2012-03-29 Terry Guo <terry.guo@arm.com>
[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, 2012
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 #include "libiberty.h"
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 /* The maximum number of operands we need.  */
355 #define ARM_IT_MAX_OPERANDS 6
356
357 struct arm_it
358 {
359   const char *  error;
360   unsigned long instruction;
361   int           size;
362   int           size_req;
363   int           cond;
364   /* "uncond_value" is set to the value in place of the conditional field in
365      unconditional versions of the instruction, or -1 if nothing is
366      appropriate.  */
367   int           uncond_value;
368   struct neon_type vectype;
369   /* This does not indicate an actual NEON instruction, only that
370      the mnemonic accepts neon-style type suffixes.  */
371   int           is_neon;
372   /* Set to the opcode if the instruction needs relaxation.
373      Zero if the instruction is not relaxed.  */
374   unsigned long relax;
375   struct
376   {
377     bfd_reloc_code_real_type type;
378     expressionS              exp;
379     int                      pc_rel;
380   } reloc;
381
382   enum it_instruction_type it_insn_type;
383
384   struct
385   {
386     unsigned reg;
387     signed int imm;
388     struct neon_type_el vectype;
389     unsigned present    : 1;  /* Operand present.  */
390     unsigned isreg      : 1;  /* Operand was a register.  */
391     unsigned immisreg   : 1;  /* .imm field is a second register.  */
392     unsigned isscalar   : 1;  /* Operand is a (Neon) scalar.  */
393     unsigned immisalign : 1;  /* Immediate is an alignment specifier.  */
394     unsigned immisfloat : 1;  /* Immediate was parsed as a float.  */
395     /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
396        instructions. This allows us to disambiguate ARM <-> vector insns.  */
397     unsigned regisimm   : 1;  /* 64-bit immediate, reg forms high 32 bits.  */
398     unsigned isvec      : 1;  /* Is a single, double or quad VFP/Neon reg.  */
399     unsigned isquad     : 1;  /* Operand is Neon quad-precision register.  */
400     unsigned issingle   : 1;  /* Operand is VFP single-precision register.  */
401     unsigned hasreloc   : 1;  /* Operand has relocation suffix.  */
402     unsigned writeback  : 1;  /* Operand has trailing !  */
403     unsigned preind     : 1;  /* Preindexed address.  */
404     unsigned postind    : 1;  /* Postindexed address.  */
405     unsigned negative   : 1;  /* Index register was negated.  */
406     unsigned shifted    : 1;  /* Shift applied to operation.  */
407     unsigned shift_kind : 3;  /* Shift operation (enum shift_kind).  */
408   } operands[ARM_IT_MAX_OPERANDS];
409 };
410
411 static struct arm_it inst;
412
413 #define NUM_FLOAT_VALS 8
414
415 const char * fp_const[] =
416 {
417   "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
418 };
419
420 /* Number of littlenums required to hold an extended precision number.  */
421 #define MAX_LITTLENUMS 6
422
423 LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
424
425 #define FAIL    (-1)
426 #define SUCCESS (0)
427
428 #define SUFF_S 1
429 #define SUFF_D 2
430 #define SUFF_E 3
431 #define SUFF_P 4
432
433 #define CP_T_X   0x00008000
434 #define CP_T_Y   0x00400000
435
436 #define CONDS_BIT        0x00100000
437 #define LOAD_BIT         0x00100000
438
439 #define DOUBLE_LOAD_FLAG 0x00000001
440
441 struct asm_cond
442 {
443   const char *   template_name;
444   unsigned long  value;
445 };
446
447 #define COND_ALWAYS 0xE
448
449 struct asm_psr
450 {
451   const char *   template_name;
452   unsigned long  field;
453 };
454
455 struct asm_barrier_opt
456 {
457   const char *   template_name;
458   unsigned long  value;
459 };
460
461 /* The bit that distinguishes CPSR and SPSR.  */
462 #define SPSR_BIT   (1 << 22)
463
464 /* The individual PSR flag bits.  */
465 #define PSR_c   (1 << 16)
466 #define PSR_x   (1 << 17)
467 #define PSR_s   (1 << 18)
468 #define PSR_f   (1 << 19)
469
470 struct reloc_entry
471 {
472   char *                    name;
473   bfd_reloc_code_real_type  reloc;
474 };
475
476 enum vfp_reg_pos
477 {
478   VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
479   VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
480 };
481
482 enum vfp_ldstm_type
483 {
484   VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
485 };
486
487 /* Bits for DEFINED field in neon_typed_alias.  */
488 #define NTA_HASTYPE  1
489 #define NTA_HASINDEX 2
490
491 struct neon_typed_alias
492 {
493   unsigned char        defined;
494   unsigned char        index;
495   struct neon_type_el  eltype;
496 };
497
498 /* ARM register categories.  This includes coprocessor numbers and various
499    architecture extensions' registers.  */
500 enum arm_reg_type
501 {
502   REG_TYPE_RN,
503   REG_TYPE_CP,
504   REG_TYPE_CN,
505   REG_TYPE_FN,
506   REG_TYPE_VFS,
507   REG_TYPE_VFD,
508   REG_TYPE_NQ,
509   REG_TYPE_VFSD,
510   REG_TYPE_NDQ,
511   REG_TYPE_NSDQ,
512   REG_TYPE_VFC,
513   REG_TYPE_MVF,
514   REG_TYPE_MVD,
515   REG_TYPE_MVFX,
516   REG_TYPE_MVDX,
517   REG_TYPE_MVAX,
518   REG_TYPE_DSPSC,
519   REG_TYPE_MMXWR,
520   REG_TYPE_MMXWC,
521   REG_TYPE_MMXWCG,
522   REG_TYPE_XSCALE,
523   REG_TYPE_RNB
524 };
525
526 /* Structure for a hash table entry for a register.
527    If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
528    information which states whether a vector type or index is specified (for a
529    register alias created with .dn or .qn). Otherwise NEON should be NULL.  */
530 struct reg_entry
531 {
532   const char *               name;
533   unsigned int               number;
534   unsigned char              type;
535   unsigned char              builtin;
536   struct neon_typed_alias *  neon;
537 };
538
539 /* Diagnostics used when we don't get a register of the expected type.  */
540 const char * const reg_expected_msgs[] =
541 {
542   N_("ARM register expected"),
543   N_("bad or missing co-processor number"),
544   N_("co-processor register expected"),
545   N_("FPA register expected"),
546   N_("VFP single precision register expected"),
547   N_("VFP/Neon double precision register expected"),
548   N_("Neon quad precision register expected"),
549   N_("VFP single or double precision register expected"),
550   N_("Neon double or quad precision register expected"),
551   N_("VFP single, double or Neon quad precision register expected"),
552   N_("VFP system register expected"),
553   N_("Maverick MVF register expected"),
554   N_("Maverick MVD register expected"),
555   N_("Maverick MVFX register expected"),
556   N_("Maverick MVDX register expected"),
557   N_("Maverick MVAX register expected"),
558   N_("Maverick DSPSC register expected"),
559   N_("iWMMXt data register expected"),
560   N_("iWMMXt control register expected"),
561   N_("iWMMXt scalar register expected"),
562   N_("XScale accumulator register expected"),
563 };
564
565 /* Some well known registers that we refer to directly elsewhere.  */
566 #define REG_R12 12
567 #define REG_SP  13
568 #define REG_LR  14
569 #define REG_PC  15
570
571 /* ARM instructions take 4bytes in the object file, Thumb instructions
572    take 2:  */
573 #define INSN_SIZE       4
574
575 struct asm_opcode
576 {
577   /* Basic string to match.  */
578   const char * template_name;
579
580   /* Parameters to instruction.  */
581   unsigned int operands[8];
582
583   /* Conditional tag - see opcode_lookup.  */
584   unsigned int tag : 4;
585
586   /* Basic instruction code.  */
587   unsigned int avalue : 28;
588
589   /* Thumb-format instruction code.  */
590   unsigned int tvalue;
591
592   /* Which architecture variant provides this instruction.  */
593   const arm_feature_set * avariant;
594   const arm_feature_set * tvariant;
595
596   /* Function to call to encode instruction in ARM format.  */
597   void (* aencode) (void);
598
599   /* Function to call to encode instruction in Thumb format.  */
600   void (* tencode) (void);
601 };
602
603 /* Defines for various bits that we will want to toggle.  */
604 #define INST_IMMEDIATE  0x02000000
605 #define OFFSET_REG      0x02000000
606 #define HWOFFSET_IMM    0x00400000
607 #define SHIFT_BY_REG    0x00000010
608 #define PRE_INDEX       0x01000000
609 #define INDEX_UP        0x00800000
610 #define WRITE_BACK      0x00200000
611 #define LDM_TYPE_2_OR_3 0x00400000
612 #define CPSI_MMOD       0x00020000
613
614 #define LITERAL_MASK    0xf000f000
615 #define OPCODE_MASK     0xfe1fffff
616 #define V4_STR_BIT      0x00000020
617
618 #define T2_SUBS_PC_LR   0xf3de8f00
619
620 #define DATA_OP_SHIFT   21
621
622 #define T2_OPCODE_MASK  0xfe1fffff
623 #define T2_DATA_OP_SHIFT 21
624
625 /* Codes to distinguish the arithmetic instructions.  */
626 #define OPCODE_AND      0
627 #define OPCODE_EOR      1
628 #define OPCODE_SUB      2
629 #define OPCODE_RSB      3
630 #define OPCODE_ADD      4
631 #define OPCODE_ADC      5
632 #define OPCODE_SBC      6
633 #define OPCODE_RSC      7
634 #define OPCODE_TST      8
635 #define OPCODE_TEQ      9
636 #define OPCODE_CMP      10
637 #define OPCODE_CMN      11
638 #define OPCODE_ORR      12
639 #define OPCODE_MOV      13
640 #define OPCODE_BIC      14
641 #define OPCODE_MVN      15
642
643 #define T2_OPCODE_AND   0
644 #define T2_OPCODE_BIC   1
645 #define T2_OPCODE_ORR   2
646 #define T2_OPCODE_ORN   3
647 #define T2_OPCODE_EOR   4
648 #define T2_OPCODE_ADD   8
649 #define T2_OPCODE_ADC   10
650 #define T2_OPCODE_SBC   11
651 #define T2_OPCODE_SUB   13
652 #define T2_OPCODE_RSB   14
653
654 #define T_OPCODE_MUL 0x4340
655 #define T_OPCODE_TST 0x4200
656 #define T_OPCODE_CMN 0x42c0
657 #define T_OPCODE_NEG 0x4240
658 #define T_OPCODE_MVN 0x43c0
659
660 #define T_OPCODE_ADD_R3 0x1800
661 #define T_OPCODE_SUB_R3 0x1a00
662 #define T_OPCODE_ADD_HI 0x4400
663 #define T_OPCODE_ADD_ST 0xb000
664 #define T_OPCODE_SUB_ST 0xb080
665 #define T_OPCODE_ADD_SP 0xa800
666 #define T_OPCODE_ADD_PC 0xa000
667 #define T_OPCODE_ADD_I8 0x3000
668 #define T_OPCODE_SUB_I8 0x3800
669 #define T_OPCODE_ADD_I3 0x1c00
670 #define T_OPCODE_SUB_I3 0x1e00
671
672 #define T_OPCODE_ASR_R  0x4100
673 #define T_OPCODE_LSL_R  0x4080
674 #define T_OPCODE_LSR_R  0x40c0
675 #define T_OPCODE_ROR_R  0x41c0
676 #define T_OPCODE_ASR_I  0x1000
677 #define T_OPCODE_LSL_I  0x0000
678 #define T_OPCODE_LSR_I  0x0800
679
680 #define T_OPCODE_MOV_I8 0x2000
681 #define T_OPCODE_CMP_I8 0x2800
682 #define T_OPCODE_CMP_LR 0x4280
683 #define T_OPCODE_MOV_HR 0x4600
684 #define T_OPCODE_CMP_HR 0x4500
685
686 #define T_OPCODE_LDR_PC 0x4800
687 #define T_OPCODE_LDR_SP 0x9800
688 #define T_OPCODE_STR_SP 0x9000
689 #define T_OPCODE_LDR_IW 0x6800
690 #define T_OPCODE_STR_IW 0x6000
691 #define T_OPCODE_LDR_IH 0x8800
692 #define T_OPCODE_STR_IH 0x8000
693 #define T_OPCODE_LDR_IB 0x7800
694 #define T_OPCODE_STR_IB 0x7000
695 #define T_OPCODE_LDR_RW 0x5800
696 #define T_OPCODE_STR_RW 0x5000
697 #define T_OPCODE_LDR_RH 0x5a00
698 #define T_OPCODE_STR_RH 0x5200
699 #define T_OPCODE_LDR_RB 0x5c00
700 #define T_OPCODE_STR_RB 0x5400
701
702 #define T_OPCODE_PUSH   0xb400
703 #define T_OPCODE_POP    0xbc00
704
705 #define T_OPCODE_BRANCH 0xe000
706
707 #define THUMB_SIZE      2       /* Size of thumb instruction.  */
708 #define THUMB_PP_PC_LR 0x0100
709 #define THUMB_LOAD_BIT 0x0800
710 #define THUMB2_LOAD_BIT 0x00100000
711
712 #define BAD_ARGS        _("bad arguments to instruction")
713 #define BAD_SP          _("r13 not allowed here")
714 #define BAD_PC          _("r15 not allowed here")
715 #define BAD_COND        _("instruction cannot be conditional")
716 #define BAD_OVERLAP     _("registers may not be the same")
717 #define BAD_HIREG       _("lo register required")
718 #define BAD_THUMB32     _("instruction not supported in Thumb16 mode")
719 #define BAD_ADDR_MODE   _("instruction does not accept this addressing mode");
720 #define BAD_BRANCH      _("branch must be last instruction in IT block")
721 #define BAD_NOT_IT      _("instruction not allowed in IT block")
722 #define BAD_FPU         _("selected FPU does not support instruction")
723 #define BAD_OUT_IT      _("thumb conditional instruction should be in IT block")
724 #define BAD_IT_COND     _("incorrect condition in IT block")
725 #define BAD_IT_IT       _("IT falling in the range of a previous IT block")
726 #define MISSING_FNSTART _("missing .fnstart before unwinding directive")
727 #define BAD_PC_ADDRESSING \
728         _("cannot use register index with PC-relative addressing")
729 #define BAD_PC_WRITEBACK \
730         _("cannot use writeback with PC-relative addressing")
731 #define BAD_RANGE     _("branch out of range")
732
733 static struct hash_control * arm_ops_hsh;
734 static struct hash_control * arm_cond_hsh;
735 static struct hash_control * arm_shift_hsh;
736 static struct hash_control * arm_psr_hsh;
737 static struct hash_control * arm_v7m_psr_hsh;
738 static struct hash_control * arm_reg_hsh;
739 static struct hash_control * arm_reloc_hsh;
740 static struct hash_control * arm_barrier_opt_hsh;
741
742 /* Stuff needed to resolve the label ambiguity
743    As:
744      ...
745      label:   <insn>
746    may differ from:
747      ...
748      label:
749               <insn>  */
750
751 symbolS *  last_label_seen;
752 static int label_is_thumb_function_name = FALSE;
753
754 /* Literal pool structure.  Held on a per-section
755    and per-sub-section basis.  */
756
757 #define MAX_LITERAL_POOL_SIZE 1024
758 typedef struct literal_pool
759 {
760   expressionS            literals [MAX_LITERAL_POOL_SIZE];
761   unsigned int           next_free_entry;
762   unsigned int           id;
763   symbolS *              symbol;
764   segT                   section;
765   subsegT                sub_section;
766 #ifdef OBJ_ELF
767   struct dwarf2_line_info locs [MAX_LITERAL_POOL_SIZE];
768 #endif
769   struct literal_pool *  next;
770 } literal_pool;
771
772 /* Pointer to a linked list of literal pools.  */
773 literal_pool * list_of_pools = NULL;
774
775 #ifdef OBJ_ELF
776 #  define now_it seg_info (now_seg)->tc_segment_info_data.current_it
777 #else
778 static struct current_it now_it;
779 #endif
780
781 static inline int
782 now_it_compatible (int cond)
783 {
784   return (cond & ~1) == (now_it.cc & ~1);
785 }
786
787 static inline int
788 conditional_insn (void)
789 {
790   return inst.cond != COND_ALWAYS;
791 }
792
793 static int in_it_block (void);
794
795 static int handle_it_state (void);
796
797 static void force_automatic_it_block_close (void);
798
799 static void it_fsm_post_encode (void);
800
801 #define set_it_insn_type(type)                  \
802   do                                            \
803     {                                           \
804       inst.it_insn_type = type;                 \
805       if (handle_it_state () == FAIL)           \
806         return;                                 \
807     }                                           \
808   while (0)
809
810 #define set_it_insn_type_nonvoid(type, failret) \
811   do                                            \
812     {                                           \
813       inst.it_insn_type = type;                 \
814       if (handle_it_state () == FAIL)           \
815         return failret;                         \
816     }                                           \
817   while(0)
818
819 #define set_it_insn_type_last()                         \
820   do                                                    \
821     {                                                   \
822       if (inst.cond == COND_ALWAYS)                     \
823         set_it_insn_type (IF_INSIDE_IT_LAST_INSN);      \
824       else                                              \
825         set_it_insn_type (INSIDE_IT_LAST_INSN);         \
826     }                                                   \
827   while (0)
828
829 /* Pure syntax.  */
830
831 /* This array holds the chars that always start a comment.  If the
832    pre-processor is disabled, these aren't very useful.  */
833 const char comment_chars[] = "@";
834
835 /* This array holds the chars that only start a comment at the beginning of
836    a line.  If the line seems to have the form '# 123 filename'
837    .line and .file directives will appear in the pre-processed output.  */
838 /* Note that input_file.c hand checks for '#' at the beginning of the
839    first line of the input file.  This is because the compiler outputs
840    #NO_APP at the beginning of its output.  */
841 /* Also note that comments like this one will always work.  */
842 const char line_comment_chars[] = "#";
843
844 const char line_separator_chars[] = ";";
845
846 /* Chars that can be used to separate mant
847    from exp in floating point numbers.  */
848 const char EXP_CHARS[] = "eE";
849
850 /* Chars that mean this number is a floating point constant.  */
851 /* As in 0f12.456  */
852 /* or    0d1.2345e12  */
853
854 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
855
856 /* Prefix characters that indicate the start of an immediate
857    value.  */
858 #define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
859
860 /* Separator character handling.  */
861
862 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
863
864 static inline int
865 skip_past_char (char ** str, char c)
866 {
867   if (**str == c)
868     {
869       (*str)++;
870       return SUCCESS;
871     }
872   else
873     return FAIL;
874 }
875
876 #define skip_past_comma(str) skip_past_char (str, ',')
877
878 /* Arithmetic expressions (possibly involving symbols).  */
879
880 /* Return TRUE if anything in the expression is a bignum.  */
881
882 static int
883 walk_no_bignums (symbolS * sp)
884 {
885   if (symbol_get_value_expression (sp)->X_op == O_big)
886     return 1;
887
888   if (symbol_get_value_expression (sp)->X_add_symbol)
889     {
890       return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
891               || (symbol_get_value_expression (sp)->X_op_symbol
892                   && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
893     }
894
895   return 0;
896 }
897
898 static int in_my_get_expression = 0;
899
900 /* Third argument to my_get_expression.  */
901 #define GE_NO_PREFIX 0
902 #define GE_IMM_PREFIX 1
903 #define GE_OPT_PREFIX 2
904 /* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
905    immediates, as can be used in Neon VMVN and VMOV immediate instructions.  */
906 #define GE_OPT_PREFIX_BIG 3
907
908 static int
909 my_get_expression (expressionS * ep, char ** str, int prefix_mode)
910 {
911   char * save_in;
912   segT   seg;
913
914   /* In unified syntax, all prefixes are optional.  */
915   if (unified_syntax)
916     prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
917                   : GE_OPT_PREFIX;
918
919   switch (prefix_mode)
920     {
921     case GE_NO_PREFIX: break;
922     case GE_IMM_PREFIX:
923       if (!is_immediate_prefix (**str))
924         {
925           inst.error = _("immediate expression requires a # prefix");
926           return FAIL;
927         }
928       (*str)++;
929       break;
930     case GE_OPT_PREFIX:
931     case GE_OPT_PREFIX_BIG:
932       if (is_immediate_prefix (**str))
933         (*str)++;
934       break;
935     default: abort ();
936     }
937
938   memset (ep, 0, sizeof (expressionS));
939
940   save_in = input_line_pointer;
941   input_line_pointer = *str;
942   in_my_get_expression = 1;
943   seg = expression (ep);
944   in_my_get_expression = 0;
945
946   if (ep->X_op == O_illegal || ep->X_op == O_absent)
947     {
948       /* We found a bad or missing expression in md_operand().  */
949       *str = input_line_pointer;
950       input_line_pointer = save_in;
951       if (inst.error == NULL)
952         inst.error = (ep->X_op == O_absent
953                       ? _("missing expression") :_("bad expression"));
954       return 1;
955     }
956
957 #ifdef OBJ_AOUT
958   if (seg != absolute_section
959       && seg != text_section
960       && seg != data_section
961       && seg != bss_section
962       && seg != undefined_section)
963     {
964       inst.error = _("bad segment");
965       *str = input_line_pointer;
966       input_line_pointer = save_in;
967       return 1;
968     }
969 #else
970   (void) seg;
971 #endif
972
973   /* Get rid of any bignums now, so that we don't generate an error for which
974      we can't establish a line number later on.  Big numbers are never valid
975      in instructions, which is where this routine is always called.  */
976   if (prefix_mode != GE_OPT_PREFIX_BIG
977       && (ep->X_op == O_big
978           || (ep->X_add_symbol
979               && (walk_no_bignums (ep->X_add_symbol)
980                   || (ep->X_op_symbol
981                       && walk_no_bignums (ep->X_op_symbol))))))
982     {
983       inst.error = _("invalid constant");
984       *str = input_line_pointer;
985       input_line_pointer = save_in;
986       return 1;
987     }
988
989   *str = input_line_pointer;
990   input_line_pointer = save_in;
991   return 0;
992 }
993
994 /* Turn a string in input_line_pointer into a floating point constant
995    of type TYPE, and store the appropriate bytes in *LITP.  The number
996    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
997    returned, or NULL on OK.
998
999    Note that fp constants aren't represent in the normal way on the ARM.
1000    In big endian mode, things are as expected.  However, in little endian
1001    mode fp constants are big-endian word-wise, and little-endian byte-wise
1002    within the words.  For example, (double) 1.1 in big endian mode is
1003    the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
1004    the byte sequence 99 99 f1 3f 9a 99 99 99.
1005
1006    ??? The format of 12 byte floats is uncertain according to gcc's arm.h.  */
1007
1008 char *
1009 md_atof (int type, char * litP, int * sizeP)
1010 {
1011   int prec;
1012   LITTLENUM_TYPE words[MAX_LITTLENUMS];
1013   char *t;
1014   int i;
1015
1016   switch (type)
1017     {
1018     case 'f':
1019     case 'F':
1020     case 's':
1021     case 'S':
1022       prec = 2;
1023       break;
1024
1025     case 'd':
1026     case 'D':
1027     case 'r':
1028     case 'R':
1029       prec = 4;
1030       break;
1031
1032     case 'x':
1033     case 'X':
1034       prec = 5;
1035       break;
1036
1037     case 'p':
1038     case 'P':
1039       prec = 5;
1040       break;
1041
1042     default:
1043       *sizeP = 0;
1044       return _("Unrecognized or unsupported floating point constant");
1045     }
1046
1047   t = atof_ieee (input_line_pointer, type, words);
1048   if (t)
1049     input_line_pointer = t;
1050   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1051
1052   if (target_big_endian)
1053     {
1054       for (i = 0; i < prec; i++)
1055         {
1056           md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1057           litP += sizeof (LITTLENUM_TYPE);
1058         }
1059     }
1060   else
1061     {
1062       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
1063         for (i = prec - 1; i >= 0; i--)
1064           {
1065             md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1066             litP += sizeof (LITTLENUM_TYPE);
1067           }
1068       else
1069         /* For a 4 byte float the order of elements in `words' is 1 0.
1070            For an 8 byte float the order is 1 0 3 2.  */
1071         for (i = 0; i < prec; i += 2)
1072           {
1073             md_number_to_chars (litP, (valueT) words[i + 1],
1074                                 sizeof (LITTLENUM_TYPE));
1075             md_number_to_chars (litP + sizeof (LITTLENUM_TYPE),
1076                                 (valueT) words[i], sizeof (LITTLENUM_TYPE));
1077             litP += 2 * sizeof (LITTLENUM_TYPE);
1078           }
1079     }
1080
1081   return NULL;
1082 }
1083
1084 /* We handle all bad expressions here, so that we can report the faulty
1085    instruction in the error message.  */
1086 void
1087 md_operand (expressionS * exp)
1088 {
1089   if (in_my_get_expression)
1090     exp->X_op = O_illegal;
1091 }
1092
1093 /* Immediate values.  */
1094
1095 /* Generic immediate-value read function for use in directives.
1096    Accepts anything that 'expression' can fold to a constant.
1097    *val receives the number.  */
1098 #ifdef OBJ_ELF
1099 static int
1100 immediate_for_directive (int *val)
1101 {
1102   expressionS exp;
1103   exp.X_op = O_illegal;
1104
1105   if (is_immediate_prefix (*input_line_pointer))
1106     {
1107       input_line_pointer++;
1108       expression (&exp);
1109     }
1110
1111   if (exp.X_op != O_constant)
1112     {
1113       as_bad (_("expected #constant"));
1114       ignore_rest_of_line ();
1115       return FAIL;
1116     }
1117   *val = exp.X_add_number;
1118   return SUCCESS;
1119 }
1120 #endif
1121
1122 /* Register parsing.  */
1123
1124 /* Generic register parser.  CCP points to what should be the
1125    beginning of a register name.  If it is indeed a valid register
1126    name, advance CCP over it and return the reg_entry structure;
1127    otherwise return NULL.  Does not issue diagnostics.  */
1128
1129 static struct reg_entry *
1130 arm_reg_parse_multi (char **ccp)
1131 {
1132   char *start = *ccp;
1133   char *p;
1134   struct reg_entry *reg;
1135
1136 #ifdef REGISTER_PREFIX
1137   if (*start != REGISTER_PREFIX)
1138     return NULL;
1139   start++;
1140 #endif
1141 #ifdef OPTIONAL_REGISTER_PREFIX
1142   if (*start == OPTIONAL_REGISTER_PREFIX)
1143     start++;
1144 #endif
1145
1146   p = start;
1147   if (!ISALPHA (*p) || !is_name_beginner (*p))
1148     return NULL;
1149
1150   do
1151     p++;
1152   while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1153
1154   reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1155
1156   if (!reg)
1157     return NULL;
1158
1159   *ccp = p;
1160   return reg;
1161 }
1162
1163 static int
1164 arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
1165                     enum arm_reg_type type)
1166 {
1167   /* Alternative syntaxes are accepted for a few register classes.  */
1168   switch (type)
1169     {
1170     case REG_TYPE_MVF:
1171     case REG_TYPE_MVD:
1172     case REG_TYPE_MVFX:
1173     case REG_TYPE_MVDX:
1174       /* Generic coprocessor register names are allowed for these.  */
1175       if (reg && reg->type == REG_TYPE_CN)
1176         return reg->number;
1177       break;
1178
1179     case REG_TYPE_CP:
1180       /* For backward compatibility, a bare number is valid here.  */
1181       {
1182         unsigned long processor = strtoul (start, ccp, 10);
1183         if (*ccp != start && processor <= 15)
1184           return processor;
1185       }
1186
1187     case REG_TYPE_MMXWC:
1188       /* WC includes WCG.  ??? I'm not sure this is true for all
1189          instructions that take WC registers.  */
1190       if (reg && reg->type == REG_TYPE_MMXWCG)
1191         return reg->number;
1192       break;
1193
1194     default:
1195       break;
1196     }
1197
1198   return FAIL;
1199 }
1200
1201 /* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1202    return value is the register number or FAIL.  */
1203
1204 static int
1205 arm_reg_parse (char **ccp, enum arm_reg_type type)
1206 {
1207   char *start = *ccp;
1208   struct reg_entry *reg = arm_reg_parse_multi (ccp);
1209   int ret;
1210
1211   /* Do not allow a scalar (reg+index) to parse as a register.  */
1212   if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1213     return FAIL;
1214
1215   if (reg && reg->type == type)
1216     return reg->number;
1217
1218   if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1219     return ret;
1220
1221   *ccp = start;
1222   return FAIL;
1223 }
1224
1225 /* Parse a Neon type specifier. *STR should point at the leading '.'
1226    character. Does no verification at this stage that the type fits the opcode
1227    properly. E.g.,
1228
1229      .i32.i32.s16
1230      .s32.f32
1231      .u16
1232
1233    Can all be legally parsed by this function.
1234
1235    Fills in neon_type struct pointer with parsed information, and updates STR
1236    to point after the parsed type specifier. Returns SUCCESS if this was a legal
1237    type, FAIL if not.  */
1238
1239 static int
1240 parse_neon_type (struct neon_type *type, char **str)
1241 {
1242   char *ptr = *str;
1243
1244   if (type)
1245     type->elems = 0;
1246
1247   while (type->elems < NEON_MAX_TYPE_ELS)
1248     {
1249       enum neon_el_type thistype = NT_untyped;
1250       unsigned thissize = -1u;
1251
1252       if (*ptr != '.')
1253         break;
1254
1255       ptr++;
1256
1257       /* Just a size without an explicit type.  */
1258       if (ISDIGIT (*ptr))
1259         goto parsesize;
1260
1261       switch (TOLOWER (*ptr))
1262         {
1263         case 'i': thistype = NT_integer; break;
1264         case 'f': thistype = NT_float; break;
1265         case 'p': thistype = NT_poly; break;
1266         case 's': thistype = NT_signed; break;
1267         case 'u': thistype = NT_unsigned; break;
1268         case 'd':
1269           thistype = NT_float;
1270           thissize = 64;
1271           ptr++;
1272           goto done;
1273         default:
1274           as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1275           return FAIL;
1276         }
1277
1278       ptr++;
1279
1280       /* .f is an abbreviation for .f32.  */
1281       if (thistype == NT_float && !ISDIGIT (*ptr))
1282         thissize = 32;
1283       else
1284         {
1285         parsesize:
1286           thissize = strtoul (ptr, &ptr, 10);
1287
1288           if (thissize != 8 && thissize != 16 && thissize != 32
1289               && thissize != 64)
1290             {
1291               as_bad (_("bad size %d in type specifier"), thissize);
1292               return FAIL;
1293             }
1294         }
1295
1296       done:
1297       if (type)
1298         {
1299           type->el[type->elems].type = thistype;
1300           type->el[type->elems].size = thissize;
1301           type->elems++;
1302         }
1303     }
1304
1305   /* Empty/missing type is not a successful parse.  */
1306   if (type->elems == 0)
1307     return FAIL;
1308
1309   *str = ptr;
1310
1311   return SUCCESS;
1312 }
1313
1314 /* Errors may be set multiple times during parsing or bit encoding
1315    (particularly in the Neon bits), but usually the earliest error which is set
1316    will be the most meaningful. Avoid overwriting it with later (cascading)
1317    errors by calling this function.  */
1318
1319 static void
1320 first_error (const char *err)
1321 {
1322   if (!inst.error)
1323     inst.error = err;
1324 }
1325
1326 /* Parse a single type, e.g. ".s32", leading period included.  */
1327 static int
1328 parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1329 {
1330   char *str = *ccp;
1331   struct neon_type optype;
1332
1333   if (*str == '.')
1334     {
1335       if (parse_neon_type (&optype, &str) == SUCCESS)
1336         {
1337           if (optype.elems == 1)
1338             *vectype = optype.el[0];
1339           else
1340             {
1341               first_error (_("only one type should be specified for operand"));
1342               return FAIL;
1343             }
1344         }
1345       else
1346         {
1347           first_error (_("vector type expected"));
1348           return FAIL;
1349         }
1350     }
1351   else
1352     return FAIL;
1353
1354   *ccp = str;
1355
1356   return SUCCESS;
1357 }
1358
1359 /* Special meanings for indices (which have a range of 0-7), which will fit into
1360    a 4-bit integer.  */
1361
1362 #define NEON_ALL_LANES          15
1363 #define NEON_INTERLEAVE_LANES   14
1364
1365 /* Parse either a register or a scalar, with an optional type. Return the
1366    register number, and optionally fill in the actual type of the register
1367    when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1368    type/index information in *TYPEINFO.  */
1369
1370 static int
1371 parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
1372                            enum arm_reg_type *rtype,
1373                            struct neon_typed_alias *typeinfo)
1374 {
1375   char *str = *ccp;
1376   struct reg_entry *reg = arm_reg_parse_multi (&str);
1377   struct neon_typed_alias atype;
1378   struct neon_type_el parsetype;
1379
1380   atype.defined = 0;
1381   atype.index = -1;
1382   atype.eltype.type = NT_invtype;
1383   atype.eltype.size = -1;
1384
1385   /* Try alternate syntax for some types of register. Note these are mutually
1386      exclusive with the Neon syntax extensions.  */
1387   if (reg == NULL)
1388     {
1389       int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1390       if (altreg != FAIL)
1391         *ccp = str;
1392       if (typeinfo)
1393         *typeinfo = atype;
1394       return altreg;
1395     }
1396
1397   /* Undo polymorphism when a set of register types may be accepted.  */
1398   if ((type == REG_TYPE_NDQ
1399        && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1400       || (type == REG_TYPE_VFSD
1401           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1402       || (type == REG_TYPE_NSDQ
1403           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
1404               || reg->type == REG_TYPE_NQ))
1405       || (type == REG_TYPE_MMXWC
1406           && (reg->type == REG_TYPE_MMXWCG)))
1407     type = (enum arm_reg_type) reg->type;
1408
1409   if (type != reg->type)
1410     return FAIL;
1411
1412   if (reg->neon)
1413     atype = *reg->neon;
1414
1415   if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1416     {
1417       if ((atype.defined & NTA_HASTYPE) != 0)
1418         {
1419           first_error (_("can't redefine type for operand"));
1420           return FAIL;
1421         }
1422       atype.defined |= NTA_HASTYPE;
1423       atype.eltype = parsetype;
1424     }
1425
1426   if (skip_past_char (&str, '[') == SUCCESS)
1427     {
1428       if (type != REG_TYPE_VFD)
1429         {
1430           first_error (_("only D registers may be indexed"));
1431           return FAIL;
1432         }
1433
1434       if ((atype.defined & NTA_HASINDEX) != 0)
1435         {
1436           first_error (_("can't change index for operand"));
1437           return FAIL;
1438         }
1439
1440       atype.defined |= NTA_HASINDEX;
1441
1442       if (skip_past_char (&str, ']') == SUCCESS)
1443         atype.index = NEON_ALL_LANES;
1444       else
1445         {
1446           expressionS exp;
1447
1448           my_get_expression (&exp, &str, GE_NO_PREFIX);
1449
1450           if (exp.X_op != O_constant)
1451             {
1452               first_error (_("constant expression required"));
1453               return FAIL;
1454             }
1455
1456           if (skip_past_char (&str, ']') == FAIL)
1457             return FAIL;
1458
1459           atype.index = exp.X_add_number;
1460         }
1461     }
1462
1463   if (typeinfo)
1464     *typeinfo = atype;
1465
1466   if (rtype)
1467     *rtype = type;
1468
1469   *ccp = str;
1470
1471   return reg->number;
1472 }
1473
1474 /* Like arm_reg_parse, but allow allow the following extra features:
1475     - If RTYPE is non-zero, return the (possibly restricted) type of the
1476       register (e.g. Neon double or quad reg when either has been requested).
1477     - If this is a Neon vector type with additional type information, fill
1478       in the struct pointed to by VECTYPE (if non-NULL).
1479    This function will fault on encountering a scalar.  */
1480
1481 static int
1482 arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
1483                      enum arm_reg_type *rtype, struct neon_type_el *vectype)
1484 {
1485   struct neon_typed_alias atype;
1486   char *str = *ccp;
1487   int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1488
1489   if (reg == FAIL)
1490     return FAIL;
1491
1492   /* Do not allow regname(... to parse as a register.  */
1493   if (*str == '(')
1494     return FAIL;
1495
1496   /* Do not allow a scalar (reg+index) to parse as a register.  */
1497   if ((atype.defined & NTA_HASINDEX) != 0)
1498     {
1499       first_error (_("register operand expected, but got scalar"));
1500       return FAIL;
1501     }
1502
1503   if (vectype)
1504     *vectype = atype.eltype;
1505
1506   *ccp = str;
1507
1508   return reg;
1509 }
1510
1511 #define NEON_SCALAR_REG(X)      ((X) >> 4)
1512 #define NEON_SCALAR_INDEX(X)    ((X) & 15)
1513
1514 /* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1515    have enough information to be able to do a good job bounds-checking. So, we
1516    just do easy checks here, and do further checks later.  */
1517
1518 static int
1519 parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
1520 {
1521   int reg;
1522   char *str = *ccp;
1523   struct neon_typed_alias atype;
1524
1525   reg = parse_typed_reg_or_scalar (&str, REG_TYPE_VFD, NULL, &atype);
1526
1527   if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
1528     return FAIL;
1529
1530   if (atype.index == NEON_ALL_LANES)
1531     {
1532       first_error (_("scalar must have an index"));
1533       return FAIL;
1534     }
1535   else if (atype.index >= 64 / elsize)
1536     {
1537       first_error (_("scalar index out of range"));
1538       return FAIL;
1539     }
1540
1541   if (type)
1542     *type = atype.eltype;
1543
1544   *ccp = str;
1545
1546   return reg * 16 + atype.index;
1547 }
1548
1549 /* Parse an ARM register list.  Returns the bitmask, or FAIL.  */
1550
1551 static long
1552 parse_reg_list (char ** strp)
1553 {
1554   char * str = * strp;
1555   long   range = 0;
1556   int    another_range;
1557
1558   /* We come back here if we get ranges concatenated by '+' or '|'.  */
1559   do
1560     {
1561       another_range = 0;
1562
1563       if (*str == '{')
1564         {
1565           int in_range = 0;
1566           int cur_reg = -1;
1567
1568           str++;
1569           do
1570             {
1571               int reg;
1572
1573               if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
1574                 {
1575                   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
1576                   return FAIL;
1577                 }
1578
1579               if (in_range)
1580                 {
1581                   int i;
1582
1583                   if (reg <= cur_reg)
1584                     {
1585                       first_error (_("bad range in register list"));
1586                       return FAIL;
1587                     }
1588
1589                   for (i = cur_reg + 1; i < reg; i++)
1590                     {
1591                       if (range & (1 << i))
1592                         as_tsktsk
1593                           (_("Warning: duplicated register (r%d) in register list"),
1594                            i);
1595                       else
1596                         range |= 1 << i;
1597                     }
1598                   in_range = 0;
1599                 }
1600
1601               if (range & (1 << reg))
1602                 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1603                            reg);
1604               else if (reg <= cur_reg)
1605                 as_tsktsk (_("Warning: register range not in ascending order"));
1606
1607               range |= 1 << reg;
1608               cur_reg = reg;
1609             }
1610           while (skip_past_comma (&str) != FAIL
1611                  || (in_range = 1, *str++ == '-'));
1612           str--;
1613
1614           if (*str++ != '}')
1615             {
1616               first_error (_("missing `}'"));
1617               return FAIL;
1618             }
1619         }
1620       else
1621         {
1622           expressionS exp;
1623
1624           if (my_get_expression (&exp, &str, GE_NO_PREFIX))
1625             return FAIL;
1626
1627           if (exp.X_op == O_constant)
1628             {
1629               if (exp.X_add_number
1630                   != (exp.X_add_number & 0x0000ffff))
1631                 {
1632                   inst.error = _("invalid register mask");
1633                   return FAIL;
1634                 }
1635
1636               if ((range & exp.X_add_number) != 0)
1637                 {
1638                   int regno = range & exp.X_add_number;
1639
1640                   regno &= -regno;
1641                   regno = (1 << regno) - 1;
1642                   as_tsktsk
1643                     (_("Warning: duplicated register (r%d) in register list"),
1644                      regno);
1645                 }
1646
1647               range |= exp.X_add_number;
1648             }
1649           else
1650             {
1651               if (inst.reloc.type != 0)
1652                 {
1653                   inst.error = _("expression too complex");
1654                   return FAIL;
1655                 }
1656
1657               memcpy (&inst.reloc.exp, &exp, sizeof (expressionS));
1658               inst.reloc.type = BFD_RELOC_ARM_MULTI;
1659               inst.reloc.pc_rel = 0;
1660             }
1661         }
1662
1663       if (*str == '|' || *str == '+')
1664         {
1665           str++;
1666           another_range = 1;
1667         }
1668     }
1669   while (another_range);
1670
1671   *strp = str;
1672   return range;
1673 }
1674
1675 /* Types of registers in a list.  */
1676
1677 enum reg_list_els
1678 {
1679   REGLIST_VFP_S,
1680   REGLIST_VFP_D,
1681   REGLIST_NEON_D
1682 };
1683
1684 /* Parse a VFP register list.  If the string is invalid return FAIL.
1685    Otherwise return the number of registers, and set PBASE to the first
1686    register.  Parses registers of type ETYPE.
1687    If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1688      - Q registers can be used to specify pairs of D registers
1689      - { } can be omitted from around a singleton register list
1690          FIXME: This is not implemented, as it would require backtracking in
1691          some cases, e.g.:
1692            vtbl.8 d3,d4,d5
1693          This could be done (the meaning isn't really ambiguous), but doesn't
1694          fit in well with the current parsing framework.
1695      - 32 D registers may be used (also true for VFPv3).
1696    FIXME: Types are ignored in these register lists, which is probably a
1697    bug.  */
1698
1699 static int
1700 parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype)
1701 {
1702   char *str = *ccp;
1703   int base_reg;
1704   int new_base;
1705   enum arm_reg_type regtype = (enum arm_reg_type) 0;
1706   int max_regs = 0;
1707   int count = 0;
1708   int warned = 0;
1709   unsigned long mask = 0;
1710   int i;
1711
1712   if (*str != '{')
1713     {
1714       inst.error = _("expecting {");
1715       return FAIL;
1716     }
1717
1718   str++;
1719
1720   switch (etype)
1721     {
1722     case REGLIST_VFP_S:
1723       regtype = REG_TYPE_VFS;
1724       max_regs = 32;
1725       break;
1726
1727     case REGLIST_VFP_D:
1728       regtype = REG_TYPE_VFD;
1729       break;
1730
1731     case REGLIST_NEON_D:
1732       regtype = REG_TYPE_NDQ;
1733       break;
1734     }
1735
1736   if (etype != REGLIST_VFP_S)
1737     {
1738       /* VFPv3 allows 32 D registers, except for the VFPv3-D16 variant.  */
1739       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
1740         {
1741           max_regs = 32;
1742           if (thumb_mode)
1743             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
1744                                     fpu_vfp_ext_d32);
1745           else
1746             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
1747                                     fpu_vfp_ext_d32);
1748         }
1749       else
1750         max_regs = 16;
1751     }
1752
1753   base_reg = max_regs;
1754
1755   do
1756     {
1757       int setmask = 1, addregs = 1;
1758
1759       new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
1760
1761       if (new_base == FAIL)
1762         {
1763           first_error (_(reg_expected_msgs[regtype]));
1764           return FAIL;
1765         }
1766
1767       if (new_base >= max_regs)
1768         {
1769           first_error (_("register out of range in list"));
1770           return FAIL;
1771         }
1772
1773       /* Note: a value of 2 * n is returned for the register Q<n>.  */
1774       if (regtype == REG_TYPE_NQ)
1775         {
1776           setmask = 3;
1777           addregs = 2;
1778         }
1779
1780       if (new_base < base_reg)
1781         base_reg = new_base;
1782
1783       if (mask & (setmask << new_base))
1784         {
1785           first_error (_("invalid register list"));
1786           return FAIL;
1787         }
1788
1789       if ((mask >> new_base) != 0 && ! warned)
1790         {
1791           as_tsktsk (_("register list not in ascending order"));
1792           warned = 1;
1793         }
1794
1795       mask |= setmask << new_base;
1796       count += addregs;
1797
1798       if (*str == '-') /* We have the start of a range expression */
1799         {
1800           int high_range;
1801
1802           str++;
1803
1804           if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
1805               == FAIL)
1806             {
1807               inst.error = gettext (reg_expected_msgs[regtype]);
1808               return FAIL;
1809             }
1810
1811           if (high_range >= max_regs)
1812             {
1813               first_error (_("register out of range in list"));
1814               return FAIL;
1815             }
1816
1817           if (regtype == REG_TYPE_NQ)
1818             high_range = high_range + 1;
1819
1820           if (high_range <= new_base)
1821             {
1822               inst.error = _("register range not in ascending order");
1823               return FAIL;
1824             }
1825
1826           for (new_base += addregs; new_base <= high_range; new_base += addregs)
1827             {
1828               if (mask & (setmask << new_base))
1829                 {
1830                   inst.error = _("invalid register list");
1831                   return FAIL;
1832                 }
1833
1834               mask |= setmask << new_base;
1835               count += addregs;
1836             }
1837         }
1838     }
1839   while (skip_past_comma (&str) != FAIL);
1840
1841   str++;
1842
1843   /* Sanity check -- should have raised a parse error above.  */
1844   if (count == 0 || count > max_regs)
1845     abort ();
1846
1847   *pbase = base_reg;
1848
1849   /* Final test -- the registers must be consecutive.  */
1850   mask >>= base_reg;
1851   for (i = 0; i < count; i++)
1852     {
1853       if ((mask & (1u << i)) == 0)
1854         {
1855           inst.error = _("non-contiguous register range");
1856           return FAIL;
1857         }
1858     }
1859
1860   *ccp = str;
1861
1862   return count;
1863 }
1864
1865 /* True if two alias types are the same.  */
1866
1867 static bfd_boolean
1868 neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
1869 {
1870   if (!a && !b)
1871     return TRUE;
1872
1873   if (!a || !b)
1874     return FALSE;
1875
1876   if (a->defined != b->defined)
1877     return FALSE;
1878
1879   if ((a->defined & NTA_HASTYPE) != 0
1880       && (a->eltype.type != b->eltype.type
1881           || a->eltype.size != b->eltype.size))
1882     return FALSE;
1883
1884   if ((a->defined & NTA_HASINDEX) != 0
1885       && (a->index != b->index))
1886     return FALSE;
1887
1888   return TRUE;
1889 }
1890
1891 /* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
1892    The base register is put in *PBASE.
1893    The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
1894    the return value.
1895    The register stride (minus one) is put in bit 4 of the return value.
1896    Bits [6:5] encode the list length (minus one).
1897    The type of the list elements is put in *ELTYPE, if non-NULL.  */
1898
1899 #define NEON_LANE(X)            ((X) & 0xf)
1900 #define NEON_REG_STRIDE(X)      ((((X) >> 4) & 1) + 1)
1901 #define NEON_REGLIST_LENGTH(X)  ((((X) >> 5) & 3) + 1)
1902
1903 static int
1904 parse_neon_el_struct_list (char **str, unsigned *pbase,
1905                            struct neon_type_el *eltype)
1906 {
1907   char *ptr = *str;
1908   int base_reg = -1;
1909   int reg_incr = -1;
1910   int count = 0;
1911   int lane = -1;
1912   int leading_brace = 0;
1913   enum arm_reg_type rtype = REG_TYPE_NDQ;
1914   const char *const incr_error = _("register stride must be 1 or 2");
1915   const char *const type_error = _("mismatched element/structure types in list");
1916   struct neon_typed_alias firsttype;
1917
1918   if (skip_past_char (&ptr, '{') == SUCCESS)
1919     leading_brace = 1;
1920
1921   do
1922     {
1923       struct neon_typed_alias atype;
1924       int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
1925
1926       if (getreg == FAIL)
1927         {
1928           first_error (_(reg_expected_msgs[rtype]));
1929           return FAIL;
1930         }
1931
1932       if (base_reg == -1)
1933         {
1934           base_reg = getreg;
1935           if (rtype == REG_TYPE_NQ)
1936             {
1937               reg_incr = 1;
1938             }
1939           firsttype = atype;
1940         }
1941       else if (reg_incr == -1)
1942         {
1943           reg_incr = getreg - base_reg;
1944           if (reg_incr < 1 || reg_incr > 2)
1945             {
1946               first_error (_(incr_error));
1947               return FAIL;
1948             }
1949         }
1950       else if (getreg != base_reg + reg_incr * count)
1951         {
1952           first_error (_(incr_error));
1953           return FAIL;
1954         }
1955
1956       if (! neon_alias_types_same (&atype, &firsttype))
1957         {
1958           first_error (_(type_error));
1959           return FAIL;
1960         }
1961
1962       /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
1963          modes.  */
1964       if (ptr[0] == '-')
1965         {
1966           struct neon_typed_alias htype;
1967           int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
1968           if (lane == -1)
1969             lane = NEON_INTERLEAVE_LANES;
1970           else if (lane != NEON_INTERLEAVE_LANES)
1971             {
1972               first_error (_(type_error));
1973               return FAIL;
1974             }
1975           if (reg_incr == -1)
1976             reg_incr = 1;
1977           else if (reg_incr != 1)
1978             {
1979               first_error (_("don't use Rn-Rm syntax with non-unit stride"));
1980               return FAIL;
1981             }
1982           ptr++;
1983           hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
1984           if (hireg == FAIL)
1985             {
1986               first_error (_(reg_expected_msgs[rtype]));
1987               return FAIL;
1988             }
1989           if (! neon_alias_types_same (&htype, &firsttype))
1990             {
1991               first_error (_(type_error));
1992               return FAIL;
1993             }
1994           count += hireg + dregs - getreg;
1995           continue;
1996         }
1997
1998       /* If we're using Q registers, we can't use [] or [n] syntax.  */
1999       if (rtype == REG_TYPE_NQ)
2000         {
2001           count += 2;
2002           continue;
2003         }
2004
2005       if ((atype.defined & NTA_HASINDEX) != 0)
2006         {
2007           if (lane == -1)
2008             lane = atype.index;
2009           else if (lane != atype.index)
2010             {
2011               first_error (_(type_error));
2012               return FAIL;
2013             }
2014         }
2015       else if (lane == -1)
2016         lane = NEON_INTERLEAVE_LANES;
2017       else if (lane != NEON_INTERLEAVE_LANES)
2018         {
2019           first_error (_(type_error));
2020           return FAIL;
2021         }
2022       count++;
2023     }
2024   while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
2025
2026   /* No lane set by [x]. We must be interleaving structures.  */
2027   if (lane == -1)
2028     lane = NEON_INTERLEAVE_LANES;
2029
2030   /* Sanity check.  */
2031   if (lane == -1 || base_reg == -1 || count < 1 || count > 4
2032       || (count > 1 && reg_incr == -1))
2033     {
2034       first_error (_("error parsing element/structure list"));
2035       return FAIL;
2036     }
2037
2038   if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
2039     {
2040       first_error (_("expected }"));
2041       return FAIL;
2042     }
2043
2044   if (reg_incr == -1)
2045     reg_incr = 1;
2046
2047   if (eltype)
2048     *eltype = firsttype.eltype;
2049
2050   *pbase = base_reg;
2051   *str = ptr;
2052
2053   return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
2054 }
2055
2056 /* Parse an explicit relocation suffix on an expression.  This is
2057    either nothing, or a word in parentheses.  Note that if !OBJ_ELF,
2058    arm_reloc_hsh contains no entries, so this function can only
2059    succeed if there is no () after the word.  Returns -1 on error,
2060    BFD_RELOC_UNUSED if there wasn't any suffix.  */
2061
2062 static int
2063 parse_reloc (char **str)
2064 {
2065   struct reloc_entry *r;
2066   char *p, *q;
2067
2068   if (**str != '(')
2069     return BFD_RELOC_UNUSED;
2070
2071   p = *str + 1;
2072   q = p;
2073
2074   while (*q && *q != ')' && *q != ',')
2075     q++;
2076   if (*q != ')')
2077     return -1;
2078
2079   if ((r = (struct reloc_entry *)
2080        hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
2081     return -1;
2082
2083   *str = q + 1;
2084   return r->reloc;
2085 }
2086
2087 /* Directives: register aliases.  */
2088
2089 static struct reg_entry *
2090 insert_reg_alias (char *str, unsigned number, int type)
2091 {
2092   struct reg_entry *new_reg;
2093   const char *name;
2094
2095   if ((new_reg = (struct reg_entry *) hash_find (arm_reg_hsh, str)) != 0)
2096     {
2097       if (new_reg->builtin)
2098         as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
2099
2100       /* Only warn about a redefinition if it's not defined as the
2101          same register.  */
2102       else if (new_reg->number != number || new_reg->type != type)
2103         as_warn (_("ignoring redefinition of register alias '%s'"), str);
2104
2105       return NULL;
2106     }
2107
2108   name = xstrdup (str);
2109   new_reg = (struct reg_entry *) xmalloc (sizeof (struct reg_entry));
2110
2111   new_reg->name = name;
2112   new_reg->number = number;
2113   new_reg->type = type;
2114   new_reg->builtin = FALSE;
2115   new_reg->neon = NULL;
2116
2117   if (hash_insert (arm_reg_hsh, name, (void *) new_reg))
2118     abort ();
2119
2120   return new_reg;
2121 }
2122
2123 static void
2124 insert_neon_reg_alias (char *str, int number, int type,
2125                        struct neon_typed_alias *atype)
2126 {
2127   struct reg_entry *reg = insert_reg_alias (str, number, type);
2128
2129   if (!reg)
2130     {
2131       first_error (_("attempt to redefine typed alias"));
2132       return;
2133     }
2134
2135   if (atype)
2136     {
2137       reg->neon = (struct neon_typed_alias *)
2138           xmalloc (sizeof (struct neon_typed_alias));
2139       *reg->neon = *atype;
2140     }
2141 }
2142
2143 /* Look for the .req directive.  This is of the form:
2144
2145         new_register_name .req existing_register_name
2146
2147    If we find one, or if it looks sufficiently like one that we want to
2148    handle any error here, return TRUE.  Otherwise return FALSE.  */
2149
2150 static bfd_boolean
2151 create_register_alias (char * newname, char *p)
2152 {
2153   struct reg_entry *old;
2154   char *oldname, *nbuf;
2155   size_t nlen;
2156
2157   /* The input scrubber ensures that whitespace after the mnemonic is
2158      collapsed to single spaces.  */
2159   oldname = p;
2160   if (strncmp (oldname, " .req ", 6) != 0)
2161     return FALSE;
2162
2163   oldname += 6;
2164   if (*oldname == '\0')
2165     return FALSE;
2166
2167   old = (struct reg_entry *) hash_find (arm_reg_hsh, oldname);
2168   if (!old)
2169     {
2170       as_warn (_("unknown register '%s' -- .req ignored"), oldname);
2171       return TRUE;
2172     }
2173
2174   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2175      the desired alias name, and p points to its end.  If not, then
2176      the desired alias name is in the global original_case_string.  */
2177 #ifdef TC_CASE_SENSITIVE
2178   nlen = p - newname;
2179 #else
2180   newname = original_case_string;
2181   nlen = strlen (newname);
2182 #endif
2183
2184   nbuf = (char *) alloca (nlen + 1);
2185   memcpy (nbuf, newname, nlen);
2186   nbuf[nlen] = '\0';
2187
2188   /* Create aliases under the new name as stated; an all-lowercase
2189      version of the new name; and an all-uppercase version of the new
2190      name.  */
2191   if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
2192     {
2193       for (p = nbuf; *p; p++)
2194         *p = TOUPPER (*p);
2195
2196       if (strncmp (nbuf, newname, nlen))
2197         {
2198           /* If this attempt to create an additional alias fails, do not bother
2199              trying to create the all-lower case alias.  We will fail and issue
2200              a second, duplicate error message.  This situation arises when the
2201              programmer does something like:
2202                foo .req r0
2203                Foo .req r1
2204              The second .req creates the "Foo" alias but then fails to create
2205              the artificial FOO alias because it has already been created by the
2206              first .req.  */
2207           if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
2208             return TRUE;
2209         }
2210
2211       for (p = nbuf; *p; p++)
2212         *p = TOLOWER (*p);
2213
2214       if (strncmp (nbuf, newname, nlen))
2215         insert_reg_alias (nbuf, old->number, old->type);
2216     }
2217
2218   return TRUE;
2219 }
2220
2221 /* Create a Neon typed/indexed register alias using directives, e.g.:
2222      X .dn d5.s32[1]
2223      Y .qn 6.s16
2224      Z .dn d7
2225      T .dn Z[0]
2226    These typed registers can be used instead of the types specified after the
2227    Neon mnemonic, so long as all operands given have types. Types can also be
2228    specified directly, e.g.:
2229      vadd d0.s32, d1.s32, d2.s32  */
2230
2231 static bfd_boolean
2232 create_neon_reg_alias (char *newname, char *p)
2233 {
2234   enum arm_reg_type basetype;
2235   struct reg_entry *basereg;
2236   struct reg_entry mybasereg;
2237   struct neon_type ntype;
2238   struct neon_typed_alias typeinfo;
2239   char *namebuf, *nameend ATTRIBUTE_UNUSED;
2240   int namelen;
2241
2242   typeinfo.defined = 0;
2243   typeinfo.eltype.type = NT_invtype;
2244   typeinfo.eltype.size = -1;
2245   typeinfo.index = -1;
2246
2247   nameend = p;
2248
2249   if (strncmp (p, " .dn ", 5) == 0)
2250     basetype = REG_TYPE_VFD;
2251   else if (strncmp (p, " .qn ", 5) == 0)
2252     basetype = REG_TYPE_NQ;
2253   else
2254     return FALSE;
2255
2256   p += 5;
2257
2258   if (*p == '\0')
2259     return FALSE;
2260
2261   basereg = arm_reg_parse_multi (&p);
2262
2263   if (basereg && basereg->type != basetype)
2264     {
2265       as_bad (_("bad type for register"));
2266       return FALSE;
2267     }
2268
2269   if (basereg == NULL)
2270     {
2271       expressionS exp;
2272       /* Try parsing as an integer.  */
2273       my_get_expression (&exp, &p, GE_NO_PREFIX);
2274       if (exp.X_op != O_constant)
2275         {
2276           as_bad (_("expression must be constant"));
2277           return FALSE;
2278         }
2279       basereg = &mybasereg;
2280       basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
2281                                                   : exp.X_add_number;
2282       basereg->neon = 0;
2283     }
2284
2285   if (basereg->neon)
2286     typeinfo = *basereg->neon;
2287
2288   if (parse_neon_type (&ntype, &p) == SUCCESS)
2289     {
2290       /* We got a type.  */
2291       if (typeinfo.defined & NTA_HASTYPE)
2292         {
2293           as_bad (_("can't redefine the type of a register alias"));
2294           return FALSE;
2295         }
2296
2297       typeinfo.defined |= NTA_HASTYPE;
2298       if (ntype.elems != 1)
2299         {
2300           as_bad (_("you must specify a single type only"));
2301           return FALSE;
2302         }
2303       typeinfo.eltype = ntype.el[0];
2304     }
2305
2306   if (skip_past_char (&p, '[') == SUCCESS)
2307     {
2308       expressionS exp;
2309       /* We got a scalar index.  */
2310
2311       if (typeinfo.defined & NTA_HASINDEX)
2312         {
2313           as_bad (_("can't redefine the index of a scalar alias"));
2314           return FALSE;
2315         }
2316
2317       my_get_expression (&exp, &p, GE_NO_PREFIX);
2318
2319       if (exp.X_op != O_constant)
2320         {
2321           as_bad (_("scalar index must be constant"));
2322           return FALSE;
2323         }
2324
2325       typeinfo.defined |= NTA_HASINDEX;
2326       typeinfo.index = exp.X_add_number;
2327
2328       if (skip_past_char (&p, ']') == FAIL)
2329         {
2330           as_bad (_("expecting ]"));
2331           return FALSE;
2332         }
2333     }
2334
2335   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2336      the desired alias name, and p points to its end.  If not, then
2337      the desired alias name is in the global original_case_string.  */
2338 #ifdef TC_CASE_SENSITIVE
2339   namelen = nameend - newname;
2340 #else
2341   newname = original_case_string;
2342   namelen = strlen (newname);
2343 #endif
2344
2345   namebuf = (char *) alloca (namelen + 1);
2346   strncpy (namebuf, newname, namelen);
2347   namebuf[namelen] = '\0';
2348
2349   insert_neon_reg_alias (namebuf, basereg->number, basetype,
2350                          typeinfo.defined != 0 ? &typeinfo : NULL);
2351
2352   /* Insert name in all uppercase.  */
2353   for (p = namebuf; *p; p++)
2354     *p = TOUPPER (*p);
2355
2356   if (strncmp (namebuf, newname, namelen))
2357     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2358                            typeinfo.defined != 0 ? &typeinfo : NULL);
2359
2360   /* Insert name in all lowercase.  */
2361   for (p = namebuf; *p; p++)
2362     *p = TOLOWER (*p);
2363
2364   if (strncmp (namebuf, newname, namelen))
2365     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2366                            typeinfo.defined != 0 ? &typeinfo : NULL);
2367
2368   return TRUE;
2369 }
2370
2371 /* Should never be called, as .req goes between the alias and the
2372    register name, not at the beginning of the line.  */
2373
2374 static void
2375 s_req (int a ATTRIBUTE_UNUSED)
2376 {
2377   as_bad (_("invalid syntax for .req directive"));
2378 }
2379
2380 static void
2381 s_dn (int a ATTRIBUTE_UNUSED)
2382 {
2383   as_bad (_("invalid syntax for .dn directive"));
2384 }
2385
2386 static void
2387 s_qn (int a ATTRIBUTE_UNUSED)
2388 {
2389   as_bad (_("invalid syntax for .qn directive"));
2390 }
2391
2392 /* The .unreq directive deletes an alias which was previously defined
2393    by .req.  For example:
2394
2395        my_alias .req r11
2396        .unreq my_alias    */
2397
2398 static void
2399 s_unreq (int a ATTRIBUTE_UNUSED)
2400 {
2401   char * name;
2402   char saved_char;
2403
2404   name = input_line_pointer;
2405
2406   while (*input_line_pointer != 0
2407          && *input_line_pointer != ' '
2408          && *input_line_pointer != '\n')
2409     ++input_line_pointer;
2410
2411   saved_char = *input_line_pointer;
2412   *input_line_pointer = 0;
2413
2414   if (!*name)
2415     as_bad (_("invalid syntax for .unreq directive"));
2416   else
2417     {
2418       struct reg_entry *reg = (struct reg_entry *) hash_find (arm_reg_hsh,
2419                                                               name);
2420
2421       if (!reg)
2422         as_bad (_("unknown register alias '%s'"), name);
2423       else if (reg->builtin)
2424         as_warn (_("ignoring attempt to use .unreq on fixed register name: '%s'"),
2425                  name);
2426       else
2427         {
2428           char * p;
2429           char * nbuf;
2430
2431           hash_delete (arm_reg_hsh, name, FALSE);
2432           free ((char *) reg->name);
2433           if (reg->neon)
2434             free (reg->neon);
2435           free (reg);
2436
2437           /* Also locate the all upper case and all lower case versions.
2438              Do not complain if we cannot find one or the other as it
2439              was probably deleted above.  */
2440
2441           nbuf = strdup (name);
2442           for (p = nbuf; *p; p++)
2443             *p = TOUPPER (*p);
2444           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2445           if (reg)
2446             {
2447               hash_delete (arm_reg_hsh, nbuf, FALSE);
2448               free ((char *) reg->name);
2449               if (reg->neon)
2450                 free (reg->neon);
2451               free (reg);
2452             }
2453
2454           for (p = nbuf; *p; p++)
2455             *p = TOLOWER (*p);
2456           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2457           if (reg)
2458             {
2459               hash_delete (arm_reg_hsh, nbuf, FALSE);
2460               free ((char *) reg->name);
2461               if (reg->neon)
2462                 free (reg->neon);
2463               free (reg);
2464             }
2465
2466           free (nbuf);
2467         }
2468     }
2469
2470   *input_line_pointer = saved_char;
2471   demand_empty_rest_of_line ();
2472 }
2473
2474 /* Directives: Instruction set selection.  */
2475
2476 #ifdef OBJ_ELF
2477 /* This code is to handle mapping symbols as defined in the ARM ELF spec.
2478    (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2479    Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2480    and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped.  */
2481
2482 /* Create a new mapping symbol for the transition to STATE.  */
2483
2484 static void
2485 make_mapping_symbol (enum mstate state, valueT value, fragS *frag)
2486 {
2487   symbolS * symbolP;
2488   const char * symname;
2489   int type;
2490
2491   switch (state)
2492     {
2493     case MAP_DATA:
2494       symname = "$d";
2495       type = BSF_NO_FLAGS;
2496       break;
2497     case MAP_ARM:
2498       symname = "$a";
2499       type = BSF_NO_FLAGS;
2500       break;
2501     case MAP_THUMB:
2502       symname = "$t";
2503       type = BSF_NO_FLAGS;
2504       break;
2505     default:
2506       abort ();
2507     }
2508
2509   symbolP = symbol_new (symname, now_seg, value, frag);
2510   symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2511
2512   switch (state)
2513     {
2514     case MAP_ARM:
2515       THUMB_SET_FUNC (symbolP, 0);
2516       ARM_SET_THUMB (symbolP, 0);
2517       ARM_SET_INTERWORK (symbolP, support_interwork);
2518       break;
2519
2520     case MAP_THUMB:
2521       THUMB_SET_FUNC (symbolP, 1);
2522       ARM_SET_THUMB (symbolP, 1);
2523       ARM_SET_INTERWORK (symbolP, support_interwork);
2524       break;
2525
2526     case MAP_DATA:
2527     default:
2528       break;
2529     }
2530
2531   /* Save the mapping symbols for future reference.  Also check that
2532      we do not place two mapping symbols at the same offset within a
2533      frag.  We'll handle overlap between frags in
2534      check_mapping_symbols.
2535
2536      If .fill or other data filling directive generates zero sized data,
2537      the mapping symbol for the following code will have the same value
2538      as the one generated for the data filling directive.  In this case,
2539      we replace the old symbol with the new one at the same address.  */
2540   if (value == 0)
2541     {
2542       if (frag->tc_frag_data.first_map != NULL)
2543         {
2544           know (S_GET_VALUE (frag->tc_frag_data.first_map) == 0);
2545           symbol_remove (frag->tc_frag_data.first_map, &symbol_rootP, &symbol_lastP);
2546         }
2547       frag->tc_frag_data.first_map = symbolP;
2548     }
2549   if (frag->tc_frag_data.last_map != NULL)
2550     {
2551       know (S_GET_VALUE (frag->tc_frag_data.last_map) <= S_GET_VALUE (symbolP));
2552       if (S_GET_VALUE (frag->tc_frag_data.last_map) == S_GET_VALUE (symbolP))
2553         symbol_remove (frag->tc_frag_data.last_map, &symbol_rootP, &symbol_lastP);
2554     }
2555   frag->tc_frag_data.last_map = symbolP;
2556 }
2557
2558 /* We must sometimes convert a region marked as code to data during
2559    code alignment, if an odd number of bytes have to be padded.  The
2560    code mapping symbol is pushed to an aligned address.  */
2561
2562 static void
2563 insert_data_mapping_symbol (enum mstate state,
2564                             valueT value, fragS *frag, offsetT bytes)
2565 {
2566   /* If there was already a mapping symbol, remove it.  */
2567   if (frag->tc_frag_data.last_map != NULL
2568       && S_GET_VALUE (frag->tc_frag_data.last_map) == frag->fr_address + value)
2569     {
2570       symbolS *symp = frag->tc_frag_data.last_map;
2571
2572       if (value == 0)
2573         {
2574           know (frag->tc_frag_data.first_map == symp);
2575           frag->tc_frag_data.first_map = NULL;
2576         }
2577       frag->tc_frag_data.last_map = NULL;
2578       symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2579     }
2580
2581   make_mapping_symbol (MAP_DATA, value, frag);
2582   make_mapping_symbol (state, value + bytes, frag);
2583 }
2584
2585 static void mapping_state_2 (enum mstate state, int max_chars);
2586
2587 /* Set the mapping state to STATE.  Only call this when about to
2588    emit some STATE bytes to the file.  */
2589
2590 void
2591 mapping_state (enum mstate state)
2592 {
2593   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2594
2595 #define TRANSITION(from, to) (mapstate == (from) && state == (to))
2596
2597   if (mapstate == state)
2598     /* The mapping symbol has already been emitted.
2599        There is nothing else to do.  */
2600     return;
2601
2602   if (state == MAP_ARM || state == MAP_THUMB)
2603     /*  PR gas/12931
2604         All ARM instructions require 4-byte alignment.
2605         (Almost) all Thumb instructions require 2-byte alignment.
2606
2607         When emitting instructions into any section, mark the section
2608         appropriately.
2609
2610         Some Thumb instructions are alignment-sensitive modulo 4 bytes,
2611         but themselves require 2-byte alignment; this applies to some
2612         PC- relative forms.  However, these cases will invovle implicit
2613         literal pool generation or an explicit .align >=2, both of
2614         which will cause the section to me marked with sufficient
2615         alignment.  Thus, we don't handle those cases here.  */
2616     record_alignment (now_seg, state == MAP_ARM ? 2 : 1);
2617
2618   if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
2619     /* This case will be evaluated later in the next else.  */
2620     return;
2621   else if (TRANSITION (MAP_UNDEFINED, MAP_ARM)
2622           || TRANSITION (MAP_UNDEFINED, MAP_THUMB))
2623     {
2624       /* Only add the symbol if the offset is > 0:
2625          if we're at the first frag, check it's size > 0;
2626          if we're not at the first frag, then for sure
2627             the offset is > 0.  */
2628       struct frag * const frag_first = seg_info (now_seg)->frchainP->frch_root;
2629       const int add_symbol = (frag_now != frag_first) || (frag_now_fix () > 0);
2630
2631       if (add_symbol)
2632         make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
2633     }
2634
2635   mapping_state_2 (state, 0);
2636 #undef TRANSITION
2637 }
2638
2639 /* Same as mapping_state, but MAX_CHARS bytes have already been
2640    allocated.  Put the mapping symbol that far back.  */
2641
2642 static void
2643 mapping_state_2 (enum mstate state, int max_chars)
2644 {
2645   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2646
2647   if (!SEG_NORMAL (now_seg))
2648     return;
2649
2650   if (mapstate == state)
2651     /* The mapping symbol has already been emitted.
2652        There is nothing else to do.  */
2653     return;
2654
2655   seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2656   make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
2657 }
2658 #else
2659 #define mapping_state(x) ((void)0)
2660 #define mapping_state_2(x, y) ((void)0)
2661 #endif
2662
2663 /* Find the real, Thumb encoded start of a Thumb function.  */
2664
2665 #ifdef OBJ_COFF
2666 static symbolS *
2667 find_real_start (symbolS * symbolP)
2668 {
2669   char *       real_start;
2670   const char * name = S_GET_NAME (symbolP);
2671   symbolS *    new_target;
2672
2673   /* This definition must agree with the one in gcc/config/arm/thumb.c.  */
2674 #define STUB_NAME ".real_start_of"
2675
2676   if (name == NULL)
2677     abort ();
2678
2679   /* The compiler may generate BL instructions to local labels because
2680      it needs to perform a branch to a far away location. These labels
2681      do not have a corresponding ".real_start_of" label.  We check
2682      both for S_IS_LOCAL and for a leading dot, to give a way to bypass
2683      the ".real_start_of" convention for nonlocal branches.  */
2684   if (S_IS_LOCAL (symbolP) || name[0] == '.')
2685     return symbolP;
2686
2687   real_start = ACONCAT ((STUB_NAME, name, NULL));
2688   new_target = symbol_find (real_start);
2689
2690   if (new_target == NULL)
2691     {
2692       as_warn (_("Failed to find real start of function: %s\n"), name);
2693       new_target = symbolP;
2694     }
2695
2696   return new_target;
2697 }
2698 #endif
2699
2700 static void
2701 opcode_select (int width)
2702 {
2703   switch (width)
2704     {
2705     case 16:
2706       if (! thumb_mode)
2707         {
2708           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
2709             as_bad (_("selected processor does not support THUMB opcodes"));
2710
2711           thumb_mode = 1;
2712           /* No need to force the alignment, since we will have been
2713              coming from ARM mode, which is word-aligned.  */
2714           record_alignment (now_seg, 1);
2715         }
2716       break;
2717
2718     case 32:
2719       if (thumb_mode)
2720         {
2721           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
2722             as_bad (_("selected processor does not support ARM opcodes"));
2723
2724           thumb_mode = 0;
2725
2726           if (!need_pass_2)
2727             frag_align (2, 0, 0);
2728
2729           record_alignment (now_seg, 1);
2730         }
2731       break;
2732
2733     default:
2734       as_bad (_("invalid instruction size selected (%d)"), width);
2735     }
2736 }
2737
2738 static void
2739 s_arm (int ignore ATTRIBUTE_UNUSED)
2740 {
2741   opcode_select (32);
2742   demand_empty_rest_of_line ();
2743 }
2744
2745 static void
2746 s_thumb (int ignore ATTRIBUTE_UNUSED)
2747 {
2748   opcode_select (16);
2749   demand_empty_rest_of_line ();
2750 }
2751
2752 static void
2753 s_code (int unused ATTRIBUTE_UNUSED)
2754 {
2755   int temp;
2756
2757   temp = get_absolute_expression ();
2758   switch (temp)
2759     {
2760     case 16:
2761     case 32:
2762       opcode_select (temp);
2763       break;
2764
2765     default:
2766       as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
2767     }
2768 }
2769
2770 static void
2771 s_force_thumb (int ignore ATTRIBUTE_UNUSED)
2772 {
2773   /* If we are not already in thumb mode go into it, EVEN if
2774      the target processor does not support thumb instructions.
2775      This is used by gcc/config/arm/lib1funcs.asm for example
2776      to compile interworking support functions even if the
2777      target processor should not support interworking.  */
2778   if (! thumb_mode)
2779     {
2780       thumb_mode = 2;
2781       record_alignment (now_seg, 1);
2782     }
2783
2784   demand_empty_rest_of_line ();
2785 }
2786
2787 static void
2788 s_thumb_func (int ignore ATTRIBUTE_UNUSED)
2789 {
2790   s_thumb (0);
2791
2792   /* The following label is the name/address of the start of a Thumb function.
2793      We need to know this for the interworking support.  */
2794   label_is_thumb_function_name = TRUE;
2795 }
2796
2797 /* Perform a .set directive, but also mark the alias as
2798    being a thumb function.  */
2799
2800 static void
2801 s_thumb_set (int equiv)
2802 {
2803   /* XXX the following is a duplicate of the code for s_set() in read.c
2804      We cannot just call that code as we need to get at the symbol that
2805      is created.  */
2806   char *    name;
2807   char      delim;
2808   char *    end_name;
2809   symbolS * symbolP;
2810
2811   /* Especial apologies for the random logic:
2812      This just grew, and could be parsed much more simply!
2813      Dean - in haste.  */
2814   name      = input_line_pointer;
2815   delim     = get_symbol_end ();
2816   end_name  = input_line_pointer;
2817   *end_name = delim;
2818
2819   if (*input_line_pointer != ',')
2820     {
2821       *end_name = 0;
2822       as_bad (_("expected comma after name \"%s\""), name);
2823       *end_name = delim;
2824       ignore_rest_of_line ();
2825       return;
2826     }
2827
2828   input_line_pointer++;
2829   *end_name = 0;
2830
2831   if (name[0] == '.' && name[1] == '\0')
2832     {
2833       /* XXX - this should not happen to .thumb_set.  */
2834       abort ();
2835     }
2836
2837   if ((symbolP = symbol_find (name)) == NULL
2838       && (symbolP = md_undefined_symbol (name)) == NULL)
2839     {
2840 #ifndef NO_LISTING
2841       /* When doing symbol listings, play games with dummy fragments living
2842          outside the normal fragment chain to record the file and line info
2843          for this symbol.  */
2844       if (listing & LISTING_SYMBOLS)
2845         {
2846           extern struct list_info_struct * listing_tail;
2847           fragS * dummy_frag = (fragS * ) xmalloc (sizeof (fragS));
2848
2849           memset (dummy_frag, 0, sizeof (fragS));
2850           dummy_frag->fr_type = rs_fill;
2851           dummy_frag->line = listing_tail;
2852           symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2853           dummy_frag->fr_symbol = symbolP;
2854         }
2855       else
2856 #endif
2857         symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2858
2859 #ifdef OBJ_COFF
2860       /* "set" symbols are local unless otherwise specified.  */
2861       SF_SET_LOCAL (symbolP);
2862 #endif /* OBJ_COFF  */
2863     }                           /* Make a new symbol.  */
2864
2865   symbol_table_insert (symbolP);
2866
2867   * end_name = delim;
2868
2869   if (equiv
2870       && S_IS_DEFINED (symbolP)
2871       && S_GET_SEGMENT (symbolP) != reg_section)
2872     as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2873
2874   pseudo_set (symbolP);
2875
2876   demand_empty_rest_of_line ();
2877
2878   /* XXX Now we come to the Thumb specific bit of code.  */
2879
2880   THUMB_SET_FUNC (symbolP, 1);
2881   ARM_SET_THUMB (symbolP, 1);
2882 #if defined OBJ_ELF || defined OBJ_COFF
2883   ARM_SET_INTERWORK (symbolP, support_interwork);
2884 #endif
2885 }
2886
2887 /* Directives: Mode selection.  */
2888
2889 /* .syntax [unified|divided] - choose the new unified syntax
2890    (same for Arm and Thumb encoding, modulo slight differences in what
2891    can be represented) or the old divergent syntax for each mode.  */
2892 static void
2893 s_syntax (int unused ATTRIBUTE_UNUSED)
2894 {
2895   char *name, delim;
2896
2897   name = input_line_pointer;
2898   delim = get_symbol_end ();
2899
2900   if (!strcasecmp (name, "unified"))
2901     unified_syntax = TRUE;
2902   else if (!strcasecmp (name, "divided"))
2903     unified_syntax = FALSE;
2904   else
2905     {
2906       as_bad (_("unrecognized syntax mode \"%s\""), name);
2907       return;
2908     }
2909   *input_line_pointer = delim;
2910   demand_empty_rest_of_line ();
2911 }
2912
2913 /* Directives: sectioning and alignment.  */
2914
2915 /* Same as s_align_ptwo but align 0 => align 2.  */
2916
2917 static void
2918 s_align (int unused ATTRIBUTE_UNUSED)
2919 {
2920   int temp;
2921   bfd_boolean fill_p;
2922   long temp_fill;
2923   long max_alignment = 15;
2924
2925   temp = get_absolute_expression ();
2926   if (temp > max_alignment)
2927     as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
2928   else if (temp < 0)
2929     {
2930       as_bad (_("alignment negative. 0 assumed."));
2931       temp = 0;
2932     }
2933
2934   if (*input_line_pointer == ',')
2935     {
2936       input_line_pointer++;
2937       temp_fill = get_absolute_expression ();
2938       fill_p = TRUE;
2939     }
2940   else
2941     {
2942       fill_p = FALSE;
2943       temp_fill = 0;
2944     }
2945
2946   if (!temp)
2947     temp = 2;
2948
2949   /* Only make a frag if we HAVE to.  */
2950   if (temp && !need_pass_2)
2951     {
2952       if (!fill_p && subseg_text_p (now_seg))
2953         frag_align_code (temp, 0);
2954       else
2955         frag_align (temp, (int) temp_fill, 0);
2956     }
2957   demand_empty_rest_of_line ();
2958
2959   record_alignment (now_seg, temp);
2960 }
2961
2962 static void
2963 s_bss (int ignore ATTRIBUTE_UNUSED)
2964 {
2965   /* We don't support putting frags in the BSS segment, we fake it by
2966      marking in_bss, then looking at s_skip for clues.  */
2967   subseg_set (bss_section, 0);
2968   demand_empty_rest_of_line ();
2969
2970 #ifdef md_elf_section_change_hook
2971   md_elf_section_change_hook ();
2972 #endif
2973 }
2974
2975 static void
2976 s_even (int ignore ATTRIBUTE_UNUSED)
2977 {
2978   /* Never make frag if expect extra pass.  */
2979   if (!need_pass_2)
2980     frag_align (1, 0, 0);
2981
2982   record_alignment (now_seg, 1);
2983
2984   demand_empty_rest_of_line ();
2985 }
2986
2987 /* Directives: Literal pools.  */
2988
2989 static literal_pool *
2990 find_literal_pool (void)
2991 {
2992   literal_pool * pool;
2993
2994   for (pool = list_of_pools; pool != NULL; pool = pool->next)
2995     {
2996       if (pool->section == now_seg
2997           && pool->sub_section == now_subseg)
2998         break;
2999     }
3000
3001   return pool;
3002 }
3003
3004 static literal_pool *
3005 find_or_make_literal_pool (void)
3006 {
3007   /* Next literal pool ID number.  */
3008   static unsigned int latest_pool_num = 1;
3009   literal_pool *      pool;
3010
3011   pool = find_literal_pool ();
3012
3013   if (pool == NULL)
3014     {
3015       /* Create a new pool.  */
3016       pool = (literal_pool *) xmalloc (sizeof (* pool));
3017       if (! pool)
3018         return NULL;
3019
3020       pool->next_free_entry = 0;
3021       pool->section         = now_seg;
3022       pool->sub_section     = now_subseg;
3023       pool->next            = list_of_pools;
3024       pool->symbol          = NULL;
3025
3026       /* Add it to the list.  */
3027       list_of_pools = pool;
3028     }
3029
3030   /* New pools, and emptied pools, will have a NULL symbol.  */
3031   if (pool->symbol == NULL)
3032     {
3033       pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
3034                                     (valueT) 0, &zero_address_frag);
3035       pool->id = latest_pool_num ++;
3036     }
3037
3038   /* Done.  */
3039   return pool;
3040 }
3041
3042 /* Add the literal in the global 'inst'
3043    structure to the relevant literal pool.  */
3044
3045 static int
3046 add_to_lit_pool (void)
3047 {
3048   literal_pool * pool;
3049   unsigned int entry;
3050
3051   pool = find_or_make_literal_pool ();
3052
3053   /* Check if this literal value is already in the pool.  */
3054   for (entry = 0; entry < pool->next_free_entry; entry ++)
3055     {
3056       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3057           && (inst.reloc.exp.X_op == O_constant)
3058           && (pool->literals[entry].X_add_number
3059               == inst.reloc.exp.X_add_number)
3060           && (pool->literals[entry].X_unsigned
3061               == inst.reloc.exp.X_unsigned))
3062         break;
3063
3064       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3065           && (inst.reloc.exp.X_op == O_symbol)
3066           && (pool->literals[entry].X_add_number
3067               == inst.reloc.exp.X_add_number)
3068           && (pool->literals[entry].X_add_symbol
3069               == inst.reloc.exp.X_add_symbol)
3070           && (pool->literals[entry].X_op_symbol
3071               == inst.reloc.exp.X_op_symbol))
3072         break;
3073     }
3074
3075   /* Do we need to create a new entry?  */
3076   if (entry == pool->next_free_entry)
3077     {
3078       if (entry >= MAX_LITERAL_POOL_SIZE)
3079         {
3080           inst.error = _("literal pool overflow");
3081           return FAIL;
3082         }
3083
3084       pool->literals[entry] = inst.reloc.exp;
3085 #ifdef OBJ_ELF
3086       /* PR ld/12974: Record the location of the first source line to reference
3087          this entry in the literal pool.  If it turns out during linking that the
3088          symbol does not exist we will be able to give an accurate line number for
3089          the (first use of the) missing reference.  */
3090       if (debug_type == DEBUG_DWARF2)
3091         dwarf2_where (pool->locs + entry);
3092 #endif
3093       pool->next_free_entry += 1;
3094     }
3095
3096   inst.reloc.exp.X_op         = O_symbol;
3097   inst.reloc.exp.X_add_number = ((int) entry) * 4;
3098   inst.reloc.exp.X_add_symbol = pool->symbol;
3099
3100   return SUCCESS;
3101 }
3102
3103 /* Can't use symbol_new here, so have to create a symbol and then at
3104    a later date assign it a value. Thats what these functions do.  */
3105
3106 static void
3107 symbol_locate (symbolS *    symbolP,
3108                const char * name,       /* It is copied, the caller can modify.  */
3109                segT         segment,    /* Segment identifier (SEG_<something>).  */
3110                valueT       valu,       /* Symbol value.  */
3111                fragS *      frag)       /* Associated fragment.  */
3112 {
3113   unsigned int name_length;
3114   char * preserved_copy_of_name;
3115
3116   name_length = strlen (name) + 1;   /* +1 for \0.  */
3117   obstack_grow (&notes, name, name_length);
3118   preserved_copy_of_name = (char *) obstack_finish (&notes);
3119
3120 #ifdef tc_canonicalize_symbol_name
3121   preserved_copy_of_name =
3122     tc_canonicalize_symbol_name (preserved_copy_of_name);
3123 #endif
3124
3125   S_SET_NAME (symbolP, preserved_copy_of_name);
3126
3127   S_SET_SEGMENT (symbolP, segment);
3128   S_SET_VALUE (symbolP, valu);
3129   symbol_clear_list_pointers (symbolP);
3130
3131   symbol_set_frag (symbolP, frag);
3132
3133   /* Link to end of symbol chain.  */
3134   {
3135     extern int symbol_table_frozen;
3136
3137     if (symbol_table_frozen)
3138       abort ();
3139   }
3140
3141   symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
3142
3143   obj_symbol_new_hook (symbolP);
3144
3145 #ifdef tc_symbol_new_hook
3146   tc_symbol_new_hook (symbolP);
3147 #endif
3148
3149 #ifdef DEBUG_SYMS
3150   verify_symbol_chain (symbol_rootP, symbol_lastP);
3151 #endif /* DEBUG_SYMS  */
3152 }
3153
3154
3155 static void
3156 s_ltorg (int ignored ATTRIBUTE_UNUSED)
3157 {
3158   unsigned int entry;
3159   literal_pool * pool;
3160   char sym_name[20];
3161
3162   pool = find_literal_pool ();
3163   if (pool == NULL
3164       || pool->symbol == NULL
3165       || pool->next_free_entry == 0)
3166     return;
3167
3168   mapping_state (MAP_DATA);
3169
3170   /* Align pool as you have word accesses.
3171      Only make a frag if we have to.  */
3172   if (!need_pass_2)
3173     frag_align (2, 0, 0);
3174
3175   record_alignment (now_seg, 2);
3176
3177   sprintf (sym_name, "$$lit_\002%x", pool->id);
3178
3179   symbol_locate (pool->symbol, sym_name, now_seg,
3180                  (valueT) frag_now_fix (), frag_now);
3181   symbol_table_insert (pool->symbol);
3182
3183   ARM_SET_THUMB (pool->symbol, thumb_mode);
3184
3185 #if defined OBJ_COFF || defined OBJ_ELF
3186   ARM_SET_INTERWORK (pool->symbol, support_interwork);
3187 #endif
3188
3189   for (entry = 0; entry < pool->next_free_entry; entry ++)
3190     {
3191 #ifdef OBJ_ELF
3192       if (debug_type == DEBUG_DWARF2)
3193         dwarf2_gen_line_info (frag_now_fix (), pool->locs + entry);
3194 #endif
3195       /* First output the expression in the instruction to the pool.  */
3196       emit_expr (&(pool->literals[entry]), 4); /* .word  */
3197     }
3198
3199   /* Mark the pool as empty.  */
3200   pool->next_free_entry = 0;
3201   pool->symbol = NULL;
3202 }
3203
3204 #ifdef OBJ_ELF
3205 /* Forward declarations for functions below, in the MD interface
3206    section.  */
3207 static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
3208 static valueT create_unwind_entry (int);
3209 static void start_unwind_section (const segT, int);
3210 static void add_unwind_opcode (valueT, int);
3211 static void flush_pending_unwind (void);
3212
3213 /* Directives: Data.  */
3214
3215 static void
3216 s_arm_elf_cons (int nbytes)
3217 {
3218   expressionS exp;
3219
3220 #ifdef md_flush_pending_output
3221   md_flush_pending_output ();
3222 #endif
3223
3224   if (is_it_end_of_statement ())
3225     {
3226       demand_empty_rest_of_line ();
3227       return;
3228     }
3229
3230 #ifdef md_cons_align
3231   md_cons_align (nbytes);
3232 #endif
3233
3234   mapping_state (MAP_DATA);
3235   do
3236     {
3237       int reloc;
3238       char *base = input_line_pointer;
3239
3240       expression (& exp);
3241
3242       if (exp.X_op != O_symbol)
3243         emit_expr (&exp, (unsigned int) nbytes);
3244       else
3245         {
3246           char *before_reloc = input_line_pointer;
3247           reloc = parse_reloc (&input_line_pointer);
3248           if (reloc == -1)
3249             {
3250               as_bad (_("unrecognized relocation suffix"));
3251               ignore_rest_of_line ();
3252               return;
3253             }
3254           else if (reloc == BFD_RELOC_UNUSED)
3255             emit_expr (&exp, (unsigned int) nbytes);
3256           else
3257             {
3258               reloc_howto_type *howto = (reloc_howto_type *)
3259                   bfd_reloc_type_lookup (stdoutput,
3260                                          (bfd_reloc_code_real_type) reloc);
3261               int size = bfd_get_reloc_size (howto);
3262
3263               if (reloc == BFD_RELOC_ARM_PLT32)
3264                 {
3265                   as_bad (_("(plt) is only valid on branch targets"));
3266                   reloc = BFD_RELOC_UNUSED;
3267                   size = 0;
3268                 }
3269
3270               if (size > nbytes)
3271                 as_bad (_("%s relocations do not fit in %d bytes"),
3272                         howto->name, nbytes);
3273               else
3274                 {
3275                   /* We've parsed an expression stopping at O_symbol.
3276                      But there may be more expression left now that we
3277                      have parsed the relocation marker.  Parse it again.
3278                      XXX Surely there is a cleaner way to do this.  */
3279                   char *p = input_line_pointer;
3280                   int offset;
3281                   char *save_buf = (char *) alloca (input_line_pointer - base);
3282                   memcpy (save_buf, base, input_line_pointer - base);
3283                   memmove (base + (input_line_pointer - before_reloc),
3284                            base, before_reloc - base);
3285
3286                   input_line_pointer = base + (input_line_pointer-before_reloc);
3287                   expression (&exp);
3288                   memcpy (base, save_buf, p - base);
3289
3290                   offset = nbytes - size;
3291                   p = frag_more ((int) nbytes);
3292                   fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
3293                                size, &exp, 0, (enum bfd_reloc_code_real) reloc);
3294                 }
3295             }
3296         }
3297     }
3298   while (*input_line_pointer++ == ',');
3299
3300   /* Put terminator back into stream.  */
3301   input_line_pointer --;
3302   demand_empty_rest_of_line ();
3303 }
3304
3305 /* Emit an expression containing a 32-bit thumb instruction.
3306    Implementation based on put_thumb32_insn.  */
3307
3308 static void
3309 emit_thumb32_expr (expressionS * exp)
3310 {
3311   expressionS exp_high = *exp;
3312
3313   exp_high.X_add_number = (unsigned long)exp_high.X_add_number >> 16;
3314   emit_expr (& exp_high, (unsigned int) THUMB_SIZE);
3315   exp->X_add_number &= 0xffff;
3316   emit_expr (exp, (unsigned int) THUMB_SIZE);
3317 }
3318
3319 /*  Guess the instruction size based on the opcode.  */
3320
3321 static int
3322 thumb_insn_size (int opcode)
3323 {
3324   if ((unsigned int) opcode < 0xe800u)
3325     return 2;
3326   else if ((unsigned int) opcode >= 0xe8000000u)
3327     return 4;
3328   else
3329     return 0;
3330 }
3331
3332 static bfd_boolean
3333 emit_insn (expressionS *exp, int nbytes)
3334 {
3335   int size = 0;
3336
3337   if (exp->X_op == O_constant)
3338     {
3339       size = nbytes;
3340
3341       if (size == 0)
3342         size = thumb_insn_size (exp->X_add_number);
3343
3344       if (size != 0)
3345         {
3346           if (size == 2 && (unsigned int)exp->X_add_number > 0xffffu)
3347             {
3348               as_bad (_(".inst.n operand too big. "\
3349                         "Use .inst.w instead"));
3350               size = 0;
3351             }
3352           else
3353             {
3354               if (now_it.state == AUTOMATIC_IT_BLOCK)
3355                 set_it_insn_type_nonvoid (OUTSIDE_IT_INSN, 0);
3356               else
3357                 set_it_insn_type_nonvoid (NEUTRAL_IT_INSN, 0);
3358
3359               if (thumb_mode && (size > THUMB_SIZE) && !target_big_endian)
3360                 emit_thumb32_expr (exp);
3361               else
3362                 emit_expr (exp, (unsigned int) size);
3363
3364               it_fsm_post_encode ();
3365             }
3366         }
3367       else
3368         as_bad (_("cannot determine Thumb instruction size. "   \
3369                   "Use .inst.n/.inst.w instead"));
3370     }
3371   else
3372     as_bad (_("constant expression required"));
3373
3374   return (size != 0);
3375 }
3376
3377 /* Like s_arm_elf_cons but do not use md_cons_align and
3378    set the mapping state to MAP_ARM/MAP_THUMB.  */
3379
3380 static void
3381 s_arm_elf_inst (int nbytes)
3382 {
3383   if (is_it_end_of_statement ())
3384     {
3385       demand_empty_rest_of_line ();
3386       return;
3387     }
3388
3389   /* Calling mapping_state () here will not change ARM/THUMB,
3390      but will ensure not to be in DATA state.  */
3391
3392   if (thumb_mode)
3393     mapping_state (MAP_THUMB);
3394   else
3395     {
3396       if (nbytes != 0)
3397         {
3398           as_bad (_("width suffixes are invalid in ARM mode"));
3399           ignore_rest_of_line ();
3400           return;
3401         }
3402
3403       nbytes = 4;
3404
3405       mapping_state (MAP_ARM);
3406     }
3407
3408   do
3409     {
3410       expressionS exp;
3411
3412       expression (& exp);
3413
3414       if (! emit_insn (& exp, nbytes))
3415         {
3416           ignore_rest_of_line ();
3417           return;
3418         }
3419     }
3420   while (*input_line_pointer++ == ',');
3421
3422   /* Put terminator back into stream.  */
3423   input_line_pointer --;
3424   demand_empty_rest_of_line ();
3425 }
3426
3427 /* Parse a .rel31 directive.  */
3428
3429 static void
3430 s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
3431 {
3432   expressionS exp;
3433   char *p;
3434   valueT highbit;
3435
3436   highbit = 0;
3437   if (*input_line_pointer == '1')
3438     highbit = 0x80000000;
3439   else if (*input_line_pointer != '0')
3440     as_bad (_("expected 0 or 1"));
3441
3442   input_line_pointer++;
3443   if (*input_line_pointer != ',')
3444     as_bad (_("missing comma"));
3445   input_line_pointer++;
3446
3447 #ifdef md_flush_pending_output
3448   md_flush_pending_output ();
3449 #endif
3450
3451 #ifdef md_cons_align
3452   md_cons_align (4);
3453 #endif
3454
3455   mapping_state (MAP_DATA);
3456
3457   expression (&exp);
3458
3459   p = frag_more (4);
3460   md_number_to_chars (p, highbit, 4);
3461   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3462                BFD_RELOC_ARM_PREL31);
3463
3464   demand_empty_rest_of_line ();
3465 }
3466
3467 /* Directives: AEABI stack-unwind tables.  */
3468
3469 /* Parse an unwind_fnstart directive.  Simply records the current location.  */
3470
3471 static void
3472 s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3473 {
3474   demand_empty_rest_of_line ();
3475   if (unwind.proc_start)
3476     {
3477       as_bad (_("duplicate .fnstart directive"));
3478       return;
3479     }
3480
3481   /* Mark the start of the function.  */
3482   unwind.proc_start = expr_build_dot ();
3483
3484   /* Reset the rest of the unwind info.  */
3485   unwind.opcode_count = 0;
3486   unwind.table_entry = NULL;
3487   unwind.personality_routine = NULL;
3488   unwind.personality_index = -1;
3489   unwind.frame_size = 0;
3490   unwind.fp_offset = 0;
3491   unwind.fp_reg = REG_SP;
3492   unwind.fp_used = 0;
3493   unwind.sp_restored = 0;
3494 }
3495
3496
3497 /* Parse a handlerdata directive.  Creates the exception handling table entry
3498    for the function.  */
3499
3500 static void
3501 s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3502 {
3503   demand_empty_rest_of_line ();
3504   if (!unwind.proc_start)
3505     as_bad (MISSING_FNSTART);
3506
3507   if (unwind.table_entry)
3508     as_bad (_("duplicate .handlerdata directive"));
3509
3510   create_unwind_entry (1);
3511 }
3512
3513 /* Parse an unwind_fnend directive.  Generates the index table entry.  */
3514
3515 static void
3516 s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3517 {
3518   long where;
3519   char *ptr;
3520   valueT val;
3521   unsigned int marked_pr_dependency;
3522
3523   demand_empty_rest_of_line ();
3524
3525   if (!unwind.proc_start)
3526     {
3527       as_bad (_(".fnend directive without .fnstart"));
3528       return;
3529     }
3530
3531   /* Add eh table entry.  */
3532   if (unwind.table_entry == NULL)
3533     val = create_unwind_entry (0);
3534   else
3535     val = 0;
3536
3537   /* Add index table entry.  This is two words.  */
3538   start_unwind_section (unwind.saved_seg, 1);
3539   frag_align (2, 0, 0);
3540   record_alignment (now_seg, 2);
3541
3542   ptr = frag_more (8);
3543   memset (ptr, 0, 8);
3544   where = frag_now_fix () - 8;
3545
3546   /* Self relative offset of the function start.  */
3547   fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3548            BFD_RELOC_ARM_PREL31);
3549
3550   /* Indicate dependency on EHABI-defined personality routines to the
3551      linker, if it hasn't been done already.  */
3552   marked_pr_dependency
3553     = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
3554   if (unwind.personality_index >= 0 && unwind.personality_index < 3
3555       && !(marked_pr_dependency & (1 << unwind.personality_index)))
3556     {
3557       static const char *const name[] =
3558         {
3559           "__aeabi_unwind_cpp_pr0",
3560           "__aeabi_unwind_cpp_pr1",
3561           "__aeabi_unwind_cpp_pr2"
3562         };
3563       symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3564       fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
3565       seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
3566         |= 1 << unwind.personality_index;
3567     }
3568
3569   if (val)
3570     /* Inline exception table entry.  */
3571     md_number_to_chars (ptr + 4, val, 4);
3572   else
3573     /* Self relative offset of the table entry.  */
3574     fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3575              BFD_RELOC_ARM_PREL31);
3576
3577   /* Restore the original section.  */
3578   subseg_set (unwind.saved_seg, unwind.saved_subseg);
3579
3580   unwind.proc_start = NULL;
3581 }
3582
3583
3584 /* Parse an unwind_cantunwind directive.  */
3585
3586 static void
3587 s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3588 {
3589   demand_empty_rest_of_line ();
3590   if (!unwind.proc_start)
3591     as_bad (MISSING_FNSTART);
3592
3593   if (unwind.personality_routine || unwind.personality_index != -1)
3594     as_bad (_("personality routine specified for cantunwind frame"));
3595
3596   unwind.personality_index = -2;
3597 }
3598
3599
3600 /* Parse a personalityindex directive.  */
3601
3602 static void
3603 s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3604 {
3605   expressionS exp;
3606
3607   if (!unwind.proc_start)
3608     as_bad (MISSING_FNSTART);
3609
3610   if (unwind.personality_routine || unwind.personality_index != -1)
3611     as_bad (_("duplicate .personalityindex directive"));
3612
3613   expression (&exp);
3614
3615   if (exp.X_op != O_constant
3616       || exp.X_add_number < 0 || exp.X_add_number > 15)
3617     {
3618       as_bad (_("bad personality routine number"));
3619       ignore_rest_of_line ();
3620       return;
3621     }
3622
3623   unwind.personality_index = exp.X_add_number;
3624
3625   demand_empty_rest_of_line ();
3626 }
3627
3628
3629 /* Parse a personality directive.  */
3630
3631 static void
3632 s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3633 {
3634   char *name, *p, c;
3635
3636   if (!unwind.proc_start)
3637     as_bad (MISSING_FNSTART);
3638
3639   if (unwind.personality_routine || unwind.personality_index != -1)
3640     as_bad (_("duplicate .personality directive"));
3641
3642   name = input_line_pointer;
3643   c = get_symbol_end ();
3644   p = input_line_pointer;
3645   unwind.personality_routine = symbol_find_or_make (name);
3646   *p = c;
3647   demand_empty_rest_of_line ();
3648 }
3649
3650
3651 /* Parse a directive saving core registers.  */
3652
3653 static void
3654 s_arm_unwind_save_core (void)
3655 {
3656   valueT op;
3657   long range;
3658   int n;
3659
3660   range = parse_reg_list (&input_line_pointer);
3661   if (range == FAIL)
3662     {
3663       as_bad (_("expected register list"));
3664       ignore_rest_of_line ();
3665       return;
3666     }
3667
3668   demand_empty_rest_of_line ();
3669
3670   /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3671      into .unwind_save {..., sp...}.  We aren't bothered about the value of
3672      ip because it is clobbered by calls.  */
3673   if (unwind.sp_restored && unwind.fp_reg == 12
3674       && (range & 0x3000) == 0x1000)
3675     {
3676       unwind.opcode_count--;
3677       unwind.sp_restored = 0;
3678       range = (range | 0x2000) & ~0x1000;
3679       unwind.pending_offset = 0;
3680     }
3681
3682   /* Pop r4-r15.  */
3683   if (range & 0xfff0)
3684     {
3685       /* See if we can use the short opcodes.  These pop a block of up to 8
3686          registers starting with r4, plus maybe r14.  */
3687       for (n = 0; n < 8; n++)
3688         {
3689           /* Break at the first non-saved register.      */
3690           if ((range & (1 << (n + 4))) == 0)
3691             break;
3692         }
3693       /* See if there are any other bits set.  */
3694       if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
3695         {
3696           /* Use the long form.  */
3697           op = 0x8000 | ((range >> 4) & 0xfff);
3698           add_unwind_opcode (op, 2);
3699         }
3700       else
3701         {
3702           /* Use the short form.  */
3703           if (range & 0x4000)
3704             op = 0xa8; /* Pop r14.      */
3705           else
3706             op = 0xa0; /* Do not pop r14.  */
3707           op |= (n - 1);
3708           add_unwind_opcode (op, 1);
3709         }
3710     }
3711
3712   /* Pop r0-r3.  */
3713   if (range & 0xf)
3714     {
3715       op = 0xb100 | (range & 0xf);
3716       add_unwind_opcode (op, 2);
3717     }
3718
3719   /* Record the number of bytes pushed.  */
3720   for (n = 0; n < 16; n++)
3721     {
3722       if (range & (1 << n))
3723         unwind.frame_size += 4;
3724     }
3725 }
3726
3727
3728 /* Parse a directive saving FPA registers.  */
3729
3730 static void
3731 s_arm_unwind_save_fpa (int reg)
3732 {
3733   expressionS exp;
3734   int num_regs;
3735   valueT op;
3736
3737   /* Get Number of registers to transfer.  */
3738   if (skip_past_comma (&input_line_pointer) != FAIL)
3739     expression (&exp);
3740   else
3741     exp.X_op = O_illegal;
3742
3743   if (exp.X_op != O_constant)
3744     {
3745       as_bad (_("expected , <constant>"));
3746       ignore_rest_of_line ();
3747       return;
3748     }
3749
3750   num_regs = exp.X_add_number;
3751
3752   if (num_regs < 1 || num_regs > 4)
3753     {
3754       as_bad (_("number of registers must be in the range [1:4]"));
3755       ignore_rest_of_line ();
3756       return;
3757     }
3758
3759   demand_empty_rest_of_line ();
3760
3761   if (reg == 4)
3762     {
3763       /* Short form.  */
3764       op = 0xb4 | (num_regs - 1);
3765       add_unwind_opcode (op, 1);
3766     }
3767   else
3768     {
3769       /* Long form.  */
3770       op = 0xc800 | (reg << 4) | (num_regs - 1);
3771       add_unwind_opcode (op, 2);
3772     }
3773   unwind.frame_size += num_regs * 12;
3774 }
3775
3776
3777 /* Parse a directive saving VFP registers for ARMv6 and above.  */
3778
3779 static void
3780 s_arm_unwind_save_vfp_armv6 (void)
3781 {
3782   int count;
3783   unsigned int start;
3784   valueT op;
3785   int num_vfpv3_regs = 0;
3786   int num_regs_below_16;
3787
3788   count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
3789   if (count == FAIL)
3790     {
3791       as_bad (_("expected register list"));
3792       ignore_rest_of_line ();
3793       return;
3794     }
3795
3796   demand_empty_rest_of_line ();
3797
3798   /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
3799      than FSTMX/FLDMX-style ones).  */
3800
3801   /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31.  */
3802   if (start >= 16)
3803     num_vfpv3_regs = count;
3804   else if (start + count > 16)
3805     num_vfpv3_regs = start + count - 16;
3806
3807   if (num_vfpv3_regs > 0)
3808     {
3809       int start_offset = start > 16 ? start - 16 : 0;
3810       op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
3811       add_unwind_opcode (op, 2);
3812     }
3813
3814   /* Generate opcode for registers numbered in the range 0 .. 15.  */
3815   num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
3816   gas_assert (num_regs_below_16 + num_vfpv3_regs == count);
3817   if (num_regs_below_16 > 0)
3818     {
3819       op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
3820       add_unwind_opcode (op, 2);
3821     }
3822
3823   unwind.frame_size += count * 8;
3824 }
3825
3826
3827 /* Parse a directive saving VFP registers for pre-ARMv6.  */
3828
3829 static void
3830 s_arm_unwind_save_vfp (void)
3831 {
3832   int count;
3833   unsigned int reg;
3834   valueT op;
3835
3836   count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
3837   if (count == FAIL)
3838     {
3839       as_bad (_("expected register list"));
3840       ignore_rest_of_line ();
3841       return;
3842     }
3843
3844   demand_empty_rest_of_line ();
3845
3846   if (reg == 8)
3847     {
3848       /* Short form.  */
3849       op = 0xb8 | (count - 1);
3850       add_unwind_opcode (op, 1);
3851     }
3852   else
3853     {
3854       /* Long form.  */
3855       op = 0xb300 | (reg << 4) | (count - 1);
3856       add_unwind_opcode (op, 2);
3857     }
3858   unwind.frame_size += count * 8 + 4;
3859 }
3860
3861
3862 /* Parse a directive saving iWMMXt data registers.  */
3863
3864 static void
3865 s_arm_unwind_save_mmxwr (void)
3866 {
3867   int reg;
3868   int hi_reg;
3869   int i;
3870   unsigned mask = 0;
3871   valueT op;
3872
3873   if (*input_line_pointer == '{')
3874     input_line_pointer++;
3875
3876   do
3877     {
3878       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
3879
3880       if (reg == FAIL)
3881         {
3882           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
3883           goto error;
3884         }
3885
3886       if (mask >> reg)
3887         as_tsktsk (_("register list not in ascending order"));
3888       mask |= 1 << reg;
3889
3890       if (*input_line_pointer == '-')
3891         {
3892           input_line_pointer++;
3893           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
3894           if (hi_reg == FAIL)
3895             {
3896               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
3897               goto error;
3898             }
3899           else if (reg >= hi_reg)
3900             {
3901               as_bad (_("bad register range"));
3902               goto error;
3903             }
3904           for (; reg < hi_reg; reg++)
3905             mask |= 1 << reg;
3906         }
3907     }
3908   while (skip_past_comma (&input_line_pointer) != FAIL);
3909
3910   if (*input_line_pointer == '}')
3911     input_line_pointer++;
3912
3913   demand_empty_rest_of_line ();
3914
3915   /* Generate any deferred opcodes because we're going to be looking at
3916      the list.  */
3917   flush_pending_unwind ();
3918
3919   for (i = 0; i < 16; i++)
3920     {
3921       if (mask & (1 << i))
3922         unwind.frame_size += 8;
3923     }
3924
3925   /* Attempt to combine with a previous opcode.  We do this because gcc
3926      likes to output separate unwind directives for a single block of
3927      registers.  */
3928   if (unwind.opcode_count > 0)
3929     {
3930       i = unwind.opcodes[unwind.opcode_count - 1];
3931       if ((i & 0xf8) == 0xc0)
3932         {
3933           i &= 7;
3934           /* Only merge if the blocks are contiguous.  */
3935           if (i < 6)
3936             {
3937               if ((mask & 0xfe00) == (1 << 9))
3938                 {
3939                   mask |= ((1 << (i + 11)) - 1) & 0xfc00;
3940                   unwind.opcode_count--;
3941                 }
3942             }
3943           else if (i == 6 && unwind.opcode_count >= 2)
3944             {
3945               i = unwind.opcodes[unwind.opcode_count - 2];
3946               reg = i >> 4;
3947               i &= 0xf;
3948
3949               op = 0xffff << (reg - 1);
3950               if (reg > 0
3951                   && ((mask & op) == (1u << (reg - 1))))
3952                 {
3953                   op = (1 << (reg + i + 1)) - 1;
3954                   op &= ~((1 << reg) - 1);
3955                   mask |= op;
3956                   unwind.opcode_count -= 2;
3957                 }
3958             }
3959         }
3960     }
3961
3962   hi_reg = 15;
3963   /* We want to generate opcodes in the order the registers have been
3964      saved, ie. descending order.  */
3965   for (reg = 15; reg >= -1; reg--)
3966     {
3967       /* Save registers in blocks.  */
3968       if (reg < 0
3969           || !(mask & (1 << reg)))
3970         {
3971           /* We found an unsaved reg.  Generate opcodes to save the
3972              preceding block.   */
3973           if (reg != hi_reg)
3974             {
3975               if (reg == 9)
3976                 {
3977                   /* Short form.  */
3978                   op = 0xc0 | (hi_reg - 10);
3979                   add_unwind_opcode (op, 1);
3980                 }
3981               else
3982                 {
3983                   /* Long form.  */
3984                   op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
3985                   add_unwind_opcode (op, 2);
3986                 }
3987             }
3988           hi_reg = reg - 1;
3989         }
3990     }
3991
3992   return;
3993 error:
3994   ignore_rest_of_line ();
3995 }
3996
3997 static void
3998 s_arm_unwind_save_mmxwcg (void)
3999 {
4000   int reg;
4001   int hi_reg;
4002   unsigned mask = 0;
4003   valueT op;
4004
4005   if (*input_line_pointer == '{')
4006     input_line_pointer++;
4007
4008   do
4009     {
4010       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
4011
4012       if (reg == FAIL)
4013         {
4014           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
4015           goto error;
4016         }
4017
4018       reg -= 8;
4019       if (mask >> reg)
4020         as_tsktsk (_("register list not in ascending order"));
4021       mask |= 1 << reg;
4022
4023       if (*input_line_pointer == '-')
4024         {
4025           input_line_pointer++;
4026           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
4027           if (hi_reg == FAIL)
4028             {
4029               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
4030               goto error;
4031             }
4032           else if (reg >= hi_reg)
4033             {
4034               as_bad (_("bad register range"));
4035               goto error;
4036             }
4037           for (; reg < hi_reg; reg++)
4038             mask |= 1 << reg;
4039         }
4040     }
4041   while (skip_past_comma (&input_line_pointer) != FAIL);
4042
4043   if (*input_line_pointer == '}')
4044     input_line_pointer++;
4045
4046   demand_empty_rest_of_line ();
4047
4048   /* Generate any deferred opcodes because we're going to be looking at
4049      the list.  */
4050   flush_pending_unwind ();
4051
4052   for (reg = 0; reg < 16; reg++)
4053     {
4054       if (mask & (1 << reg))
4055         unwind.frame_size += 4;
4056     }
4057   op = 0xc700 | mask;
4058   add_unwind_opcode (op, 2);
4059   return;
4060 error:
4061   ignore_rest_of_line ();
4062 }
4063
4064
4065 /* Parse an unwind_save directive.
4066    If the argument is non-zero, this is a .vsave directive.  */
4067
4068 static void
4069 s_arm_unwind_save (int arch_v6)
4070 {
4071   char *peek;
4072   struct reg_entry *reg;
4073   bfd_boolean had_brace = FALSE;
4074
4075   if (!unwind.proc_start)
4076     as_bad (MISSING_FNSTART);
4077
4078   /* Figure out what sort of save we have.  */
4079   peek = input_line_pointer;
4080
4081   if (*peek == '{')
4082     {
4083       had_brace = TRUE;
4084       peek++;
4085     }
4086
4087   reg = arm_reg_parse_multi (&peek);
4088
4089   if (!reg)
4090     {
4091       as_bad (_("register expected"));
4092       ignore_rest_of_line ();
4093       return;
4094     }
4095
4096   switch (reg->type)
4097     {
4098     case REG_TYPE_FN:
4099       if (had_brace)
4100         {
4101           as_bad (_("FPA .unwind_save does not take a register list"));
4102           ignore_rest_of_line ();
4103           return;
4104         }
4105       input_line_pointer = peek;
4106       s_arm_unwind_save_fpa (reg->number);
4107       return;
4108
4109     case REG_TYPE_RN:     s_arm_unwind_save_core ();   return;
4110     case REG_TYPE_VFD:
4111       if (arch_v6)
4112         s_arm_unwind_save_vfp_armv6 ();
4113       else
4114         s_arm_unwind_save_vfp ();
4115       return;
4116     case REG_TYPE_MMXWR:  s_arm_unwind_save_mmxwr ();  return;
4117     case REG_TYPE_MMXWCG: s_arm_unwind_save_mmxwcg (); return;
4118
4119     default:
4120       as_bad (_(".unwind_save does not support this kind of register"));
4121       ignore_rest_of_line ();
4122     }
4123 }
4124
4125
4126 /* Parse an unwind_movsp directive.  */
4127
4128 static void
4129 s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
4130 {
4131   int reg;
4132   valueT op;
4133   int offset;
4134
4135   if (!unwind.proc_start)
4136     as_bad (MISSING_FNSTART);
4137
4138   reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4139   if (reg == FAIL)
4140     {
4141       as_bad ("%s", _(reg_expected_msgs[REG_TYPE_RN]));
4142       ignore_rest_of_line ();
4143       return;
4144     }
4145
4146   /* Optional constant.  */
4147   if (skip_past_comma (&input_line_pointer) != FAIL)
4148     {
4149       if (immediate_for_directive (&offset) == FAIL)
4150         return;
4151     }
4152   else
4153     offset = 0;
4154
4155   demand_empty_rest_of_line ();
4156
4157   if (reg == REG_SP || reg == REG_PC)
4158     {
4159       as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
4160       return;
4161     }
4162
4163   if (unwind.fp_reg != REG_SP)
4164     as_bad (_("unexpected .unwind_movsp directive"));
4165
4166   /* Generate opcode to restore the value.  */
4167   op = 0x90 | reg;
4168   add_unwind_opcode (op, 1);
4169
4170   /* Record the information for later.  */
4171   unwind.fp_reg = reg;
4172   unwind.fp_offset = unwind.frame_size - offset;
4173   unwind.sp_restored = 1;
4174 }
4175
4176 /* Parse an unwind_pad directive.  */
4177
4178 static void
4179 s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
4180 {
4181   int offset;
4182
4183   if (!unwind.proc_start)
4184     as_bad (MISSING_FNSTART);
4185
4186   if (immediate_for_directive (&offset) == FAIL)
4187     return;
4188
4189   if (offset & 3)
4190     {
4191       as_bad (_("stack increment must be multiple of 4"));
4192       ignore_rest_of_line ();
4193       return;
4194     }
4195
4196   /* Don't generate any opcodes, just record the details for later.  */
4197   unwind.frame_size += offset;
4198   unwind.pending_offset += offset;
4199
4200   demand_empty_rest_of_line ();
4201 }
4202
4203 /* Parse an unwind_setfp directive.  */
4204
4205 static void
4206 s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
4207 {
4208   int sp_reg;
4209   int fp_reg;
4210   int offset;
4211
4212   if (!unwind.proc_start)
4213     as_bad (MISSING_FNSTART);
4214
4215   fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4216   if (skip_past_comma (&input_line_pointer) == FAIL)
4217     sp_reg = FAIL;
4218   else
4219     sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4220
4221   if (fp_reg == FAIL || sp_reg == FAIL)
4222     {
4223       as_bad (_("expected <reg>, <reg>"));
4224       ignore_rest_of_line ();
4225       return;
4226     }
4227
4228   /* Optional constant.  */
4229   if (skip_past_comma (&input_line_pointer) != FAIL)
4230     {
4231       if (immediate_for_directive (&offset) == FAIL)
4232         return;
4233     }
4234   else
4235     offset = 0;
4236
4237   demand_empty_rest_of_line ();
4238
4239   if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
4240     {
4241       as_bad (_("register must be either sp or set by a previous"
4242                 "unwind_movsp directive"));
4243       return;
4244     }
4245
4246   /* Don't generate any opcodes, just record the information for later.  */
4247   unwind.fp_reg = fp_reg;
4248   unwind.fp_used = 1;
4249   if (sp_reg == REG_SP)
4250     unwind.fp_offset = unwind.frame_size - offset;
4251   else
4252     unwind.fp_offset -= offset;
4253 }
4254
4255 /* Parse an unwind_raw directive.  */
4256
4257 static void
4258 s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
4259 {
4260   expressionS exp;
4261   /* This is an arbitrary limit.         */
4262   unsigned char op[16];
4263   int count;
4264
4265   if (!unwind.proc_start)
4266     as_bad (MISSING_FNSTART);
4267
4268   expression (&exp);
4269   if (exp.X_op == O_constant
4270       && skip_past_comma (&input_line_pointer) != FAIL)
4271     {
4272       unwind.frame_size += exp.X_add_number;
4273       expression (&exp);
4274     }
4275   else
4276     exp.X_op = O_illegal;
4277
4278   if (exp.X_op != O_constant)
4279     {
4280       as_bad (_("expected <offset>, <opcode>"));
4281       ignore_rest_of_line ();
4282       return;
4283     }
4284
4285   count = 0;
4286
4287   /* Parse the opcode.  */
4288   for (;;)
4289     {
4290       if (count >= 16)
4291         {
4292           as_bad (_("unwind opcode too long"));
4293           ignore_rest_of_line ();
4294         }
4295       if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
4296         {
4297           as_bad (_("invalid unwind opcode"));
4298           ignore_rest_of_line ();
4299           return;
4300         }
4301       op[count++] = exp.X_add_number;
4302
4303       /* Parse the next byte.  */
4304       if (skip_past_comma (&input_line_pointer) == FAIL)
4305         break;
4306
4307       expression (&exp);
4308     }
4309
4310   /* Add the opcode bytes in reverse order.  */
4311   while (count--)
4312     add_unwind_opcode (op[count], 1);
4313
4314   demand_empty_rest_of_line ();
4315 }
4316
4317
4318 /* Parse a .eabi_attribute directive.  */
4319
4320 static void
4321 s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
4322 {
4323   int tag = s_vendor_attribute (OBJ_ATTR_PROC);
4324
4325   if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4326     attributes_set_explicitly[tag] = 1;
4327 }
4328
4329 /* Emit a tls fix for the symbol.  */
4330
4331 static void
4332 s_arm_tls_descseq (int ignored ATTRIBUTE_UNUSED)
4333 {
4334   char *p;
4335   expressionS exp;
4336 #ifdef md_flush_pending_output
4337   md_flush_pending_output ();
4338 #endif
4339
4340 #ifdef md_cons_align
4341   md_cons_align (4);
4342 #endif
4343
4344   /* Since we're just labelling the code, there's no need to define a
4345      mapping symbol.  */
4346   expression (&exp);
4347   p = obstack_next_free (&frchain_now->frch_obstack);
4348   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
4349                thumb_mode ? BFD_RELOC_ARM_THM_TLS_DESCSEQ
4350                : BFD_RELOC_ARM_TLS_DESCSEQ);
4351 }
4352 #endif /* OBJ_ELF */
4353
4354 static void s_arm_arch (int);
4355 static void s_arm_object_arch (int);
4356 static void s_arm_cpu (int);
4357 static void s_arm_fpu (int);
4358 static void s_arm_arch_extension (int);
4359
4360 #ifdef TE_PE
4361
4362 static void
4363 pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
4364 {
4365   expressionS exp;
4366
4367   do
4368     {
4369       expression (&exp);
4370       if (exp.X_op == O_symbol)
4371         exp.X_op = O_secrel;
4372
4373       emit_expr (&exp, 4);
4374     }
4375   while (*input_line_pointer++ == ',');
4376
4377   input_line_pointer--;
4378   demand_empty_rest_of_line ();
4379 }
4380 #endif /* TE_PE */
4381
4382 /* This table describes all the machine specific pseudo-ops the assembler
4383    has to support.  The fields are:
4384      pseudo-op name without dot
4385      function to call to execute this pseudo-op
4386      Integer arg to pass to the function.  */
4387
4388 const pseudo_typeS md_pseudo_table[] =
4389 {
4390   /* Never called because '.req' does not start a line.  */
4391   { "req",         s_req,         0 },
4392   /* Following two are likewise never called.  */
4393   { "dn",          s_dn,          0 },
4394   { "qn",          s_qn,          0 },
4395   { "unreq",       s_unreq,       0 },
4396   { "bss",         s_bss,         0 },
4397   { "align",       s_align,       0 },
4398   { "arm",         s_arm,         0 },
4399   { "thumb",       s_thumb,       0 },
4400   { "code",        s_code,        0 },
4401   { "force_thumb", s_force_thumb, 0 },
4402   { "thumb_func",  s_thumb_func,  0 },
4403   { "thumb_set",   s_thumb_set,   0 },
4404   { "even",        s_even,        0 },
4405   { "ltorg",       s_ltorg,       0 },
4406   { "pool",        s_ltorg,       0 },
4407   { "syntax",      s_syntax,      0 },
4408   { "cpu",         s_arm_cpu,     0 },
4409   { "arch",        s_arm_arch,    0 },
4410   { "object_arch", s_arm_object_arch,   0 },
4411   { "fpu",         s_arm_fpu,     0 },
4412   { "arch_extension", s_arm_arch_extension, 0 },
4413 #ifdef OBJ_ELF
4414   { "word",             s_arm_elf_cons, 4 },
4415   { "long",             s_arm_elf_cons, 4 },
4416   { "inst.n",           s_arm_elf_inst, 2 },
4417   { "inst.w",           s_arm_elf_inst, 4 },
4418   { "inst",             s_arm_elf_inst, 0 },
4419   { "rel31",            s_arm_rel31,      0 },
4420   { "fnstart",          s_arm_unwind_fnstart,   0 },
4421   { "fnend",            s_arm_unwind_fnend,     0 },
4422   { "cantunwind",       s_arm_unwind_cantunwind, 0 },
4423   { "personality",      s_arm_unwind_personality, 0 },
4424   { "personalityindex", s_arm_unwind_personalityindex, 0 },
4425   { "handlerdata",      s_arm_unwind_handlerdata, 0 },
4426   { "save",             s_arm_unwind_save,      0 },
4427   { "vsave",            s_arm_unwind_save,      1 },
4428   { "movsp",            s_arm_unwind_movsp,     0 },
4429   { "pad",              s_arm_unwind_pad,       0 },
4430   { "setfp",            s_arm_unwind_setfp,     0 },
4431   { "unwind_raw",       s_arm_unwind_raw,       0 },
4432   { "eabi_attribute",   s_arm_eabi_attribute,   0 },
4433   { "tlsdescseq",       s_arm_tls_descseq,      0 },
4434 #else
4435   { "word",        cons, 4},
4436
4437   /* These are used for dwarf.  */
4438   {"2byte", cons, 2},
4439   {"4byte", cons, 4},
4440   {"8byte", cons, 8},
4441   /* These are used for dwarf2.  */
4442   { "file", (void (*) (int)) dwarf2_directive_file, 0 },
4443   { "loc",  dwarf2_directive_loc,  0 },
4444   { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
4445 #endif
4446   { "extend",      float_cons, 'x' },
4447   { "ldouble",     float_cons, 'x' },
4448   { "packed",      float_cons, 'p' },
4449 #ifdef TE_PE
4450   {"secrel32", pe_directive_secrel, 0},
4451 #endif
4452   { 0, 0, 0 }
4453 };
4454 \f
4455 /* Parser functions used exclusively in instruction operands.  */
4456
4457 /* Generic immediate-value read function for use in insn parsing.
4458    STR points to the beginning of the immediate (the leading #);
4459    VAL receives the value; if the value is outside [MIN, MAX]
4460    issue an error.  PREFIX_OPT is true if the immediate prefix is
4461    optional.  */
4462
4463 static int
4464 parse_immediate (char **str, int *val, int min, int max,
4465                  bfd_boolean prefix_opt)
4466 {
4467   expressionS exp;
4468   my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
4469   if (exp.X_op != O_constant)
4470     {
4471       inst.error = _("constant expression required");
4472       return FAIL;
4473     }
4474
4475   if (exp.X_add_number < min || exp.X_add_number > max)
4476     {
4477       inst.error = _("immediate value out of range");
4478       return FAIL;
4479     }
4480
4481   *val = exp.X_add_number;
4482   return SUCCESS;
4483 }
4484
4485 /* Less-generic immediate-value read function with the possibility of loading a
4486    big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
4487    instructions. Puts the result directly in inst.operands[i].  */
4488
4489 static int
4490 parse_big_immediate (char **str, int i)
4491 {
4492   expressionS exp;
4493   char *ptr = *str;
4494
4495   my_get_expression (&exp, &ptr, GE_OPT_PREFIX_BIG);
4496
4497   if (exp.X_op == O_constant)
4498     {
4499       inst.operands[i].imm = exp.X_add_number & 0xffffffff;
4500       /* If we're on a 64-bit host, then a 64-bit number can be returned using
4501          O_constant.  We have to be careful not to break compilation for
4502          32-bit X_add_number, though.  */
4503       if ((exp.X_add_number & ~(offsetT)(0xffffffffU)) != 0)
4504         {
4505           /* X >> 32 is illegal if sizeof (exp.X_add_number) == 4.  */
4506           inst.operands[i].reg = ((exp.X_add_number >> 16) >> 16) & 0xffffffff;
4507           inst.operands[i].regisimm = 1;
4508         }
4509     }
4510   else if (exp.X_op == O_big
4511            && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32)
4512     {
4513       unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
4514
4515       /* Bignums have their least significant bits in
4516          generic_bignum[0]. Make sure we put 32 bits in imm and
4517          32 bits in reg,  in a (hopefully) portable way.  */
4518       gas_assert (parts != 0);
4519
4520       /* Make sure that the number is not too big.
4521          PR 11972: Bignums can now be sign-extended to the
4522          size of a .octa so check that the out of range bits
4523          are all zero or all one.  */
4524       if (LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 64)
4525         {
4526           LITTLENUM_TYPE m = -1;
4527
4528           if (generic_bignum[parts * 2] != 0
4529               && generic_bignum[parts * 2] != m)
4530             return FAIL;
4531
4532           for (j = parts * 2 + 1; j < (unsigned) exp.X_add_number; j++)
4533             if (generic_bignum[j] != generic_bignum[j-1])
4534               return FAIL;
4535         }
4536
4537       inst.operands[i].imm = 0;
4538       for (j = 0; j < parts; j++, idx++)
4539         inst.operands[i].imm |= generic_bignum[idx]
4540                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4541       inst.operands[i].reg = 0;
4542       for (j = 0; j < parts; j++, idx++)
4543         inst.operands[i].reg |= generic_bignum[idx]
4544                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4545       inst.operands[i].regisimm = 1;
4546     }
4547   else
4548     return FAIL;
4549
4550   *str = ptr;
4551
4552   return SUCCESS;
4553 }
4554
4555 /* Returns the pseudo-register number of an FPA immediate constant,
4556    or FAIL if there isn't a valid constant here.  */
4557
4558 static int
4559 parse_fpa_immediate (char ** str)
4560 {
4561   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4562   char *         save_in;
4563   expressionS    exp;
4564   int            i;
4565   int            j;
4566
4567   /* First try and match exact strings, this is to guarantee
4568      that some formats will work even for cross assembly.  */
4569
4570   for (i = 0; fp_const[i]; i++)
4571     {
4572       if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
4573         {
4574           char *start = *str;
4575
4576           *str += strlen (fp_const[i]);
4577           if (is_end_of_line[(unsigned char) **str])
4578             return i + 8;
4579           *str = start;
4580         }
4581     }
4582
4583   /* Just because we didn't get a match doesn't mean that the constant
4584      isn't valid, just that it is in a format that we don't
4585      automatically recognize.  Try parsing it with the standard
4586      expression routines.  */
4587
4588   memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
4589
4590   /* Look for a raw floating point number.  */
4591   if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4592       && is_end_of_line[(unsigned char) *save_in])
4593     {
4594       for (i = 0; i < NUM_FLOAT_VALS; i++)
4595         {
4596           for (j = 0; j < MAX_LITTLENUMS; j++)
4597             {
4598               if (words[j] != fp_values[i][j])
4599                 break;
4600             }
4601
4602           if (j == MAX_LITTLENUMS)
4603             {
4604               *str = save_in;
4605               return i + 8;
4606             }
4607         }
4608     }
4609
4610   /* Try and parse a more complex expression, this will probably fail
4611      unless the code uses a floating point prefix (eg "0f").  */
4612   save_in = input_line_pointer;
4613   input_line_pointer = *str;
4614   if (expression (&exp) == absolute_section
4615       && exp.X_op == O_big
4616       && exp.X_add_number < 0)
4617     {
4618       /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4619          Ditto for 15.  */
4620       if (gen_to_words (words, 5, (long) 15) == 0)
4621         {
4622           for (i = 0; i < NUM_FLOAT_VALS; i++)
4623             {
4624               for (j = 0; j < MAX_LITTLENUMS; j++)
4625                 {
4626                   if (words[j] != fp_values[i][j])
4627                     break;
4628                 }
4629
4630               if (j == MAX_LITTLENUMS)
4631                 {
4632                   *str = input_line_pointer;
4633                   input_line_pointer = save_in;
4634                   return i + 8;
4635                 }
4636             }
4637         }
4638     }
4639
4640   *str = input_line_pointer;
4641   input_line_pointer = save_in;
4642   inst.error = _("invalid FPA immediate expression");
4643   return FAIL;
4644 }
4645
4646 /* Returns 1 if a number has "quarter-precision" float format
4647    0baBbbbbbc defgh000 00000000 00000000.  */
4648
4649 static int
4650 is_quarter_float (unsigned imm)
4651 {
4652   int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4653   return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4654 }
4655
4656 /* Parse an 8-bit "quarter-precision" floating point number of the form:
4657    0baBbbbbbc defgh000 00000000 00000000.
4658    The zero and minus-zero cases need special handling, since they can't be
4659    encoded in the "quarter-precision" float format, but can nonetheless be
4660    loaded as integer constants.  */
4661
4662 static unsigned
4663 parse_qfloat_immediate (char **ccp, int *immed)
4664 {
4665   char *str = *ccp;
4666   char *fpnum;
4667   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4668   int found_fpchar = 0;
4669
4670   skip_past_char (&str, '#');
4671
4672   /* We must not accidentally parse an integer as a floating-point number. Make
4673      sure that the value we parse is not an integer by checking for special
4674      characters '.' or 'e'.
4675      FIXME: This is a horrible hack, but doing better is tricky because type
4676      information isn't in a very usable state at parse time.  */
4677   fpnum = str;
4678   skip_whitespace (fpnum);
4679
4680   if (strncmp (fpnum, "0x", 2) == 0)
4681     return FAIL;
4682   else
4683     {
4684       for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
4685         if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
4686           {
4687             found_fpchar = 1;
4688             break;
4689           }
4690
4691       if (!found_fpchar)
4692         return FAIL;
4693     }
4694
4695   if ((str = atof_ieee (str, 's', words)) != NULL)
4696     {
4697       unsigned fpword = 0;
4698       int i;
4699
4700       /* Our FP word must be 32 bits (single-precision FP).  */
4701       for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
4702         {
4703           fpword <<= LITTLENUM_NUMBER_OF_BITS;
4704           fpword |= words[i];
4705         }
4706
4707       if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
4708         *immed = fpword;
4709       else
4710         return FAIL;
4711
4712       *ccp = str;
4713
4714       return SUCCESS;
4715     }
4716
4717   return FAIL;
4718 }
4719
4720 /* Shift operands.  */
4721 enum shift_kind
4722 {
4723   SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
4724 };
4725
4726 struct asm_shift_name
4727 {
4728   const char      *name;
4729   enum shift_kind  kind;
4730 };
4731
4732 /* Third argument to parse_shift.  */
4733 enum parse_shift_mode
4734 {
4735   NO_SHIFT_RESTRICT,            /* Any kind of shift is accepted.  */
4736   SHIFT_IMMEDIATE,              /* Shift operand must be an immediate.  */
4737   SHIFT_LSL_OR_ASR_IMMEDIATE,   /* Shift must be LSL or ASR immediate.  */
4738   SHIFT_ASR_IMMEDIATE,          /* Shift must be ASR immediate.  */
4739   SHIFT_LSL_IMMEDIATE,          /* Shift must be LSL immediate.  */
4740 };
4741
4742 /* Parse a <shift> specifier on an ARM data processing instruction.
4743    This has three forms:
4744
4745      (LSL|LSR|ASL|ASR|ROR) Rs
4746      (LSL|LSR|ASL|ASR|ROR) #imm
4747      RRX
4748
4749    Note that ASL is assimilated to LSL in the instruction encoding, and
4750    RRX to ROR #0 (which cannot be written as such).  */
4751
4752 static int
4753 parse_shift (char **str, int i, enum parse_shift_mode mode)
4754 {
4755   const struct asm_shift_name *shift_name;
4756   enum shift_kind shift;
4757   char *s = *str;
4758   char *p = s;
4759   int reg;
4760
4761   for (p = *str; ISALPHA (*p); p++)
4762     ;
4763
4764   if (p == *str)
4765     {
4766       inst.error = _("shift expression expected");
4767       return FAIL;
4768     }
4769
4770   shift_name = (const struct asm_shift_name *) hash_find_n (arm_shift_hsh, *str,
4771                                                             p - *str);
4772
4773   if (shift_name == NULL)
4774     {
4775       inst.error = _("shift expression expected");
4776       return FAIL;
4777     }
4778
4779   shift = shift_name->kind;
4780
4781   switch (mode)
4782     {
4783     case NO_SHIFT_RESTRICT:
4784     case SHIFT_IMMEDIATE:   break;
4785
4786     case SHIFT_LSL_OR_ASR_IMMEDIATE:
4787       if (shift != SHIFT_LSL && shift != SHIFT_ASR)
4788         {
4789           inst.error = _("'LSL' or 'ASR' required");
4790           return FAIL;
4791         }
4792       break;
4793
4794     case SHIFT_LSL_IMMEDIATE:
4795       if (shift != SHIFT_LSL)
4796         {
4797           inst.error = _("'LSL' required");
4798           return FAIL;
4799         }
4800       break;
4801
4802     case SHIFT_ASR_IMMEDIATE:
4803       if (shift != SHIFT_ASR)
4804         {
4805           inst.error = _("'ASR' required");
4806           return FAIL;
4807         }
4808       break;
4809
4810     default: abort ();
4811     }
4812
4813   if (shift != SHIFT_RRX)
4814     {
4815       /* Whitespace can appear here if the next thing is a bare digit.  */
4816       skip_whitespace (p);
4817
4818       if (mode == NO_SHIFT_RESTRICT
4819           && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
4820         {
4821           inst.operands[i].imm = reg;
4822           inst.operands[i].immisreg = 1;
4823         }
4824       else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4825         return FAIL;
4826     }
4827   inst.operands[i].shift_kind = shift;
4828   inst.operands[i].shifted = 1;
4829   *str = p;
4830   return SUCCESS;
4831 }
4832
4833 /* Parse a <shifter_operand> for an ARM data processing instruction:
4834
4835       #<immediate>
4836       #<immediate>, <rotate>
4837       <Rm>
4838       <Rm>, <shift>
4839
4840    where <shift> is defined by parse_shift above, and <rotate> is a
4841    multiple of 2 between 0 and 30.  Validation of immediate operands
4842    is deferred to md_apply_fix.  */
4843
4844 static int
4845 parse_shifter_operand (char **str, int i)
4846 {
4847   int value;
4848   expressionS exp;
4849
4850   if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
4851     {
4852       inst.operands[i].reg = value;
4853       inst.operands[i].isreg = 1;
4854
4855       /* parse_shift will override this if appropriate */
4856       inst.reloc.exp.X_op = O_constant;
4857       inst.reloc.exp.X_add_number = 0;
4858
4859       if (skip_past_comma (str) == FAIL)
4860         return SUCCESS;
4861
4862       /* Shift operation on register.  */
4863       return parse_shift (str, i, NO_SHIFT_RESTRICT);
4864     }
4865
4866   if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
4867     return FAIL;
4868
4869   if (skip_past_comma (str) == SUCCESS)
4870     {
4871       /* #x, y -- ie explicit rotation by Y.  */
4872       if (my_get_expression (&exp, str, GE_NO_PREFIX))
4873         return FAIL;
4874
4875       if (exp.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
4876         {
4877           inst.error = _("constant expression expected");
4878           return FAIL;
4879         }
4880
4881       value = exp.X_add_number;
4882       if (value < 0 || value > 30 || value % 2 != 0)
4883         {
4884           inst.error = _("invalid rotation");
4885           return FAIL;
4886         }
4887       if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
4888         {
4889           inst.error = _("invalid constant");
4890           return FAIL;
4891         }
4892
4893       /* Encode as specified.  */
4894       inst.operands[i].imm = inst.reloc.exp.X_add_number | value << 7;
4895       return SUCCESS;
4896     }
4897
4898   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4899   inst.reloc.pc_rel = 0;
4900   return SUCCESS;
4901 }
4902
4903 /* Group relocation information.  Each entry in the table contains the
4904    textual name of the relocation as may appear in assembler source
4905    and must end with a colon.
4906    Along with this textual name are the relocation codes to be used if
4907    the corresponding instruction is an ALU instruction (ADD or SUB only),
4908    an LDR, an LDRS, or an LDC.  */
4909
4910 struct group_reloc_table_entry
4911 {
4912   const char *name;
4913   int alu_code;
4914   int ldr_code;
4915   int ldrs_code;
4916   int ldc_code;
4917 };
4918
4919 typedef enum
4920 {
4921   /* Varieties of non-ALU group relocation.  */
4922
4923   GROUP_LDR,
4924   GROUP_LDRS,
4925   GROUP_LDC
4926 } group_reloc_type;
4927
4928 static struct group_reloc_table_entry group_reloc_table[] =
4929   { /* Program counter relative: */
4930     { "pc_g0_nc",
4931       BFD_RELOC_ARM_ALU_PC_G0_NC,       /* ALU */
4932       0,                                /* LDR */
4933       0,                                /* LDRS */
4934       0 },                              /* LDC */
4935     { "pc_g0",
4936       BFD_RELOC_ARM_ALU_PC_G0,          /* ALU */
4937       BFD_RELOC_ARM_LDR_PC_G0,          /* LDR */
4938       BFD_RELOC_ARM_LDRS_PC_G0,         /* LDRS */
4939       BFD_RELOC_ARM_LDC_PC_G0 },        /* LDC */
4940     { "pc_g1_nc",
4941       BFD_RELOC_ARM_ALU_PC_G1_NC,       /* ALU */
4942       0,                                /* LDR */
4943       0,                                /* LDRS */
4944       0 },                              /* LDC */
4945     { "pc_g1",
4946       BFD_RELOC_ARM_ALU_PC_G1,          /* ALU */
4947       BFD_RELOC_ARM_LDR_PC_G1,          /* LDR */
4948       BFD_RELOC_ARM_LDRS_PC_G1,         /* LDRS */
4949       BFD_RELOC_ARM_LDC_PC_G1 },        /* LDC */
4950     { "pc_g2",
4951       BFD_RELOC_ARM_ALU_PC_G2,          /* ALU */
4952       BFD_RELOC_ARM_LDR_PC_G2,          /* LDR */
4953       BFD_RELOC_ARM_LDRS_PC_G2,         /* LDRS */
4954       BFD_RELOC_ARM_LDC_PC_G2 },        /* LDC */
4955     /* Section base relative */
4956     { "sb_g0_nc",
4957       BFD_RELOC_ARM_ALU_SB_G0_NC,       /* ALU */
4958       0,                                /* LDR */
4959       0,                                /* LDRS */
4960       0 },                              /* LDC */
4961     { "sb_g0",
4962       BFD_RELOC_ARM_ALU_SB_G0,          /* ALU */
4963       BFD_RELOC_ARM_LDR_SB_G0,          /* LDR */
4964       BFD_RELOC_ARM_LDRS_SB_G0,         /* LDRS */
4965       BFD_RELOC_ARM_LDC_SB_G0 },        /* LDC */
4966     { "sb_g1_nc",
4967       BFD_RELOC_ARM_ALU_SB_G1_NC,       /* ALU */
4968       0,                                /* LDR */
4969       0,                                /* LDRS */
4970       0 },                              /* LDC */
4971     { "sb_g1",
4972       BFD_RELOC_ARM_ALU_SB_G1,          /* ALU */
4973       BFD_RELOC_ARM_LDR_SB_G1,          /* LDR */
4974       BFD_RELOC_ARM_LDRS_SB_G1,         /* LDRS */
4975       BFD_RELOC_ARM_LDC_SB_G1 },        /* LDC */
4976     { "sb_g2",
4977       BFD_RELOC_ARM_ALU_SB_G2,          /* ALU */
4978       BFD_RELOC_ARM_LDR_SB_G2,          /* LDR */
4979       BFD_RELOC_ARM_LDRS_SB_G2,         /* LDRS */
4980       BFD_RELOC_ARM_LDC_SB_G2 } };      /* LDC */
4981
4982 /* Given the address of a pointer pointing to the textual name of a group
4983    relocation as may appear in assembler source, attempt to find its details
4984    in group_reloc_table.  The pointer will be updated to the character after
4985    the trailing colon.  On failure, FAIL will be returned; SUCCESS
4986    otherwise.  On success, *entry will be updated to point at the relevant
4987    group_reloc_table entry. */
4988
4989 static int
4990 find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
4991 {
4992   unsigned int i;
4993   for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
4994     {
4995       int length = strlen (group_reloc_table[i].name);
4996
4997       if (strncasecmp (group_reloc_table[i].name, *str, length) == 0
4998           && (*str)[length] == ':')
4999         {
5000           *out = &group_reloc_table[i];
5001           *str += (length + 1);
5002           return SUCCESS;
5003         }
5004     }
5005
5006   return FAIL;
5007 }
5008
5009 /* Parse a <shifter_operand> for an ARM data processing instruction
5010    (as for parse_shifter_operand) where group relocations are allowed:
5011
5012       #<immediate>
5013       #<immediate>, <rotate>
5014       #:<group_reloc>:<expression>
5015       <Rm>
5016       <Rm>, <shift>
5017
5018    where <group_reloc> is one of the strings defined in group_reloc_table.
5019    The hashes are optional.
5020
5021    Everything else is as for parse_shifter_operand.  */
5022
5023 static parse_operand_result
5024 parse_shifter_operand_group_reloc (char **str, int i)
5025 {
5026   /* Determine if we have the sequence of characters #: or just :
5027      coming next.  If we do, then we check for a group relocation.
5028      If we don't, punt the whole lot to parse_shifter_operand.  */
5029
5030   if (((*str)[0] == '#' && (*str)[1] == ':')
5031       || (*str)[0] == ':')
5032     {
5033       struct group_reloc_table_entry *entry;
5034
5035       if ((*str)[0] == '#')
5036         (*str) += 2;
5037       else
5038         (*str)++;
5039
5040       /* Try to parse a group relocation.  Anything else is an error.  */
5041       if (find_group_reloc_table_entry (str, &entry) == FAIL)
5042         {
5043           inst.error = _("unknown group relocation");
5044           return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5045         }
5046
5047       /* We now have the group relocation table entry corresponding to
5048          the name in the assembler source.  Next, we parse the expression.  */
5049       if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
5050         return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5051
5052       /* Record the relocation type (always the ALU variant here).  */
5053       inst.reloc.type = (bfd_reloc_code_real_type) entry->alu_code;
5054       gas_assert (inst.reloc.type != 0);
5055
5056       return PARSE_OPERAND_SUCCESS;
5057     }
5058   else
5059     return parse_shifter_operand (str, i) == SUCCESS
5060            ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
5061
5062   /* Never reached.  */
5063 }
5064
5065 /* Parse a Neon alignment expression.  Information is written to
5066    inst.operands[i].  We assume the initial ':' has been skipped.
5067
5068    align        .imm = align << 8, .immisalign=1, .preind=0  */
5069 static parse_operand_result
5070 parse_neon_alignment (char **str, int i)
5071 {
5072   char *p = *str;
5073   expressionS exp;
5074
5075   my_get_expression (&exp, &p, GE_NO_PREFIX);
5076
5077   if (exp.X_op != O_constant)
5078     {
5079       inst.error = _("alignment must be constant");
5080       return PARSE_OPERAND_FAIL;
5081     }
5082
5083   inst.operands[i].imm = exp.X_add_number << 8;
5084   inst.operands[i].immisalign = 1;
5085   /* Alignments are not pre-indexes.  */
5086   inst.operands[i].preind = 0;
5087
5088   *str = p;
5089   return PARSE_OPERAND_SUCCESS;
5090 }
5091
5092 /* Parse all forms of an ARM address expression.  Information is written
5093    to inst.operands[i] and/or inst.reloc.
5094
5095    Preindexed addressing (.preind=1):
5096
5097    [Rn, #offset]       .reg=Rn .reloc.exp=offset
5098    [Rn, +/-Rm]         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5099    [Rn, +/-Rm, shift]  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5100                        .shift_kind=shift .reloc.exp=shift_imm
5101
5102    These three may have a trailing ! which causes .writeback to be set also.
5103
5104    Postindexed addressing (.postind=1, .writeback=1):
5105
5106    [Rn], #offset       .reg=Rn .reloc.exp=offset
5107    [Rn], +/-Rm         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5108    [Rn], +/-Rm, shift  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5109                        .shift_kind=shift .reloc.exp=shift_imm
5110
5111    Unindexed addressing (.preind=0, .postind=0):
5112
5113    [Rn], {option}      .reg=Rn .imm=option .immisreg=0
5114
5115    Other:
5116
5117    [Rn]{!}             shorthand for [Rn,#0]{!}
5118    =immediate          .isreg=0 .reloc.exp=immediate
5119    label               .reg=PC .reloc.pc_rel=1 .reloc.exp=label
5120
5121   It is the caller's responsibility to check for addressing modes not
5122   supported by the instruction, and to set inst.reloc.type.  */
5123
5124 static parse_operand_result
5125 parse_address_main (char **str, int i, int group_relocations,
5126                     group_reloc_type group_type)
5127 {
5128   char *p = *str;
5129   int reg;
5130
5131   if (skip_past_char (&p, '[') == FAIL)
5132     {
5133       if (skip_past_char (&p, '=') == FAIL)
5134         {
5135           /* Bare address - translate to PC-relative offset.  */
5136           inst.reloc.pc_rel = 1;
5137           inst.operands[i].reg = REG_PC;
5138           inst.operands[i].isreg = 1;
5139           inst.operands[i].preind = 1;
5140         }
5141       /* Otherwise a load-constant pseudo op, no special treatment needed here.  */
5142
5143       if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5144         return PARSE_OPERAND_FAIL;
5145
5146       *str = p;
5147       return PARSE_OPERAND_SUCCESS;
5148     }
5149
5150   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5151     {
5152       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5153       return PARSE_OPERAND_FAIL;
5154     }
5155   inst.operands[i].reg = reg;
5156   inst.operands[i].isreg = 1;
5157
5158   if (skip_past_comma (&p) == SUCCESS)
5159     {
5160       inst.operands[i].preind = 1;
5161
5162       if (*p == '+') p++;
5163       else if (*p == '-') p++, inst.operands[i].negative = 1;
5164
5165       if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5166         {
5167           inst.operands[i].imm = reg;
5168           inst.operands[i].immisreg = 1;
5169
5170           if (skip_past_comma (&p) == SUCCESS)
5171             if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5172               return PARSE_OPERAND_FAIL;
5173         }
5174       else if (skip_past_char (&p, ':') == SUCCESS)
5175         {
5176           /* FIXME: '@' should be used here, but it's filtered out by generic
5177              code before we get to see it here. This may be subject to
5178              change.  */
5179           parse_operand_result result = parse_neon_alignment (&p, i);
5180
5181           if (result != PARSE_OPERAND_SUCCESS)
5182             return result;
5183         }
5184       else
5185         {
5186           if (inst.operands[i].negative)
5187             {
5188               inst.operands[i].negative = 0;
5189               p--;
5190             }
5191
5192           if (group_relocations
5193               && ((*p == '#' && *(p + 1) == ':') || *p == ':'))
5194             {
5195               struct group_reloc_table_entry *entry;
5196
5197               /* Skip over the #: or : sequence.  */
5198               if (*p == '#')
5199                 p += 2;
5200               else
5201                 p++;
5202
5203               /* Try to parse a group relocation.  Anything else is an
5204                  error.  */
5205               if (find_group_reloc_table_entry (&p, &entry) == FAIL)
5206                 {
5207                   inst.error = _("unknown group relocation");
5208                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5209                 }
5210
5211               /* We now have the group relocation table entry corresponding to
5212                  the name in the assembler source.  Next, we parse the
5213                  expression.  */
5214               if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5215                 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5216
5217               /* Record the relocation type.  */
5218               switch (group_type)
5219                 {
5220                   case GROUP_LDR:
5221                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldr_code;
5222                     break;
5223
5224                   case GROUP_LDRS:
5225                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldrs_code;
5226                     break;
5227
5228                   case GROUP_LDC:
5229                     inst.reloc.type = (bfd_reloc_code_real_type) entry->ldc_code;
5230                     break;
5231
5232                   default:
5233                     gas_assert (0);
5234                 }
5235
5236               if (inst.reloc.type == 0)
5237                 {
5238                   inst.error = _("this group relocation is not allowed on this instruction");
5239                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5240                 }
5241             }
5242           else
5243             {
5244               char *q = p;
5245               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5246                 return PARSE_OPERAND_FAIL;
5247               /* If the offset is 0, find out if it's a +0 or -0.  */
5248               if (inst.reloc.exp.X_op == O_constant
5249                   && inst.reloc.exp.X_add_number == 0)
5250                 {
5251                   skip_whitespace (q);
5252                   if (*q == '#')
5253                     {
5254                       q++;
5255                       skip_whitespace (q);
5256                     }
5257                   if (*q == '-')
5258                     inst.operands[i].negative = 1;
5259                 }
5260             }
5261         }
5262     }
5263   else if (skip_past_char (&p, ':') == SUCCESS)
5264     {
5265       /* FIXME: '@' should be used here, but it's filtered out by generic code
5266          before we get to see it here. This may be subject to change.  */
5267       parse_operand_result result = parse_neon_alignment (&p, i);
5268
5269       if (result != PARSE_OPERAND_SUCCESS)
5270         return result;
5271     }
5272
5273   if (skip_past_char (&p, ']') == FAIL)
5274     {
5275       inst.error = _("']' expected");
5276       return PARSE_OPERAND_FAIL;
5277     }
5278
5279   if (skip_past_char (&p, '!') == SUCCESS)
5280     inst.operands[i].writeback = 1;
5281
5282   else if (skip_past_comma (&p) == SUCCESS)
5283     {
5284       if (skip_past_char (&p, '{') == SUCCESS)
5285         {
5286           /* [Rn], {expr} - unindexed, with option */
5287           if (parse_immediate (&p, &inst.operands[i].imm,
5288                                0, 255, TRUE) == FAIL)
5289             return PARSE_OPERAND_FAIL;
5290
5291           if (skip_past_char (&p, '}') == FAIL)
5292             {
5293               inst.error = _("'}' expected at end of 'option' field");
5294               return PARSE_OPERAND_FAIL;
5295             }
5296           if (inst.operands[i].preind)
5297             {
5298               inst.error = _("cannot combine index with option");
5299               return PARSE_OPERAND_FAIL;
5300             }
5301           *str = p;
5302           return PARSE_OPERAND_SUCCESS;
5303         }
5304       else
5305         {
5306           inst.operands[i].postind = 1;
5307           inst.operands[i].writeback = 1;
5308
5309           if (inst.operands[i].preind)
5310             {
5311               inst.error = _("cannot combine pre- and post-indexing");
5312               return PARSE_OPERAND_FAIL;
5313             }
5314
5315           if (*p == '+') p++;
5316           else if (*p == '-') p++, inst.operands[i].negative = 1;
5317
5318           if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5319             {
5320               /* We might be using the immediate for alignment already. If we
5321                  are, OR the register number into the low-order bits.  */
5322               if (inst.operands[i].immisalign)
5323                 inst.operands[i].imm |= reg;
5324               else
5325                 inst.operands[i].imm = reg;
5326               inst.operands[i].immisreg = 1;
5327
5328               if (skip_past_comma (&p) == SUCCESS)
5329                 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5330                   return PARSE_OPERAND_FAIL;
5331             }
5332           else
5333             {
5334               char *q = p;
5335               if (inst.operands[i].negative)
5336                 {
5337                   inst.operands[i].negative = 0;
5338                   p--;
5339                 }
5340               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5341                 return PARSE_OPERAND_FAIL;
5342               /* If the offset is 0, find out if it's a +0 or -0.  */
5343               if (inst.reloc.exp.X_op == O_constant
5344                   && inst.reloc.exp.X_add_number == 0)
5345                 {
5346                   skip_whitespace (q);
5347                   if (*q == '#')
5348                     {
5349                       q++;
5350                       skip_whitespace (q);
5351                     }
5352                   if (*q == '-')
5353                     inst.operands[i].negative = 1;
5354                 }
5355             }
5356         }
5357     }
5358
5359   /* If at this point neither .preind nor .postind is set, we have a
5360      bare [Rn]{!}, which is shorthand for [Rn,#0]{!}.  */
5361   if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
5362     {
5363       inst.operands[i].preind = 1;
5364       inst.reloc.exp.X_op = O_constant;
5365       inst.reloc.exp.X_add_number = 0;
5366     }
5367   *str = p;
5368   return PARSE_OPERAND_SUCCESS;
5369 }
5370
5371 static int
5372 parse_address (char **str, int i)
5373 {
5374   return parse_address_main (str, i, 0, GROUP_LDR) == PARSE_OPERAND_SUCCESS
5375          ? SUCCESS : FAIL;
5376 }
5377
5378 static parse_operand_result
5379 parse_address_group_reloc (char **str, int i, group_reloc_type type)
5380 {
5381   return parse_address_main (str, i, 1, type);
5382 }
5383
5384 /* Parse an operand for a MOVW or MOVT instruction.  */
5385 static int
5386 parse_half (char **str)
5387 {
5388   char * p;
5389
5390   p = *str;
5391   skip_past_char (&p, '#');
5392   if (strncasecmp (p, ":lower16:", 9) == 0)
5393     inst.reloc.type = BFD_RELOC_ARM_MOVW;
5394   else if (strncasecmp (p, ":upper16:", 9) == 0)
5395     inst.reloc.type = BFD_RELOC_ARM_MOVT;
5396
5397   if (inst.reloc.type != BFD_RELOC_UNUSED)
5398     {
5399       p += 9;
5400       skip_whitespace (p);
5401     }
5402
5403   if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5404     return FAIL;
5405
5406   if (inst.reloc.type == BFD_RELOC_UNUSED)
5407     {
5408       if (inst.reloc.exp.X_op != O_constant)
5409         {
5410           inst.error = _("constant expression expected");
5411           return FAIL;
5412         }
5413       if (inst.reloc.exp.X_add_number < 0
5414           || inst.reloc.exp.X_add_number > 0xffff)
5415         {
5416           inst.error = _("immediate value out of range");
5417           return FAIL;
5418         }
5419     }
5420   *str = p;
5421   return SUCCESS;
5422 }
5423
5424 /* Miscellaneous. */
5425
5426 /* Parse a PSR flag operand.  The value returned is FAIL on syntax error,
5427    or a bitmask suitable to be or-ed into the ARM msr instruction.  */
5428 static int
5429 parse_psr (char **str, bfd_boolean lhs)
5430 {
5431   char *p;
5432   unsigned long psr_field;
5433   const struct asm_psr *psr;
5434   char *start;
5435   bfd_boolean is_apsr = FALSE;
5436   bfd_boolean m_profile = ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m);
5437
5438   /* PR gas/12698:  If the user has specified -march=all then m_profile will
5439      be TRUE, but we want to ignore it in this case as we are building for any
5440      CPU type, including non-m variants.  */
5441   if (selected_cpu.core == arm_arch_any.core)
5442     m_profile = FALSE;
5443
5444   /* CPSR's and SPSR's can now be lowercase.  This is just a convenience
5445      feature for ease of use and backwards compatibility.  */
5446   p = *str;
5447   if (strncasecmp (p, "SPSR", 4) == 0)
5448     {
5449       if (m_profile)
5450         goto unsupported_psr;
5451
5452       psr_field = SPSR_BIT;
5453     }
5454   else if (strncasecmp (p, "CPSR", 4) == 0)
5455     {
5456       if (m_profile)
5457         goto unsupported_psr;
5458
5459       psr_field = 0;
5460     }
5461   else if (strncasecmp (p, "APSR", 4) == 0)
5462     {
5463       /* APSR[_<bits>] can be used as a synonym for CPSR[_<flags>] on ARMv7-A
5464          and ARMv7-R architecture CPUs.  */
5465       is_apsr = TRUE;
5466       psr_field = 0;
5467     }
5468   else if (m_profile)
5469     {
5470       start = p;
5471       do
5472         p++;
5473       while (ISALNUM (*p) || *p == '_');
5474
5475       if (strncasecmp (start, "iapsr", 5) == 0
5476           || strncasecmp (start, "eapsr", 5) == 0
5477           || strncasecmp (start, "xpsr", 4) == 0
5478           || strncasecmp (start, "psr", 3) == 0)
5479         p = start + strcspn (start, "rR") + 1;
5480
5481       psr = (const struct asm_psr *) hash_find_n (arm_v7m_psr_hsh, start,
5482                                                   p - start);
5483
5484       if (!psr)
5485         return FAIL;
5486
5487       /* If APSR is being written, a bitfield may be specified.  Note that
5488          APSR itself is handled above.  */
5489       if (psr->field <= 3)
5490         {
5491           psr_field = psr->field;
5492           is_apsr = TRUE;
5493           goto check_suffix;
5494         }
5495
5496       *str = p;
5497       /* M-profile MSR instructions have the mask field set to "10", except
5498          *PSR variants which modify APSR, which may use a different mask (and
5499          have been handled already).  Do that by setting the PSR_f field
5500          here.  */
5501       return psr->field | (lhs ? PSR_f : 0);
5502     }
5503   else
5504     goto unsupported_psr;
5505
5506   p += 4;
5507 check_suffix:
5508   if (*p == '_')
5509     {
5510       /* A suffix follows.  */
5511       p++;
5512       start = p;
5513
5514       do
5515         p++;
5516       while (ISALNUM (*p) || *p == '_');
5517
5518       if (is_apsr)
5519         {
5520           /* APSR uses a notation for bits, rather than fields.  */
5521           unsigned int nzcvq_bits = 0;
5522           unsigned int g_bit = 0;
5523           char *bit;
5524
5525           for (bit = start; bit != p; bit++)
5526             {
5527               switch (TOLOWER (*bit))
5528                 {
5529                 case 'n':
5530                   nzcvq_bits |= (nzcvq_bits & 0x01) ? 0x20 : 0x01;
5531                   break;
5532
5533                 case 'z':
5534                   nzcvq_bits |= (nzcvq_bits & 0x02) ? 0x20 : 0x02;
5535                   break;
5536
5537                 case 'c':
5538                   nzcvq_bits |= (nzcvq_bits & 0x04) ? 0x20 : 0x04;
5539                   break;
5540
5541                 case 'v':
5542                   nzcvq_bits |= (nzcvq_bits & 0x08) ? 0x20 : 0x08;
5543                   break;
5544
5545                 case 'q':
5546                   nzcvq_bits |= (nzcvq_bits & 0x10) ? 0x20 : 0x10;
5547                   break;
5548
5549                 case 'g':
5550                   g_bit |= (g_bit & 0x1) ? 0x2 : 0x1;
5551                   break;
5552
5553                 default:
5554                   inst.error = _("unexpected bit specified after APSR");
5555                   return FAIL;
5556                 }
5557             }
5558
5559           if (nzcvq_bits == 0x1f)
5560             psr_field |= PSR_f;
5561
5562           if (g_bit == 0x1)
5563             {
5564               if (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp))
5565                 {
5566                   inst.error = _("selected processor does not "
5567                                  "support DSP extension");
5568                   return FAIL;
5569                 }
5570
5571               psr_field |= PSR_s;
5572             }
5573
5574           if ((nzcvq_bits & 0x20) != 0
5575               || (nzcvq_bits != 0x1f && nzcvq_bits != 0)
5576               || (g_bit & 0x2) != 0)
5577             {
5578               inst.error = _("bad bitmask specified after APSR");
5579               return FAIL;
5580             }
5581         }
5582       else
5583         {
5584           psr = (const struct asm_psr *) hash_find_n (arm_psr_hsh, start,
5585                                                       p - start);
5586           if (!psr)
5587             goto error;
5588
5589           psr_field |= psr->field;
5590         }
5591     }
5592   else
5593     {
5594       if (ISALNUM (*p))
5595         goto error;    /* Garbage after "[CS]PSR".  */
5596
5597       /* Unadorned APSR is equivalent to APSR_nzcvq/CPSR_f (for writes).  This
5598          is deprecated, but allow it anyway.  */
5599       if (is_apsr && lhs)
5600         {
5601           psr_field |= PSR_f;
5602           as_tsktsk (_("writing to APSR without specifying a bitmask is "
5603                        "deprecated"));
5604         }
5605       else if (!m_profile)
5606         /* These bits are never right for M-profile devices: don't set them
5607            (only code paths which read/write APSR reach here).  */
5608         psr_field |= (PSR_c | PSR_f);
5609     }
5610   *str = p;
5611   return psr_field;
5612
5613  unsupported_psr:
5614   inst.error = _("selected processor does not support requested special "
5615                  "purpose register");
5616   return FAIL;
5617
5618  error:
5619   inst.error = _("flag for {c}psr instruction expected");
5620   return FAIL;
5621 }
5622
5623 /* Parse the flags argument to CPSI[ED].  Returns FAIL on error, or a
5624    value suitable for splatting into the AIF field of the instruction.  */
5625
5626 static int
5627 parse_cps_flags (char **str)
5628 {
5629   int val = 0;
5630   int saw_a_flag = 0;
5631   char *s = *str;
5632
5633   for (;;)
5634     switch (*s++)
5635       {
5636       case '\0': case ',':
5637         goto done;
5638
5639       case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
5640       case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
5641       case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
5642
5643       default:
5644         inst.error = _("unrecognized CPS flag");
5645         return FAIL;
5646       }
5647
5648  done:
5649   if (saw_a_flag == 0)
5650     {
5651       inst.error = _("missing CPS flags");
5652       return FAIL;
5653     }
5654
5655   *str = s - 1;
5656   return val;
5657 }
5658
5659 /* Parse an endian specifier ("BE" or "LE", case insensitive);
5660    returns 0 for big-endian, 1 for little-endian, FAIL for an error.  */
5661
5662 static int
5663 parse_endian_specifier (char **str)
5664 {
5665   int little_endian;
5666   char *s = *str;
5667
5668   if (strncasecmp (s, "BE", 2))
5669     little_endian = 0;
5670   else if (strncasecmp (s, "LE", 2))
5671     little_endian = 1;
5672   else
5673     {
5674       inst.error = _("valid endian specifiers are be or le");
5675       return FAIL;
5676     }
5677
5678   if (ISALNUM (s[2]) || s[2] == '_')
5679     {
5680       inst.error = _("valid endian specifiers are be or le");
5681       return FAIL;
5682     }
5683
5684   *str = s + 2;
5685   return little_endian;
5686 }
5687
5688 /* Parse a rotation specifier: ROR #0, #8, #16, #24.  *val receives a
5689    value suitable for poking into the rotate field of an sxt or sxta
5690    instruction, or FAIL on error.  */
5691
5692 static int
5693 parse_ror (char **str)
5694 {
5695   int rot;
5696   char *s = *str;
5697
5698   if (strncasecmp (s, "ROR", 3) == 0)
5699     s += 3;
5700   else
5701     {
5702       inst.error = _("missing rotation field after comma");
5703       return FAIL;
5704     }
5705
5706   if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
5707     return FAIL;
5708
5709   switch (rot)
5710     {
5711     case  0: *str = s; return 0x0;
5712     case  8: *str = s; return 0x1;
5713     case 16: *str = s; return 0x2;
5714     case 24: *str = s; return 0x3;
5715
5716     default:
5717       inst.error = _("rotation can only be 0, 8, 16, or 24");
5718       return FAIL;
5719     }
5720 }
5721
5722 /* Parse a conditional code (from conds[] below).  The value returned is in the
5723    range 0 .. 14, or FAIL.  */
5724 static int
5725 parse_cond (char **str)
5726 {
5727   char *q;
5728   const struct asm_cond *c;
5729   int n;
5730   /* Condition codes are always 2 characters, so matching up to
5731      3 characters is sufficient.  */
5732   char cond[3];
5733
5734   q = *str;
5735   n = 0;
5736   while (ISALPHA (*q) && n < 3)
5737     {
5738       cond[n] = TOLOWER (*q);
5739       q++;
5740       n++;
5741     }
5742
5743   c = (const struct asm_cond *) hash_find_n (arm_cond_hsh, cond, n);
5744   if (!c)
5745     {
5746       inst.error = _("condition required");
5747       return FAIL;
5748     }
5749
5750   *str = q;
5751   return c->value;
5752 }
5753
5754 /* Parse an option for a barrier instruction.  Returns the encoding for the
5755    option, or FAIL.  */
5756 static int
5757 parse_barrier (char **str)
5758 {
5759   char *p, *q;
5760   const struct asm_barrier_opt *o;
5761
5762   p = q = *str;
5763   while (ISALPHA (*q))
5764     q++;
5765
5766   o = (const struct asm_barrier_opt *) hash_find_n (arm_barrier_opt_hsh, p,
5767                                                     q - p);
5768   if (!o)
5769     return FAIL;
5770
5771   *str = q;
5772   return o->value;
5773 }
5774
5775 /* Parse the operands of a table branch instruction.  Similar to a memory
5776    operand.  */
5777 static int
5778 parse_tb (char **str)
5779 {
5780   char * p = *str;
5781   int reg;
5782
5783   if (skip_past_char (&p, '[') == FAIL)
5784     {
5785       inst.error = _("'[' expected");
5786       return FAIL;
5787     }
5788
5789   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5790     {
5791       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5792       return FAIL;
5793     }
5794   inst.operands[0].reg = reg;
5795
5796   if (skip_past_comma (&p) == FAIL)
5797     {
5798       inst.error = _("',' expected");
5799       return FAIL;
5800     }
5801
5802   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5803     {
5804       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5805       return FAIL;
5806     }
5807   inst.operands[0].imm = reg;
5808
5809   if (skip_past_comma (&p) == SUCCESS)
5810     {
5811       if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
5812         return FAIL;
5813       if (inst.reloc.exp.X_add_number != 1)
5814         {
5815           inst.error = _("invalid shift");
5816           return FAIL;
5817         }
5818       inst.operands[0].shifted = 1;
5819     }
5820
5821   if (skip_past_char (&p, ']') == FAIL)
5822     {
5823       inst.error = _("']' expected");
5824       return FAIL;
5825     }
5826   *str = p;
5827   return SUCCESS;
5828 }
5829
5830 /* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
5831    information on the types the operands can take and how they are encoded.
5832    Up to four operands may be read; this function handles setting the
5833    ".present" field for each read operand itself.
5834    Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
5835    else returns FAIL.  */
5836
5837 static int
5838 parse_neon_mov (char **str, int *which_operand)
5839 {
5840   int i = *which_operand, val;
5841   enum arm_reg_type rtype;
5842   char *ptr = *str;
5843   struct neon_type_el optype;
5844
5845   if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5846     {
5847       /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>.  */
5848       inst.operands[i].reg = val;
5849       inst.operands[i].isscalar = 1;
5850       inst.operands[i].vectype = optype;
5851       inst.operands[i++].present = 1;
5852
5853       if (skip_past_comma (&ptr) == FAIL)
5854         goto wanted_comma;
5855
5856       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5857         goto wanted_arm;
5858
5859       inst.operands[i].reg = val;
5860       inst.operands[i].isreg = 1;
5861       inst.operands[i].present = 1;
5862     }
5863   else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
5864            != FAIL)
5865     {
5866       /* Cases 0, 1, 2, 3, 5 (D only).  */
5867       if (skip_past_comma (&ptr) == FAIL)
5868         goto wanted_comma;
5869
5870       inst.operands[i].reg = val;
5871       inst.operands[i].isreg = 1;
5872       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5873       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5874       inst.operands[i].isvec = 1;
5875       inst.operands[i].vectype = optype;
5876       inst.operands[i++].present = 1;
5877
5878       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5879         {
5880           /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
5881              Case 13: VMOV <Sd>, <Rm>  */
5882           inst.operands[i].reg = val;
5883           inst.operands[i].isreg = 1;
5884           inst.operands[i].present = 1;
5885
5886           if (rtype == REG_TYPE_NQ)
5887             {
5888               first_error (_("can't use Neon quad register here"));
5889               return FAIL;
5890             }
5891           else if (rtype != REG_TYPE_VFS)
5892             {
5893               i++;
5894               if (skip_past_comma (&ptr) == FAIL)
5895                 goto wanted_comma;
5896               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5897                 goto wanted_arm;
5898               inst.operands[i].reg = val;
5899               inst.operands[i].isreg = 1;
5900               inst.operands[i].present = 1;
5901             }
5902         }
5903       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
5904                                            &optype)) != FAIL)
5905         {
5906           /* Case 0: VMOV<c><q> <Qd>, <Qm>
5907              Case 1: VMOV<c><q> <Dd>, <Dm>
5908              Case 8: VMOV.F32 <Sd>, <Sm>
5909              Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm>  */
5910
5911           inst.operands[i].reg = val;
5912           inst.operands[i].isreg = 1;
5913           inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5914           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5915           inst.operands[i].isvec = 1;
5916           inst.operands[i].vectype = optype;
5917           inst.operands[i].present = 1;
5918
5919           if (skip_past_comma (&ptr) == SUCCESS)
5920             {
5921               /* Case 15.  */
5922               i++;
5923
5924               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5925                 goto wanted_arm;
5926
5927               inst.operands[i].reg = val;
5928               inst.operands[i].isreg = 1;
5929               inst.operands[i++].present = 1;
5930
5931               if (skip_past_comma (&ptr) == FAIL)
5932                 goto wanted_comma;
5933
5934               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5935                 goto wanted_arm;
5936
5937               inst.operands[i].reg = val;
5938               inst.operands[i].isreg = 1;
5939               inst.operands[i].present = 1;
5940             }
5941         }
5942       else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
5943           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
5944              Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
5945              Case 10: VMOV.F32 <Sd>, #<imm>
5946              Case 11: VMOV.F64 <Dd>, #<imm>  */
5947         inst.operands[i].immisfloat = 1;
5948       else if (parse_big_immediate (&ptr, i) == SUCCESS)
5949           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
5950              Case 3: VMOV<c><q>.<dt> <Dd>, #<imm>  */
5951         ;
5952       else
5953         {
5954           first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
5955           return FAIL;
5956         }
5957     }
5958   else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5959     {
5960       /* Cases 6, 7.  */
5961       inst.operands[i].reg = val;
5962       inst.operands[i].isreg = 1;
5963       inst.operands[i++].present = 1;
5964
5965       if (skip_past_comma (&ptr) == FAIL)
5966         goto wanted_comma;
5967
5968       if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5969         {
5970           /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]>  */
5971           inst.operands[i].reg = val;
5972           inst.operands[i].isscalar = 1;
5973           inst.operands[i].present = 1;
5974           inst.operands[i].vectype = optype;
5975         }
5976       else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5977         {
5978           /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm>  */
5979           inst.operands[i].reg = val;
5980           inst.operands[i].isreg = 1;
5981           inst.operands[i++].present = 1;
5982
5983           if (skip_past_comma (&ptr) == FAIL)
5984             goto wanted_comma;
5985
5986           if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
5987               == FAIL)
5988             {
5989               first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
5990               return FAIL;
5991             }
5992
5993           inst.operands[i].reg = val;
5994           inst.operands[i].isreg = 1;
5995           inst.operands[i].isvec = 1;
5996           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5997           inst.operands[i].vectype = optype;
5998           inst.operands[i].present = 1;
5999
6000           if (rtype == REG_TYPE_VFS)
6001             {
6002               /* Case 14.  */
6003               i++;
6004               if (skip_past_comma (&ptr) == FAIL)
6005                 goto wanted_comma;
6006               if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
6007                                               &optype)) == FAIL)
6008                 {
6009                   first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
6010                   return FAIL;
6011                 }
6012               inst.operands[i].reg = val;
6013               inst.operands[i].isreg = 1;
6014               inst.operands[i].isvec = 1;
6015               inst.operands[i].issingle = 1;
6016               inst.operands[i].vectype = optype;
6017               inst.operands[i].present = 1;
6018             }
6019         }
6020       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
6021                != FAIL)
6022         {
6023           /* Case 13.  */
6024           inst.operands[i].reg = val;
6025           inst.operands[i].isreg = 1;
6026           inst.operands[i].isvec = 1;
6027           inst.operands[i].issingle = 1;
6028           inst.operands[i].vectype = optype;
6029           inst.operands[i].present = 1;
6030         }
6031     }
6032   else
6033     {
6034       first_error (_("parse error"));
6035       return FAIL;
6036     }
6037
6038   /* Successfully parsed the operands. Update args.  */
6039   *which_operand = i;
6040   *str = ptr;
6041   return SUCCESS;
6042
6043  wanted_comma:
6044   first_error (_("expected comma"));
6045   return FAIL;
6046
6047  wanted_arm:
6048   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
6049   return FAIL;
6050 }
6051
6052 /* Use this macro when the operand constraints are different
6053    for ARM and THUMB (e.g. ldrd).  */
6054 #define MIX_ARM_THUMB_OPERANDS(arm_operand, thumb_operand) \
6055         ((arm_operand) | ((thumb_operand) << 16))
6056
6057 /* Matcher codes for parse_operands.  */
6058 enum operand_parse_code
6059 {
6060   OP_stop,      /* end of line */
6061
6062   OP_RR,        /* ARM register */
6063   OP_RRnpc,     /* ARM register, not r15 */
6064   OP_RRnpcsp,   /* ARM register, neither r15 nor r13 (a.k.a. 'BadReg') */
6065   OP_RRnpcb,    /* ARM register, not r15, in square brackets */
6066   OP_RRnpctw,   /* ARM register, not r15 in Thumb-state or with writeback,
6067                    optional trailing ! */
6068   OP_RRw,       /* ARM register, not r15, optional trailing ! */
6069   OP_RCP,       /* Coprocessor number */
6070   OP_RCN,       /* Coprocessor register */
6071   OP_RF,        /* FPA register */
6072   OP_RVS,       /* VFP single precision register */
6073   OP_RVD,       /* VFP double precision register (0..15) */
6074   OP_RND,       /* Neon double precision register (0..31) */
6075   OP_RNQ,       /* Neon quad precision register */
6076   OP_RVSD,      /* VFP single or double precision register */
6077   OP_RNDQ,      /* Neon double or quad precision register */
6078   OP_RNSDQ,     /* Neon single, double or quad precision register */
6079   OP_RNSC,      /* Neon scalar D[X] */
6080   OP_RVC,       /* VFP control register */
6081   OP_RMF,       /* Maverick F register */
6082   OP_RMD,       /* Maverick D register */
6083   OP_RMFX,      /* Maverick FX register */
6084   OP_RMDX,      /* Maverick DX register */
6085   OP_RMAX,      /* Maverick AX register */
6086   OP_RMDS,      /* Maverick DSPSC register */
6087   OP_RIWR,      /* iWMMXt wR register */
6088   OP_RIWC,      /* iWMMXt wC register */
6089   OP_RIWG,      /* iWMMXt wCG register */
6090   OP_RXA,       /* XScale accumulator register */
6091
6092   OP_REGLST,    /* ARM register list */
6093   OP_VRSLST,    /* VFP single-precision register list */
6094   OP_VRDLST,    /* VFP double-precision register list */
6095   OP_VRSDLST,   /* VFP single or double-precision register list (& quad) */
6096   OP_NRDLST,    /* Neon double-precision register list (d0-d31, qN aliases) */
6097   OP_NSTRLST,   /* Neon element/structure list */
6098
6099   OP_RNDQ_I0,   /* Neon D or Q reg, or immediate zero.  */
6100   OP_RVSD_I0,   /* VFP S or D reg, or immediate zero.  */
6101   OP_RR_RNSC,   /* ARM reg or Neon scalar.  */
6102   OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar.  */
6103   OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar.  */
6104   OP_RND_RNSC,  /* Neon D reg, or Neon scalar.  */
6105   OP_VMOV,      /* Neon VMOV operands.  */
6106   OP_RNDQ_Ibig, /* Neon D or Q reg, or big immediate for logic and VMVN.  */
6107   OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift.  */
6108   OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2.  */
6109
6110   OP_I0,        /* immediate zero */
6111   OP_I7,        /* immediate value 0 .. 7 */
6112   OP_I15,       /*                 0 .. 15 */
6113   OP_I16,       /*                 1 .. 16 */
6114   OP_I16z,      /*                 0 .. 16 */
6115   OP_I31,       /*                 0 .. 31 */
6116   OP_I31w,      /*                 0 .. 31, optional trailing ! */
6117   OP_I32,       /*                 1 .. 32 */
6118   OP_I32z,      /*                 0 .. 32 */
6119   OP_I63,       /*                 0 .. 63 */
6120   OP_I63s,      /*               -64 .. 63 */
6121   OP_I64,       /*                 1 .. 64 */
6122   OP_I64z,      /*                 0 .. 64 */
6123   OP_I255,      /*                 0 .. 255 */
6124
6125   OP_I4b,       /* immediate, prefix optional, 1 .. 4 */
6126   OP_I7b,       /*                             0 .. 7 */
6127   OP_I15b,      /*                             0 .. 15 */
6128   OP_I31b,      /*                             0 .. 31 */
6129
6130   OP_SH,        /* shifter operand */
6131   OP_SHG,       /* shifter operand with possible group relocation */
6132   OP_ADDR,      /* Memory address expression (any mode) */
6133   OP_ADDRGLDR,  /* Mem addr expr (any mode) with possible LDR group reloc */
6134   OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
6135   OP_ADDRGLDC,  /* Mem addr expr (any mode) with possible LDC group reloc */
6136   OP_EXP,       /* arbitrary expression */
6137   OP_EXPi,      /* same, with optional immediate prefix */
6138   OP_EXPr,      /* same, with optional relocation suffix */
6139   OP_HALF,      /* 0 .. 65535 or low/high reloc.  */
6140
6141   OP_CPSF,      /* CPS flags */
6142   OP_ENDI,      /* Endianness specifier */
6143   OP_wPSR,      /* CPSR/SPSR/APSR mask for msr (writing).  */
6144   OP_rPSR,      /* CPSR/SPSR/APSR mask for msr (reading).  */
6145   OP_COND,      /* conditional code */
6146   OP_TB,        /* Table branch.  */
6147
6148   OP_APSR_RR,   /* ARM register or "APSR_nzcv".  */
6149
6150   OP_RRnpc_I0,  /* ARM register or literal 0 */
6151   OP_RR_EXr,    /* ARM register or expression with opt. reloc suff. */
6152   OP_RR_EXi,    /* ARM register or expression with imm prefix */
6153   OP_RF_IF,     /* FPA register or immediate */
6154   OP_RIWR_RIWC, /* iWMMXt R or C reg */
6155   OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
6156
6157   /* Optional operands.  */
6158   OP_oI7b,       /* immediate, prefix optional, 0 .. 7 */
6159   OP_oI31b,      /*                             0 .. 31 */
6160   OP_oI32b,      /*                             1 .. 32 */
6161   OP_oI32z,      /*                             0 .. 32 */
6162   OP_oIffffb,    /*                             0 .. 65535 */
6163   OP_oI255c,     /*       curly-brace enclosed, 0 .. 255 */
6164
6165   OP_oRR,        /* ARM register */
6166   OP_oRRnpc,     /* ARM register, not the PC */
6167   OP_oRRnpcsp,   /* ARM register, neither the PC nor the SP (a.k.a. BadReg) */
6168   OP_oRRw,       /* ARM register, not r15, optional trailing ! */
6169   OP_oRND,       /* Optional Neon double precision register */
6170   OP_oRNQ,       /* Optional Neon quad precision register */
6171   OP_oRNDQ,      /* Optional Neon double or quad precision register */
6172   OP_oRNSDQ,     /* Optional single, double or quad precision vector register */
6173   OP_oSHll,      /* LSL immediate */
6174   OP_oSHar,      /* ASR immediate */
6175   OP_oSHllar,    /* LSL or ASR immediate */
6176   OP_oROR,       /* ROR 0/8/16/24 */
6177   OP_oBARRIER_I15, /* Option argument for a barrier instruction.  */
6178
6179   /* Some pre-defined mixed (ARM/THUMB) operands.  */
6180   OP_RR_npcsp           = MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
6181   OP_RRnpc_npcsp        = MIX_ARM_THUMB_OPERANDS (OP_RRnpc, OP_RRnpcsp),
6182   OP_oRRnpc_npcsp       = MIX_ARM_THUMB_OPERANDS (OP_oRRnpc, OP_oRRnpcsp),
6183
6184   OP_FIRST_OPTIONAL = OP_oI7b
6185 };
6186
6187 /* Generic instruction operand parser.  This does no encoding and no
6188    semantic validation; it merely squirrels values away in the inst
6189    structure.  Returns SUCCESS or FAIL depending on whether the
6190    specified grammar matched.  */
6191 static int
6192 parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
6193 {
6194   unsigned const int *upat = pattern;
6195   char *backtrack_pos = 0;
6196   const char *backtrack_error = 0;
6197   int i, val, backtrack_index = 0;
6198   enum arm_reg_type rtype;
6199   parse_operand_result result;
6200   unsigned int op_parse_code;
6201
6202 #define po_char_or_fail(chr)                    \
6203   do                                            \
6204     {                                           \
6205       if (skip_past_char (&str, chr) == FAIL)   \
6206         goto bad_args;                          \
6207     }                                           \
6208   while (0)
6209
6210 #define po_reg_or_fail(regtype)                                 \
6211   do                                                            \
6212     {                                                           \
6213       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
6214                                  & inst.operands[i].vectype);   \
6215       if (val == FAIL)                                          \
6216         {                                                       \
6217           first_error (_(reg_expected_msgs[regtype]));          \
6218           goto failure;                                         \
6219         }                                                       \
6220       inst.operands[i].reg = val;                               \
6221       inst.operands[i].isreg = 1;                               \
6222       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
6223       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
6224       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
6225                              || rtype == REG_TYPE_VFD           \
6226                              || rtype == REG_TYPE_NQ);          \
6227     }                                                           \
6228   while (0)
6229
6230 #define po_reg_or_goto(regtype, label)                          \
6231   do                                                            \
6232     {                                                           \
6233       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
6234                                  & inst.operands[i].vectype);   \
6235       if (val == FAIL)                                          \
6236         goto label;                                             \
6237                                                                 \
6238       inst.operands[i].reg = val;                               \
6239       inst.operands[i].isreg = 1;                               \
6240       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
6241       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
6242       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
6243                              || rtype == REG_TYPE_VFD           \
6244                              || rtype == REG_TYPE_NQ);          \
6245     }                                                           \
6246   while (0)
6247
6248 #define po_imm_or_fail(min, max, popt)                          \
6249   do                                                            \
6250     {                                                           \
6251       if (parse_immediate (&str, &val, min, max, popt) == FAIL) \
6252         goto failure;                                           \
6253       inst.operands[i].imm = val;                               \
6254     }                                                           \
6255   while (0)
6256
6257 #define po_scalar_or_goto(elsz, label)                                  \
6258   do                                                                    \
6259     {                                                                   \
6260       val = parse_scalar (& str, elsz, & inst.operands[i].vectype);     \
6261       if (val == FAIL)                                                  \
6262         goto label;                                                     \
6263       inst.operands[i].reg = val;                                       \
6264       inst.operands[i].isscalar = 1;                                    \
6265     }                                                                   \
6266   while (0)
6267
6268 #define po_misc_or_fail(expr)                   \
6269   do                                            \
6270     {                                           \
6271       if (expr)                                 \
6272         goto failure;                           \
6273     }                                           \
6274   while (0)
6275
6276 #define po_misc_or_fail_no_backtrack(expr)              \
6277   do                                                    \
6278     {                                                   \
6279       result = expr;                                    \
6280       if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK)    \
6281         backtrack_pos = 0;                              \
6282       if (result != PARSE_OPERAND_SUCCESS)              \
6283         goto failure;                                   \
6284     }                                                   \
6285   while (0)
6286
6287 #define po_barrier_or_imm(str)                             \
6288   do                                                       \
6289     {                                                      \
6290       val = parse_barrier (&str);                          \
6291       if (val == FAIL)                                     \
6292         {                                                  \
6293           if (ISALPHA (*str))                              \
6294               goto failure;                                \
6295           else                                             \
6296               goto immediate;                              \
6297         }                                                  \
6298       else                                                 \
6299         {                                                  \
6300           if ((inst.instruction & 0xf0) == 0x60            \
6301               && val != 0xf)                               \
6302             {                                              \
6303                /* ISB can only take SY as an option.  */   \
6304                inst.error = _("invalid barrier type");     \
6305                goto failure;                               \
6306             }                                              \
6307         }                                                  \
6308     }                                                      \
6309   while (0)
6310
6311   skip_whitespace (str);
6312
6313   for (i = 0; upat[i] != OP_stop; i++)
6314     {
6315       op_parse_code = upat[i];
6316       if (op_parse_code >= 1<<16)
6317         op_parse_code = thumb ? (op_parse_code >> 16)
6318                                 : (op_parse_code & ((1<<16)-1));
6319
6320       if (op_parse_code >= OP_FIRST_OPTIONAL)
6321         {
6322           /* Remember where we are in case we need to backtrack.  */
6323           gas_assert (!backtrack_pos);
6324           backtrack_pos = str;
6325           backtrack_error = inst.error;
6326           backtrack_index = i;
6327         }
6328
6329       if (i > 0 && (i > 1 || inst.operands[0].present))
6330         po_char_or_fail (',');
6331
6332       switch (op_parse_code)
6333         {
6334           /* Registers */
6335         case OP_oRRnpc:
6336         case OP_oRRnpcsp:
6337         case OP_RRnpc:
6338         case OP_RRnpcsp:
6339         case OP_oRR:
6340         case OP_RR:    po_reg_or_fail (REG_TYPE_RN);      break;
6341         case OP_RCP:   po_reg_or_fail (REG_TYPE_CP);      break;
6342         case OP_RCN:   po_reg_or_fail (REG_TYPE_CN);      break;
6343         case OP_RF:    po_reg_or_fail (REG_TYPE_FN);      break;
6344         case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);     break;
6345         case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);     break;
6346         case OP_oRND:
6347         case OP_RND:   po_reg_or_fail (REG_TYPE_VFD);     break;
6348         case OP_RVC:
6349           po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
6350           break;
6351           /* Also accept generic coprocessor regs for unknown registers.  */
6352           coproc_reg:
6353           po_reg_or_fail (REG_TYPE_CN);
6354           break;
6355         case OP_RMF:   po_reg_or_fail (REG_TYPE_MVF);     break;
6356         case OP_RMD:   po_reg_or_fail (REG_TYPE_MVD);     break;
6357         case OP_RMFX:  po_reg_or_fail (REG_TYPE_MVFX);    break;
6358         case OP_RMDX:  po_reg_or_fail (REG_TYPE_MVDX);    break;
6359         case OP_RMAX:  po_reg_or_fail (REG_TYPE_MVAX);    break;
6360         case OP_RMDS:  po_reg_or_fail (REG_TYPE_DSPSC);   break;
6361         case OP_RIWR:  po_reg_or_fail (REG_TYPE_MMXWR);   break;
6362         case OP_RIWC:  po_reg_or_fail (REG_TYPE_MMXWC);   break;
6363         case OP_RIWG:  po_reg_or_fail (REG_TYPE_MMXWCG);  break;
6364         case OP_RXA:   po_reg_or_fail (REG_TYPE_XSCALE);  break;
6365         case OP_oRNQ:
6366         case OP_RNQ:   po_reg_or_fail (REG_TYPE_NQ);      break;
6367         case OP_oRNDQ:
6368         case OP_RNDQ:  po_reg_or_fail (REG_TYPE_NDQ);     break;
6369         case OP_RVSD:  po_reg_or_fail (REG_TYPE_VFSD);    break;
6370         case OP_oRNSDQ:
6371         case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ);    break;
6372
6373         /* Neon scalar. Using an element size of 8 means that some invalid
6374            scalars are accepted here, so deal with those in later code.  */
6375         case OP_RNSC:  po_scalar_or_goto (8, failure);    break;
6376
6377         case OP_RNDQ_I0:
6378           {
6379             po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
6380             break;
6381             try_imm0:
6382             po_imm_or_fail (0, 0, TRUE);
6383           }
6384           break;
6385
6386         case OP_RVSD_I0:
6387           po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
6388           break;
6389
6390         case OP_RR_RNSC:
6391           {
6392             po_scalar_or_goto (8, try_rr);
6393             break;
6394             try_rr:
6395             po_reg_or_fail (REG_TYPE_RN);
6396           }
6397           break;
6398
6399         case OP_RNSDQ_RNSC:
6400           {
6401             po_scalar_or_goto (8, try_nsdq);
6402             break;
6403             try_nsdq:
6404             po_reg_or_fail (REG_TYPE_NSDQ);
6405           }
6406           break;
6407
6408         case OP_RNDQ_RNSC:
6409           {
6410             po_scalar_or_goto (8, try_ndq);
6411             break;
6412             try_ndq:
6413             po_reg_or_fail (REG_TYPE_NDQ);
6414           }
6415           break;
6416
6417         case OP_RND_RNSC:
6418           {
6419             po_scalar_or_goto (8, try_vfd);
6420             break;
6421             try_vfd:
6422             po_reg_or_fail (REG_TYPE_VFD);
6423           }
6424           break;
6425
6426         case OP_VMOV:
6427           /* WARNING: parse_neon_mov can move the operand counter, i. If we're
6428              not careful then bad things might happen.  */
6429           po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
6430           break;
6431
6432         case OP_RNDQ_Ibig:
6433           {
6434             po_reg_or_goto (REG_TYPE_NDQ, try_immbig);
6435             break;
6436             try_immbig:
6437             /* There's a possibility of getting a 64-bit immediate here, so
6438                we need special handling.  */
6439             if (parse_big_immediate (&str, i) == FAIL)
6440               {
6441                 inst.error = _("immediate value is out of range");
6442                 goto failure;
6443               }
6444           }
6445           break;
6446
6447         case OP_RNDQ_I63b:
6448           {
6449             po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
6450             break;
6451             try_shimm:
6452             po_imm_or_fail (0, 63, TRUE);
6453           }
6454           break;
6455
6456         case OP_RRnpcb:
6457           po_char_or_fail ('[');
6458           po_reg_or_fail  (REG_TYPE_RN);
6459           po_char_or_fail (']');
6460           break;
6461
6462         case OP_RRnpctw:
6463         case OP_RRw:
6464         case OP_oRRw:
6465           po_reg_or_fail (REG_TYPE_RN);
6466           if (skip_past_char (&str, '!') == SUCCESS)
6467             inst.operands[i].writeback = 1;
6468           break;
6469
6470           /* Immediates */
6471         case OP_I7:      po_imm_or_fail (  0,      7, FALSE);   break;
6472         case OP_I15:     po_imm_or_fail (  0,     15, FALSE);   break;
6473         case OP_I16:     po_imm_or_fail (  1,     16, FALSE);   break;
6474         case OP_I16z:    po_imm_or_fail (  0,     16, FALSE);   break;
6475         case OP_I31:     po_imm_or_fail (  0,     31, FALSE);   break;
6476         case OP_I32:     po_imm_or_fail (  1,     32, FALSE);   break;
6477         case OP_I32z:    po_imm_or_fail (  0,     32, FALSE);   break;
6478         case OP_I63s:    po_imm_or_fail (-64,     63, FALSE);   break;
6479         case OP_I63:     po_imm_or_fail (  0,     63, FALSE);   break;
6480         case OP_I64:     po_imm_or_fail (  1,     64, FALSE);   break;
6481         case OP_I64z:    po_imm_or_fail (  0,     64, FALSE);   break;
6482         case OP_I255:    po_imm_or_fail (  0,    255, FALSE);   break;
6483
6484         case OP_I4b:     po_imm_or_fail (  1,      4, TRUE);    break;
6485         case OP_oI7b:
6486         case OP_I7b:     po_imm_or_fail (  0,      7, TRUE);    break;
6487         case OP_I15b:    po_imm_or_fail (  0,     15, TRUE);    break;
6488         case OP_oI31b:
6489         case OP_I31b:    po_imm_or_fail (  0,     31, TRUE);    break;
6490         case OP_oI32b:   po_imm_or_fail (  1,     32, TRUE);    break;
6491         case OP_oI32z:   po_imm_or_fail (  0,     32, TRUE);    break;
6492         case OP_oIffffb: po_imm_or_fail (  0, 0xffff, TRUE);    break;
6493
6494           /* Immediate variants */
6495         case OP_oI255c:
6496           po_char_or_fail ('{');
6497           po_imm_or_fail (0, 255, TRUE);
6498           po_char_or_fail ('}');
6499           break;
6500
6501         case OP_I31w:
6502           /* The expression parser chokes on a trailing !, so we have
6503              to find it first and zap it.  */
6504           {
6505             char *s = str;
6506             while (*s && *s != ',')
6507               s++;
6508             if (s[-1] == '!')
6509               {
6510                 s[-1] = '\0';
6511                 inst.operands[i].writeback = 1;
6512               }
6513             po_imm_or_fail (0, 31, TRUE);
6514             if (str == s - 1)
6515               str = s;
6516           }
6517           break;
6518
6519           /* Expressions */
6520         case OP_EXPi:   EXPi:
6521           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6522                                               GE_OPT_PREFIX));
6523           break;
6524
6525         case OP_EXP:
6526           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6527                                               GE_NO_PREFIX));
6528           break;
6529
6530         case OP_EXPr:   EXPr:
6531           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6532                                               GE_NO_PREFIX));
6533           if (inst.reloc.exp.X_op == O_symbol)
6534             {
6535               val = parse_reloc (&str);
6536               if (val == -1)
6537                 {
6538                   inst.error = _("unrecognized relocation suffix");
6539                   goto failure;
6540                 }
6541               else if (val != BFD_RELOC_UNUSED)
6542                 {
6543                   inst.operands[i].imm = val;
6544                   inst.operands[i].hasreloc = 1;
6545                 }
6546             }
6547           break;
6548
6549           /* Operand for MOVW or MOVT.  */
6550         case OP_HALF:
6551           po_misc_or_fail (parse_half (&str));
6552           break;
6553
6554           /* Register or expression.  */
6555         case OP_RR_EXr:   po_reg_or_goto (REG_TYPE_RN, EXPr); break;
6556         case OP_RR_EXi:   po_reg_or_goto (REG_TYPE_RN, EXPi); break;
6557
6558           /* Register or immediate.  */
6559         case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0);   break;
6560         I0:               po_imm_or_fail (0, 0, FALSE);       break;
6561
6562         case OP_RF_IF:    po_reg_or_goto (REG_TYPE_FN, IF);   break;
6563         IF:
6564           if (!is_immediate_prefix (*str))
6565             goto bad_args;
6566           str++;
6567           val = parse_fpa_immediate (&str);
6568           if (val == FAIL)
6569             goto failure;
6570           /* FPA immediates are encoded as registers 8-15.
6571              parse_fpa_immediate has already applied the offset.  */
6572           inst.operands[i].reg = val;
6573           inst.operands[i].isreg = 1;
6574           break;
6575
6576         case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
6577         I32z:             po_imm_or_fail (0, 32, FALSE);          break;
6578
6579           /* Two kinds of register.  */
6580         case OP_RIWR_RIWC:
6581           {
6582             struct reg_entry *rege = arm_reg_parse_multi (&str);
6583             if (!rege
6584                 || (rege->type != REG_TYPE_MMXWR
6585                     && rege->type != REG_TYPE_MMXWC
6586                     && rege->type != REG_TYPE_MMXWCG))
6587               {
6588                 inst.error = _("iWMMXt data or control register expected");
6589                 goto failure;
6590               }
6591             inst.operands[i].reg = rege->number;
6592             inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
6593           }
6594           break;
6595
6596         case OP_RIWC_RIWG:
6597           {
6598             struct reg_entry *rege = arm_reg_parse_multi (&str);
6599             if (!rege
6600                 || (rege->type != REG_TYPE_MMXWC
6601                     && rege->type != REG_TYPE_MMXWCG))
6602               {
6603                 inst.error = _("iWMMXt control register expected");
6604                 goto failure;
6605               }
6606             inst.operands[i].reg = rege->number;
6607             inst.operands[i].isreg = 1;
6608           }
6609           break;
6610
6611           /* Misc */
6612         case OP_CPSF:    val = parse_cps_flags (&str);          break;
6613         case OP_ENDI:    val = parse_endian_specifier (&str);   break;
6614         case OP_oROR:    val = parse_ror (&str);                break;
6615         case OP_COND:    val = parse_cond (&str);               break;
6616         case OP_oBARRIER_I15:
6617           po_barrier_or_imm (str); break;
6618           immediate:
6619           if (parse_immediate (&str, &val, 0, 15, TRUE) == FAIL)
6620             goto failure;
6621           break;
6622
6623         case OP_wPSR:
6624         case OP_rPSR:
6625           po_reg_or_goto (REG_TYPE_RNB, try_psr);
6626           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_virt))
6627             {
6628               inst.error = _("Banked registers are not available with this "
6629                              "architecture.");
6630               goto failure;
6631             }
6632           break;
6633           try_psr:
6634           val = parse_psr (&str, op_parse_code == OP_wPSR);
6635           break;
6636
6637         case OP_APSR_RR:
6638           po_reg_or_goto (REG_TYPE_RN, try_apsr);
6639           break;
6640           try_apsr:
6641           /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
6642              instruction).  */
6643           if (strncasecmp (str, "APSR_", 5) == 0)
6644             {
6645               unsigned found = 0;
6646               str += 5;
6647               while (found < 15)
6648                 switch (*str++)
6649                   {
6650                   case 'c': found = (found & 1) ? 16 : found | 1; break;
6651                   case 'n': found = (found & 2) ? 16 : found | 2; break;
6652                   case 'z': found = (found & 4) ? 16 : found | 4; break;
6653                   case 'v': found = (found & 8) ? 16 : found | 8; break;
6654                   default: found = 16;
6655                   }
6656               if (found != 15)
6657                 goto failure;
6658               inst.operands[i].isvec = 1;
6659               /* APSR_nzcv is encoded in instructions as if it were the REG_PC.  */
6660               inst.operands[i].reg = REG_PC;
6661             }
6662           else
6663             goto failure;
6664           break;
6665
6666         case OP_TB:
6667           po_misc_or_fail (parse_tb (&str));
6668           break;
6669
6670           /* Register lists.  */
6671         case OP_REGLST:
6672           val = parse_reg_list (&str);
6673           if (*str == '^')
6674             {
6675               inst.operands[1].writeback = 1;
6676               str++;
6677             }
6678           break;
6679
6680         case OP_VRSLST:
6681           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
6682           break;
6683
6684         case OP_VRDLST:
6685           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
6686           break;
6687
6688         case OP_VRSDLST:
6689           /* Allow Q registers too.  */
6690           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6691                                     REGLIST_NEON_D);
6692           if (val == FAIL)
6693             {
6694               inst.error = NULL;
6695               val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6696                                         REGLIST_VFP_S);
6697               inst.operands[i].issingle = 1;
6698             }
6699           break;
6700
6701         case OP_NRDLST:
6702           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6703                                     REGLIST_NEON_D);
6704           break;
6705
6706         case OP_NSTRLST:
6707           val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
6708                                            &inst.operands[i].vectype);
6709           break;
6710
6711           /* Addressing modes */
6712         case OP_ADDR:
6713           po_misc_or_fail (parse_address (&str, i));
6714           break;
6715
6716         case OP_ADDRGLDR:
6717           po_misc_or_fail_no_backtrack (
6718             parse_address_group_reloc (&str, i, GROUP_LDR));
6719           break;
6720
6721         case OP_ADDRGLDRS:
6722           po_misc_or_fail_no_backtrack (
6723             parse_address_group_reloc (&str, i, GROUP_LDRS));
6724           break;
6725
6726         case OP_ADDRGLDC:
6727           po_misc_or_fail_no_backtrack (
6728             parse_address_group_reloc (&str, i, GROUP_LDC));
6729           break;
6730
6731         case OP_SH:
6732           po_misc_or_fail (parse_shifter_operand (&str, i));
6733           break;
6734
6735         case OP_SHG:
6736           po_misc_or_fail_no_backtrack (
6737             parse_shifter_operand_group_reloc (&str, i));
6738           break;
6739
6740         case OP_oSHll:
6741           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
6742           break;
6743
6744         case OP_oSHar:
6745           po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
6746           break;
6747
6748         case OP_oSHllar:
6749           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
6750           break;
6751
6752         default:
6753           as_fatal (_("unhandled operand code %d"), op_parse_code);
6754         }
6755
6756       /* Various value-based sanity checks and shared operations.  We
6757          do not signal immediate failures for the register constraints;
6758          this allows a syntax error to take precedence.  */
6759       switch (op_parse_code)
6760         {
6761         case OP_oRRnpc:
6762         case OP_RRnpc:
6763         case OP_RRnpcb:
6764         case OP_RRw:
6765         case OP_oRRw:
6766         case OP_RRnpc_I0:
6767           if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
6768             inst.error = BAD_PC;
6769           break;
6770
6771         case OP_oRRnpcsp:
6772         case OP_RRnpcsp:
6773           if (inst.operands[i].isreg)
6774             {
6775               if (inst.operands[i].reg == REG_PC)
6776                 inst.error = BAD_PC;
6777               else if (inst.operands[i].reg == REG_SP)
6778                 inst.error = BAD_SP;
6779             }
6780           break;
6781
6782         case OP_RRnpctw:
6783           if (inst.operands[i].isreg
6784               && inst.operands[i].reg == REG_PC
6785               && (inst.operands[i].writeback || thumb))
6786             inst.error = BAD_PC;
6787           break;
6788
6789         case OP_CPSF:
6790         case OP_ENDI:
6791         case OP_oROR:
6792         case OP_wPSR:
6793         case OP_rPSR:
6794         case OP_COND:
6795         case OP_oBARRIER_I15:
6796         case OP_REGLST:
6797         case OP_VRSLST:
6798         case OP_VRDLST:
6799         case OP_VRSDLST:
6800         case OP_NRDLST:
6801         case OP_NSTRLST:
6802           if (val == FAIL)
6803             goto failure;
6804           inst.operands[i].imm = val;
6805           break;
6806
6807         default:
6808           break;
6809         }
6810
6811       /* If we get here, this operand was successfully parsed.  */
6812       inst.operands[i].present = 1;
6813       continue;
6814
6815     bad_args:
6816       inst.error = BAD_ARGS;
6817
6818     failure:
6819       if (!backtrack_pos)
6820         {
6821           /* The parse routine should already have set inst.error, but set a
6822              default here just in case.  */
6823           if (!inst.error)
6824             inst.error = _("syntax error");
6825           return FAIL;
6826         }
6827
6828       /* Do not backtrack over a trailing optional argument that
6829          absorbed some text.  We will only fail again, with the
6830          'garbage following instruction' error message, which is
6831          probably less helpful than the current one.  */
6832       if (backtrack_index == i && backtrack_pos != str
6833           && upat[i+1] == OP_stop)
6834         {
6835           if (!inst.error)
6836             inst.error = _("syntax error");
6837           return FAIL;
6838         }
6839
6840       /* Try again, skipping the optional argument at backtrack_pos.  */
6841       str = backtrack_pos;
6842       inst.error = backtrack_error;
6843       inst.operands[backtrack_index].present = 0;
6844       i = backtrack_index;
6845       backtrack_pos = 0;
6846     }
6847
6848   /* Check that we have parsed all the arguments.  */
6849   if (*str != '\0' && !inst.error)
6850     inst.error = _("garbage following instruction");
6851
6852   return inst.error ? FAIL : SUCCESS;
6853 }
6854
6855 #undef po_char_or_fail
6856 #undef po_reg_or_fail
6857 #undef po_reg_or_goto
6858 #undef po_imm_or_fail
6859 #undef po_scalar_or_fail
6860 #undef po_barrier_or_imm
6861
6862 /* Shorthand macro for instruction encoding functions issuing errors.  */
6863 #define constraint(expr, err)                   \
6864   do                                            \
6865     {                                           \
6866       if (expr)                                 \
6867         {                                       \
6868           inst.error = err;                     \
6869           return;                               \
6870         }                                       \
6871     }                                           \
6872   while (0)
6873
6874 /* Reject "bad registers" for Thumb-2 instructions.  Many Thumb-2
6875    instructions are unpredictable if these registers are used.  This
6876    is the BadReg predicate in ARM's Thumb-2 documentation.  */
6877 #define reject_bad_reg(reg)                             \
6878   do                                                    \
6879    if (reg == REG_SP || reg == REG_PC)                  \
6880      {                                                  \
6881        inst.error = (reg == REG_SP) ? BAD_SP : BAD_PC;  \
6882        return;                                          \
6883      }                                                  \
6884   while (0)
6885
6886 /* If REG is R13 (the stack pointer), warn that its use is
6887    deprecated.  */
6888 #define warn_deprecated_sp(reg)                 \
6889   do                                            \
6890     if (warn_on_deprecated && reg == REG_SP)    \
6891        as_warn (_("use of r13 is deprecated")); \
6892   while (0)
6893
6894 /* Functions for operand encoding.  ARM, then Thumb.  */
6895
6896 #define rotate_left(v, n) (v << n | v >> (32 - n))
6897
6898 /* If VAL can be encoded in the immediate field of an ARM instruction,
6899    return the encoded form.  Otherwise, return FAIL.  */
6900
6901 static unsigned int
6902 encode_arm_immediate (unsigned int val)
6903 {
6904   unsigned int a, i;
6905
6906   for (i = 0; i < 32; i += 2)
6907     if ((a = rotate_left (val, i)) <= 0xff)
6908       return a | (i << 7); /* 12-bit pack: [shift-cnt,const].  */
6909
6910   return FAIL;
6911 }
6912
6913 /* If VAL can be encoded in the immediate field of a Thumb32 instruction,
6914    return the encoded form.  Otherwise, return FAIL.  */
6915 static unsigned int
6916 encode_thumb32_immediate (unsigned int val)
6917 {
6918   unsigned int a, i;
6919
6920   if (val <= 0xff)
6921     return val;
6922
6923   for (i = 1; i <= 24; i++)
6924     {
6925       a = val >> i;
6926       if ((val & ~(0xff << i)) == 0)
6927         return ((val >> i) & 0x7f) | ((32 - i) << 7);
6928     }
6929
6930   a = val & 0xff;
6931   if (val == ((a << 16) | a))
6932     return 0x100 | a;
6933   if (val == ((a << 24) | (a << 16) | (a << 8) | a))
6934     return 0x300 | a;
6935
6936   a = val & 0xff00;
6937   if (val == ((a << 16) | a))
6938     return 0x200 | (a >> 8);
6939
6940   return FAIL;
6941 }
6942 /* Encode a VFP SP or DP register number into inst.instruction.  */
6943
6944 static void
6945 encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
6946 {
6947   if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
6948       && reg > 15)
6949     {
6950       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
6951         {
6952           if (thumb_mode)
6953             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
6954                                     fpu_vfp_ext_d32);
6955           else
6956             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
6957                                     fpu_vfp_ext_d32);
6958         }
6959       else
6960         {
6961           first_error (_("D register out of range for selected VFP version"));
6962           return;
6963         }
6964     }
6965
6966   switch (pos)
6967     {
6968     case VFP_REG_Sd:
6969       inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
6970       break;
6971
6972     case VFP_REG_Sn:
6973       inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
6974       break;
6975
6976     case VFP_REG_Sm:
6977       inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
6978       break;
6979
6980     case VFP_REG_Dd:
6981       inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
6982       break;
6983
6984     case VFP_REG_Dn:
6985       inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
6986       break;
6987
6988     case VFP_REG_Dm:
6989       inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
6990       break;
6991
6992     default:
6993       abort ();
6994     }
6995 }
6996
6997 /* Encode a <shift> in an ARM-format instruction.  The immediate,
6998    if any, is handled by md_apply_fix.   */
6999 static void
7000 encode_arm_shift (int i)
7001 {
7002   if (inst.operands[i].shift_kind == SHIFT_RRX)
7003     inst.instruction |= SHIFT_ROR << 5;
7004   else
7005     {
7006       inst.instruction |= inst.operands[i].shift_kind << 5;
7007       if (inst.operands[i].immisreg)
7008         {
7009           inst.instruction |= SHIFT_BY_REG;
7010           inst.instruction |= inst.operands[i].imm << 8;
7011         }
7012       else
7013         inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7014     }
7015 }
7016
7017 static void
7018 encode_arm_shifter_operand (int i)
7019 {
7020   if (inst.operands[i].isreg)
7021     {
7022       inst.instruction |= inst.operands[i].reg;
7023       encode_arm_shift (i);
7024     }
7025   else
7026     {
7027       inst.instruction |= INST_IMMEDIATE;
7028       if (inst.reloc.type != BFD_RELOC_ARM_IMMEDIATE)
7029         inst.instruction |= inst.operands[i].imm;
7030     }
7031 }
7032
7033 /* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3.  */
7034 static void
7035 encode_arm_addr_mode_common (int i, bfd_boolean is_t)
7036 {
7037   gas_assert (inst.operands[i].isreg);
7038   inst.instruction |= inst.operands[i].reg << 16;
7039
7040   if (inst.operands[i].preind)
7041     {
7042       if (is_t)
7043         {
7044           inst.error = _("instruction does not accept preindexed addressing");
7045           return;
7046         }
7047       inst.instruction |= PRE_INDEX;
7048       if (inst.operands[i].writeback)
7049         inst.instruction |= WRITE_BACK;
7050
7051     }
7052   else if (inst.operands[i].postind)
7053     {
7054       gas_assert (inst.operands[i].writeback);
7055       if (is_t)
7056         inst.instruction |= WRITE_BACK;
7057     }
7058   else /* unindexed - only for coprocessor */
7059     {
7060       inst.error = _("instruction does not accept unindexed addressing");
7061       return;
7062     }
7063
7064   if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
7065       && (((inst.instruction & 0x000f0000) >> 16)
7066           == ((inst.instruction & 0x0000f000) >> 12)))
7067     as_warn ((inst.instruction & LOAD_BIT)
7068              ? _("destination register same as write-back base")
7069              : _("source register same as write-back base"));
7070 }
7071
7072 /* inst.operands[i] was set up by parse_address.  Encode it into an
7073    ARM-format mode 2 load or store instruction.  If is_t is true,
7074    reject forms that cannot be used with a T instruction (i.e. not
7075    post-indexed).  */
7076 static void
7077 encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
7078 {
7079   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
7080
7081   encode_arm_addr_mode_common (i, is_t);
7082
7083   if (inst.operands[i].immisreg)
7084     {
7085       constraint ((inst.operands[i].imm == REG_PC
7086                    || (is_pc && inst.operands[i].writeback)),
7087                   BAD_PC_ADDRESSING);
7088       inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
7089       inst.instruction |= inst.operands[i].imm;
7090       if (!inst.operands[i].negative)
7091         inst.instruction |= INDEX_UP;
7092       if (inst.operands[i].shifted)
7093         {
7094           if (inst.operands[i].shift_kind == SHIFT_RRX)
7095             inst.instruction |= SHIFT_ROR << 5;
7096           else
7097             {
7098               inst.instruction |= inst.operands[i].shift_kind << 5;
7099               inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7100             }
7101         }
7102     }
7103   else /* immediate offset in inst.reloc */
7104     {
7105       if (is_pc && !inst.reloc.pc_rel)
7106         {
7107           const bfd_boolean is_load = ((inst.instruction & LOAD_BIT) != 0);
7108
7109           /* If is_t is TRUE, it's called from do_ldstt.  ldrt/strt
7110              cannot use PC in addressing.
7111              PC cannot be used in writeback addressing, either.  */
7112           constraint ((is_t || inst.operands[i].writeback),
7113                       BAD_PC_ADDRESSING);
7114
7115           /* Use of PC in str is deprecated for ARMv7.  */
7116           if (warn_on_deprecated
7117               && !is_load
7118               && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
7119             as_warn (_("use of PC in this instruction is deprecated"));
7120         }
7121
7122       if (inst.reloc.type == BFD_RELOC_UNUSED)
7123         {
7124           /* Prefer + for zero encoded value.  */
7125           if (!inst.operands[i].negative)
7126             inst.instruction |= INDEX_UP;
7127           inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
7128         }
7129     }
7130 }
7131
7132 /* inst.operands[i] was set up by parse_address.  Encode it into an
7133    ARM-format mode 3 load or store instruction.  Reject forms that
7134    cannot be used with such instructions.  If is_t is true, reject
7135    forms that cannot be used with a T instruction (i.e. not
7136    post-indexed).  */
7137 static void
7138 encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
7139 {
7140   if (inst.operands[i].immisreg && inst.operands[i].shifted)
7141     {
7142       inst.error = _("instruction does not accept scaled register index");
7143       return;
7144     }
7145
7146   encode_arm_addr_mode_common (i, is_t);
7147
7148   if (inst.operands[i].immisreg)
7149     {
7150       constraint ((inst.operands[i].imm == REG_PC
7151                    || inst.operands[i].reg == REG_PC),
7152                   BAD_PC_ADDRESSING);
7153       inst.instruction |= inst.operands[i].imm;
7154       if (!inst.operands[i].negative)
7155         inst.instruction |= INDEX_UP;
7156     }
7157   else /* immediate offset in inst.reloc */
7158     {
7159       constraint ((inst.operands[i].reg == REG_PC && !inst.reloc.pc_rel
7160                    && inst.operands[i].writeback),
7161                   BAD_PC_WRITEBACK);
7162       inst.instruction |= HWOFFSET_IMM;
7163       if (inst.reloc.type == BFD_RELOC_UNUSED)
7164         {
7165           /* Prefer + for zero encoded value.  */
7166           if (!inst.operands[i].negative)
7167             inst.instruction |= INDEX_UP;
7168
7169           inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
7170         }
7171     }
7172 }
7173
7174 /* inst.operands[i] was set up by parse_address.  Encode it into an
7175    ARM-format instruction.  Reject all forms which cannot be encoded
7176    into a coprocessor load/store instruction.  If wb_ok is false,
7177    reject use of writeback; if unind_ok is false, reject use of
7178    unindexed addressing.  If reloc_override is not 0, use it instead
7179    of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
7180    (in which case it is preserved).  */
7181
7182 static int
7183 encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
7184 {
7185   inst.instruction |= inst.operands[i].reg << 16;
7186
7187   gas_assert (!(inst.operands[i].preind && inst.operands[i].postind));
7188
7189   if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
7190     {
7191       gas_assert (!inst.operands[i].writeback);
7192       if (!unind_ok)
7193         {
7194           inst.error = _("instruction does not support unindexed addressing");
7195           return FAIL;
7196         }
7197       inst.instruction |= inst.operands[i].imm;
7198       inst.instruction |= INDEX_UP;
7199       return SUCCESS;
7200     }
7201
7202   if (inst.operands[i].preind)
7203     inst.instruction |= PRE_INDEX;
7204
7205   if (inst.operands[i].writeback)
7206     {
7207       if (inst.operands[i].reg == REG_PC)
7208         {
7209           inst.error = _("pc may not be used with write-back");
7210           return FAIL;
7211         }
7212       if (!wb_ok)
7213         {
7214           inst.error = _("instruction does not support writeback");
7215           return FAIL;
7216         }
7217       inst.instruction |= WRITE_BACK;
7218     }
7219
7220   if (reloc_override)
7221     inst.reloc.type = (bfd_reloc_code_real_type) reloc_override;
7222   else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
7223             || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
7224            && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
7225     {
7226       if (thumb_mode)
7227         inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
7228       else
7229         inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
7230     }
7231
7232   /* Prefer + for zero encoded value.  */
7233   if (!inst.operands[i].negative)
7234     inst.instruction |= INDEX_UP;
7235
7236   return SUCCESS;
7237 }
7238
7239 /* inst.reloc.exp describes an "=expr" load pseudo-operation.
7240    Determine whether it can be performed with a move instruction; if
7241    it can, convert inst.instruction to that move instruction and
7242    return TRUE; if it can't, convert inst.instruction to a literal-pool
7243    load and return FALSE.  If this is not a valid thing to do in the
7244    current context, set inst.error and return TRUE.
7245
7246    inst.operands[i] describes the destination register.  */
7247
7248 static bfd_boolean
7249 move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
7250 {
7251   unsigned long tbit;
7252
7253   if (thumb_p)
7254     tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
7255   else
7256     tbit = LOAD_BIT;
7257
7258   if ((inst.instruction & tbit) == 0)
7259     {
7260       inst.error = _("invalid pseudo operation");
7261       return TRUE;
7262     }
7263   if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
7264     {
7265       inst.error = _("constant expression expected");
7266       return TRUE;
7267     }
7268   if (inst.reloc.exp.X_op == O_constant)
7269     {
7270       if (thumb_p)
7271         {
7272           if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
7273             {
7274               /* This can be done with a mov(1) instruction.  */
7275               inst.instruction  = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
7276               inst.instruction |= inst.reloc.exp.X_add_number;
7277               return TRUE;
7278             }
7279         }
7280       else
7281         {
7282           int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
7283           if (value != FAIL)
7284             {
7285               /* This can be done with a mov instruction.  */
7286               inst.instruction &= LITERAL_MASK;
7287               inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
7288               inst.instruction |= value & 0xfff;
7289               return TRUE;
7290             }
7291
7292           value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
7293           if (value != FAIL)
7294             {
7295               /* This can be done with a mvn instruction.  */
7296               inst.instruction &= LITERAL_MASK;
7297               inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
7298               inst.instruction |= value & 0xfff;
7299               return TRUE;
7300             }
7301         }
7302     }
7303
7304   if (add_to_lit_pool () == FAIL)
7305     {
7306       inst.error = _("literal pool insertion failed");
7307       return TRUE;
7308     }
7309   inst.operands[1].reg = REG_PC;
7310   inst.operands[1].isreg = 1;
7311   inst.operands[1].preind = 1;
7312   inst.reloc.pc_rel = 1;
7313   inst.reloc.type = (thumb_p
7314                      ? BFD_RELOC_ARM_THUMB_OFFSET
7315                      : (mode_3
7316                         ? BFD_RELOC_ARM_HWLITERAL
7317                         : BFD_RELOC_ARM_LITERAL));
7318   return FALSE;
7319 }
7320
7321 /* Functions for instruction encoding, sorted by sub-architecture.
7322    First some generics; their names are taken from the conventional
7323    bit positions for register arguments in ARM format instructions.  */
7324
7325 static void
7326 do_noargs (void)
7327 {
7328 }
7329
7330 static void
7331 do_rd (void)
7332 {
7333   inst.instruction |= inst.operands[0].reg << 12;
7334 }
7335
7336 static void
7337 do_rd_rm (void)
7338 {
7339   inst.instruction |= inst.operands[0].reg << 12;
7340   inst.instruction |= inst.operands[1].reg;
7341 }
7342
7343 static void
7344 do_rd_rn (void)
7345 {
7346   inst.instruction |= inst.operands[0].reg << 12;
7347   inst.instruction |= inst.operands[1].reg << 16;
7348 }
7349
7350 static void
7351 do_rn_rd (void)
7352 {
7353   inst.instruction |= inst.operands[0].reg << 16;
7354   inst.instruction |= inst.operands[1].reg << 12;
7355 }
7356
7357 static void
7358 do_rd_rm_rn (void)
7359 {
7360   unsigned Rn = inst.operands[2].reg;
7361   /* Enforce restrictions on SWP instruction.  */
7362   if ((inst.instruction & 0x0fbfffff) == 0x01000090)
7363     {
7364       constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
7365                   _("Rn must not overlap other operands"));
7366
7367       /* SWP{b} is deprecated for ARMv6* and ARMv7.  */
7368       if (warn_on_deprecated
7369           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
7370         as_warn (_("swp{b} use is deprecated for this architecture"));
7371
7372     }
7373   inst.instruction |= inst.operands[0].reg << 12;
7374   inst.instruction |= inst.operands[1].reg;
7375   inst.instruction |= Rn << 16;
7376 }
7377
7378 static void
7379 do_rd_rn_rm (void)
7380 {
7381   inst.instruction |= inst.operands[0].reg << 12;
7382   inst.instruction |= inst.operands[1].reg << 16;
7383   inst.instruction |= inst.operands[2].reg;
7384 }
7385
7386 static void
7387 do_rm_rd_rn (void)
7388 {
7389   constraint ((inst.operands[2].reg == REG_PC), BAD_PC);
7390   constraint (((inst.reloc.exp.X_op != O_constant
7391                 && inst.reloc.exp.X_op != O_illegal)
7392                || inst.reloc.exp.X_add_number != 0),
7393               BAD_ADDR_MODE);
7394   inst.instruction |= inst.operands[0].reg;
7395   inst.instruction |= inst.operands[1].reg << 12;
7396   inst.instruction |= inst.operands[2].reg << 16;
7397 }
7398
7399 static void
7400 do_imm0 (void)
7401 {
7402   inst.instruction |= inst.operands[0].imm;
7403 }
7404
7405 static void
7406 do_rd_cpaddr (void)
7407 {
7408   inst.instruction |= inst.operands[0].reg << 12;
7409   encode_arm_cp_address (1, TRUE, TRUE, 0);
7410 }
7411
7412 /* ARM instructions, in alphabetical order by function name (except
7413    that wrapper functions appear immediately after the function they
7414    wrap).  */
7415
7416 /* This is a pseudo-op of the form "adr rd, label" to be converted
7417    into a relative address of the form "add rd, pc, #label-.-8".  */
7418
7419 static void
7420 do_adr (void)
7421 {
7422   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7423
7424   /* Frag hacking will turn this into a sub instruction if the offset turns
7425      out to be negative.  */
7426   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
7427   inst.reloc.pc_rel = 1;
7428   inst.reloc.exp.X_add_number -= 8;
7429 }
7430
7431 /* This is a pseudo-op of the form "adrl rd, label" to be converted
7432    into a relative address of the form:
7433    add rd, pc, #low(label-.-8)"
7434    add rd, rd, #high(label-.-8)"  */
7435
7436 static void
7437 do_adrl (void)
7438 {
7439   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
7440
7441   /* Frag hacking will turn this into a sub instruction if the offset turns
7442      out to be negative.  */
7443   inst.reloc.type              = BFD_RELOC_ARM_ADRL_IMMEDIATE;
7444   inst.reloc.pc_rel            = 1;
7445   inst.size                    = INSN_SIZE * 2;
7446   inst.reloc.exp.X_add_number -= 8;
7447 }
7448
7449 static void
7450 do_arit (void)
7451 {
7452   if (!inst.operands[1].present)
7453     inst.operands[1].reg = inst.operands[0].reg;
7454   inst.instruction |= inst.operands[0].reg << 12;
7455   inst.instruction |= inst.operands[1].reg << 16;
7456   encode_arm_shifter_operand (2);
7457 }
7458
7459 static void
7460 do_barrier (void)
7461 {
7462   if (inst.operands[0].present)
7463     {
7464       constraint ((inst.instruction & 0xf0) != 0x40
7465                   && inst.operands[0].imm > 0xf
7466                   && inst.operands[0].imm < 0x0,
7467                   _("bad barrier type"));
7468       inst.instruction |= inst.operands[0].imm;
7469     }
7470   else
7471     inst.instruction |= 0xf;
7472 }
7473
7474 static void
7475 do_bfc (void)
7476 {
7477   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
7478   constraint (msb > 32, _("bit-field extends past end of register"));
7479   /* The instruction encoding stores the LSB and MSB,
7480      not the LSB and width.  */
7481   inst.instruction |= inst.operands[0].reg << 12;
7482   inst.instruction |= inst.operands[1].imm << 7;
7483   inst.instruction |= (msb - 1) << 16;
7484 }
7485
7486 static void
7487 do_bfi (void)
7488 {
7489   unsigned int msb;
7490
7491   /* #0 in second position is alternative syntax for bfc, which is
7492      the same instruction but with REG_PC in the Rm field.  */
7493   if (!inst.operands[1].isreg)
7494     inst.operands[1].reg = REG_PC;
7495
7496   msb = inst.operands[2].imm + inst.operands[3].imm;
7497   constraint (msb > 32, _("bit-field extends past end of register"));
7498   /* The instruction encoding stores the LSB and MSB,
7499      not the LSB and width.  */
7500   inst.instruction |= inst.operands[0].reg << 12;
7501   inst.instruction |= inst.operands[1].reg;
7502   inst.instruction |= inst.operands[2].imm << 7;
7503   inst.instruction |= (msb - 1) << 16;
7504 }
7505
7506 static void
7507 do_bfx (void)
7508 {
7509   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
7510               _("bit-field extends past end of register"));
7511   inst.instruction |= inst.operands[0].reg << 12;
7512   inst.instruction |= inst.operands[1].reg;
7513   inst.instruction |= inst.operands[2].imm << 7;
7514   inst.instruction |= (inst.operands[3].imm - 1) << 16;
7515 }
7516
7517 /* ARM V5 breakpoint instruction (argument parse)
7518      BKPT <16 bit unsigned immediate>
7519      Instruction is not conditional.
7520         The bit pattern given in insns[] has the COND_ALWAYS condition,
7521         and it is an error if the caller tried to override that.  */
7522
7523 static void
7524 do_bkpt (void)
7525 {
7526   /* Top 12 of 16 bits to bits 19:8.  */
7527   inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
7528
7529   /* Bottom 4 of 16 bits to bits 3:0.  */
7530   inst.instruction |= inst.operands[0].imm & 0xf;
7531 }
7532
7533 static void
7534 encode_branch (int default_reloc)
7535 {
7536   if (inst.operands[0].hasreloc)
7537     {
7538       constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32
7539                   && inst.operands[0].imm != BFD_RELOC_ARM_TLS_CALL,
7540                   _("the only valid suffixes here are '(plt)' and '(tlscall)'"));
7541       inst.reloc.type = inst.operands[0].imm == BFD_RELOC_ARM_PLT32
7542         ? BFD_RELOC_ARM_PLT32
7543         : thumb_mode ? BFD_RELOC_ARM_THM_TLS_CALL : BFD_RELOC_ARM_TLS_CALL;
7544     }
7545   else
7546     inst.reloc.type = (bfd_reloc_code_real_type) default_reloc;
7547   inst.reloc.pc_rel = 1;
7548 }
7549
7550 static void
7551 do_branch (void)
7552 {
7553 #ifdef OBJ_ELF
7554   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7555     encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7556   else
7557 #endif
7558     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7559 }
7560
7561 static void
7562 do_bl (void)
7563 {
7564 #ifdef OBJ_ELF
7565   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7566     {
7567       if (inst.cond == COND_ALWAYS)
7568         encode_branch (BFD_RELOC_ARM_PCREL_CALL);
7569       else
7570         encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7571     }
7572   else
7573 #endif
7574     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7575 }
7576
7577 /* ARM V5 branch-link-exchange instruction (argument parse)
7578      BLX <target_addr>          ie BLX(1)
7579      BLX{<condition>} <Rm>      ie BLX(2)
7580    Unfortunately, there are two different opcodes for this mnemonic.
7581    So, the insns[].value is not used, and the code here zaps values
7582         into inst.instruction.
7583    Also, the <target_addr> can be 25 bits, hence has its own reloc.  */
7584
7585 static void
7586 do_blx (void)
7587 {
7588   if (inst.operands[0].isreg)
7589     {
7590       /* Arg is a register; the opcode provided by insns[] is correct.
7591          It is not illegal to do "blx pc", just useless.  */
7592       if (inst.operands[0].reg == REG_PC)
7593         as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
7594
7595       inst.instruction |= inst.operands[0].reg;
7596     }
7597   else
7598     {
7599       /* Arg is an address; this instruction cannot be executed
7600          conditionally, and the opcode must be adjusted.
7601          We retain the BFD_RELOC_ARM_PCREL_BLX till the very end
7602          where we generate out a BFD_RELOC_ARM_PCREL_CALL instead.  */
7603       constraint (inst.cond != COND_ALWAYS, BAD_COND);
7604       inst.instruction = 0xfa000000;
7605       encode_branch (BFD_RELOC_ARM_PCREL_BLX);
7606     }
7607 }
7608
7609 static void
7610 do_bx (void)
7611 {
7612   bfd_boolean want_reloc;
7613
7614   if (inst.operands[0].reg == REG_PC)
7615     as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
7616
7617   inst.instruction |= inst.operands[0].reg;
7618   /* Output R_ARM_V4BX relocations if is an EABI object that looks like
7619      it is for ARMv4t or earlier.  */
7620   want_reloc = !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5);
7621   if (object_arch && !ARM_CPU_HAS_FEATURE (*object_arch, arm_ext_v5))
7622       want_reloc = TRUE;
7623
7624 #ifdef OBJ_ELF
7625   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
7626 #endif
7627     want_reloc = FALSE;
7628
7629   if (want_reloc)
7630     inst.reloc.type = BFD_RELOC_ARM_V4BX;
7631 }
7632
7633
7634 /* ARM v5TEJ.  Jump to Jazelle code.  */
7635
7636 static void
7637 do_bxj (void)
7638 {
7639   if (inst.operands[0].reg == REG_PC)
7640     as_tsktsk (_("use of r15 in bxj is not really useful"));
7641
7642   inst.instruction |= inst.operands[0].reg;
7643 }
7644
7645 /* Co-processor data operation:
7646       CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
7647       CDP2      <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}  */
7648 static void
7649 do_cdp (void)
7650 {
7651   inst.instruction |= inst.operands[0].reg << 8;
7652   inst.instruction |= inst.operands[1].imm << 20;
7653   inst.instruction |= inst.operands[2].reg << 12;
7654   inst.instruction |= inst.operands[3].reg << 16;
7655   inst.instruction |= inst.operands[4].reg;
7656   inst.instruction |= inst.operands[5].imm << 5;
7657 }
7658
7659 static void
7660 do_cmp (void)
7661 {
7662   inst.instruction |= inst.operands[0].reg << 16;
7663   encode_arm_shifter_operand (1);
7664 }
7665
7666 /* Transfer between coprocessor and ARM registers.
7667    MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
7668    MRC2
7669    MCR{cond}
7670    MCR2
7671
7672    No special properties.  */
7673
7674 static void
7675 do_co_reg (void)
7676 {
7677   unsigned Rd;
7678
7679   Rd = inst.operands[2].reg;
7680   if (thumb_mode)
7681     {
7682       if (inst.instruction == 0xee000010
7683           || inst.instruction == 0xfe000010)
7684         /* MCR, MCR2  */
7685         reject_bad_reg (Rd);
7686       else
7687         /* MRC, MRC2  */
7688         constraint (Rd == REG_SP, BAD_SP);
7689     }
7690   else
7691     {
7692       /* MCR */
7693       if (inst.instruction == 0xe000010)
7694         constraint (Rd == REG_PC, BAD_PC);
7695     }
7696
7697
7698   inst.instruction |= inst.operands[0].reg << 8;
7699   inst.instruction |= inst.operands[1].imm << 21;
7700   inst.instruction |= Rd << 12;
7701   inst.instruction |= inst.operands[3].reg << 16;
7702   inst.instruction |= inst.operands[4].reg;
7703   inst.instruction |= inst.operands[5].imm << 5;
7704 }
7705
7706 /* Transfer between coprocessor register and pair of ARM registers.
7707    MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
7708    MCRR2
7709    MRRC{cond}
7710    MRRC2
7711
7712    Two XScale instructions are special cases of these:
7713
7714      MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
7715      MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
7716
7717    Result unpredictable if Rd or Rn is R15.  */
7718
7719 static void
7720 do_co_reg2c (void)
7721 {
7722   unsigned Rd, Rn;
7723
7724   Rd = inst.operands[2].reg;
7725   Rn = inst.operands[3].reg;
7726
7727   if (thumb_mode)
7728     {
7729       reject_bad_reg (Rd);
7730       reject_bad_reg (Rn);
7731     }
7732   else
7733     {
7734       constraint (Rd == REG_PC, BAD_PC);
7735       constraint (Rn == REG_PC, BAD_PC);
7736     }
7737
7738   inst.instruction |= inst.operands[0].reg << 8;
7739   inst.instruction |= inst.operands[1].imm << 4;
7740   inst.instruction |= Rd << 12;
7741   inst.instruction |= Rn << 16;
7742   inst.instruction |= inst.operands[4].reg;
7743 }
7744
7745 static void
7746 do_cpsi (void)
7747 {
7748   inst.instruction |= inst.operands[0].imm << 6;
7749   if (inst.operands[1].present)
7750     {
7751       inst.instruction |= CPSI_MMOD;
7752       inst.instruction |= inst.operands[1].imm;
7753     }
7754 }
7755
7756 static void
7757 do_dbg (void)
7758 {
7759   inst.instruction |= inst.operands[0].imm;
7760 }
7761
7762 static void
7763 do_div (void)
7764 {
7765   unsigned Rd, Rn, Rm;
7766
7767   Rd = inst.operands[0].reg;
7768   Rn = (inst.operands[1].present
7769         ? inst.operands[1].reg : Rd);
7770   Rm = inst.operands[2].reg;
7771
7772   constraint ((Rd == REG_PC), BAD_PC);
7773   constraint ((Rn == REG_PC), BAD_PC);
7774   constraint ((Rm == REG_PC), BAD_PC);
7775
7776   inst.instruction |= Rd << 16;
7777   inst.instruction |= Rn << 0;
7778   inst.instruction |= Rm << 8;
7779 }
7780
7781 static void
7782 do_it (void)
7783 {
7784   /* There is no IT instruction in ARM mode.  We
7785      process it to do the validation as if in
7786      thumb mode, just in case the code gets
7787      assembled for thumb using the unified syntax.  */
7788
7789   inst.size = 0;
7790   if (unified_syntax)
7791     {
7792       set_it_insn_type (IT_INSN);
7793       now_it.mask = (inst.instruction & 0xf) | 0x10;
7794       now_it.cc = inst.operands[0].imm;
7795     }
7796 }
7797
7798 static void
7799 do_ldmstm (void)
7800 {
7801   int base_reg = inst.operands[0].reg;
7802   int range = inst.operands[1].imm;
7803
7804   inst.instruction |= base_reg << 16;
7805   inst.instruction |= range;
7806
7807   if (inst.operands[1].writeback)
7808     inst.instruction |= LDM_TYPE_2_OR_3;
7809
7810   if (inst.operands[0].writeback)
7811     {
7812       inst.instruction |= WRITE_BACK;
7813       /* Check for unpredictable uses of writeback.  */
7814       if (inst.instruction & LOAD_BIT)
7815         {
7816           /* Not allowed in LDM type 2.  */
7817           if ((inst.instruction & LDM_TYPE_2_OR_3)
7818               && ((range & (1 << REG_PC)) == 0))
7819             as_warn (_("writeback of base register is UNPREDICTABLE"));
7820           /* Only allowed if base reg not in list for other types.  */
7821           else if (range & (1 << base_reg))
7822             as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
7823         }
7824       else /* STM.  */
7825         {
7826           /* Not allowed for type 2.  */
7827           if (inst.instruction & LDM_TYPE_2_OR_3)
7828             as_warn (_("writeback of base register is UNPREDICTABLE"));
7829           /* Only allowed if base reg not in list, or first in list.  */
7830           else if ((range & (1 << base_reg))
7831                    && (range & ((1 << base_reg) - 1)))
7832             as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
7833         }
7834     }
7835 }
7836
7837 /* ARMv5TE load-consecutive (argument parse)
7838    Mode is like LDRH.
7839
7840      LDRccD R, mode
7841      STRccD R, mode.  */
7842
7843 static void
7844 do_ldrd (void)
7845 {
7846   constraint (inst.operands[0].reg % 2 != 0,
7847               _("first transfer register must be even"));
7848   constraint (inst.operands[1].present
7849               && inst.operands[1].reg != inst.operands[0].reg + 1,
7850               _("can only transfer two consecutive registers"));
7851   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
7852   constraint (!inst.operands[2].isreg, _("'[' expected"));
7853
7854   if (!inst.operands[1].present)
7855     inst.operands[1].reg = inst.operands[0].reg + 1;
7856
7857   /* encode_arm_addr_mode_3 will diagnose overlap between the base
7858      register and the first register written; we have to diagnose
7859      overlap between the base and the second register written here.  */
7860
7861   if (inst.operands[2].reg == inst.operands[1].reg
7862       && (inst.operands[2].writeback || inst.operands[2].postind))
7863     as_warn (_("base register written back, and overlaps "
7864                "second transfer register"));
7865
7866   if (!(inst.instruction & V4_STR_BIT))
7867     {
7868       /* For an index-register load, the index register must not overlap the
7869         destination (even if not write-back).  */
7870       if (inst.operands[2].immisreg
7871               && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
7872               || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
7873         as_warn (_("index register overlaps transfer register"));
7874     }
7875   inst.instruction |= inst.operands[0].reg << 12;
7876   encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
7877 }
7878
7879 static void
7880 do_ldrex (void)
7881 {
7882   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
7883               || inst.operands[1].postind || inst.operands[1].writeback
7884               || inst.operands[1].immisreg || inst.operands[1].shifted
7885               || inst.operands[1].negative
7886               /* This can arise if the programmer has written
7887                    strex rN, rM, foo
7888                  or if they have mistakenly used a register name as the last
7889                  operand,  eg:
7890                    strex rN, rM, rX
7891                  It is very difficult to distinguish between these two cases
7892                  because "rX" might actually be a label. ie the register
7893                  name has been occluded by a symbol of the same name. So we
7894                  just generate a general 'bad addressing mode' type error
7895                  message and leave it up to the programmer to discover the
7896                  true cause and fix their mistake.  */
7897               || (inst.operands[1].reg == REG_PC),
7898               BAD_ADDR_MODE);
7899
7900   constraint (inst.reloc.exp.X_op != O_constant
7901               || inst.reloc.exp.X_add_number != 0,
7902               _("offset must be zero in ARM encoding"));
7903
7904   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
7905
7906   inst.instruction |= inst.operands[0].reg << 12;
7907   inst.instruction |= inst.operands[1].reg << 16;
7908   inst.reloc.type = BFD_RELOC_UNUSED;
7909 }
7910
7911 static void
7912 do_ldrexd (void)
7913 {
7914   constraint (inst.operands[0].reg % 2 != 0,
7915               _("even register required"));
7916   constraint (inst.operands[1].present
7917               && inst.operands[1].reg != inst.operands[0].reg + 1,
7918               _("can only load two consecutive registers"));
7919   /* If op 1 were present and equal to PC, this function wouldn't
7920      have been called in the first place.  */
7921   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
7922
7923   inst.instruction |= inst.operands[0].reg << 12;
7924   inst.instruction |= inst.operands[2].reg << 16;
7925 }
7926
7927 /* In both ARM and thumb state 'ldr pc, #imm'  with an immediate
7928    which is not a multiple of four is UNPREDICTABLE.  */
7929 static void
7930 check_ldr_r15_aligned (void)
7931 {
7932   constraint (!(inst.operands[1].immisreg)
7933               && (inst.operands[0].reg == REG_PC
7934               && inst.operands[1].reg == REG_PC
7935               && (inst.reloc.exp.X_add_number & 0x3)),
7936               _("ldr to register 15 must be 4-byte alligned"));
7937 }
7938
7939 static void
7940 do_ldst (void)
7941 {
7942   inst.instruction |= inst.operands[0].reg << 12;
7943   if (!inst.operands[1].isreg)
7944     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
7945       return;
7946   encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
7947   check_ldr_r15_aligned ();
7948 }
7949
7950 static void
7951 do_ldstt (void)
7952 {
7953   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
7954      reject [Rn,...].  */
7955   if (inst.operands[1].preind)
7956     {
7957       constraint (inst.reloc.exp.X_op != O_constant
7958                   || inst.reloc.exp.X_add_number != 0,
7959                   _("this instruction requires a post-indexed address"));
7960
7961       inst.operands[1].preind = 0;
7962       inst.operands[1].postind = 1;
7963       inst.operands[1].writeback = 1;
7964     }
7965   inst.instruction |= inst.operands[0].reg << 12;
7966   encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
7967 }
7968
7969 /* Halfword and signed-byte load/store operations.  */
7970
7971 static void
7972 do_ldstv4 (void)
7973 {
7974   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
7975   inst.instruction |= inst.operands[0].reg << 12;
7976   if (!inst.operands[1].isreg)
7977     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
7978       return;
7979   encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
7980 }
7981
7982 static void
7983 do_ldsttv4 (void)
7984 {
7985   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
7986      reject [Rn,...].  */
7987   if (inst.operands[1].preind)
7988     {
7989       constraint (inst.reloc.exp.X_op != O_constant
7990                   || inst.reloc.exp.X_add_number != 0,
7991                   _("this instruction requires a post-indexed address"));
7992
7993       inst.operands[1].preind = 0;
7994       inst.operands[1].postind = 1;
7995       inst.operands[1].writeback = 1;
7996     }
7997   inst.instruction |= inst.operands[0].reg << 12;
7998   encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
7999 }
8000
8001 /* Co-processor register load/store.
8002    Format: <LDC|STC>{cond}[L] CP#,CRd,<address>  */
8003 static void
8004 do_lstc (void)
8005 {
8006   inst.instruction |= inst.operands[0].reg << 8;
8007   inst.instruction |= inst.operands[1].reg << 12;
8008   encode_arm_cp_address (2, TRUE, TRUE, 0);
8009 }
8010
8011 static void
8012 do_mlas (void)
8013 {
8014   /* This restriction does not apply to mls (nor to mla in v6 or later).  */
8015   if (inst.operands[0].reg == inst.operands[1].reg
8016       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
8017       && !(inst.instruction & 0x00400000))
8018     as_tsktsk (_("Rd and Rm should be different in mla"));
8019
8020   inst.instruction |= inst.operands[0].reg << 16;
8021   inst.instruction |= inst.operands[1].reg;
8022   inst.instruction |= inst.operands[2].reg << 8;
8023   inst.instruction |= inst.operands[3].reg << 12;
8024 }
8025
8026 static void
8027 do_mov (void)
8028 {
8029   inst.instruction |= inst.operands[0].reg << 12;
8030   encode_arm_shifter_operand (1);
8031 }
8032
8033 /* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>.  */
8034 static void
8035 do_mov16 (void)
8036 {
8037   bfd_vma imm;
8038   bfd_boolean top;
8039
8040   top = (inst.instruction & 0x00400000) != 0;
8041   constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
8042               _(":lower16: not allowed this instruction"));
8043   constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
8044               _(":upper16: not allowed instruction"));
8045   inst.instruction |= inst.operands[0].reg << 12;
8046   if (inst.reloc.type == BFD_RELOC_UNUSED)
8047     {
8048       imm = inst.reloc.exp.X_add_number;
8049       /* The value is in two pieces: 0:11, 16:19.  */
8050       inst.instruction |= (imm & 0x00000fff);
8051       inst.instruction |= (imm & 0x0000f000) << 4;
8052     }
8053 }
8054
8055 static void do_vfp_nsyn_opcode (const char *);
8056
8057 static int
8058 do_vfp_nsyn_mrs (void)
8059 {
8060   if (inst.operands[0].isvec)
8061     {
8062       if (inst.operands[1].reg != 1)
8063         first_error (_("operand 1 must be FPSCR"));
8064       memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
8065       memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
8066       do_vfp_nsyn_opcode ("fmstat");
8067     }
8068   else if (inst.operands[1].isvec)
8069     do_vfp_nsyn_opcode ("fmrx");
8070   else
8071     return FAIL;
8072
8073   return SUCCESS;
8074 }
8075
8076 static int
8077 do_vfp_nsyn_msr (void)
8078 {
8079   if (inst.operands[0].isvec)
8080     do_vfp_nsyn_opcode ("fmxr");
8081   else
8082     return FAIL;
8083
8084   return SUCCESS;
8085 }
8086
8087 static void
8088 do_vmrs (void)
8089 {
8090   unsigned Rt = inst.operands[0].reg;
8091
8092   if (thumb_mode && inst.operands[0].reg == REG_SP)
8093     {
8094       inst.error = BAD_SP;
8095       return;
8096     }
8097
8098   /* APSR_ sets isvec. All other refs to PC are illegal.  */
8099   if (!inst.operands[0].isvec && inst.operands[0].reg == REG_PC)
8100     {
8101       inst.error = BAD_PC;
8102       return;
8103     }
8104
8105   switch (inst.operands[1].reg)
8106     {
8107     case 0: /* FPSID */
8108     case 1: /* FPSCR */
8109     case 6: /* MVFR1 */
8110     case 7: /* MVFR0 */
8111     case 8: /* FPEXC */
8112       inst.instruction |= (inst.operands[1].reg << 16);
8113       break;
8114     default:
8115       first_error (_("operand 1 must be a VFP extension System Register"));
8116     }
8117
8118   inst.instruction |= (Rt << 12);
8119 }
8120
8121 static void
8122 do_vmsr (void)
8123 {
8124   unsigned Rt = inst.operands[1].reg;
8125
8126   if (thumb_mode)
8127     reject_bad_reg (Rt);
8128   else if (Rt == REG_PC)
8129     {
8130       inst.error = BAD_PC;
8131       return;
8132     }
8133
8134   switch (inst.operands[0].reg)
8135     {
8136     case 0: /* FPSID  */
8137     case 1: /* FPSCR  */
8138     case 8: /* FPEXC */
8139       inst.instruction |= (inst.operands[0].reg << 16);
8140       break;
8141     default:
8142       first_error (_("operand 0 must be FPSID or FPSCR pr FPEXC"));
8143     }
8144
8145   inst.instruction |= (Rt << 12);
8146 }
8147
8148 static void
8149 do_mrs (void)
8150 {
8151   unsigned br;
8152
8153   if (do_vfp_nsyn_mrs () == SUCCESS)
8154     return;
8155
8156   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
8157   inst.instruction |= inst.operands[0].reg << 12;
8158
8159   if (inst.operands[1].isreg)
8160     {
8161       br = inst.operands[1].reg;
8162       if (((br & 0x200) == 0) && ((br & 0xf0000) != 0xf000))
8163         as_bad (_("bad register for mrs"));
8164     }
8165   else
8166     {
8167       /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
8168       constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
8169                   != (PSR_c|PSR_f),
8170                   _("'APSR', 'CPSR' or 'SPSR' expected"));
8171       br = (15<<16) | (inst.operands[1].imm & SPSR_BIT);
8172     }
8173
8174   inst.instruction |= br;
8175 }
8176
8177 /* Two possible forms:
8178       "{C|S}PSR_<field>, Rm",
8179       "{C|S}PSR_f, #expression".  */
8180
8181 static void
8182 do_msr (void)
8183 {
8184   if (do_vfp_nsyn_msr () == SUCCESS)
8185     return;
8186
8187   inst.instruction |= inst.operands[0].imm;
8188   if (inst.operands[1].isreg)
8189     inst.instruction |= inst.operands[1].reg;
8190   else
8191     {
8192       inst.instruction |= INST_IMMEDIATE;
8193       inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
8194       inst.reloc.pc_rel = 0;
8195     }
8196 }
8197
8198 static void
8199 do_mul (void)
8200 {
8201   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
8202
8203   if (!inst.operands[2].present)
8204     inst.operands[2].reg = inst.operands[0].reg;
8205   inst.instruction |= inst.operands[0].reg << 16;
8206   inst.instruction |= inst.operands[1].reg;
8207   inst.instruction |= inst.operands[2].reg << 8;
8208
8209   if (inst.operands[0].reg == inst.operands[1].reg
8210       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8211     as_tsktsk (_("Rd and Rm should be different in mul"));
8212 }
8213
8214 /* Long Multiply Parser
8215    UMULL RdLo, RdHi, Rm, Rs
8216    SMULL RdLo, RdHi, Rm, Rs
8217    UMLAL RdLo, RdHi, Rm, Rs
8218    SMLAL RdLo, RdHi, Rm, Rs.  */
8219
8220 static void
8221 do_mull (void)
8222 {
8223   inst.instruction |= inst.operands[0].reg << 12;
8224   inst.instruction |= inst.operands[1].reg << 16;
8225   inst.instruction |= inst.operands[2].reg;
8226   inst.instruction |= inst.operands[3].reg << 8;
8227
8228   /* rdhi and rdlo must be different.  */
8229   if (inst.operands[0].reg == inst.operands[1].reg)
8230     as_tsktsk (_("rdhi and rdlo must be different"));
8231
8232   /* rdhi, rdlo and rm must all be different before armv6.  */
8233   if ((inst.operands[0].reg == inst.operands[2].reg
8234       || inst.operands[1].reg == inst.operands[2].reg)
8235       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8236     as_tsktsk (_("rdhi, rdlo and rm must all be different"));
8237 }
8238
8239 static void
8240 do_nop (void)
8241 {
8242   if (inst.operands[0].present
8243       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k))
8244     {
8245       /* Architectural NOP hints are CPSR sets with no bits selected.  */
8246       inst.instruction &= 0xf0000000;
8247       inst.instruction |= 0x0320f000;
8248       if (inst.operands[0].present)
8249         inst.instruction |= inst.operands[0].imm;
8250     }
8251 }
8252
8253 /* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
8254    PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
8255    Condition defaults to COND_ALWAYS.
8256    Error if Rd, Rn or Rm are R15.  */
8257
8258 static void
8259 do_pkhbt (void)
8260 {
8261   inst.instruction |= inst.operands[0].reg << 12;
8262   inst.instruction |= inst.operands[1].reg << 16;
8263   inst.instruction |= inst.operands[2].reg;
8264   if (inst.operands[3].present)
8265     encode_arm_shift (3);
8266 }
8267
8268 /* ARM V6 PKHTB (Argument Parse).  */
8269
8270 static void
8271 do_pkhtb (void)
8272 {
8273   if (!inst.operands[3].present)
8274     {
8275       /* If the shift specifier is omitted, turn the instruction
8276          into pkhbt rd, rm, rn. */
8277       inst.instruction &= 0xfff00010;
8278       inst.instruction |= inst.operands[0].reg << 12;
8279       inst.instruction |= inst.operands[1].reg;
8280       inst.instruction |= inst.operands[2].reg << 16;
8281     }
8282   else
8283     {
8284       inst.instruction |= inst.operands[0].reg << 12;
8285       inst.instruction |= inst.operands[1].reg << 16;
8286       inst.instruction |= inst.operands[2].reg;
8287       encode_arm_shift (3);
8288     }
8289 }
8290
8291 /* ARMv5TE: Preload-Cache
8292    MP Extensions: Preload for write
8293
8294     PLD(W) <addr_mode>
8295
8296   Syntactically, like LDR with B=1, W=0, L=1.  */
8297
8298 static void
8299 do_pld (void)
8300 {
8301   constraint (!inst.operands[0].isreg,
8302               _("'[' expected after PLD mnemonic"));
8303   constraint (inst.operands[0].postind,
8304               _("post-indexed expression used in preload instruction"));
8305   constraint (inst.operands[0].writeback,
8306               _("writeback used in preload instruction"));
8307   constraint (!inst.operands[0].preind,
8308               _("unindexed addressing used in preload instruction"));
8309   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8310 }
8311
8312 /* ARMv7: PLI <addr_mode>  */
8313 static void
8314 do_pli (void)
8315 {
8316   constraint (!inst.operands[0].isreg,
8317               _("'[' expected after PLI mnemonic"));
8318   constraint (inst.operands[0].postind,
8319               _("post-indexed expression used in preload instruction"));
8320   constraint (inst.operands[0].writeback,
8321               _("writeback used in preload instruction"));
8322   constraint (!inst.operands[0].preind,
8323               _("unindexed addressing used in preload instruction"));
8324   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8325   inst.instruction &= ~PRE_INDEX;
8326 }
8327
8328 static void
8329 do_push_pop (void)
8330 {
8331   inst.operands[1] = inst.operands[0];
8332   memset (&inst.operands[0], 0, sizeof inst.operands[0]);
8333   inst.operands[0].isreg = 1;
8334   inst.operands[0].writeback = 1;
8335   inst.operands[0].reg = REG_SP;
8336   do_ldmstm ();
8337 }
8338
8339 /* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
8340    word at the specified address and the following word
8341    respectively.
8342    Unconditionally executed.
8343    Error if Rn is R15.  */
8344
8345 static void
8346 do_rfe (void)
8347 {
8348   inst.instruction |= inst.operands[0].reg << 16;
8349   if (inst.operands[0].writeback)
8350     inst.instruction |= WRITE_BACK;
8351 }
8352
8353 /* ARM V6 ssat (argument parse).  */
8354
8355 static void
8356 do_ssat (void)
8357 {
8358   inst.instruction |= inst.operands[0].reg << 12;
8359   inst.instruction |= (inst.operands[1].imm - 1) << 16;
8360   inst.instruction |= inst.operands[2].reg;
8361
8362   if (inst.operands[3].present)
8363     encode_arm_shift (3);
8364 }
8365
8366 /* ARM V6 usat (argument parse).  */
8367
8368 static void
8369 do_usat (void)
8370 {
8371   inst.instruction |= inst.operands[0].reg << 12;
8372   inst.instruction |= inst.operands[1].imm << 16;
8373   inst.instruction |= inst.operands[2].reg;
8374
8375   if (inst.operands[3].present)
8376     encode_arm_shift (3);
8377 }
8378
8379 /* ARM V6 ssat16 (argument parse).  */
8380
8381 static void
8382 do_ssat16 (void)
8383 {
8384   inst.instruction |= inst.operands[0].reg << 12;
8385   inst.instruction |= ((inst.operands[1].imm - 1) << 16);
8386   inst.instruction |= inst.operands[2].reg;
8387 }
8388
8389 static void
8390 do_usat16 (void)
8391 {
8392   inst.instruction |= inst.operands[0].reg << 12;
8393   inst.instruction |= inst.operands[1].imm << 16;
8394   inst.instruction |= inst.operands[2].reg;
8395 }
8396
8397 /* ARM V6 SETEND (argument parse).  Sets the E bit in the CPSR while
8398    preserving the other bits.
8399
8400    setend <endian_specifier>, where <endian_specifier> is either
8401    BE or LE.  */
8402
8403 static void
8404 do_setend (void)
8405 {
8406   if (inst.operands[0].imm)
8407     inst.instruction |= 0x200;
8408 }
8409
8410 static void
8411 do_shift (void)
8412 {
8413   unsigned int Rm = (inst.operands[1].present
8414                      ? inst.operands[1].reg
8415                      : inst.operands[0].reg);
8416
8417   inst.instruction |= inst.operands[0].reg << 12;
8418   inst.instruction |= Rm;
8419   if (inst.operands[2].isreg)  /* Rd, {Rm,} Rs */
8420     {
8421       inst.instruction |= inst.operands[2].reg << 8;
8422       inst.instruction |= SHIFT_BY_REG;
8423       /* PR 12854: Error on extraneous shifts.  */
8424       constraint (inst.operands[2].shifted,
8425                   _("extraneous shift as part of operand to shift insn"));
8426     }
8427   else
8428     inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
8429 }
8430
8431 static void
8432 do_smc (void)
8433 {
8434   inst.reloc.type = BFD_RELOC_ARM_SMC;
8435   inst.reloc.pc_rel = 0;
8436 }
8437
8438 static void
8439 do_hvc (void)
8440 {
8441   inst.reloc.type = BFD_RELOC_ARM_HVC;
8442   inst.reloc.pc_rel = 0;
8443 }
8444
8445 static void
8446 do_swi (void)
8447 {
8448   inst.reloc.type = BFD_RELOC_ARM_SWI;
8449   inst.reloc.pc_rel = 0;
8450 }
8451
8452 /* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
8453    SMLAxy{cond} Rd,Rm,Rs,Rn
8454    SMLAWy{cond} Rd,Rm,Rs,Rn
8455    Error if any register is R15.  */
8456
8457 static void
8458 do_smla (void)
8459 {
8460   inst.instruction |= inst.operands[0].reg << 16;
8461   inst.instruction |= inst.operands[1].reg;
8462   inst.instruction |= inst.operands[2].reg << 8;
8463   inst.instruction |= inst.operands[3].reg << 12;
8464 }
8465
8466 /* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
8467    SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
8468    Error if any register is R15.
8469    Warning if Rdlo == Rdhi.  */
8470
8471 static void
8472 do_smlal (void)
8473 {
8474   inst.instruction |= inst.operands[0].reg << 12;
8475   inst.instruction |= inst.operands[1].reg << 16;
8476   inst.instruction |= inst.operands[2].reg;
8477   inst.instruction |= inst.operands[3].reg << 8;
8478
8479   if (inst.operands[0].reg == inst.operands[1].reg)
8480     as_tsktsk (_("rdhi and rdlo must be different"));
8481 }
8482
8483 /* ARM V5E (El Segundo) signed-multiply (argument parse)
8484    SMULxy{cond} Rd,Rm,Rs
8485    Error if any register is R15.  */
8486
8487 static void
8488 do_smul (void)
8489 {
8490   inst.instruction |= inst.operands[0].reg << 16;
8491   inst.instruction |= inst.operands[1].reg;
8492   inst.instruction |= inst.operands[2].reg << 8;
8493 }
8494
8495 /* ARM V6 srs (argument parse).  The variable fields in the encoding are
8496    the same for both ARM and Thumb-2.  */
8497
8498 static void
8499 do_srs (void)
8500 {
8501   int reg;
8502
8503   if (inst.operands[0].present)
8504     {
8505       reg = inst.operands[0].reg;
8506       constraint (reg != REG_SP, _("SRS base register must be r13"));
8507     }
8508   else
8509     reg = REG_SP;
8510
8511   inst.instruction |= reg << 16;
8512   inst.instruction |= inst.operands[1].imm;
8513   if (inst.operands[0].writeback || inst.operands[1].writeback)
8514     inst.instruction |= WRITE_BACK;
8515 }
8516
8517 /* ARM V6 strex (argument parse).  */
8518
8519 static void
8520 do_strex (void)
8521 {
8522   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8523               || inst.operands[2].postind || inst.operands[2].writeback
8524               || inst.operands[2].immisreg || inst.operands[2].shifted
8525               || inst.operands[2].negative
8526               /* See comment in do_ldrex().  */
8527               || (inst.operands[2].reg == REG_PC),
8528               BAD_ADDR_MODE);
8529
8530   constraint (inst.operands[0].reg == inst.operands[1].reg
8531               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8532
8533   constraint (inst.reloc.exp.X_op != O_constant
8534               || inst.reloc.exp.X_add_number != 0,
8535               _("offset must be zero in ARM encoding"));
8536
8537   inst.instruction |= inst.operands[0].reg << 12;
8538   inst.instruction |= inst.operands[1].reg;
8539   inst.instruction |= inst.operands[2].reg << 16;
8540   inst.reloc.type = BFD_RELOC_UNUSED;
8541 }
8542
8543 static void
8544 do_t_strexbh (void)
8545 {
8546   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8547               || inst.operands[2].postind || inst.operands[2].writeback
8548               || inst.operands[2].immisreg || inst.operands[2].shifted
8549               || inst.operands[2].negative,
8550               BAD_ADDR_MODE);
8551
8552   constraint (inst.operands[0].reg == inst.operands[1].reg
8553               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8554
8555   do_rm_rd_rn ();
8556 }
8557
8558 static void
8559 do_strexd (void)
8560 {
8561   constraint (inst.operands[1].reg % 2 != 0,
8562               _("even register required"));
8563   constraint (inst.operands[2].present
8564               && inst.operands[2].reg != inst.operands[1].reg + 1,
8565               _("can only store two consecutive registers"));
8566   /* If op 2 were present and equal to PC, this function wouldn't
8567      have been called in the first place.  */
8568   constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
8569
8570   constraint (inst.operands[0].reg == inst.operands[1].reg
8571               || inst.operands[0].reg == inst.operands[1].reg + 1
8572               || inst.operands[0].reg == inst.operands[3].reg,
8573               BAD_OVERLAP);
8574
8575   inst.instruction |= inst.operands[0].reg << 12;
8576   inst.instruction |= inst.operands[1].reg;
8577   inst.instruction |= inst.operands[3].reg << 16;
8578 }
8579
8580 /* ARM V6 SXTAH extracts a 16-bit value from a register, sign
8581    extends it to 32-bits, and adds the result to a value in another
8582    register.  You can specify a rotation by 0, 8, 16, or 24 bits
8583    before extracting the 16-bit value.
8584    SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
8585    Condition defaults to COND_ALWAYS.
8586    Error if any register uses R15.  */
8587
8588 static void
8589 do_sxtah (void)
8590 {
8591   inst.instruction |= inst.operands[0].reg << 12;
8592   inst.instruction |= inst.operands[1].reg << 16;
8593   inst.instruction |= inst.operands[2].reg;
8594   inst.instruction |= inst.operands[3].imm << 10;
8595 }
8596
8597 /* ARM V6 SXTH.
8598
8599    SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
8600    Condition defaults to COND_ALWAYS.
8601    Error if any register uses R15.  */
8602
8603 static void
8604 do_sxth (void)
8605 {
8606   inst.instruction |= inst.operands[0].reg << 12;
8607   inst.instruction |= inst.operands[1].reg;
8608   inst.instruction |= inst.operands[2].imm << 10;
8609 }
8610 \f
8611 /* VFP instructions.  In a logical order: SP variant first, monad
8612    before dyad, arithmetic then move then load/store.  */
8613
8614 static void
8615 do_vfp_sp_monadic (void)
8616 {
8617   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8618   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8619 }
8620
8621 static void
8622 do_vfp_sp_dyadic (void)
8623 {
8624   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8625   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8626   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8627 }
8628
8629 static void
8630 do_vfp_sp_compare_z (void)
8631 {
8632   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8633 }
8634
8635 static void
8636 do_vfp_dp_sp_cvt (void)
8637 {
8638   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8639   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
8640 }
8641
8642 static void
8643 do_vfp_sp_dp_cvt (void)
8644 {
8645   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8646   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8647 }
8648
8649 static void
8650 do_vfp_reg_from_sp (void)
8651 {
8652   inst.instruction |= inst.operands[0].reg << 12;
8653   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8654 }
8655
8656 static void
8657 do_vfp_reg2_from_sp2 (void)
8658 {
8659   constraint (inst.operands[2].imm != 2,
8660               _("only two consecutive VFP SP registers allowed here"));
8661   inst.instruction |= inst.operands[0].reg << 12;
8662   inst.instruction |= inst.operands[1].reg << 16;
8663   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
8664 }
8665
8666 static void
8667 do_vfp_sp_from_reg (void)
8668 {
8669   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
8670   inst.instruction |= inst.operands[1].reg << 12;
8671 }
8672
8673 static void
8674 do_vfp_sp2_from_reg2 (void)
8675 {
8676   constraint (inst.operands[0].imm != 2,
8677               _("only two consecutive VFP SP registers allowed here"));
8678   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
8679   inst.instruction |= inst.operands[1].reg << 12;
8680   inst.instruction |= inst.operands[2].reg << 16;
8681 }
8682
8683 static void
8684 do_vfp_sp_ldst (void)
8685 {
8686   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8687   encode_arm_cp_address (1, FALSE, TRUE, 0);
8688 }
8689
8690 static void
8691 do_vfp_dp_ldst (void)
8692 {
8693   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8694   encode_arm_cp_address (1, FALSE, TRUE, 0);
8695 }
8696
8697
8698 static void
8699 vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
8700 {
8701   if (inst.operands[0].writeback)
8702     inst.instruction |= WRITE_BACK;
8703   else
8704     constraint (ldstm_type != VFP_LDSTMIA,
8705                 _("this addressing mode requires base-register writeback"));
8706   inst.instruction |= inst.operands[0].reg << 16;
8707   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
8708   inst.instruction |= inst.operands[1].imm;
8709 }
8710
8711 static void
8712 vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
8713 {
8714   int count;
8715
8716   if (inst.operands[0].writeback)
8717     inst.instruction |= WRITE_BACK;
8718   else
8719     constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
8720                 _("this addressing mode requires base-register writeback"));
8721
8722   inst.instruction |= inst.operands[0].reg << 16;
8723   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8724
8725   count = inst.operands[1].imm << 1;
8726   if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
8727     count += 1;
8728
8729   inst.instruction |= count;
8730 }
8731
8732 static void
8733 do_vfp_sp_ldstmia (void)
8734 {
8735   vfp_sp_ldstm (VFP_LDSTMIA);
8736 }
8737
8738 static void
8739 do_vfp_sp_ldstmdb (void)
8740 {
8741   vfp_sp_ldstm (VFP_LDSTMDB);
8742 }
8743
8744 static void
8745 do_vfp_dp_ldstmia (void)
8746 {
8747   vfp_dp_ldstm (VFP_LDSTMIA);
8748 }
8749
8750 static void
8751 do_vfp_dp_ldstmdb (void)
8752 {
8753   vfp_dp_ldstm (VFP_LDSTMDB);
8754 }
8755
8756 static void
8757 do_vfp_xp_ldstmia (void)
8758 {
8759   vfp_dp_ldstm (VFP_LDSTMIAX);
8760 }
8761
8762 static void
8763 do_vfp_xp_ldstmdb (void)
8764 {
8765   vfp_dp_ldstm (VFP_LDSTMDBX);
8766 }
8767
8768 static void
8769 do_vfp_dp_rd_rm (void)
8770 {
8771   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8772   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8773 }
8774
8775 static void
8776 do_vfp_dp_rn_rd (void)
8777 {
8778   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
8779   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8780 }
8781
8782 static void
8783 do_vfp_dp_rd_rn (void)
8784 {
8785   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8786   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8787 }
8788
8789 static void
8790 do_vfp_dp_rd_rn_rm (void)
8791 {
8792   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8793   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8794   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
8795 }
8796
8797 static void
8798 do_vfp_dp_rd (void)
8799 {
8800   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8801 }
8802
8803 static void
8804 do_vfp_dp_rm_rd_rn (void)
8805 {
8806   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
8807   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8808   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
8809 }
8810
8811 /* VFPv3 instructions.  */
8812 static void
8813 do_vfp_sp_const (void)
8814 {
8815   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8816   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8817   inst.instruction |= (inst.operands[1].imm & 0x0f);
8818 }
8819
8820 static void
8821 do_vfp_dp_const (void)
8822 {
8823   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8824   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8825   inst.instruction |= (inst.operands[1].imm & 0x0f);
8826 }
8827
8828 static void
8829 vfp_conv (int srcsize)
8830 {
8831   int immbits = srcsize - inst.operands[1].imm;
8832
8833   if (srcsize == 16 && !(immbits >= 0 && immbits <= srcsize))
8834     {
8835       /* If srcsize is 16, inst.operands[1].imm must be in the range 0-16.
8836          i.e. immbits must be in range 0 - 16.  */
8837       inst.error = _("immediate value out of range, expected range [0, 16]");
8838       return;
8839     }
8840   else if (srcsize == 32 && !(immbits >= 0 && immbits < srcsize))
8841     {
8842       /* If srcsize is 32, inst.operands[1].imm must be in the range 1-32.
8843          i.e. immbits must be in range 0 - 31.  */
8844       inst.error = _("immediate value out of range, expected range [1, 32]");
8845       return;
8846     }
8847
8848   inst.instruction |= (immbits & 1) << 5;
8849   inst.instruction |= (immbits >> 1);
8850 }
8851
8852 static void
8853 do_vfp_sp_conv_16 (void)
8854 {
8855   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8856   vfp_conv (16);
8857 }
8858
8859 static void
8860 do_vfp_dp_conv_16 (void)
8861 {
8862   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8863   vfp_conv (16);
8864 }
8865
8866 static void
8867 do_vfp_sp_conv_32 (void)
8868 {
8869   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8870   vfp_conv (32);
8871 }
8872
8873 static void
8874 do_vfp_dp_conv_32 (void)
8875 {
8876   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8877   vfp_conv (32);
8878 }
8879 \f
8880 /* FPA instructions.  Also in a logical order.  */
8881
8882 static void
8883 do_fpa_cmp (void)
8884 {
8885   inst.instruction |= inst.operands[0].reg << 16;
8886   inst.instruction |= inst.operands[1].reg;
8887 }
8888
8889 static void
8890 do_fpa_ldmstm (void)
8891 {
8892   inst.instruction |= inst.operands[0].reg << 12;
8893   switch (inst.operands[1].imm)
8894     {
8895     case 1: inst.instruction |= CP_T_X;          break;
8896     case 2: inst.instruction |= CP_T_Y;          break;
8897     case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
8898     case 4:                                      break;
8899     default: abort ();
8900     }
8901
8902   if (inst.instruction & (PRE_INDEX | INDEX_UP))
8903     {
8904       /* The instruction specified "ea" or "fd", so we can only accept
8905          [Rn]{!}.  The instruction does not really support stacking or
8906          unstacking, so we have to emulate these by setting appropriate
8907          bits and offsets.  */
8908       constraint (inst.reloc.exp.X_op != O_constant
8909                   || inst.reloc.exp.X_add_number != 0,
8910                   _("this instruction does not support indexing"));
8911
8912       if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
8913         inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
8914
8915       if (!(inst.instruction & INDEX_UP))
8916         inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
8917
8918       if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
8919         {
8920           inst.operands[2].preind = 0;
8921           inst.operands[2].postind = 1;
8922         }
8923     }
8924
8925   encode_arm_cp_address (2, TRUE, TRUE, 0);
8926 }
8927 \f
8928 /* iWMMXt instructions: strictly in alphabetical order.  */
8929
8930 static void
8931 do_iwmmxt_tandorc (void)
8932 {
8933   constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
8934 }
8935
8936 static void
8937 do_iwmmxt_textrc (void)
8938 {
8939   inst.instruction |= inst.operands[0].reg << 12;
8940   inst.instruction |= inst.operands[1].imm;
8941 }
8942
8943 static void
8944 do_iwmmxt_textrm (void)
8945 {
8946   inst.instruction |= inst.operands[0].reg << 12;
8947   inst.instruction |= inst.operands[1].reg << 16;
8948   inst.instruction |= inst.operands[2].imm;
8949 }
8950
8951 static void
8952 do_iwmmxt_tinsr (void)
8953 {
8954   inst.instruction |= inst.operands[0].reg << 16;
8955   inst.instruction |= inst.operands[1].reg << 12;
8956   inst.instruction |= inst.operands[2].imm;
8957 }
8958
8959 static void
8960 do_iwmmxt_tmia (void)
8961 {
8962   inst.instruction |= inst.operands[0].reg << 5;
8963   inst.instruction |= inst.operands[1].reg;
8964   inst.instruction |= inst.operands[2].reg << 12;
8965 }
8966
8967 static void
8968 do_iwmmxt_waligni (void)
8969 {
8970   inst.instruction |= inst.operands[0].reg << 12;
8971   inst.instruction |= inst.operands[1].reg << 16;
8972   inst.instruction |= inst.operands[2].reg;
8973   inst.instruction |= inst.operands[3].imm << 20;
8974 }
8975
8976 static void
8977 do_iwmmxt_wmerge (void)
8978 {
8979   inst.instruction |= inst.operands[0].reg << 12;
8980   inst.instruction |= inst.operands[1].reg << 16;
8981   inst.instruction |= inst.operands[2].reg;
8982   inst.instruction |= inst.operands[3].imm << 21;
8983 }
8984
8985 static void
8986 do_iwmmxt_wmov (void)
8987 {
8988   /* WMOV rD, rN is an alias for WOR rD, rN, rN.  */
8989   inst.instruction |= inst.operands[0].reg << 12;
8990   inst.instruction |= inst.operands[1].reg << 16;
8991   inst.instruction |= inst.operands[1].reg;
8992 }
8993
8994 static void
8995 do_iwmmxt_wldstbh (void)
8996 {
8997   int reloc;
8998   inst.instruction |= inst.operands[0].reg << 12;
8999   if (thumb_mode)
9000     reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
9001   else
9002     reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
9003   encode_arm_cp_address (1, TRUE, FALSE, reloc);
9004 }
9005
9006 static void
9007 do_iwmmxt_wldstw (void)
9008 {
9009   /* RIWR_RIWC clears .isreg for a control register.  */
9010   if (!inst.operands[0].isreg)
9011     {
9012       constraint (inst.cond != COND_ALWAYS, BAD_COND);
9013       inst.instruction |= 0xf0000000;
9014     }
9015
9016   inst.instruction |= inst.operands[0].reg << 12;
9017   encode_arm_cp_address (1, TRUE, TRUE, 0);
9018 }
9019
9020 static void
9021 do_iwmmxt_wldstd (void)
9022 {
9023   inst.instruction |= inst.operands[0].reg << 12;
9024   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
9025       && inst.operands[1].immisreg)
9026     {
9027       inst.instruction &= ~0x1a000ff;
9028       inst.instruction |= (0xf << 28);
9029       if (inst.operands[1].preind)
9030         inst.instruction |= PRE_INDEX;
9031       if (!inst.operands[1].negative)
9032         inst.instruction |= INDEX_UP;
9033       if (inst.operands[1].writeback)
9034         inst.instruction |= WRITE_BACK;
9035       inst.instruction |= inst.operands[1].reg << 16;
9036       inst.instruction |= inst.reloc.exp.X_add_number << 4;
9037       inst.instruction |= inst.operands[1].imm;
9038     }
9039   else
9040     encode_arm_cp_address (1, TRUE, FALSE, 0);
9041 }
9042
9043 static void
9044 do_iwmmxt_wshufh (void)
9045 {
9046   inst.instruction |= inst.operands[0].reg << 12;
9047   inst.instruction |= inst.operands[1].reg << 16;
9048   inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
9049   inst.instruction |= (inst.operands[2].imm & 0x0f);
9050 }
9051
9052 static void
9053 do_iwmmxt_wzero (void)
9054 {
9055   /* WZERO reg is an alias for WANDN reg, reg, reg.  */
9056   inst.instruction |= inst.operands[0].reg;
9057   inst.instruction |= inst.operands[0].reg << 12;
9058   inst.instruction |= inst.operands[0].reg << 16;
9059 }
9060
9061 static void
9062 do_iwmmxt_wrwrwr_or_imm5 (void)
9063 {
9064   if (inst.operands[2].isreg)
9065     do_rd_rn_rm ();
9066   else {
9067     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
9068                 _("immediate operand requires iWMMXt2"));
9069     do_rd_rn ();
9070     if (inst.operands[2].imm == 0)
9071       {
9072         switch ((inst.instruction >> 20) & 0xf)
9073           {
9074           case 4:
9075           case 5:
9076           case 6:
9077           case 7:
9078             /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16.  */
9079             inst.operands[2].imm = 16;
9080             inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
9081             break;
9082           case 8:
9083           case 9:
9084           case 10:
9085           case 11:
9086             /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32.  */
9087             inst.operands[2].imm = 32;
9088             inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
9089             break;
9090           case 12:
9091           case 13:
9092           case 14:
9093           case 15:
9094             {
9095               /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn.  */
9096               unsigned long wrn;
9097               wrn = (inst.instruction >> 16) & 0xf;
9098               inst.instruction &= 0xff0fff0f;
9099               inst.instruction |= wrn;
9100               /* Bail out here; the instruction is now assembled.  */
9101               return;
9102             }
9103           }
9104       }
9105     /* Map 32 -> 0, etc.  */
9106     inst.operands[2].imm &= 0x1f;
9107     inst.instruction |= (0xf << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
9108   }
9109 }
9110 \f
9111 /* Cirrus Maverick instructions.  Simple 2-, 3-, and 4-register
9112    operations first, then control, shift, and load/store.  */
9113
9114 /* Insns like "foo X,Y,Z".  */
9115
9116 static void
9117 do_mav_triple (void)
9118 {
9119   inst.instruction |= inst.operands[0].reg << 16;
9120   inst.instruction |= inst.operands[1].reg;
9121   inst.instruction |= inst.operands[2].reg << 12;
9122 }
9123
9124 /* Insns like "foo W,X,Y,Z".
9125     where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
9126
9127 static void
9128 do_mav_quad (void)
9129 {
9130   inst.instruction |= inst.operands[0].reg << 5;
9131   inst.instruction |= inst.operands[1].reg << 12;
9132   inst.instruction |= inst.operands[2].reg << 16;
9133   inst.instruction |= inst.operands[3].reg;
9134 }
9135
9136 /* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
9137 static void
9138 do_mav_dspsc (void)
9139 {
9140   inst.instruction |= inst.operands[1].reg << 12;
9141 }
9142
9143 /* Maverick shift immediate instructions.
9144    cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
9145    cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0].  */
9146
9147 static void
9148 do_mav_shift (void)
9149 {
9150   int imm = inst.operands[2].imm;
9151
9152   inst.instruction |= inst.operands[0].reg << 12;
9153   inst.instruction |= inst.operands[1].reg << 16;
9154
9155   /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
9156      Bits 5-7 of the insn should have bits 4-6 of the immediate.
9157      Bit 4 should be 0.  */
9158   imm = (imm & 0xf) | ((imm & 0x70) << 1);
9159
9160   inst.instruction |= imm;
9161 }
9162 \f
9163 /* XScale instructions.  Also sorted arithmetic before move.  */
9164
9165 /* Xscale multiply-accumulate (argument parse)
9166      MIAcc   acc0,Rm,Rs
9167      MIAPHcc acc0,Rm,Rs
9168      MIAxycc acc0,Rm,Rs.  */
9169
9170 static void
9171 do_xsc_mia (void)
9172 {
9173   inst.instruction |= inst.operands[1].reg;
9174   inst.instruction |= inst.operands[2].reg << 12;
9175 }
9176
9177 /* Xscale move-accumulator-register (argument parse)
9178
9179      MARcc   acc0,RdLo,RdHi.  */
9180
9181 static void
9182 do_xsc_mar (void)
9183 {
9184   inst.instruction |= inst.operands[1].reg << 12;
9185   inst.instruction |= inst.operands[2].reg << 16;
9186 }
9187
9188 /* Xscale move-register-accumulator (argument parse)
9189
9190      MRAcc   RdLo,RdHi,acc0.  */
9191
9192 static void
9193 do_xsc_mra (void)
9194 {
9195   constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
9196   inst.instruction |= inst.operands[0].reg << 12;
9197   inst.instruction |= inst.operands[1].reg << 16;
9198 }
9199 \f
9200 /* Encoding functions relevant only to Thumb.  */
9201
9202 /* inst.operands[i] is a shifted-register operand; encode
9203    it into inst.instruction in the format used by Thumb32.  */
9204
9205 static void
9206 encode_thumb32_shifted_operand (int i)
9207 {
9208   unsigned int value = inst.reloc.exp.X_add_number;
9209   unsigned int shift = inst.operands[i].shift_kind;
9210
9211   constraint (inst.operands[i].immisreg,
9212               _("shift by register not allowed in thumb mode"));
9213   inst.instruction |= inst.operands[i].reg;
9214   if (shift == SHIFT_RRX)
9215     inst.instruction |= SHIFT_ROR << 4;
9216   else
9217     {
9218       constraint (inst.reloc.exp.X_op != O_constant,
9219                   _("expression too complex"));
9220
9221       constraint (value > 32
9222                   || (value == 32 && (shift == SHIFT_LSL
9223                                       || shift == SHIFT_ROR)),
9224                   _("shift expression is too large"));
9225
9226       if (value == 0)
9227         shift = SHIFT_LSL;
9228       else if (value == 32)
9229         value = 0;
9230
9231       inst.instruction |= shift << 4;
9232       inst.instruction |= (value & 0x1c) << 10;
9233       inst.instruction |= (value & 0x03) << 6;
9234     }
9235 }
9236
9237
9238 /* inst.operands[i] was set up by parse_address.  Encode it into a
9239    Thumb32 format load or store instruction.  Reject forms that cannot
9240    be used with such instructions.  If is_t is true, reject forms that
9241    cannot be used with a T instruction; if is_d is true, reject forms
9242    that cannot be used with a D instruction.  If it is a store insn,
9243    reject PC in Rn.  */
9244
9245 static void
9246 encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
9247 {
9248   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
9249
9250   constraint (!inst.operands[i].isreg,
9251               _("Instruction does not support =N addresses"));
9252
9253   inst.instruction |= inst.operands[i].reg << 16;
9254   if (inst.operands[i].immisreg)
9255     {
9256       constraint (is_pc, BAD_PC_ADDRESSING);
9257       constraint (is_t || is_d, _("cannot use register index with this instruction"));
9258       constraint (inst.operands[i].negative,
9259                   _("Thumb does not support negative register indexing"));
9260       constraint (inst.operands[i].postind,
9261                   _("Thumb does not support register post-indexing"));
9262       constraint (inst.operands[i].writeback,
9263                   _("Thumb does not support register indexing with writeback"));
9264       constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
9265                   _("Thumb supports only LSL in shifted register indexing"));
9266
9267       inst.instruction |= inst.operands[i].imm;
9268       if (inst.operands[i].shifted)
9269         {
9270           constraint (inst.reloc.exp.X_op != O_constant,
9271                       _("expression too complex"));
9272           constraint (inst.reloc.exp.X_add_number < 0
9273                       || inst.reloc.exp.X_add_number > 3,
9274                       _("shift out of range"));
9275           inst.instruction |= inst.reloc.exp.X_add_number << 4;
9276         }
9277       inst.reloc.type = BFD_RELOC_UNUSED;
9278     }
9279   else if (inst.operands[i].preind)
9280     {
9281       constraint (is_pc && inst.operands[i].writeback, BAD_PC_WRITEBACK);
9282       constraint (is_t && inst.operands[i].writeback,
9283                   _("cannot use writeback with this instruction"));
9284       constraint (is_pc && ((inst.instruction & THUMB2_LOAD_BIT) == 0)
9285                   && !inst.reloc.pc_rel, BAD_PC_ADDRESSING);
9286
9287       if (is_d)
9288         {
9289           inst.instruction |= 0x01000000;
9290           if (inst.operands[i].writeback)
9291             inst.instruction |= 0x00200000;
9292         }
9293       else
9294         {
9295           inst.instruction |= 0x00000c00;
9296           if (inst.operands[i].writeback)
9297             inst.instruction |= 0x00000100;
9298         }
9299       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9300     }
9301   else if (inst.operands[i].postind)
9302     {
9303       gas_assert (inst.operands[i].writeback);
9304       constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
9305       constraint (is_t, _("cannot use post-indexing with this instruction"));
9306
9307       if (is_d)
9308         inst.instruction |= 0x00200000;
9309       else
9310         inst.instruction |= 0x00000900;
9311       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9312     }
9313   else /* unindexed - only for coprocessor */
9314     inst.error = _("instruction does not accept unindexed addressing");
9315 }
9316
9317 /* Table of Thumb instructions which exist in both 16- and 32-bit
9318    encodings (the latter only in post-V6T2 cores).  The index is the
9319    value used in the insns table below.  When there is more than one
9320    possible 16-bit encoding for the instruction, this table always
9321    holds variant (1).
9322    Also contains several pseudo-instructions used during relaxation.  */
9323 #define T16_32_TAB                              \
9324   X(_adc,   4140, eb400000),                    \
9325   X(_adcs,  4140, eb500000),                    \
9326   X(_add,   1c00, eb000000),                    \
9327   X(_adds,  1c00, eb100000),                    \
9328   X(_addi,  0000, f1000000),                    \
9329   X(_addis, 0000, f1100000),                    \
9330   X(_add_pc,000f, f20f0000),                    \
9331   X(_add_sp,000d, f10d0000),                    \
9332   X(_adr,   000f, f20f0000),                    \
9333   X(_and,   4000, ea000000),                    \
9334   X(_ands,  4000, ea100000),                    \
9335   X(_asr,   1000, fa40f000),                    \
9336   X(_asrs,  1000, fa50f000),                    \
9337   X(_b,     e000, f000b000),                    \
9338   X(_bcond, d000, f0008000),                    \
9339   X(_bic,   4380, ea200000),                    \
9340   X(_bics,  4380, ea300000),                    \
9341   X(_cmn,   42c0, eb100f00),                    \
9342   X(_cmp,   2800, ebb00f00),                    \
9343   X(_cpsie, b660, f3af8400),                    \
9344   X(_cpsid, b670, f3af8600),                    \
9345   X(_cpy,   4600, ea4f0000),                    \
9346   X(_dec_sp,80dd, f1ad0d00),                    \
9347   X(_eor,   4040, ea800000),                    \
9348   X(_eors,  4040, ea900000),                    \
9349   X(_inc_sp,00dd, f10d0d00),                    \
9350   X(_ldmia, c800, e8900000),                    \
9351   X(_ldr,   6800, f8500000),                    \
9352   X(_ldrb,  7800, f8100000),                    \
9353   X(_ldrh,  8800, f8300000),                    \
9354   X(_ldrsb, 5600, f9100000),                    \
9355   X(_ldrsh, 5e00, f9300000),                    \
9356   X(_ldr_pc,4800, f85f0000),                    \
9357   X(_ldr_pc2,4800, f85f0000),                   \
9358   X(_ldr_sp,9800, f85d0000),                    \
9359   X(_lsl,   0000, fa00f000),                    \
9360   X(_lsls,  0000, fa10f000),                    \
9361   X(_lsr,   0800, fa20f000),                    \
9362   X(_lsrs,  0800, fa30f000),                    \
9363   X(_mov,   2000, ea4f0000),                    \
9364   X(_movs,  2000, ea5f0000),                    \
9365   X(_mul,   4340, fb00f000),                     \
9366   X(_muls,  4340, ffffffff), /* no 32b muls */  \
9367   X(_mvn,   43c0, ea6f0000),                    \
9368   X(_mvns,  43c0, ea7f0000),                    \
9369   X(_neg,   4240, f1c00000), /* rsb #0 */       \
9370   X(_negs,  4240, f1d00000), /* rsbs #0 */      \
9371   X(_orr,   4300, ea400000),                    \
9372   X(_orrs,  4300, ea500000),                    \
9373   X(_pop,   bc00, e8bd0000), /* ldmia sp!,... */        \
9374   X(_push,  b400, e92d0000), /* stmdb sp!,... */        \
9375   X(_rev,   ba00, fa90f080),                    \
9376   X(_rev16, ba40, fa90f090),                    \
9377   X(_revsh, bac0, fa90f0b0),                    \
9378   X(_ror,   41c0, fa60f000),                    \
9379   X(_rors,  41c0, fa70f000),                    \
9380   X(_sbc,   4180, eb600000),                    \
9381   X(_sbcs,  4180, eb700000),                    \
9382   X(_stmia, c000, e8800000),                    \
9383   X(_str,   6000, f8400000),                    \
9384   X(_strb,  7000, f8000000),                    \
9385   X(_strh,  8000, f8200000),                    \
9386   X(_str_sp,9000, f84d0000),                    \
9387   X(_sub,   1e00, eba00000),                    \
9388   X(_subs,  1e00, ebb00000),                    \
9389   X(_subi,  8000, f1a00000),                    \
9390   X(_subis, 8000, f1b00000),                    \
9391   X(_sxtb,  b240, fa4ff080),                    \
9392   X(_sxth,  b200, fa0ff080),                    \
9393   X(_tst,   4200, ea100f00),                    \
9394   X(_uxtb,  b2c0, fa5ff080),                    \
9395   X(_uxth,  b280, fa1ff080),                    \
9396   X(_nop,   bf00, f3af8000),                    \
9397   X(_yield, bf10, f3af8001),                    \
9398   X(_wfe,   bf20, f3af8002),                    \
9399   X(_wfi,   bf30, f3af8003),                    \
9400   X(_sev,   bf40, f3af8004),
9401
9402 /* To catch errors in encoding functions, the codes are all offset by
9403    0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
9404    as 16-bit instructions.  */
9405 #define X(a,b,c) T_MNEM##a
9406 enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
9407 #undef X
9408
9409 #define X(a,b,c) 0x##b
9410 static const unsigned short thumb_op16[] = { T16_32_TAB };
9411 #define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
9412 #undef X
9413
9414 #define X(a,b,c) 0x##c
9415 static const unsigned int thumb_op32[] = { T16_32_TAB };
9416 #define THUMB_OP32(n)        (thumb_op32[(n) - (T16_32_OFFSET + 1)])
9417 #define THUMB_SETS_FLAGS(n)  (THUMB_OP32 (n) & 0x00100000)
9418 #undef X
9419 #undef T16_32_TAB
9420
9421 /* Thumb instruction encoders, in alphabetical order.  */
9422
9423 /* ADDW or SUBW.  */
9424
9425 static void
9426 do_t_add_sub_w (void)
9427 {
9428   int Rd, Rn;
9429
9430   Rd = inst.operands[0].reg;
9431   Rn = inst.operands[1].reg;
9432
9433   /* If Rn is REG_PC, this is ADR; if Rn is REG_SP, then this
9434      is the SP-{plus,minus}-immediate form of the instruction.  */
9435   if (Rn == REG_SP)
9436     constraint (Rd == REG_PC, BAD_PC);
9437   else
9438     reject_bad_reg (Rd);
9439
9440   inst.instruction |= (Rn << 16) | (Rd << 8);
9441   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9442 }
9443
9444 /* Parse an add or subtract instruction.  We get here with inst.instruction
9445    equalling any of THUMB_OPCODE_add, adds, sub, or subs.  */
9446
9447 static void
9448 do_t_add_sub (void)
9449 {
9450   int Rd, Rs, Rn;
9451
9452   Rd = inst.operands[0].reg;
9453   Rs = (inst.operands[1].present
9454         ? inst.operands[1].reg    /* Rd, Rs, foo */
9455         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9456
9457   if (Rd == REG_PC)
9458     set_it_insn_type_last ();
9459
9460   if (unified_syntax)
9461     {
9462       bfd_boolean flags;
9463       bfd_boolean narrow;
9464       int opcode;
9465
9466       flags = (inst.instruction == T_MNEM_adds
9467                || inst.instruction == T_MNEM_subs);
9468       if (flags)
9469         narrow = !in_it_block ();
9470       else
9471         narrow = in_it_block ();
9472       if (!inst.operands[2].isreg)
9473         {
9474           int add;
9475
9476           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9477
9478           add = (inst.instruction == T_MNEM_add
9479                  || inst.instruction == T_MNEM_adds);
9480           opcode = 0;
9481           if (inst.size_req != 4)
9482             {
9483               /* Attempt to use a narrow opcode, with relaxation if
9484                  appropriate.  */
9485               if (Rd == REG_SP && Rs == REG_SP && !flags)
9486                 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
9487               else if (Rd <= 7 && Rs == REG_SP && add && !flags)
9488                 opcode = T_MNEM_add_sp;
9489               else if (Rd <= 7 && Rs == REG_PC && add && !flags)
9490                 opcode = T_MNEM_add_pc;
9491               else if (Rd <= 7 && Rs <= 7 && narrow)
9492                 {
9493                   if (flags)
9494                     opcode = add ? T_MNEM_addis : T_MNEM_subis;
9495                   else
9496                     opcode = add ? T_MNEM_addi : T_MNEM_subi;
9497                 }
9498               if (opcode)
9499                 {
9500                   inst.instruction = THUMB_OP16(opcode);
9501                   inst.instruction |= (Rd << 4) | Rs;
9502                   inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9503                   if (inst.size_req != 2)
9504                     inst.relax = opcode;
9505                 }
9506               else
9507                 constraint (inst.size_req == 2, BAD_HIREG);
9508             }
9509           if (inst.size_req == 4
9510               || (inst.size_req != 2 && !opcode))
9511             {
9512               if (Rd == REG_PC)
9513                 {
9514                   constraint (add, BAD_PC);
9515                   constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
9516                              _("only SUBS PC, LR, #const allowed"));
9517                   constraint (inst.reloc.exp.X_op != O_constant,
9518                               _("expression too complex"));
9519                   constraint (inst.reloc.exp.X_add_number < 0
9520                               || inst.reloc.exp.X_add_number > 0xff,
9521                              _("immediate value out of range"));
9522                   inst.instruction = T2_SUBS_PC_LR
9523                                      | inst.reloc.exp.X_add_number;
9524                   inst.reloc.type = BFD_RELOC_UNUSED;
9525                   return;
9526                 }
9527               else if (Rs == REG_PC)
9528                 {
9529                   /* Always use addw/subw.  */
9530                   inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
9531                   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9532                 }
9533               else
9534                 {
9535                   inst.instruction = THUMB_OP32 (inst.instruction);
9536                   inst.instruction = (inst.instruction & 0xe1ffffff)
9537                                      | 0x10000000;
9538                   if (flags)
9539                     inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9540                   else
9541                     inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
9542                 }
9543               inst.instruction |= Rd << 8;
9544               inst.instruction |= Rs << 16;
9545             }
9546         }
9547       else
9548         {
9549           unsigned int value = inst.reloc.exp.X_add_number;
9550           unsigned int shift = inst.operands[2].shift_kind;
9551
9552           Rn = inst.operands[2].reg;
9553           /* See if we can do this with a 16-bit instruction.  */
9554           if (!inst.operands[2].shifted && inst.size_req != 4)
9555             {
9556               if (Rd > 7 || Rs > 7 || Rn > 7)
9557                 narrow = FALSE;
9558
9559               if (narrow)
9560                 {
9561                   inst.instruction = ((inst.instruction == T_MNEM_adds
9562                                        || inst.instruction == T_MNEM_add)
9563                                       ? T_OPCODE_ADD_R3
9564                                       : T_OPCODE_SUB_R3);
9565                   inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9566                   return;
9567                 }
9568
9569               if (inst.instruction == T_MNEM_add && (Rd == Rs || Rd == Rn))
9570                 {
9571                   /* Thumb-1 cores (except v6-M) require at least one high
9572                      register in a narrow non flag setting add.  */
9573                   if (Rd > 7 || Rn > 7
9574                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)
9575                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_msr))
9576                     {
9577                       if (Rd == Rn)
9578                         {
9579                           Rn = Rs;
9580                           Rs = Rd;
9581                         }
9582                       inst.instruction = T_OPCODE_ADD_HI;
9583                       inst.instruction |= (Rd & 8) << 4;
9584                       inst.instruction |= (Rd & 7);
9585                       inst.instruction |= Rn << 3;
9586                       return;
9587                     }
9588                 }
9589             }
9590
9591           constraint (Rd == REG_PC, BAD_PC);
9592           constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9593           constraint (Rs == REG_PC, BAD_PC);
9594           reject_bad_reg (Rn);
9595
9596           /* If we get here, it can't be done in 16 bits.  */
9597           constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
9598                       _("shift must be constant"));
9599           inst.instruction = THUMB_OP32 (inst.instruction);
9600           inst.instruction |= Rd << 8;
9601           inst.instruction |= Rs << 16;
9602           constraint (Rd == REG_SP && Rs == REG_SP && value > 3,
9603                       _("shift value over 3 not allowed in thumb mode"));
9604           constraint (Rd == REG_SP && Rs == REG_SP && shift != SHIFT_LSL,
9605                       _("only LSL shift allowed in thumb mode"));
9606           encode_thumb32_shifted_operand (2);
9607         }
9608     }
9609   else
9610     {
9611       constraint (inst.instruction == T_MNEM_adds
9612                   || inst.instruction == T_MNEM_subs,
9613                   BAD_THUMB32);
9614
9615       if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
9616         {
9617           constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
9618                       || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
9619                       BAD_HIREG);
9620
9621           inst.instruction = (inst.instruction == T_MNEM_add
9622                               ? 0x0000 : 0x8000);
9623           inst.instruction |= (Rd << 4) | Rs;
9624           inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9625           return;
9626         }
9627
9628       Rn = inst.operands[2].reg;
9629       constraint (inst.operands[2].shifted, _("unshifted register required"));
9630
9631       /* We now have Rd, Rs, and Rn set to registers.  */
9632       if (Rd > 7 || Rs > 7 || Rn > 7)
9633         {
9634           /* Can't do this for SUB.      */
9635           constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
9636           inst.instruction = T_OPCODE_ADD_HI;
9637           inst.instruction |= (Rd & 8) << 4;
9638           inst.instruction |= (Rd & 7);
9639           if (Rs == Rd)
9640             inst.instruction |= Rn << 3;
9641           else if (Rn == Rd)
9642             inst.instruction |= Rs << 3;
9643           else
9644             constraint (1, _("dest must overlap one source register"));
9645         }
9646       else
9647         {
9648           inst.instruction = (inst.instruction == T_MNEM_add
9649                               ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
9650           inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9651         }
9652     }
9653 }
9654
9655 static void
9656 do_t_adr (void)
9657 {
9658   unsigned Rd;
9659
9660   Rd = inst.operands[0].reg;
9661   reject_bad_reg (Rd);
9662
9663   if (unified_syntax && inst.size_req == 0 && Rd <= 7)
9664     {
9665       /* Defer to section relaxation.  */
9666       inst.relax = inst.instruction;
9667       inst.instruction = THUMB_OP16 (inst.instruction);
9668       inst.instruction |= Rd << 4;
9669     }
9670   else if (unified_syntax && inst.size_req != 2)
9671     {
9672       /* Generate a 32-bit opcode.  */
9673       inst.instruction = THUMB_OP32 (inst.instruction);
9674       inst.instruction |= Rd << 8;
9675       inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
9676       inst.reloc.pc_rel = 1;
9677     }
9678   else
9679     {
9680       /* Generate a 16-bit opcode.  */
9681       inst.instruction = THUMB_OP16 (inst.instruction);
9682       inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9683       inst.reloc.exp.X_add_number -= 4; /* PC relative adjust.  */
9684       inst.reloc.pc_rel = 1;
9685
9686       inst.instruction |= Rd << 4;
9687     }
9688 }
9689
9690 /* Arithmetic instructions for which there is just one 16-bit
9691    instruction encoding, and it allows only two low registers.
9692    For maximal compatibility with ARM syntax, we allow three register
9693    operands even when Thumb-32 instructions are not available, as long
9694    as the first two are identical.  For instance, both "sbc r0,r1" and
9695    "sbc r0,r0,r1" are allowed.  */
9696 static void
9697 do_t_arit3 (void)
9698 {
9699   int Rd, Rs, Rn;
9700
9701   Rd = inst.operands[0].reg;
9702   Rs = (inst.operands[1].present
9703         ? inst.operands[1].reg    /* Rd, Rs, foo */
9704         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9705   Rn = inst.operands[2].reg;
9706
9707   reject_bad_reg (Rd);
9708   reject_bad_reg (Rs);
9709   if (inst.operands[2].isreg)
9710     reject_bad_reg (Rn);
9711
9712   if (unified_syntax)
9713     {
9714       if (!inst.operands[2].isreg)
9715         {
9716           /* For an immediate, we always generate a 32-bit opcode;
9717              section relaxation will shrink it later if possible.  */
9718           inst.instruction = THUMB_OP32 (inst.instruction);
9719           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9720           inst.instruction |= Rd << 8;
9721           inst.instruction |= Rs << 16;
9722           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9723         }
9724       else
9725         {
9726           bfd_boolean narrow;
9727
9728           /* See if we can do this with a 16-bit instruction.  */
9729           if (THUMB_SETS_FLAGS (inst.instruction))
9730             narrow = !in_it_block ();
9731           else
9732             narrow = in_it_block ();
9733
9734           if (Rd > 7 || Rn > 7 || Rs > 7)
9735             narrow = FALSE;
9736           if (inst.operands[2].shifted)
9737             narrow = FALSE;
9738           if (inst.size_req == 4)
9739             narrow = FALSE;
9740
9741           if (narrow
9742               && Rd == Rs)
9743             {
9744               inst.instruction = THUMB_OP16 (inst.instruction);
9745               inst.instruction |= Rd;
9746               inst.instruction |= Rn << 3;
9747               return;
9748             }
9749
9750           /* If we get here, it can't be done in 16 bits.  */
9751           constraint (inst.operands[2].shifted
9752                       && inst.operands[2].immisreg,
9753                       _("shift must be constant"));
9754           inst.instruction = THUMB_OP32 (inst.instruction);
9755           inst.instruction |= Rd << 8;
9756           inst.instruction |= Rs << 16;
9757           encode_thumb32_shifted_operand (2);
9758         }
9759     }
9760   else
9761     {
9762       /* On its face this is a lie - the instruction does set the
9763          flags.  However, the only supported mnemonic in this mode
9764          says it doesn't.  */
9765       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
9766
9767       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9768                   _("unshifted register required"));
9769       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9770       constraint (Rd != Rs,
9771                   _("dest and source1 must be the same register"));
9772
9773       inst.instruction = THUMB_OP16 (inst.instruction);
9774       inst.instruction |= Rd;
9775       inst.instruction |= Rn << 3;
9776     }
9777 }
9778
9779 /* Similarly, but for instructions where the arithmetic operation is
9780    commutative, so we can allow either of them to be different from
9781    the destination operand in a 16-bit instruction.  For instance, all
9782    three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
9783    accepted.  */
9784 static void
9785 do_t_arit3c (void)
9786 {
9787   int Rd, Rs, Rn;
9788
9789   Rd = inst.operands[0].reg;
9790   Rs = (inst.operands[1].present
9791         ? inst.operands[1].reg    /* Rd, Rs, foo */
9792         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
9793   Rn = inst.operands[2].reg;
9794
9795   reject_bad_reg (Rd);
9796   reject_bad_reg (Rs);
9797   if (inst.operands[2].isreg)
9798     reject_bad_reg (Rn);
9799
9800   if (unified_syntax)
9801     {
9802       if (!inst.operands[2].isreg)
9803         {
9804           /* For an immediate, we always generate a 32-bit opcode;
9805              section relaxation will shrink it later if possible.  */
9806           inst.instruction = THUMB_OP32 (inst.instruction);
9807           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9808           inst.instruction |= Rd << 8;
9809           inst.instruction |= Rs << 16;
9810           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9811         }
9812       else
9813         {
9814           bfd_boolean narrow;
9815
9816           /* See if we can do this with a 16-bit instruction.  */
9817           if (THUMB_SETS_FLAGS (inst.instruction))
9818             narrow = !in_it_block ();
9819           else
9820             narrow = in_it_block ();
9821
9822           if (Rd > 7 || Rn > 7 || Rs > 7)
9823             narrow = FALSE;
9824           if (inst.operands[2].shifted)
9825             narrow = FALSE;
9826           if (inst.size_req == 4)
9827             narrow = FALSE;
9828
9829           if (narrow)
9830             {
9831               if (Rd == Rs)
9832                 {
9833                   inst.instruction = THUMB_OP16 (inst.instruction);
9834                   inst.instruction |= Rd;
9835                   inst.instruction |= Rn << 3;
9836                   return;
9837                 }
9838               if (Rd == Rn)
9839                 {
9840                   inst.instruction = THUMB_OP16 (inst.instruction);
9841                   inst.instruction |= Rd;
9842                   inst.instruction |= Rs << 3;
9843                   return;
9844                 }
9845             }
9846
9847           /* If we get here, it can't be done in 16 bits.  */
9848           constraint (inst.operands[2].shifted
9849                       && inst.operands[2].immisreg,
9850                       _("shift must be constant"));
9851           inst.instruction = THUMB_OP32 (inst.instruction);
9852           inst.instruction |= Rd << 8;
9853           inst.instruction |= Rs << 16;
9854           encode_thumb32_shifted_operand (2);
9855         }
9856     }
9857   else
9858     {
9859       /* On its face this is a lie - the instruction does set the
9860          flags.  However, the only supported mnemonic in this mode
9861          says it doesn't.  */
9862       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
9863
9864       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9865                   _("unshifted register required"));
9866       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9867
9868       inst.instruction = THUMB_OP16 (inst.instruction);
9869       inst.instruction |= Rd;
9870
9871       if (Rd == Rs)
9872         inst.instruction |= Rn << 3;
9873       else if (Rd == Rn)
9874         inst.instruction |= Rs << 3;
9875       else
9876         constraint (1, _("dest must overlap one source register"));
9877     }
9878 }
9879
9880 static void
9881 do_t_barrier (void)
9882 {
9883   if (inst.operands[0].present)
9884     {
9885       constraint ((inst.instruction & 0xf0) != 0x40
9886                   && inst.operands[0].imm > 0xf
9887                   && inst.operands[0].imm < 0x0,
9888                   _("bad barrier type"));
9889       inst.instruction |= inst.operands[0].imm;
9890     }
9891   else
9892     inst.instruction |= 0xf;
9893 }
9894
9895 static void
9896 do_t_bfc (void)
9897 {
9898   unsigned Rd;
9899   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
9900   constraint (msb > 32, _("bit-field extends past end of register"));
9901   /* The instruction encoding stores the LSB and MSB,
9902      not the LSB and width.  */
9903   Rd = inst.operands[0].reg;
9904   reject_bad_reg (Rd);
9905   inst.instruction |= Rd << 8;
9906   inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
9907   inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
9908   inst.instruction |= msb - 1;
9909 }
9910
9911 static void
9912 do_t_bfi (void)
9913 {
9914   int Rd, Rn;
9915   unsigned int msb;
9916
9917   Rd = inst.operands[0].reg;
9918   reject_bad_reg (Rd);
9919
9920   /* #0 in second position is alternative syntax for bfc, which is
9921      the same instruction but with REG_PC in the Rm field.  */
9922   if (!inst.operands[1].isreg)
9923     Rn = REG_PC;
9924   else
9925     {
9926       Rn = inst.operands[1].reg;
9927       reject_bad_reg (Rn);
9928     }
9929
9930   msb = inst.operands[2].imm + inst.operands[3].imm;
9931   constraint (msb > 32, _("bit-field extends past end of register"));
9932   /* The instruction encoding stores the LSB and MSB,
9933      not the LSB and width.  */
9934   inst.instruction |= Rd << 8;
9935   inst.instruction |= Rn << 16;
9936   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
9937   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
9938   inst.instruction |= msb - 1;
9939 }
9940
9941 static void
9942 do_t_bfx (void)
9943 {
9944   unsigned Rd, Rn;
9945
9946   Rd = inst.operands[0].reg;
9947   Rn = inst.operands[1].reg;
9948
9949   reject_bad_reg (Rd);
9950   reject_bad_reg (Rn);
9951
9952   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
9953               _("bit-field extends past end of register"));
9954   inst.instruction |= Rd << 8;
9955   inst.instruction |= Rn << 16;
9956   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
9957   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
9958   inst.instruction |= inst.operands[3].imm - 1;
9959 }
9960
9961 /* ARM V5 Thumb BLX (argument parse)
9962         BLX <target_addr>       which is BLX(1)
9963         BLX <Rm>                which is BLX(2)
9964    Unfortunately, there are two different opcodes for this mnemonic.
9965    So, the insns[].value is not used, and the code here zaps values
9966         into inst.instruction.
9967
9968    ??? How to take advantage of the additional two bits of displacement
9969    available in Thumb32 mode?  Need new relocation?  */
9970
9971 static void
9972 do_t_blx (void)
9973 {
9974   set_it_insn_type_last ();
9975
9976   if (inst.operands[0].isreg)
9977     {
9978       constraint (inst.operands[0].reg == REG_PC, BAD_PC);
9979       /* We have a register, so this is BLX(2).  */
9980       inst.instruction |= inst.operands[0].reg << 3;
9981     }
9982   else
9983     {
9984       /* No register.  This must be BLX(1).  */
9985       inst.instruction = 0xf000e800;
9986       encode_branch (BFD_RELOC_THUMB_PCREL_BLX);
9987     }
9988 }
9989
9990 static void
9991 do_t_branch (void)
9992 {
9993   int opcode;
9994   int cond;
9995   int reloc;
9996
9997   cond = inst.cond;
9998   set_it_insn_type (IF_INSIDE_IT_LAST_INSN);
9999
10000   if (in_it_block ())
10001     {
10002       /* Conditional branches inside IT blocks are encoded as unconditional
10003          branches.  */
10004       cond = COND_ALWAYS;
10005     }
10006   else
10007     cond = inst.cond;
10008
10009   if (cond != COND_ALWAYS)
10010     opcode = T_MNEM_bcond;
10011   else
10012     opcode = inst.instruction;
10013
10014   if (unified_syntax
10015       && (inst.size_req == 4
10016           || (inst.size_req != 2
10017               && (inst.operands[0].hasreloc
10018                   || inst.reloc.exp.X_op == O_constant))))
10019     {
10020       inst.instruction = THUMB_OP32(opcode);
10021       if (cond == COND_ALWAYS)
10022         reloc = BFD_RELOC_THUMB_PCREL_BRANCH25;
10023       else
10024         {
10025           gas_assert (cond != 0xF);
10026           inst.instruction |= cond << 22;
10027           reloc = BFD_RELOC_THUMB_PCREL_BRANCH20;
10028         }
10029     }
10030   else
10031     {
10032       inst.instruction = THUMB_OP16(opcode);
10033       if (cond == COND_ALWAYS)
10034         reloc = BFD_RELOC_THUMB_PCREL_BRANCH12;
10035       else
10036         {
10037           inst.instruction |= cond << 8;
10038           reloc = BFD_RELOC_THUMB_PCREL_BRANCH9;
10039         }
10040       /* Allow section relaxation.  */
10041       if (unified_syntax && inst.size_req != 2)
10042         inst.relax = opcode;
10043     }
10044   inst.reloc.type = reloc;
10045   inst.reloc.pc_rel = 1;
10046 }
10047
10048 static void
10049 do_t_bkpt (void)
10050 {
10051   constraint (inst.cond != COND_ALWAYS,
10052               _("instruction is always unconditional"));
10053   if (inst.operands[0].present)
10054     {
10055       constraint (inst.operands[0].imm > 255,
10056                   _("immediate value out of range"));
10057       inst.instruction |= inst.operands[0].imm;
10058       set_it_insn_type (NEUTRAL_IT_INSN);
10059     }
10060 }
10061
10062 static void
10063 do_t_branch23 (void)
10064 {
10065   set_it_insn_type_last ();
10066   encode_branch (BFD_RELOC_THUMB_PCREL_BRANCH23);
10067
10068   /* md_apply_fix blows up with 'bl foo(PLT)' where foo is defined in
10069      this file.  We used to simply ignore the PLT reloc type here --
10070      the branch encoding is now needed to deal with TLSCALL relocs.
10071      So if we see a PLT reloc now, put it back to how it used to be to
10072      keep the preexisting behaviour.  */
10073   if (inst.reloc.type == BFD_RELOC_ARM_PLT32)
10074     inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
10075
10076 #if defined(OBJ_COFF)
10077   /* If the destination of the branch is a defined symbol which does not have
10078      the THUMB_FUNC attribute, then we must be calling a function which has
10079      the (interfacearm) attribute.  We look for the Thumb entry point to that
10080      function and change the branch to refer to that function instead.  */
10081   if (   inst.reloc.exp.X_op == O_symbol
10082       && inst.reloc.exp.X_add_symbol != NULL
10083       && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
10084       && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
10085     inst.reloc.exp.X_add_symbol =
10086       find_real_start (inst.reloc.exp.X_add_symbol);
10087 #endif
10088 }
10089
10090 static void
10091 do_t_bx (void)
10092 {
10093   set_it_insn_type_last ();
10094   inst.instruction |= inst.operands[0].reg << 3;
10095   /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC.  The reloc
10096      should cause the alignment to be checked once it is known.  This is
10097      because BX PC only works if the instruction is word aligned.  */
10098 }
10099
10100 static void
10101 do_t_bxj (void)
10102 {
10103   int Rm;
10104
10105   set_it_insn_type_last ();
10106   Rm = inst.operands[0].reg;
10107   reject_bad_reg (Rm);
10108   inst.instruction |= Rm << 16;
10109 }
10110
10111 static void
10112 do_t_clz (void)
10113 {
10114   unsigned Rd;
10115   unsigned Rm;
10116
10117   Rd = inst.operands[0].reg;
10118   Rm = inst.operands[1].reg;
10119
10120   reject_bad_reg (Rd);
10121   reject_bad_reg (Rm);
10122
10123   inst.instruction |= Rd << 8;
10124   inst.instruction |= Rm << 16;
10125   inst.instruction |= Rm;
10126 }
10127
10128 static void
10129 do_t_cps (void)
10130 {
10131   set_it_insn_type (OUTSIDE_IT_INSN);
10132   inst.instruction |= inst.operands[0].imm;
10133 }
10134
10135 static void
10136 do_t_cpsi (void)
10137 {
10138   set_it_insn_type (OUTSIDE_IT_INSN);
10139   if (unified_syntax
10140       && (inst.operands[1].present || inst.size_req == 4)
10141       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
10142     {
10143       unsigned int imod = (inst.instruction & 0x0030) >> 4;
10144       inst.instruction = 0xf3af8000;
10145       inst.instruction |= imod << 9;
10146       inst.instruction |= inst.operands[0].imm << 5;
10147       if (inst.operands[1].present)
10148         inst.instruction |= 0x100 | inst.operands[1].imm;
10149     }
10150   else
10151     {
10152       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
10153                   && (inst.operands[0].imm & 4),
10154                   _("selected processor does not support 'A' form "
10155                     "of this instruction"));
10156       constraint (inst.operands[1].present || inst.size_req == 4,
10157                   _("Thumb does not support the 2-argument "
10158                     "form of this instruction"));
10159       inst.instruction |= inst.operands[0].imm;
10160     }
10161 }
10162
10163 /* THUMB CPY instruction (argument parse).  */
10164
10165 static void
10166 do_t_cpy (void)
10167 {
10168   if (inst.size_req == 4)
10169     {
10170       inst.instruction = THUMB_OP32 (T_MNEM_mov);
10171       inst.instruction |= inst.operands[0].reg << 8;
10172       inst.instruction |= inst.operands[1].reg;
10173     }
10174   else
10175     {
10176       inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
10177       inst.instruction |= (inst.operands[0].reg & 0x7);
10178       inst.instruction |= inst.operands[1].reg << 3;
10179     }
10180 }
10181
10182 static void
10183 do_t_cbz (void)
10184 {
10185   set_it_insn_type (OUTSIDE_IT_INSN);
10186   constraint (inst.operands[0].reg > 7, BAD_HIREG);
10187   inst.instruction |= inst.operands[0].reg;
10188   inst.reloc.pc_rel = 1;
10189   inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
10190 }
10191
10192 static void
10193 do_t_dbg (void)
10194 {
10195   inst.instruction |= inst.operands[0].imm;
10196 }
10197
10198 static void
10199 do_t_div (void)
10200 {
10201   unsigned Rd, Rn, Rm;
10202
10203   Rd = inst.operands[0].reg;
10204   Rn = (inst.operands[1].present
10205         ? inst.operands[1].reg : Rd);
10206   Rm = inst.operands[2].reg;
10207
10208   reject_bad_reg (Rd);
10209   reject_bad_reg (Rn);
10210   reject_bad_reg (Rm);
10211
10212   inst.instruction |= Rd << 8;
10213   inst.instruction |= Rn << 16;
10214   inst.instruction |= Rm;
10215 }
10216
10217 static void
10218 do_t_hint (void)
10219 {
10220   if (unified_syntax && inst.size_req == 4)
10221     inst.instruction = THUMB_OP32 (inst.instruction);
10222   else
10223     inst.instruction = THUMB_OP16 (inst.instruction);
10224 }
10225
10226 static void
10227 do_t_it (void)
10228 {
10229   unsigned int cond = inst.operands[0].imm;
10230
10231   set_it_insn_type (IT_INSN);
10232   now_it.mask = (inst.instruction & 0xf) | 0x10;
10233   now_it.cc = cond;
10234
10235   /* If the condition is a negative condition, invert the mask.  */
10236   if ((cond & 0x1) == 0x0)
10237     {
10238       unsigned int mask = inst.instruction & 0x000f;
10239
10240       if ((mask & 0x7) == 0)
10241         /* no conversion needed */;
10242       else if ((mask & 0x3) == 0)
10243         mask ^= 0x8;
10244       else if ((mask & 0x1) == 0)
10245         mask ^= 0xC;
10246       else
10247         mask ^= 0xE;
10248
10249       inst.instruction &= 0xfff0;
10250       inst.instruction |= mask;
10251     }
10252
10253   inst.instruction |= cond << 4;
10254 }
10255
10256 /* Helper function used for both push/pop and ldm/stm.  */
10257 static void
10258 encode_thumb2_ldmstm (int base, unsigned mask, bfd_boolean writeback)
10259 {
10260   bfd_boolean load;
10261
10262   load = (inst.instruction & (1 << 20)) != 0;
10263
10264   if (mask & (1 << 13))
10265     inst.error =  _("SP not allowed in register list");
10266
10267   if ((mask & (1 << base)) != 0
10268       && writeback)
10269     inst.error = _("having the base register in the register list when "
10270                    "using write back is UNPREDICTABLE");
10271
10272   if (load)
10273     {
10274       if (mask & (1 << 15))
10275         {
10276           if (mask & (1 << 14))
10277             inst.error = _("LR and PC should not both be in register list");
10278           else
10279             set_it_insn_type_last ();
10280         }
10281     }
10282   else
10283     {
10284       if (mask & (1 << 15))
10285         inst.error = _("PC not allowed in register list");
10286     }
10287
10288   if ((mask & (mask - 1)) == 0)
10289     {
10290       /* Single register transfers implemented as str/ldr.  */
10291       if (writeback)
10292         {
10293           if (inst.instruction & (1 << 23))
10294             inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
10295           else
10296             inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
10297         }
10298       else
10299         {
10300           if (inst.instruction & (1 << 23))
10301             inst.instruction = 0x00800000; /* ia -> [base] */
10302           else
10303             inst.instruction = 0x00000c04; /* db -> [base, #-4] */
10304         }
10305
10306       inst.instruction |= 0xf8400000;
10307       if (load)
10308         inst.instruction |= 0x00100000;
10309
10310       mask = ffs (mask) - 1;
10311       mask <<= 12;
10312     }
10313   else if (writeback)
10314     inst.instruction |= WRITE_BACK;
10315
10316   inst.instruction |= mask;
10317   inst.instruction |= base << 16;
10318 }
10319
10320 static void
10321 do_t_ldmstm (void)
10322 {
10323   /* This really doesn't seem worth it.  */
10324   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
10325               _("expression too complex"));
10326   constraint (inst.operands[1].writeback,
10327               _("Thumb load/store multiple does not support {reglist}^"));
10328
10329   if (unified_syntax)
10330     {
10331       bfd_boolean narrow;
10332       unsigned mask;
10333
10334       narrow = FALSE;
10335       /* See if we can use a 16-bit instruction.  */
10336       if (inst.instruction < 0xffff /* not ldmdb/stmdb */
10337           && inst.size_req != 4
10338           && !(inst.operands[1].imm & ~0xff))
10339         {
10340           mask = 1 << inst.operands[0].reg;
10341
10342           if (inst.operands[0].reg <= 7)
10343             {
10344               if (inst.instruction == T_MNEM_stmia
10345                   ? inst.operands[0].writeback
10346                   : (inst.operands[0].writeback
10347                      == !(inst.operands[1].imm & mask)))
10348                 {
10349                   if (inst.instruction == T_MNEM_stmia
10350                       && (inst.operands[1].imm & mask)
10351                       && (inst.operands[1].imm & (mask - 1)))
10352                     as_warn (_("value stored for r%d is UNKNOWN"),
10353                              inst.operands[0].reg);
10354
10355                   inst.instruction = THUMB_OP16 (inst.instruction);
10356                   inst.instruction |= inst.operands[0].reg << 8;
10357                   inst.instruction |= inst.operands[1].imm;
10358                   narrow = TRUE;
10359                 }
10360               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10361                 {
10362                   /* This means 1 register in reg list one of 3 situations:
10363                      1. Instruction is stmia, but without writeback.
10364                      2. lmdia without writeback, but with Rn not in
10365                         reglist.
10366                      3. ldmia with writeback, but with Rn in reglist.
10367                      Case 3 is UNPREDICTABLE behaviour, so we handle
10368                      case 1 and 2 which can be converted into a 16-bit
10369                      str or ldr. The SP cases are handled below.  */
10370                   unsigned long opcode;
10371                   /* First, record an error for Case 3.  */
10372                   if (inst.operands[1].imm & mask
10373                       && inst.operands[0].writeback)
10374                     inst.error =
10375                         _("having the base register in the register list when "
10376                           "using write back is UNPREDICTABLE");
10377
10378                   opcode = (inst.instruction == T_MNEM_stmia ? T_MNEM_str
10379                                                              : T_MNEM_ldr);
10380                   inst.instruction = THUMB_OP16 (opcode);
10381                   inst.instruction |= inst.operands[0].reg << 3;
10382                   inst.instruction |= (ffs (inst.operands[1].imm)-1);
10383                   narrow = TRUE;
10384                 }
10385             }
10386           else if (inst.operands[0] .reg == REG_SP)
10387             {
10388               if (inst.operands[0].writeback)
10389                 {
10390                   inst.instruction =
10391                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
10392                                     ? T_MNEM_push : T_MNEM_pop);
10393                   inst.instruction |= inst.operands[1].imm;
10394                   narrow = TRUE;
10395                 }
10396               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10397                 {
10398                   inst.instruction =
10399                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
10400                                     ? T_MNEM_str_sp : T_MNEM_ldr_sp);
10401                   inst.instruction |= ((ffs (inst.operands[1].imm)-1) << 8);
10402                   narrow = TRUE;
10403                 }
10404             }
10405         }
10406
10407       if (!narrow)
10408         {
10409           if (inst.instruction < 0xffff)
10410             inst.instruction = THUMB_OP32 (inst.instruction);
10411
10412           encode_thumb2_ldmstm (inst.operands[0].reg, inst.operands[1].imm,
10413                                 inst.operands[0].writeback);
10414         }
10415     }
10416   else
10417     {
10418       constraint (inst.operands[0].reg > 7
10419                   || (inst.operands[1].imm & ~0xff), BAD_HIREG);
10420       constraint (inst.instruction != T_MNEM_ldmia
10421                   && inst.instruction != T_MNEM_stmia,
10422                   _("Thumb-2 instruction only valid in unified syntax"));
10423       if (inst.instruction == T_MNEM_stmia)
10424         {
10425           if (!inst.operands[0].writeback)
10426             as_warn (_("this instruction will write back the base register"));
10427           if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
10428               && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
10429             as_warn (_("value stored for r%d is UNKNOWN"),
10430                      inst.operands[0].reg);
10431         }
10432       else
10433         {
10434           if (!inst.operands[0].writeback
10435               && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
10436             as_warn (_("this instruction will write back the base register"));
10437           else if (inst.operands[0].writeback
10438                    && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
10439             as_warn (_("this instruction will not write back the base register"));
10440         }
10441
10442       inst.instruction = THUMB_OP16 (inst.instruction);
10443       inst.instruction |= inst.operands[0].reg << 8;
10444       inst.instruction |= inst.operands[1].imm;
10445     }
10446 }
10447
10448 static void
10449 do_t_ldrex (void)
10450 {
10451   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
10452               || inst.operands[1].postind || inst.operands[1].writeback
10453               || inst.operands[1].immisreg || inst.operands[1].shifted
10454               || inst.operands[1].negative,
10455               BAD_ADDR_MODE);
10456
10457   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
10458
10459   inst.instruction |= inst.operands[0].reg << 12;
10460   inst.instruction |= inst.operands[1].reg << 16;
10461   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
10462 }
10463
10464 static void
10465 do_t_ldrexd (void)
10466 {
10467   if (!inst.operands[1].present)
10468     {
10469       constraint (inst.operands[0].reg == REG_LR,
10470                   _("r14 not allowed as first register "
10471                     "when second register is omitted"));
10472       inst.operands[1].reg = inst.operands[0].reg + 1;
10473     }
10474   constraint (inst.operands[0].reg == inst.operands[1].reg,
10475               BAD_OVERLAP);
10476
10477   inst.instruction |= inst.operands[0].reg << 12;
10478   inst.instruction |= inst.operands[1].reg << 8;
10479   inst.instruction |= inst.operands[2].reg << 16;
10480 }
10481
10482 static void
10483 do_t_ldst (void)
10484 {
10485   unsigned long opcode;
10486   int Rn;
10487
10488   if (inst.operands[0].isreg
10489       && !inst.operands[0].preind
10490       && inst.operands[0].reg == REG_PC)
10491     set_it_insn_type_last ();
10492
10493   opcode = inst.instruction;
10494   if (unified_syntax)
10495     {
10496       if (!inst.operands[1].isreg)
10497         {
10498           if (opcode <= 0xffff)
10499             inst.instruction = THUMB_OP32 (opcode);
10500           if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10501             return;
10502         }
10503       if (inst.operands[1].isreg
10504           && !inst.operands[1].writeback
10505           && !inst.operands[1].shifted && !inst.operands[1].postind
10506           && !inst.operands[1].negative && inst.operands[0].reg <= 7
10507           && opcode <= 0xffff
10508           && inst.size_req != 4)
10509         {
10510           /* Insn may have a 16-bit form.  */
10511           Rn = inst.operands[1].reg;
10512           if (inst.operands[1].immisreg)
10513             {
10514               inst.instruction = THUMB_OP16 (opcode);
10515               /* [Rn, Rik] */
10516               if (Rn <= 7 && inst.operands[1].imm <= 7)
10517                 goto op16;
10518               else if (opcode != T_MNEM_ldr && opcode != T_MNEM_str)
10519                 reject_bad_reg (inst.operands[1].imm);
10520             }
10521           else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
10522                     && opcode != T_MNEM_ldrsb)
10523                    || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
10524                    || (Rn == REG_SP && opcode == T_MNEM_str))
10525             {
10526               /* [Rn, #const] */
10527               if (Rn > 7)
10528                 {
10529                   if (Rn == REG_PC)
10530                     {
10531                       if (inst.reloc.pc_rel)
10532                         opcode = T_MNEM_ldr_pc2;
10533                       else
10534                         opcode = T_MNEM_ldr_pc;
10535                     }
10536                   else
10537                     {
10538                       if (opcode == T_MNEM_ldr)
10539                         opcode = T_MNEM_ldr_sp;
10540                       else
10541                         opcode = T_MNEM_str_sp;
10542                     }
10543                   inst.instruction = inst.operands[0].reg << 8;
10544                 }
10545               else
10546                 {
10547                   inst.instruction = inst.operands[0].reg;
10548                   inst.instruction |= inst.operands[1].reg << 3;
10549                 }
10550               inst.instruction |= THUMB_OP16 (opcode);
10551               if (inst.size_req == 2)
10552                 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10553               else
10554                 inst.relax = opcode;
10555               return;
10556             }
10557         }
10558       /* Definitely a 32-bit variant.  */
10559
10560       /* Warning for Erratum 752419.  */
10561       if (opcode == T_MNEM_ldr
10562           && inst.operands[0].reg == REG_SP
10563           && inst.operands[1].writeback == 1
10564           && !inst.operands[1].immisreg)
10565         {
10566           if (no_cpu_selected ()
10567               || (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7)
10568                   && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a)
10569                   && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7r)))
10570             as_warn (_("This instruction may be unpredictable "
10571                        "if executed on M-profile cores "
10572                        "with interrupts enabled."));
10573         }
10574
10575       /* Do some validations regarding addressing modes.  */
10576       if (inst.operands[1].immisreg)
10577         reject_bad_reg (inst.operands[1].imm);
10578
10579       constraint (inst.operands[1].writeback == 1
10580                   && inst.operands[0].reg == inst.operands[1].reg,
10581                   BAD_OVERLAP);
10582
10583       inst.instruction = THUMB_OP32 (opcode);
10584       inst.instruction |= inst.operands[0].reg << 12;
10585       encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
10586       check_ldr_r15_aligned ();
10587       return;
10588     }
10589
10590   constraint (inst.operands[0].reg > 7, BAD_HIREG);
10591
10592   if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
10593     {
10594       /* Only [Rn,Rm] is acceptable.  */
10595       constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
10596       constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
10597                   || inst.operands[1].postind || inst.operands[1].shifted
10598                   || inst.operands[1].negative,
10599                   _("Thumb does not support this addressing mode"));
10600       inst.instruction = THUMB_OP16 (inst.instruction);
10601       goto op16;
10602     }
10603
10604   inst.instruction = THUMB_OP16 (inst.instruction);
10605   if (!inst.operands[1].isreg)
10606     if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10607       return;
10608
10609   constraint (!inst.operands[1].preind
10610               || inst.operands[1].shifted
10611               || inst.operands[1].writeback,
10612               _("Thumb does not support this addressing mode"));
10613   if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
10614     {
10615       constraint (inst.instruction & 0x0600,
10616                   _("byte or halfword not valid for base register"));
10617       constraint (inst.operands[1].reg == REG_PC
10618                   && !(inst.instruction & THUMB_LOAD_BIT),
10619                   _("r15 based store not allowed"));
10620       constraint (inst.operands[1].immisreg,
10621                   _("invalid base register for register offset"));
10622
10623       if (inst.operands[1].reg == REG_PC)
10624         inst.instruction = T_OPCODE_LDR_PC;
10625       else if (inst.instruction & THUMB_LOAD_BIT)
10626         inst.instruction = T_OPCODE_LDR_SP;
10627       else
10628         inst.instruction = T_OPCODE_STR_SP;
10629
10630       inst.instruction |= inst.operands[0].reg << 8;
10631       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10632       return;
10633     }
10634
10635   constraint (inst.operands[1].reg > 7, BAD_HIREG);
10636   if (!inst.operands[1].immisreg)
10637     {
10638       /* Immediate offset.  */
10639       inst.instruction |= inst.operands[0].reg;
10640       inst.instruction |= inst.operands[1].reg << 3;
10641       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10642       return;
10643     }
10644
10645   /* Register offset.  */
10646   constraint (inst.operands[1].imm > 7, BAD_HIREG);
10647   constraint (inst.operands[1].negative,
10648               _("Thumb does not support this addressing mode"));
10649
10650  op16:
10651   switch (inst.instruction)
10652     {
10653     case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
10654     case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
10655     case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
10656     case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
10657     case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
10658     case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
10659     case 0x5600 /* ldrsb */:
10660     case 0x5e00 /* ldrsh */: break;
10661     default: abort ();
10662     }
10663
10664   inst.instruction |= inst.operands[0].reg;
10665   inst.instruction |= inst.operands[1].reg << 3;
10666   inst.instruction |= inst.operands[1].imm << 6;
10667 }
10668
10669 static void
10670 do_t_ldstd (void)
10671 {
10672   if (!inst.operands[1].present)
10673     {
10674       inst.operands[1].reg = inst.operands[0].reg + 1;
10675       constraint (inst.operands[0].reg == REG_LR,
10676                   _("r14 not allowed here"));
10677       constraint (inst.operands[0].reg == REG_R12,
10678                   _("r12 not allowed here"));
10679     }
10680
10681   if (inst.operands[2].writeback
10682       && (inst.operands[0].reg == inst.operands[2].reg
10683       || inst.operands[1].reg == inst.operands[2].reg))
10684     as_warn (_("base register written back, and overlaps "
10685                "one of transfer registers"));
10686
10687   inst.instruction |= inst.operands[0].reg << 12;
10688   inst.instruction |= inst.operands[1].reg << 8;
10689   encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
10690 }
10691
10692 static void
10693 do_t_ldstt (void)
10694 {
10695   inst.instruction |= inst.operands[0].reg << 12;
10696   encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
10697 }
10698
10699 static void
10700 do_t_mla (void)
10701 {
10702   unsigned Rd, Rn, Rm, Ra;
10703
10704   Rd = inst.operands[0].reg;
10705   Rn = inst.operands[1].reg;
10706   Rm = inst.operands[2].reg;
10707   Ra = inst.operands[3].reg;
10708
10709   reject_bad_reg (Rd);
10710   reject_bad_reg (Rn);
10711   reject_bad_reg (Rm);
10712   reject_bad_reg (Ra);
10713
10714   inst.instruction |= Rd << 8;
10715   inst.instruction |= Rn << 16;
10716   inst.instruction |= Rm;
10717   inst.instruction |= Ra << 12;
10718 }
10719
10720 static void
10721 do_t_mlal (void)
10722 {
10723   unsigned RdLo, RdHi, Rn, Rm;
10724
10725   RdLo = inst.operands[0].reg;
10726   RdHi = inst.operands[1].reg;
10727   Rn = inst.operands[2].reg;
10728   Rm = inst.operands[3].reg;
10729
10730   reject_bad_reg (RdLo);
10731   reject_bad_reg (RdHi);
10732   reject_bad_reg (Rn);
10733   reject_bad_reg (Rm);
10734
10735   inst.instruction |= RdLo << 12;
10736   inst.instruction |= RdHi << 8;
10737   inst.instruction |= Rn << 16;
10738   inst.instruction |= Rm;
10739 }
10740
10741 static void
10742 do_t_mov_cmp (void)
10743 {
10744   unsigned Rn, Rm;
10745
10746   Rn = inst.operands[0].reg;
10747   Rm = inst.operands[1].reg;
10748
10749   if (Rn == REG_PC)
10750     set_it_insn_type_last ();
10751
10752   if (unified_syntax)
10753     {
10754       int r0off = (inst.instruction == T_MNEM_mov
10755                    || inst.instruction == T_MNEM_movs) ? 8 : 16;
10756       unsigned long opcode;
10757       bfd_boolean narrow;
10758       bfd_boolean low_regs;
10759
10760       low_regs = (Rn <= 7 && Rm <= 7);
10761       opcode = inst.instruction;
10762       if (in_it_block ())
10763         narrow = opcode != T_MNEM_movs;
10764       else
10765         narrow = opcode != T_MNEM_movs || low_regs;
10766       if (inst.size_req == 4
10767           || inst.operands[1].shifted)
10768         narrow = FALSE;
10769
10770       /* MOVS PC, LR is encoded as SUBS PC, LR, #0.  */
10771       if (opcode == T_MNEM_movs && inst.operands[1].isreg
10772           && !inst.operands[1].shifted
10773           && Rn == REG_PC
10774           && Rm == REG_LR)
10775         {
10776           inst.instruction = T2_SUBS_PC_LR;
10777           return;
10778         }
10779
10780       if (opcode == T_MNEM_cmp)
10781         {
10782           constraint (Rn == REG_PC, BAD_PC);
10783           if (narrow)
10784             {
10785               /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
10786                  but valid.  */
10787               warn_deprecated_sp (Rm);
10788               /* R15 was documented as a valid choice for Rm in ARMv6,
10789                  but as UNPREDICTABLE in ARMv7.  ARM's proprietary
10790                  tools reject R15, so we do too.  */
10791               constraint (Rm == REG_PC, BAD_PC);
10792             }
10793           else
10794             reject_bad_reg (Rm);
10795         }
10796       else if (opcode == T_MNEM_mov
10797                || opcode == T_MNEM_movs)
10798         {
10799           if (inst.operands[1].isreg)
10800             {
10801               if (opcode == T_MNEM_movs)
10802                 {
10803                   reject_bad_reg (Rn);
10804                   reject_bad_reg (Rm);
10805                 }
10806               else if (narrow)
10807                 {
10808                   /* This is mov.n.  */
10809                   if ((Rn == REG_SP || Rn == REG_PC)
10810                       && (Rm == REG_SP || Rm == REG_PC))
10811                     {
10812                       as_warn (_("Use of r%u as a source register is "
10813                                  "deprecated when r%u is the destination "
10814                                  "register."), Rm, Rn);
10815                     }
10816                 }
10817               else
10818                 {
10819                   /* This is mov.w.  */
10820                   constraint (Rn == REG_PC, BAD_PC);
10821                   constraint (Rm == REG_PC, BAD_PC);
10822                   constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP);
10823                 }
10824             }
10825           else
10826             reject_bad_reg (Rn);
10827         }
10828
10829       if (!inst.operands[1].isreg)
10830         {
10831           /* Immediate operand.  */
10832           if (!in_it_block () && opcode == T_MNEM_mov)
10833             narrow = 0;
10834           if (low_regs && narrow)
10835             {
10836               inst.instruction = THUMB_OP16 (opcode);
10837               inst.instruction |= Rn << 8;
10838               if (inst.size_req == 2)
10839                 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
10840               else
10841                 inst.relax = opcode;
10842             }
10843           else
10844             {
10845               inst.instruction = THUMB_OP32 (inst.instruction);
10846               inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10847               inst.instruction |= Rn << r0off;
10848               inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10849             }
10850         }
10851       else if (inst.operands[1].shifted && inst.operands[1].immisreg
10852                && (inst.instruction == T_MNEM_mov
10853                    || inst.instruction == T_MNEM_movs))
10854         {
10855           /* Register shifts are encoded as separate shift instructions.  */
10856           bfd_boolean flags = (inst.instruction == T_MNEM_movs);
10857
10858           if (in_it_block ())
10859             narrow = !flags;
10860           else
10861             narrow = flags;
10862
10863           if (inst.size_req == 4)
10864             narrow = FALSE;
10865
10866           if (!low_regs || inst.operands[1].imm > 7)
10867             narrow = FALSE;
10868
10869           if (Rn != Rm)
10870             narrow = FALSE;
10871
10872           switch (inst.operands[1].shift_kind)
10873             {
10874             case SHIFT_LSL:
10875               opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
10876               break;
10877             case SHIFT_ASR:
10878               opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
10879               break;
10880             case SHIFT_LSR:
10881               opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
10882               break;
10883             case SHIFT_ROR:
10884               opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
10885               break;
10886             default:
10887               abort ();
10888             }
10889
10890           inst.instruction = opcode;
10891           if (narrow)
10892             {
10893               inst.instruction |= Rn;
10894               inst.instruction |= inst.operands[1].imm << 3;
10895             }
10896           else
10897             {
10898               if (flags)
10899                 inst.instruction |= CONDS_BIT;
10900
10901               inst.instruction |= Rn << 8;
10902               inst.instruction |= Rm << 16;
10903               inst.instruction |= inst.operands[1].imm;
10904             }
10905         }
10906       else if (!narrow)
10907         {
10908           /* Some mov with immediate shift have narrow variants.
10909              Register shifts are handled above.  */
10910           if (low_regs && inst.operands[1].shifted
10911               && (inst.instruction == T_MNEM_mov
10912                   || inst.instruction == T_MNEM_movs))
10913             {
10914               if (in_it_block ())
10915                 narrow = (inst.instruction == T_MNEM_mov);
10916               else
10917                 narrow = (inst.instruction == T_MNEM_movs);
10918             }
10919
10920           if (narrow)
10921             {
10922               switch (inst.operands[1].shift_kind)
10923                 {
10924                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
10925                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
10926                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
10927                 default: narrow = FALSE; break;
10928                 }
10929             }
10930
10931           if (narrow)
10932             {
10933               inst.instruction |= Rn;
10934               inst.instruction |= Rm << 3;
10935               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
10936             }
10937           else
10938             {
10939               inst.instruction = THUMB_OP32 (inst.instruction);
10940               inst.instruction |= Rn << r0off;
10941               encode_thumb32_shifted_operand (1);
10942             }
10943         }
10944       else
10945         switch (inst.instruction)
10946           {
10947           case T_MNEM_mov:
10948             /* In v4t or v5t a move of two lowregs produces unpredictable
10949                results. Don't allow this.  */
10950             if (low_regs)
10951               {
10952                 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6),
10953                             "MOV Rd, Rs with two low registers is not "
10954                             "permitted on this architecture");
10955                 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
10956                                         arm_ext_v6);
10957               }
10958
10959             inst.instruction = T_OPCODE_MOV_HR;
10960             inst.instruction |= (Rn & 0x8) << 4;
10961             inst.instruction |= (Rn & 0x7);
10962             inst.instruction |= Rm << 3;
10963             break;
10964
10965           case T_MNEM_movs:
10966             /* We know we have low registers at this point.
10967                Generate LSLS Rd, Rs, #0.  */
10968             inst.instruction = T_OPCODE_LSL_I;
10969             inst.instruction |= Rn;
10970             inst.instruction |= Rm << 3;
10971             break;
10972
10973           case T_MNEM_cmp:
10974             if (low_regs)
10975               {
10976                 inst.instruction = T_OPCODE_CMP_LR;
10977                 inst.instruction |= Rn;
10978                 inst.instruction |= Rm << 3;
10979               }
10980             else
10981               {
10982                 inst.instruction = T_OPCODE_CMP_HR;
10983                 inst.instruction |= (Rn & 0x8) << 4;
10984                 inst.instruction |= (Rn & 0x7);
10985                 inst.instruction |= Rm << 3;
10986               }
10987             break;
10988           }
10989       return;
10990     }
10991
10992   inst.instruction = THUMB_OP16 (inst.instruction);
10993
10994   /* PR 10443: Do not silently ignore shifted operands.  */
10995   constraint (inst.operands[1].shifted,
10996               _("shifts in CMP/MOV instructions are only supported in unified syntax"));
10997
10998   if (inst.operands[1].isreg)
10999     {
11000       if (Rn < 8 && Rm < 8)
11001         {
11002           /* A move of two lowregs is encoded as ADD Rd, Rs, #0
11003              since a MOV instruction produces unpredictable results.  */
11004           if (inst.instruction == T_OPCODE_MOV_I8)
11005             inst.instruction = T_OPCODE_ADD_I3;
11006           else
11007             inst.instruction = T_OPCODE_CMP_LR;
11008
11009           inst.instruction |= Rn;
11010           inst.instruction |= Rm << 3;
11011         }
11012       else
11013         {
11014           if (inst.instruction == T_OPCODE_MOV_I8)
11015             inst.instruction = T_OPCODE_MOV_HR;
11016           else
11017             inst.instruction = T_OPCODE_CMP_HR;
11018           do_t_cpy ();
11019         }
11020     }
11021   else
11022     {
11023       constraint (Rn > 7,
11024                   _("only lo regs allowed with immediate"));
11025       inst.instruction |= Rn << 8;
11026       inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
11027     }
11028 }
11029
11030 static void
11031 do_t_mov16 (void)
11032 {
11033   unsigned Rd;
11034   bfd_vma imm;
11035   bfd_boolean top;
11036
11037   top = (inst.instruction & 0x00800000) != 0;
11038   if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
11039     {
11040       constraint (top, _(":lower16: not allowed this instruction"));
11041       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
11042     }
11043   else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
11044     {
11045       constraint (!top, _(":upper16: not allowed this instruction"));
11046       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
11047     }
11048
11049   Rd = inst.operands[0].reg;
11050   reject_bad_reg (Rd);
11051
11052   inst.instruction |= Rd << 8;
11053   if (inst.reloc.type == BFD_RELOC_UNUSED)
11054     {
11055       imm = inst.reloc.exp.X_add_number;
11056       inst.instruction |= (imm & 0xf000) << 4;
11057       inst.instruction |= (imm & 0x0800) << 15;
11058       inst.instruction |= (imm & 0x0700) << 4;
11059       inst.instruction |= (imm & 0x00ff);
11060     }
11061 }
11062
11063 static void
11064 do_t_mvn_tst (void)
11065 {
11066   unsigned Rn, Rm;
11067
11068   Rn = inst.operands[0].reg;
11069   Rm = inst.operands[1].reg;
11070
11071   if (inst.instruction == T_MNEM_cmp
11072       || inst.instruction == T_MNEM_cmn)
11073     constraint (Rn == REG_PC, BAD_PC);
11074   else
11075     reject_bad_reg (Rn);
11076   reject_bad_reg (Rm);
11077
11078   if (unified_syntax)
11079     {
11080       int r0off = (inst.instruction == T_MNEM_mvn
11081                    || inst.instruction == T_MNEM_mvns) ? 8 : 16;
11082       bfd_boolean narrow;
11083
11084       if (inst.size_req == 4
11085           || inst.instruction > 0xffff
11086           || inst.operands[1].shifted
11087           || Rn > 7 || Rm > 7)
11088         narrow = FALSE;
11089       else if (inst.instruction == T_MNEM_cmn)
11090         narrow = TRUE;
11091       else if (THUMB_SETS_FLAGS (inst.instruction))
11092         narrow = !in_it_block ();
11093       else
11094         narrow = in_it_block ();
11095
11096       if (!inst.operands[1].isreg)
11097         {
11098           /* For an immediate, we always generate a 32-bit opcode;
11099              section relaxation will shrink it later if possible.  */
11100           if (inst.instruction < 0xffff)
11101             inst.instruction = THUMB_OP32 (inst.instruction);
11102           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11103           inst.instruction |= Rn << r0off;
11104           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11105         }
11106       else
11107         {
11108           /* See if we can do this with a 16-bit instruction.  */
11109           if (narrow)
11110             {
11111               inst.instruction = THUMB_OP16 (inst.instruction);
11112               inst.instruction |= Rn;
11113               inst.instruction |= Rm << 3;
11114             }
11115           else
11116             {
11117               constraint (inst.operands[1].shifted
11118                           && inst.operands[1].immisreg,
11119                           _("shift must be constant"));
11120               if (inst.instruction < 0xffff)
11121                 inst.instruction = THUMB_OP32 (inst.instruction);
11122               inst.instruction |= Rn << r0off;
11123               encode_thumb32_shifted_operand (1);
11124             }
11125         }
11126     }
11127   else
11128     {
11129       constraint (inst.instruction > 0xffff
11130                   || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
11131       constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
11132                   _("unshifted register required"));
11133       constraint (Rn > 7 || Rm > 7,
11134                   BAD_HIREG);
11135
11136       inst.instruction = THUMB_OP16 (inst.instruction);
11137       inst.instruction |= Rn;
11138       inst.instruction |= Rm << 3;
11139     }
11140 }
11141
11142 static void
11143 do_t_mrs (void)
11144 {
11145   unsigned Rd;
11146
11147   if (do_vfp_nsyn_mrs () == SUCCESS)
11148     return;
11149
11150   Rd = inst.operands[0].reg;
11151   reject_bad_reg (Rd);
11152   inst.instruction |= Rd << 8;
11153
11154   if (inst.operands[1].isreg)
11155     {
11156       unsigned br = inst.operands[1].reg;
11157       if (((br & 0x200) == 0) && ((br & 0xf000) != 0xf000))
11158         as_bad (_("bad register for mrs"));
11159
11160       inst.instruction |= br & (0xf << 16);
11161       inst.instruction |= (br & 0x300) >> 4;
11162       inst.instruction |= (br & SPSR_BIT) >> 2;
11163     }
11164   else
11165     {
11166       int flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11167
11168       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
11169         constraint (flags != 0, _("selected processor does not support "
11170                     "requested special purpose register"));
11171       else
11172         /* mrs only accepts APSR/CPSR/SPSR/CPSR_all/SPSR_all (for non-M profile
11173            devices).  */
11174         constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
11175                     _("'APSR', 'CPSR' or 'SPSR' expected"));
11176
11177       inst.instruction |= (flags & SPSR_BIT) >> 2;
11178       inst.instruction |= inst.operands[1].imm & 0xff;
11179       inst.instruction |= 0xf0000;
11180     }
11181 }
11182
11183 static void
11184 do_t_msr (void)
11185 {
11186   int flags;
11187   unsigned Rn;
11188
11189   if (do_vfp_nsyn_msr () == SUCCESS)
11190     return;
11191
11192   constraint (!inst.operands[1].isreg,
11193               _("Thumb encoding does not support an immediate here"));
11194
11195   if (inst.operands[0].isreg)
11196     flags = (int)(inst.operands[0].reg);
11197   else
11198     flags = inst.operands[0].imm;
11199
11200   if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
11201     {
11202       int bits = inst.operands[0].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11203
11204       constraint ((ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11205                    && (bits & ~(PSR_s | PSR_f)) != 0)
11206                   || (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11207                       && bits != PSR_f),
11208                   _("selected processor does not support requested special "
11209                     "purpose register"));
11210     }
11211   else
11212      constraint ((flags & 0xff) != 0, _("selected processor does not support "
11213                  "requested special purpose register"));
11214
11215   Rn = inst.operands[1].reg;
11216   reject_bad_reg (Rn);
11217
11218   inst.instruction |= (flags & SPSR_BIT) >> 2;
11219   inst.instruction |= (flags & 0xf0000) >> 8;
11220   inst.instruction |= (flags & 0x300) >> 4;
11221   inst.instruction |= (flags & 0xff);
11222   inst.instruction |= Rn << 16;
11223 }
11224
11225 static void
11226 do_t_mul (void)
11227 {
11228   bfd_boolean narrow;
11229   unsigned Rd, Rn, Rm;
11230
11231   if (!inst.operands[2].present)
11232     inst.operands[2].reg = inst.operands[0].reg;
11233
11234   Rd = inst.operands[0].reg;
11235   Rn = inst.operands[1].reg;
11236   Rm = inst.operands[2].reg;
11237
11238   if (unified_syntax)
11239     {
11240       if (inst.size_req == 4
11241           || (Rd != Rn
11242               && Rd != Rm)
11243           || Rn > 7
11244           || Rm > 7)
11245         narrow = FALSE;
11246       else if (inst.instruction == T_MNEM_muls)
11247         narrow = !in_it_block ();
11248       else
11249         narrow = in_it_block ();
11250     }
11251   else
11252     {
11253       constraint (inst.instruction == T_MNEM_muls, BAD_THUMB32);
11254       constraint (Rn > 7 || Rm > 7,
11255                   BAD_HIREG);
11256       narrow = TRUE;
11257     }
11258
11259   if (narrow)
11260     {
11261       /* 16-bit MULS/Conditional MUL.  */
11262       inst.instruction = THUMB_OP16 (inst.instruction);
11263       inst.instruction |= Rd;
11264
11265       if (Rd == Rn)
11266         inst.instruction |= Rm << 3;
11267       else if (Rd == Rm)
11268         inst.instruction |= Rn << 3;
11269       else
11270         constraint (1, _("dest must overlap one source register"));
11271     }
11272   else
11273     {
11274       constraint (inst.instruction != T_MNEM_mul,
11275                   _("Thumb-2 MUL must not set flags"));
11276       /* 32-bit MUL.  */
11277       inst.instruction = THUMB_OP32 (inst.instruction);
11278       inst.instruction |= Rd << 8;
11279       inst.instruction |= Rn << 16;
11280       inst.instruction |= Rm << 0;
11281
11282       reject_bad_reg (Rd);
11283       reject_bad_reg (Rn);
11284       reject_bad_reg (Rm);
11285     }
11286 }
11287
11288 static void
11289 do_t_mull (void)
11290 {
11291   unsigned RdLo, RdHi, Rn, Rm;
11292
11293   RdLo = inst.operands[0].reg;
11294   RdHi = inst.operands[1].reg;
11295   Rn = inst.operands[2].reg;
11296   Rm = inst.operands[3].reg;
11297
11298   reject_bad_reg (RdLo);
11299   reject_bad_reg (RdHi);
11300   reject_bad_reg (Rn);
11301   reject_bad_reg (Rm);
11302
11303   inst.instruction |= RdLo << 12;
11304   inst.instruction |= RdHi << 8;
11305   inst.instruction |= Rn << 16;
11306   inst.instruction |= Rm;
11307
11308  if (RdLo == RdHi)
11309     as_tsktsk (_("rdhi and rdlo must be different"));
11310 }
11311
11312 static void
11313 do_t_nop (void)
11314 {
11315   set_it_insn_type (NEUTRAL_IT_INSN);
11316
11317   if (unified_syntax)
11318     {
11319       if (inst.size_req == 4 || inst.operands[0].imm > 15)
11320         {
11321           inst.instruction = THUMB_OP32 (inst.instruction);
11322           inst.instruction |= inst.operands[0].imm;
11323         }
11324       else
11325         {
11326           /* PR9722: Check for Thumb2 availability before
11327              generating a thumb2 nop instruction.  */
11328           if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
11329             {
11330               inst.instruction = THUMB_OP16 (inst.instruction);
11331               inst.instruction |= inst.operands[0].imm << 4;
11332             }
11333           else
11334             inst.instruction = 0x46c0;
11335         }
11336     }
11337   else
11338     {
11339       constraint (inst.operands[0].present,
11340                   _("Thumb does not support NOP with hints"));
11341       inst.instruction = 0x46c0;
11342     }
11343 }
11344
11345 static void
11346 do_t_neg (void)
11347 {
11348   if (unified_syntax)
11349     {
11350       bfd_boolean narrow;
11351
11352       if (THUMB_SETS_FLAGS (inst.instruction))
11353         narrow = !in_it_block ();
11354       else
11355         narrow = in_it_block ();
11356       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11357         narrow = FALSE;
11358       if (inst.size_req == 4)
11359         narrow = FALSE;
11360
11361       if (!narrow)
11362         {
11363           inst.instruction = THUMB_OP32 (inst.instruction);
11364           inst.instruction |= inst.operands[0].reg << 8;
11365           inst.instruction |= inst.operands[1].reg << 16;
11366         }
11367       else
11368         {
11369           inst.instruction = THUMB_OP16 (inst.instruction);
11370           inst.instruction |= inst.operands[0].reg;
11371           inst.instruction |= inst.operands[1].reg << 3;
11372         }
11373     }
11374   else
11375     {
11376       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
11377                   BAD_HIREG);
11378       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11379
11380       inst.instruction = THUMB_OP16 (inst.instruction);
11381       inst.instruction |= inst.operands[0].reg;
11382       inst.instruction |= inst.operands[1].reg << 3;
11383     }
11384 }
11385
11386 static void
11387 do_t_orn (void)
11388 {
11389   unsigned Rd, Rn;
11390
11391   Rd = inst.operands[0].reg;
11392   Rn = inst.operands[1].present ? inst.operands[1].reg : Rd;
11393
11394   reject_bad_reg (Rd);
11395   /* Rn == REG_SP is unpredictable; Rn == REG_PC is MVN.  */
11396   reject_bad_reg (Rn);
11397
11398   inst.instruction |= Rd << 8;
11399   inst.instruction |= Rn << 16;
11400
11401   if (!inst.operands[2].isreg)
11402     {
11403       inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11404       inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11405     }
11406   else
11407     {
11408       unsigned Rm;
11409
11410       Rm = inst.operands[2].reg;
11411       reject_bad_reg (Rm);
11412
11413       constraint (inst.operands[2].shifted
11414                   && inst.operands[2].immisreg,
11415                   _("shift must be constant"));
11416       encode_thumb32_shifted_operand (2);
11417     }
11418 }
11419
11420 static void
11421 do_t_pkhbt (void)
11422 {
11423   unsigned Rd, Rn, Rm;
11424
11425   Rd = inst.operands[0].reg;
11426   Rn = inst.operands[1].reg;
11427   Rm = inst.operands[2].reg;
11428
11429   reject_bad_reg (Rd);
11430   reject_bad_reg (Rn);
11431   reject_bad_reg (Rm);
11432
11433   inst.instruction |= Rd << 8;
11434   inst.instruction |= Rn << 16;
11435   inst.instruction |= Rm;
11436   if (inst.operands[3].present)
11437     {
11438       unsigned int val = inst.reloc.exp.X_add_number;
11439       constraint (inst.reloc.exp.X_op != O_constant,
11440                   _("expression too complex"));
11441       inst.instruction |= (val & 0x1c) << 10;
11442       inst.instruction |= (val & 0x03) << 6;
11443     }
11444 }
11445
11446 static void
11447 do_t_pkhtb (void)
11448 {
11449   if (!inst.operands[3].present)
11450     {
11451       unsigned Rtmp;
11452
11453       inst.instruction &= ~0x00000020;
11454
11455       /* PR 10168.  Swap the Rm and Rn registers.  */
11456       Rtmp = inst.operands[1].reg;
11457       inst.operands[1].reg = inst.operands[2].reg;
11458       inst.operands[2].reg = Rtmp;
11459     }
11460   do_t_pkhbt ();
11461 }
11462
11463 static void
11464 do_t_pld (void)
11465 {
11466   if (inst.operands[0].immisreg)
11467     reject_bad_reg (inst.operands[0].imm);
11468
11469   encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
11470 }
11471
11472 static void
11473 do_t_push_pop (void)
11474 {
11475   unsigned mask;
11476
11477   constraint (inst.operands[0].writeback,
11478               _("push/pop do not support {reglist}^"));
11479   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
11480               _("expression too complex"));
11481
11482   mask = inst.operands[0].imm;
11483   if ((mask & ~0xff) == 0)
11484     inst.instruction = THUMB_OP16 (inst.instruction) | mask;
11485   else if ((inst.instruction == T_MNEM_push
11486             && (mask & ~0xff) == 1 << REG_LR)
11487            || (inst.instruction == T_MNEM_pop
11488                && (mask & ~0xff) == 1 << REG_PC))
11489     {
11490       inst.instruction = THUMB_OP16 (inst.instruction);
11491       inst.instruction |= THUMB_PP_PC_LR;
11492       inst.instruction |= mask & 0xff;
11493     }
11494   else if (unified_syntax)
11495     {
11496       inst.instruction = THUMB_OP32 (inst.instruction);
11497       encode_thumb2_ldmstm (13, mask, TRUE);
11498     }
11499   else
11500     {
11501       inst.error = _("invalid register list to push/pop instruction");
11502       return;
11503     }
11504 }
11505
11506 static void
11507 do_t_rbit (void)
11508 {
11509   unsigned Rd, Rm;
11510
11511   Rd = inst.operands[0].reg;
11512   Rm = inst.operands[1].reg;
11513
11514   reject_bad_reg (Rd);
11515   reject_bad_reg (Rm);
11516
11517   inst.instruction |= Rd << 8;
11518   inst.instruction |= Rm << 16;
11519   inst.instruction |= Rm;
11520 }
11521
11522 static void
11523 do_t_rev (void)
11524 {
11525   unsigned Rd, Rm;
11526
11527   Rd = inst.operands[0].reg;
11528   Rm = inst.operands[1].reg;
11529
11530   reject_bad_reg (Rd);
11531   reject_bad_reg (Rm);
11532
11533   if (Rd <= 7 && Rm <= 7
11534       && inst.size_req != 4)
11535     {
11536       inst.instruction = THUMB_OP16 (inst.instruction);
11537       inst.instruction |= Rd;
11538       inst.instruction |= Rm << 3;
11539     }
11540   else if (unified_syntax)
11541     {
11542       inst.instruction = THUMB_OP32 (inst.instruction);
11543       inst.instruction |= Rd << 8;
11544       inst.instruction |= Rm << 16;
11545       inst.instruction |= Rm;
11546     }
11547   else
11548     inst.error = BAD_HIREG;
11549 }
11550
11551 static void
11552 do_t_rrx (void)
11553 {
11554   unsigned Rd, Rm;
11555
11556   Rd = inst.operands[0].reg;
11557   Rm = inst.operands[1].reg;
11558
11559   reject_bad_reg (Rd);
11560   reject_bad_reg (Rm);
11561
11562   inst.instruction |= Rd << 8;
11563   inst.instruction |= Rm;
11564 }
11565
11566 static void
11567 do_t_rsb (void)
11568 {
11569   unsigned Rd, Rs;
11570
11571   Rd = inst.operands[0].reg;
11572   Rs = (inst.operands[1].present
11573         ? inst.operands[1].reg    /* Rd, Rs, foo */
11574         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
11575
11576   reject_bad_reg (Rd);
11577   reject_bad_reg (Rs);
11578   if (inst.operands[2].isreg)
11579     reject_bad_reg (inst.operands[2].reg);
11580
11581   inst.instruction |= Rd << 8;
11582   inst.instruction |= Rs << 16;
11583   if (!inst.operands[2].isreg)
11584     {
11585       bfd_boolean narrow;
11586
11587       if ((inst.instruction & 0x00100000) != 0)
11588         narrow = !in_it_block ();
11589       else
11590         narrow = in_it_block ();
11591
11592       if (Rd > 7 || Rs > 7)
11593         narrow = FALSE;
11594
11595       if (inst.size_req == 4 || !unified_syntax)
11596         narrow = FALSE;
11597
11598       if (inst.reloc.exp.X_op != O_constant
11599           || inst.reloc.exp.X_add_number != 0)
11600         narrow = FALSE;
11601
11602       /* Turn rsb #0 into 16-bit neg.  We should probably do this via
11603          relaxation, but it doesn't seem worth the hassle.  */
11604       if (narrow)
11605         {
11606           inst.reloc.type = BFD_RELOC_UNUSED;
11607           inst.instruction = THUMB_OP16 (T_MNEM_negs);
11608           inst.instruction |= Rs << 3;
11609           inst.instruction |= Rd;
11610         }
11611       else
11612         {
11613           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11614           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11615         }
11616     }
11617   else
11618     encode_thumb32_shifted_operand (2);
11619 }
11620
11621 static void
11622 do_t_setend (void)
11623 {
11624   set_it_insn_type (OUTSIDE_IT_INSN);
11625   if (inst.operands[0].imm)
11626     inst.instruction |= 0x8;
11627 }
11628
11629 static void
11630 do_t_shift (void)
11631 {
11632   if (!inst.operands[1].present)
11633     inst.operands[1].reg = inst.operands[0].reg;
11634
11635   if (unified_syntax)
11636     {
11637       bfd_boolean narrow;
11638       int shift_kind;
11639
11640       switch (inst.instruction)
11641         {
11642         case T_MNEM_asr:
11643         case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
11644         case T_MNEM_lsl:
11645         case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
11646         case T_MNEM_lsr:
11647         case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
11648         case T_MNEM_ror:
11649         case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
11650         default: abort ();
11651         }
11652
11653       if (THUMB_SETS_FLAGS (inst.instruction))
11654         narrow = !in_it_block ();
11655       else
11656         narrow = in_it_block ();
11657       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11658         narrow = FALSE;
11659       if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
11660         narrow = FALSE;
11661       if (inst.operands[2].isreg
11662           && (inst.operands[1].reg != inst.operands[0].reg
11663               || inst.operands[2].reg > 7))
11664         narrow = FALSE;
11665       if (inst.size_req == 4)
11666         narrow = FALSE;
11667
11668       reject_bad_reg (inst.operands[0].reg);
11669       reject_bad_reg (inst.operands[1].reg);
11670
11671       if (!narrow)
11672         {
11673           if (inst.operands[2].isreg)
11674             {
11675               reject_bad_reg (inst.operands[2].reg);
11676               inst.instruction = THUMB_OP32 (inst.instruction);
11677               inst.instruction |= inst.operands[0].reg << 8;
11678               inst.instruction |= inst.operands[1].reg << 16;
11679               inst.instruction |= inst.operands[2].reg;
11680
11681               /* PR 12854: Error on extraneous shifts.  */
11682               constraint (inst.operands[2].shifted,
11683                           _("extraneous shift as part of operand to shift insn"));
11684             }
11685           else
11686             {
11687               inst.operands[1].shifted = 1;
11688               inst.operands[1].shift_kind = shift_kind;
11689               inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
11690                                              ? T_MNEM_movs : T_MNEM_mov);
11691               inst.instruction |= inst.operands[0].reg << 8;
11692               encode_thumb32_shifted_operand (1);
11693               /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup.  */
11694               inst.reloc.type = BFD_RELOC_UNUSED;
11695             }
11696         }
11697       else
11698         {
11699           if (inst.operands[2].isreg)
11700             {
11701               switch (shift_kind)
11702                 {
11703                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
11704                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
11705                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
11706                 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
11707                 default: abort ();
11708                 }
11709
11710               inst.instruction |= inst.operands[0].reg;
11711               inst.instruction |= inst.operands[2].reg << 3;
11712
11713               /* PR 12854: Error on extraneous shifts.  */
11714               constraint (inst.operands[2].shifted,
11715                           _("extraneous shift as part of operand to shift insn"));
11716             }
11717           else
11718             {
11719               switch (shift_kind)
11720                 {
11721                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11722                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11723                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
11724                 default: abort ();
11725                 }
11726               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11727               inst.instruction |= inst.operands[0].reg;
11728               inst.instruction |= inst.operands[1].reg << 3;
11729             }
11730         }
11731     }
11732   else
11733     {
11734       constraint (inst.operands[0].reg > 7
11735                   || inst.operands[1].reg > 7, BAD_HIREG);
11736       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11737
11738       if (inst.operands[2].isreg)  /* Rd, {Rs,} Rn */
11739         {
11740           constraint (inst.operands[2].reg > 7, BAD_HIREG);
11741           constraint (inst.operands[0].reg != inst.operands[1].reg,
11742                       _("source1 and dest must be same register"));
11743
11744           switch (inst.instruction)
11745             {
11746             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
11747             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
11748             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
11749             case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
11750             default: abort ();
11751             }
11752
11753           inst.instruction |= inst.operands[0].reg;
11754           inst.instruction |= inst.operands[2].reg << 3;
11755
11756           /* PR 12854: Error on extraneous shifts.  */
11757           constraint (inst.operands[2].shifted,
11758                       _("extraneous shift as part of operand to shift insn"));
11759         }
11760       else
11761         {
11762           switch (inst.instruction)
11763             {
11764             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
11765             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
11766             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
11767             case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
11768             default: abort ();
11769             }
11770           inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11771           inst.instruction |= inst.operands[0].reg;
11772           inst.instruction |= inst.operands[1].reg << 3;
11773         }
11774     }
11775 }
11776
11777 static void
11778 do_t_simd (void)
11779 {
11780   unsigned Rd, Rn, Rm;
11781
11782   Rd = inst.operands[0].reg;
11783   Rn = inst.operands[1].reg;
11784   Rm = inst.operands[2].reg;
11785
11786   reject_bad_reg (Rd);
11787   reject_bad_reg (Rn);
11788   reject_bad_reg (Rm);
11789
11790   inst.instruction |= Rd << 8;
11791   inst.instruction |= Rn << 16;
11792   inst.instruction |= Rm;
11793 }
11794
11795 static void
11796 do_t_simd2 (void)
11797 {
11798   unsigned Rd, Rn, Rm;
11799
11800   Rd = inst.operands[0].reg;
11801   Rm = inst.operands[1].reg;
11802   Rn = inst.operands[2].reg;
11803
11804   reject_bad_reg (Rd);
11805   reject_bad_reg (Rn);
11806   reject_bad_reg (Rm);
11807
11808   inst.instruction |= Rd << 8;
11809   inst.instruction |= Rn << 16;
11810   inst.instruction |= Rm;
11811 }
11812
11813 static void
11814 do_t_smc (void)
11815 {
11816   unsigned int value = inst.reloc.exp.X_add_number;
11817   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a),
11818               _("SMC is not permitted on this architecture"));
11819   constraint (inst.reloc.exp.X_op != O_constant,
11820               _("expression too complex"));
11821   inst.reloc.type = BFD_RELOC_UNUSED;
11822   inst.instruction |= (value & 0xf000) >> 12;
11823   inst.instruction |= (value & 0x0ff0);
11824   inst.instruction |= (value & 0x000f) << 16;
11825 }
11826
11827 static void
11828 do_t_hvc (void)
11829 {
11830   unsigned int value = inst.reloc.exp.X_add_number;
11831
11832   inst.reloc.type = BFD_RELOC_UNUSED;
11833   inst.instruction |= (value & 0x0fff);
11834   inst.instruction |= (value & 0xf000) << 4;
11835 }
11836
11837 static void
11838 do_t_ssat_usat (int bias)
11839 {
11840   unsigned Rd, Rn;
11841
11842   Rd = inst.operands[0].reg;
11843   Rn = inst.operands[2].reg;
11844
11845   reject_bad_reg (Rd);
11846   reject_bad_reg (Rn);
11847
11848   inst.instruction |= Rd << 8;
11849   inst.instruction |= inst.operands[1].imm - bias;
11850   inst.instruction |= Rn << 16;
11851
11852   if (inst.operands[3].present)
11853     {
11854       offsetT shift_amount = inst.reloc.exp.X_add_number;
11855
11856       inst.reloc.type = BFD_RELOC_UNUSED;
11857
11858       constraint (inst.reloc.exp.X_op != O_constant,
11859                   _("expression too complex"));
11860
11861       if (shift_amount != 0)
11862         {
11863           constraint (shift_amount > 31,
11864                       _("shift expression is too large"));
11865
11866           if (inst.operands[3].shift_kind == SHIFT_ASR)
11867             inst.instruction |= 0x00200000;  /* sh bit.  */
11868
11869           inst.instruction |= (shift_amount & 0x1c) << 10;
11870           inst.instruction |= (shift_amount & 0x03) << 6;
11871         }
11872     }
11873 }
11874
11875 static void
11876 do_t_ssat (void)
11877 {
11878   do_t_ssat_usat (1);
11879 }
11880
11881 static void
11882 do_t_ssat16 (void)
11883 {
11884   unsigned Rd, Rn;
11885
11886   Rd = inst.operands[0].reg;
11887   Rn = inst.operands[2].reg;
11888
11889   reject_bad_reg (Rd);
11890   reject_bad_reg (Rn);
11891
11892   inst.instruction |= Rd << 8;
11893   inst.instruction |= inst.operands[1].imm - 1;
11894   inst.instruction |= Rn << 16;
11895 }
11896
11897 static void
11898 do_t_strex (void)
11899 {
11900   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
11901               || inst.operands[2].postind || inst.operands[2].writeback
11902               || inst.operands[2].immisreg || inst.operands[2].shifted
11903               || inst.operands[2].negative,
11904               BAD_ADDR_MODE);
11905
11906   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
11907
11908   inst.instruction |= inst.operands[0].reg << 8;
11909   inst.instruction |= inst.operands[1].reg << 12;
11910   inst.instruction |= inst.operands[2].reg << 16;
11911   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
11912 }
11913
11914 static void
11915 do_t_strexd (void)
11916 {
11917   if (!inst.operands[2].present)
11918     inst.operands[2].reg = inst.operands[1].reg + 1;
11919
11920   constraint (inst.operands[0].reg == inst.operands[1].reg
11921               || inst.operands[0].reg == inst.operands[2].reg
11922               || inst.operands[0].reg == inst.operands[3].reg,
11923               BAD_OVERLAP);
11924
11925   inst.instruction |= inst.operands[0].reg;
11926   inst.instruction |= inst.operands[1].reg << 12;
11927   inst.instruction |= inst.operands[2].reg << 8;
11928   inst.instruction |= inst.operands[3].reg << 16;
11929 }
11930
11931 static void
11932 do_t_sxtah (void)
11933 {
11934   unsigned Rd, Rn, Rm;
11935
11936   Rd = inst.operands[0].reg;
11937   Rn = inst.operands[1].reg;
11938   Rm = inst.operands[2].reg;
11939
11940   reject_bad_reg (Rd);
11941   reject_bad_reg (Rn);
11942   reject_bad_reg (Rm);
11943
11944   inst.instruction |= Rd << 8;
11945   inst.instruction |= Rn << 16;
11946   inst.instruction |= Rm;
11947   inst.instruction |= inst.operands[3].imm << 4;
11948 }
11949
11950 static void
11951 do_t_sxth (void)
11952 {
11953   unsigned Rd, Rm;
11954
11955   Rd = inst.operands[0].reg;
11956   Rm = inst.operands[1].reg;
11957
11958   reject_bad_reg (Rd);
11959   reject_bad_reg (Rm);
11960
11961   if (inst.instruction <= 0xffff
11962       && inst.size_req != 4
11963       && Rd <= 7 && Rm <= 7
11964       && (!inst.operands[2].present || inst.operands[2].imm == 0))
11965     {
11966       inst.instruction = THUMB_OP16 (inst.instruction);
11967       inst.instruction |= Rd;
11968       inst.instruction |= Rm << 3;
11969     }
11970   else if (unified_syntax)
11971     {
11972       if (inst.instruction <= 0xffff)
11973         inst.instruction = THUMB_OP32 (inst.instruction);
11974       inst.instruction |= Rd << 8;
11975       inst.instruction |= Rm;
11976       inst.instruction |= inst.operands[2].imm << 4;
11977     }
11978   else
11979     {
11980       constraint (inst.operands[2].present && inst.operands[2].imm != 0,
11981                   _("Thumb encoding does not support rotation"));
11982       constraint (1, BAD_HIREG);
11983     }
11984 }
11985
11986 static void
11987 do_t_swi (void)
11988 {
11989   /* We have to do the following check manually as ARM_EXT_OS only applies
11990      to ARM_EXT_V6M.  */
11991   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6m))
11992     {
11993       if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_os)
11994           /* This only applies to the v6m howver, not later architectures.  */
11995           && ! ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7))
11996         as_bad (_("SVC is not permitted on this architecture"));
11997       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, arm_ext_os);
11998     }
11999
12000   inst.reloc.type = BFD_RELOC_ARM_SWI;
12001 }
12002
12003 static void
12004 do_t_tb (void)
12005 {
12006   unsigned Rn, Rm;
12007   int half;
12008
12009   half = (inst.instruction & 0x10) != 0;
12010   set_it_insn_type_last ();
12011   constraint (inst.operands[0].immisreg,
12012               _("instruction requires register index"));
12013
12014   Rn = inst.operands[0].reg;
12015   Rm = inst.operands[0].imm;
12016
12017   constraint (Rn == REG_SP, BAD_SP);
12018   reject_bad_reg (Rm);
12019
12020   constraint (!half && inst.operands[0].shifted,
12021               _("instruction does not allow shifted index"));
12022   inst.instruction |= (Rn << 16) | Rm;
12023 }
12024
12025 static void
12026 do_t_usat (void)
12027 {
12028   do_t_ssat_usat (0);
12029 }
12030
12031 static void
12032 do_t_usat16 (void)
12033 {
12034   unsigned Rd, Rn;
12035
12036   Rd = inst.operands[0].reg;
12037   Rn = inst.operands[2].reg;
12038
12039   reject_bad_reg (Rd);
12040   reject_bad_reg (Rn);
12041
12042   inst.instruction |= Rd << 8;
12043   inst.instruction |= inst.operands[1].imm;
12044   inst.instruction |= Rn << 16;
12045 }
12046
12047 /* Neon instruction encoder helpers.  */
12048
12049 /* Encodings for the different types for various Neon opcodes.  */
12050
12051 /* An "invalid" code for the following tables.  */
12052 #define N_INV -1u
12053
12054 struct neon_tab_entry
12055 {
12056   unsigned integer;
12057   unsigned float_or_poly;
12058   unsigned scalar_or_imm;
12059 };
12060
12061 /* Map overloaded Neon opcodes to their respective encodings.  */
12062 #define NEON_ENC_TAB                                    \
12063   X(vabd,       0x0000700, 0x1200d00, N_INV),           \
12064   X(vmax,       0x0000600, 0x0000f00, N_INV),           \
12065   X(vmin,       0x0000610, 0x0200f00, N_INV),           \
12066   X(vpadd,      0x0000b10, 0x1000d00, N_INV),           \
12067   X(vpmax,      0x0000a00, 0x1000f00, N_INV),           \
12068   X(vpmin,      0x0000a10, 0x1200f00, N_INV),           \
12069   X(vadd,       0x0000800, 0x0000d00, N_INV),           \
12070   X(vsub,       0x1000800, 0x0200d00, N_INV),           \
12071   X(vceq,       0x1000810, 0x0000e00, 0x1b10100),       \
12072   X(vcge,       0x0000310, 0x1000e00, 0x1b10080),       \
12073   X(vcgt,       0x0000300, 0x1200e00, 0x1b10000),       \
12074   /* Register variants of the following two instructions are encoded as
12075      vcge / vcgt with the operands reversed.  */        \
12076   X(vclt,       0x0000300, 0x1200e00, 0x1b10200),       \
12077   X(vcle,       0x0000310, 0x1000e00, 0x1b10180),       \
12078   X(vfma,       N_INV, 0x0000c10, N_INV),               \
12079   X(vfms,       N_INV, 0x0200c10, N_INV),               \
12080   X(vmla,       0x0000900, 0x0000d10, 0x0800040),       \
12081   X(vmls,       0x1000900, 0x0200d10, 0x0800440),       \
12082   X(vmul,       0x0000910, 0x1000d10, 0x0800840),       \
12083   X(vmull,      0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float.  */ \
12084   X(vmlal,      0x0800800, N_INV,     0x0800240),       \
12085   X(vmlsl,      0x0800a00, N_INV,     0x0800640),       \
12086   X(vqdmlal,    0x0800900, N_INV,     0x0800340),       \
12087   X(vqdmlsl,    0x0800b00, N_INV,     0x0800740),       \
12088   X(vqdmull,    0x0800d00, N_INV,     0x0800b40),       \
12089   X(vqdmulh,    0x0000b00, N_INV,     0x0800c40),       \
12090   X(vqrdmulh,   0x1000b00, N_INV,     0x0800d40),       \
12091   X(vshl,       0x0000400, N_INV,     0x0800510),       \
12092   X(vqshl,      0x0000410, N_INV,     0x0800710),       \
12093   X(vand,       0x0000110, N_INV,     0x0800030),       \
12094   X(vbic,       0x0100110, N_INV,     0x0800030),       \
12095   X(veor,       0x1000110, N_INV,     N_INV),           \
12096   X(vorn,       0x0300110, N_INV,     0x0800010),       \
12097   X(vorr,       0x0200110, N_INV,     0x0800010),       \
12098   X(vmvn,       0x1b00580, N_INV,     0x0800030),       \
12099   X(vshll,      0x1b20300, N_INV,     0x0800a10), /* max shift, immediate.  */ \
12100   X(vcvt,       0x1b30600, N_INV,     0x0800e10), /* integer, fixed-point.  */ \
12101   X(vdup,       0xe800b10, N_INV,     0x1b00c00), /* arm, scalar.  */ \
12102   X(vld1,       0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup.  */ \
12103   X(vst1,       0x0000000, 0x0800000, N_INV),           \
12104   X(vld2,       0x0200100, 0x0a00100, 0x0a00d00),       \
12105   X(vst2,       0x0000100, 0x0800100, N_INV),           \
12106   X(vld3,       0x0200200, 0x0a00200, 0x0a00e00),       \
12107   X(vst3,       0x0000200, 0x0800200, N_INV),           \
12108   X(vld4,       0x0200300, 0x0a00300, 0x0a00f00),       \
12109   X(vst4,       0x0000300, 0x0800300, N_INV),           \
12110   X(vmovn,      0x1b20200, N_INV,     N_INV),           \
12111   X(vtrn,       0x1b20080, N_INV,     N_INV),           \
12112   X(vqmovn,     0x1b20200, N_INV,     N_INV),           \
12113   X(vqmovun,    0x1b20240, N_INV,     N_INV),           \
12114   X(vnmul,      0xe200a40, 0xe200b40, N_INV),           \
12115   X(vnmla,      0xe100a40, 0xe100b40, N_INV),           \
12116   X(vnmls,      0xe100a00, 0xe100b00, N_INV),           \
12117   X(vfnma,      0xe900a40, 0xe900b40, N_INV),           \
12118   X(vfnms,      0xe900a00, 0xe900b00, N_INV),           \
12119   X(vcmp,       0xeb40a40, 0xeb40b40, N_INV),           \
12120   X(vcmpz,      0xeb50a40, 0xeb50b40, N_INV),           \
12121   X(vcmpe,      0xeb40ac0, 0xeb40bc0, N_INV),           \
12122   X(vcmpez,     0xeb50ac0, 0xeb50bc0, N_INV)
12123
12124 enum neon_opc
12125 {
12126 #define X(OPC,I,F,S) N_MNEM_##OPC
12127 NEON_ENC_TAB
12128 #undef X
12129 };
12130
12131 static const struct neon_tab_entry neon_enc_tab[] =
12132 {
12133 #define X(OPC,I,F,S) { (I), (F), (S) }
12134 NEON_ENC_TAB
12135 #undef X
12136 };
12137
12138 /* Do not use these macros; instead, use NEON_ENCODE defined below.  */
12139 #define NEON_ENC_INTEGER_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12140 #define NEON_ENC_ARMREG_(X)  (neon_enc_tab[(X) & 0x0fffffff].integer)
12141 #define NEON_ENC_POLY_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12142 #define NEON_ENC_FLOAT_(X)   (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12143 #define NEON_ENC_SCALAR_(X)  (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12144 #define NEON_ENC_IMMED_(X)   (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12145 #define NEON_ENC_INTERLV_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12146 #define NEON_ENC_LANE_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12147 #define NEON_ENC_DUP_(X)     (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12148 #define NEON_ENC_SINGLE_(X) \
12149   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
12150 #define NEON_ENC_DOUBLE_(X) \
12151   ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
12152
12153 #define NEON_ENCODE(type, inst)                                 \
12154   do                                                            \
12155     {                                                           \
12156       inst.instruction = NEON_ENC_##type##_ (inst.instruction); \
12157       inst.is_neon = 1;                                         \
12158     }                                                           \
12159   while (0)
12160
12161 #define check_neon_suffixes                                             \
12162   do                                                                    \
12163     {                                                                   \
12164       if (!inst.error && inst.vectype.elems > 0 && !inst.is_neon)       \
12165         {                                                               \
12166           as_bad (_("invalid neon suffix for non neon instruction"));   \
12167           return;                                                       \
12168         }                                                               \
12169     }                                                                   \
12170   while (0)
12171
12172 /* Define shapes for instruction operands. The following mnemonic characters
12173    are used in this table:
12174
12175      F - VFP S<n> register
12176      D - Neon D<n> register
12177      Q - Neon Q<n> register
12178      I - Immediate
12179      S - Scalar
12180      R - ARM register
12181      L - D<n> register list
12182
12183    This table is used to generate various data:
12184      - enumerations of the form NS_DDR to be used as arguments to
12185        neon_select_shape.
12186      - a table classifying shapes into single, double, quad, mixed.
12187      - a table used to drive neon_select_shape.  */
12188
12189 #define NEON_SHAPE_DEF                  \
12190   X(3, (D, D, D), DOUBLE),              \
12191   X(3, (Q, Q, Q), QUAD),                \
12192   X(3, (D, D, I), DOUBLE),              \
12193   X(3, (Q, Q, I), QUAD),                \
12194   X(3, (D, D, S), DOUBLE),              \
12195   X(3, (Q, Q, S), QUAD),                \
12196   X(2, (D, D), DOUBLE),                 \
12197   X(2, (Q, Q), QUAD),                   \
12198   X(2, (D, S), DOUBLE),                 \
12199   X(2, (Q, S), QUAD),                   \
12200   X(2, (D, R), DOUBLE),                 \
12201   X(2, (Q, R), QUAD),                   \
12202   X(2, (D, I), DOUBLE),                 \
12203   X(2, (Q, I), QUAD),                   \
12204   X(3, (D, L, D), DOUBLE),              \
12205   X(2, (D, Q), MIXED),                  \
12206   X(2, (Q, D), MIXED),                  \
12207   X(3, (D, Q, I), MIXED),               \
12208   X(3, (Q, D, I), MIXED),               \
12209   X(3, (Q, D, D), MIXED),               \
12210   X(3, (D, Q, Q), MIXED),               \
12211   X(3, (Q, Q, D), MIXED),               \
12212   X(3, (Q, D, S), MIXED),               \
12213   X(3, (D, Q, S), MIXED),               \
12214   X(4, (D, D, D, I), DOUBLE),           \
12215   X(4, (Q, Q, Q, I), QUAD),             \
12216   X(2, (F, F), SINGLE),                 \
12217   X(3, (F, F, F), SINGLE),              \
12218   X(2, (F, I), SINGLE),                 \
12219   X(2, (F, D), MIXED),                  \
12220   X(2, (D, F), MIXED),                  \
12221   X(3, (F, F, I), MIXED),               \
12222   X(4, (R, R, F, F), SINGLE),           \
12223   X(4, (F, F, R, R), SINGLE),           \
12224   X(3, (D, R, R), DOUBLE),              \
12225   X(3, (R, R, D), DOUBLE),              \
12226   X(2, (S, R), SINGLE),                 \
12227   X(2, (R, S), SINGLE),                 \
12228   X(2, (F, R), SINGLE),                 \
12229   X(2, (R, F), SINGLE)
12230
12231 #define S2(A,B)         NS_##A##B
12232 #define S3(A,B,C)       NS_##A##B##C
12233 #define S4(A,B,C,D)     NS_##A##B##C##D
12234
12235 #define X(N, L, C) S##N L
12236
12237 enum neon_shape
12238 {
12239   NEON_SHAPE_DEF,
12240   NS_NULL
12241 };
12242
12243 #undef X
12244 #undef S2
12245 #undef S3
12246 #undef S4
12247
12248 enum neon_shape_class
12249 {
12250   SC_SINGLE,
12251   SC_DOUBLE,
12252   SC_QUAD,
12253   SC_MIXED
12254 };
12255
12256 #define X(N, L, C) SC_##C
12257
12258 static enum neon_shape_class neon_shape_class[] =
12259 {
12260   NEON_SHAPE_DEF
12261 };
12262
12263 #undef X
12264
12265 enum neon_shape_el
12266 {
12267   SE_F,
12268   SE_D,
12269   SE_Q,
12270   SE_I,
12271   SE_S,
12272   SE_R,
12273   SE_L
12274 };
12275
12276 /* Register widths of above.  */
12277 static unsigned neon_shape_el_size[] =
12278 {
12279   32,
12280   64,
12281   128,
12282   0,
12283   32,
12284   32,
12285   0
12286 };
12287
12288 struct neon_shape_info
12289 {
12290   unsigned els;
12291   enum neon_shape_el el[NEON_MAX_TYPE_ELS];
12292 };
12293
12294 #define S2(A,B)         { SE_##A, SE_##B }
12295 #define S3(A,B,C)       { SE_##A, SE_##B, SE_##C }
12296 #define S4(A,B,C,D)     { SE_##A, SE_##B, SE_##C, SE_##D }
12297
12298 #define X(N, L, C) { N, S##N L }
12299
12300 static struct neon_shape_info neon_shape_tab[] =
12301 {
12302   NEON_SHAPE_DEF
12303 };
12304
12305 #undef X
12306 #undef S2
12307 #undef S3
12308 #undef S4
12309
12310 /* Bit masks used in type checking given instructions.
12311   'N_EQK' means the type must be the same as (or based on in some way) the key
12312    type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
12313    set, various other bits can be set as well in order to modify the meaning of
12314    the type constraint.  */
12315
12316 enum neon_type_mask
12317 {
12318   N_S8   = 0x0000001,
12319   N_S16  = 0x0000002,
12320   N_S32  = 0x0000004,
12321   N_S64  = 0x0000008,
12322   N_U8   = 0x0000010,
12323   N_U16  = 0x0000020,
12324   N_U32  = 0x0000040,
12325   N_U64  = 0x0000080,
12326   N_I8   = 0x0000100,
12327   N_I16  = 0x0000200,
12328   N_I32  = 0x0000400,
12329   N_I64  = 0x0000800,
12330   N_8    = 0x0001000,
12331   N_16   = 0x0002000,
12332   N_32   = 0x0004000,
12333   N_64   = 0x0008000,
12334   N_P8   = 0x0010000,
12335   N_P16  = 0x0020000,
12336   N_F16  = 0x0040000,
12337   N_F32  = 0x0080000,
12338   N_F64  = 0x0100000,
12339   N_KEY  = 0x1000000, /* Key element (main type specifier).  */
12340   N_EQK  = 0x2000000, /* Given operand has the same type & size as the key.  */
12341   N_VFP  = 0x4000000, /* VFP mode: operand size must match register width.  */
12342   N_DBL  = 0x0000001, /* If N_EQK, this operand is twice the size.  */
12343   N_HLF  = 0x0000002, /* If N_EQK, this operand is half the size.  */
12344   N_SGN  = 0x0000004, /* If N_EQK, this operand is forced to be signed.  */
12345   N_UNS  = 0x0000008, /* If N_EQK, this operand is forced to be unsigned.  */
12346   N_INT  = 0x0000010, /* If N_EQK, this operand is forced to be integer.  */
12347   N_FLT  = 0x0000020, /* If N_EQK, this operand is forced to be float.  */
12348   N_SIZ  = 0x0000040, /* If N_EQK, this operand is forced to be size-only.  */
12349   N_UTYP = 0,
12350   N_MAX_NONSPECIAL = N_F64
12351 };
12352
12353 #define N_ALLMODS  (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
12354
12355 #define N_SU_ALL   (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
12356 #define N_SU_32    (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
12357 #define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
12358 #define N_SUF_32   (N_SU_32 | N_F32)
12359 #define N_I_ALL    (N_I8 | N_I16 | N_I32 | N_I64)
12360 #define N_IF_32    (N_I8 | N_I16 | N_I32 | N_F32)
12361
12362 /* Pass this as the first type argument to neon_check_type to ignore types
12363    altogether.  */
12364 #define N_IGNORE_TYPE (N_KEY | N_EQK)
12365
12366 /* Select a "shape" for the current instruction (describing register types or
12367    sizes) from a list of alternatives. Return NS_NULL if the current instruction
12368    doesn't fit. For non-polymorphic shapes, checking is usually done as a
12369    function of operand parsing, so this function doesn't need to be called.
12370    Shapes should be listed in order of decreasing length.  */
12371
12372 static enum neon_shape
12373 neon_select_shape (enum neon_shape shape, ...)
12374 {
12375   va_list ap;
12376   enum neon_shape first_shape = shape;
12377
12378   /* Fix missing optional operands. FIXME: we don't know at this point how
12379      many arguments we should have, so this makes the assumption that we have
12380      > 1. This is true of all current Neon opcodes, I think, but may not be
12381      true in the future.  */
12382   if (!inst.operands[1].present)
12383     inst.operands[1] = inst.operands[0];
12384
12385   va_start (ap, shape);
12386
12387   for (; shape != NS_NULL; shape = (enum neon_shape) va_arg (ap, int))
12388     {
12389       unsigned j;
12390       int matches = 1;
12391
12392       for (j = 0; j < neon_shape_tab[shape].els; j++)
12393         {
12394           if (!inst.operands[j].present)
12395             {
12396               matches = 0;
12397               break;
12398             }
12399
12400           switch (neon_shape_tab[shape].el[j])
12401             {
12402             case SE_F:
12403               if (!(inst.operands[j].isreg
12404                     && inst.operands[j].isvec
12405                     && inst.operands[j].issingle
12406                     && !inst.operands[j].isquad))
12407                 matches = 0;
12408               break;
12409
12410             case SE_D:
12411               if (!(inst.operands[j].isreg
12412                     && inst.operands[j].isvec
12413                     && !inst.operands[j].isquad
12414                     && !inst.operands[j].issingle))
12415                 matches = 0;
12416               break;
12417
12418             case SE_R:
12419               if (!(inst.operands[j].isreg
12420                     && !inst.operands[j].isvec))
12421                 matches = 0;
12422               break;
12423
12424             case SE_Q:
12425               if (!(inst.operands[j].isreg
12426                     && inst.operands[j].isvec
12427                     && inst.operands[j].isquad
12428                     && !inst.operands[j].issingle))
12429                 matches = 0;
12430               break;
12431
12432             case SE_I:
12433               if (!(!inst.operands[j].isreg
12434                     && !inst.operands[j].isscalar))
12435                 matches = 0;
12436               break;
12437
12438             case SE_S:
12439               if (!(!inst.operands[j].isreg
12440                     && inst.operands[j].isscalar))
12441                 matches = 0;
12442               break;
12443
12444             case SE_L:
12445               break;
12446             }
12447           if (!matches)
12448             break;
12449         }
12450       if (matches && (j >= ARM_IT_MAX_OPERANDS || !inst.operands[j].present))
12451         /* We've matched all the entries in the shape table, and we don't
12452            have any left over operands which have not been matched.  */
12453         break;
12454     }
12455
12456   va_end (ap);
12457
12458   if (shape == NS_NULL && first_shape != NS_NULL)
12459     first_error (_("invalid instruction shape"));
12460
12461   return shape;
12462 }
12463
12464 /* True if SHAPE is predominantly a quadword operation (most of the time, this
12465    means the Q bit should be set).  */
12466
12467 static int
12468 neon_quad (enum neon_shape shape)
12469 {
12470   return neon_shape_class[shape] == SC_QUAD;
12471 }
12472
12473 static void
12474 neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
12475                        unsigned *g_size)
12476 {
12477   /* Allow modification to be made to types which are constrained to be
12478      based on the key element, based on bits set alongside N_EQK.  */
12479   if ((typebits & N_EQK) != 0)
12480     {
12481       if ((typebits & N_HLF) != 0)
12482         *g_size /= 2;
12483       else if ((typebits & N_DBL) != 0)
12484         *g_size *= 2;
12485       if ((typebits & N_SGN) != 0)
12486         *g_type = NT_signed;
12487       else if ((typebits & N_UNS) != 0)
12488         *g_type = NT_unsigned;
12489       else if ((typebits & N_INT) != 0)
12490         *g_type = NT_integer;
12491       else if ((typebits & N_FLT) != 0)
12492         *g_type = NT_float;
12493       else if ((typebits & N_SIZ) != 0)
12494         *g_type = NT_untyped;
12495     }
12496 }
12497
12498 /* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
12499    operand type, i.e. the single type specified in a Neon instruction when it
12500    is the only one given.  */
12501
12502 static struct neon_type_el
12503 neon_type_promote (struct neon_type_el *key, unsigned thisarg)
12504 {
12505   struct neon_type_el dest = *key;
12506
12507   gas_assert ((thisarg & N_EQK) != 0);
12508
12509   neon_modify_type_size (thisarg, &dest.type, &dest.size);
12510
12511   return dest;
12512 }
12513
12514 /* Convert Neon type and size into compact bitmask representation.  */
12515
12516 static enum neon_type_mask
12517 type_chk_of_el_type (enum neon_el_type type, unsigned size)
12518 {
12519   switch (type)
12520     {
12521     case NT_untyped:
12522       switch (size)
12523         {
12524         case 8:  return N_8;
12525         case 16: return N_16;
12526         case 32: return N_32;
12527         case 64: return N_64;
12528         default: ;
12529         }
12530       break;
12531
12532     case NT_integer:
12533       switch (size)
12534         {
12535         case 8:  return N_I8;
12536         case 16: return N_I16;
12537         case 32: return N_I32;
12538         case 64: return N_I64;
12539         default: ;
12540         }
12541       break;
12542
12543     case NT_float:
12544       switch (size)
12545         {
12546         case 16: return N_F16;
12547         case 32: return N_F32;
12548         case 64: return N_F64;
12549         default: ;
12550         }
12551       break;
12552
12553     case NT_poly:
12554       switch (size)
12555         {
12556         case 8:  return N_P8;
12557         case 16: return N_P16;
12558         default: ;
12559         }
12560       break;
12561
12562     case NT_signed:
12563       switch (size)
12564         {
12565         case 8:  return N_S8;
12566         case 16: return N_S16;
12567         case 32: return N_S32;
12568         case 64: return N_S64;
12569         default: ;
12570         }
12571       break;
12572
12573     case NT_unsigned:
12574       switch (size)
12575         {
12576         case 8:  return N_U8;
12577         case 16: return N_U16;
12578         case 32: return N_U32;
12579         case 64: return N_U64;
12580         default: ;
12581         }
12582       break;
12583
12584     default: ;
12585     }
12586
12587   return N_UTYP;
12588 }
12589
12590 /* Convert compact Neon bitmask type representation to a type and size. Only
12591    handles the case where a single bit is set in the mask.  */
12592
12593 static int
12594 el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
12595                      enum neon_type_mask mask)
12596 {
12597   if ((mask & N_EQK) != 0)
12598     return FAIL;
12599
12600   if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
12601     *size = 8;
12602   else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_P16)) != 0)
12603     *size = 16;
12604   else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
12605     *size = 32;
12606   else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64)) != 0)
12607     *size = 64;
12608   else
12609     return FAIL;
12610
12611   if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
12612     *type = NT_signed;
12613   else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
12614     *type = NT_unsigned;
12615   else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
12616     *type = NT_integer;
12617   else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
12618     *type = NT_untyped;
12619   else if ((mask & (N_P8 | N_P16)) != 0)
12620     *type = NT_poly;
12621   else if ((mask & (N_F32 | N_F64)) != 0)
12622     *type = NT_float;
12623   else
12624     return FAIL;
12625
12626   return SUCCESS;
12627 }
12628
12629 /* Modify a bitmask of allowed types. This is only needed for type
12630    relaxation.  */
12631
12632 static unsigned
12633 modify_types_allowed (unsigned allowed, unsigned mods)
12634 {
12635   unsigned size;
12636   enum neon_el_type type;
12637   unsigned destmask;
12638   int i;
12639
12640   destmask = 0;
12641
12642   for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
12643     {
12644       if (el_type_of_type_chk (&type, &size,
12645                                (enum neon_type_mask) (allowed & i)) == SUCCESS)
12646         {
12647           neon_modify_type_size (mods, &type, &size);
12648           destmask |= type_chk_of_el_type (type, size);
12649         }
12650     }
12651
12652   return destmask;
12653 }
12654
12655 /* Check type and return type classification.
12656    The manual states (paraphrase): If one datatype is given, it indicates the
12657    type given in:
12658     - the second operand, if there is one
12659     - the operand, if there is no second operand
12660     - the result, if there are no operands.
12661    This isn't quite good enough though, so we use a concept of a "key" datatype
12662    which is set on a per-instruction basis, which is the one which matters when
12663    only one data type is written.
12664    Note: this function has side-effects (e.g. filling in missing operands). All
12665    Neon instructions should call it before performing bit encoding.  */
12666
12667 static struct neon_type_el
12668 neon_check_type (unsigned els, enum neon_shape ns, ...)
12669 {
12670   va_list ap;
12671   unsigned i, pass, key_el = 0;
12672   unsigned types[NEON_MAX_TYPE_ELS];
12673   enum neon_el_type k_type = NT_invtype;
12674   unsigned k_size = -1u;
12675   struct neon_type_el badtype = {NT_invtype, -1};
12676   unsigned key_allowed = 0;
12677
12678   /* Optional registers in Neon instructions are always (not) in operand 1.
12679      Fill in the missing operand here, if it was omitted.  */
12680   if (els > 1 && !inst.operands[1].present)
12681     inst.operands[1] = inst.operands[0];
12682
12683   /* Suck up all the varargs.  */
12684   va_start (ap, ns);
12685   for (i = 0; i < els; i++)
12686     {
12687       unsigned thisarg = va_arg (ap, unsigned);
12688       if (thisarg == N_IGNORE_TYPE)
12689         {
12690           va_end (ap);
12691           return badtype;
12692         }
12693       types[i] = thisarg;
12694       if ((thisarg & N_KEY) != 0)
12695         key_el = i;
12696     }
12697   va_end (ap);
12698
12699   if (inst.vectype.elems > 0)
12700     for (i = 0; i < els; i++)
12701       if (inst.operands[i].vectype.type != NT_invtype)
12702         {
12703           first_error (_("types specified in both the mnemonic and operands"));
12704           return badtype;
12705         }
12706
12707   /* Duplicate inst.vectype elements here as necessary.
12708      FIXME: No idea if this is exactly the same as the ARM assembler,
12709      particularly when an insn takes one register and one non-register
12710      operand. */
12711   if (inst.vectype.elems == 1 && els > 1)
12712     {
12713       unsigned j;
12714       inst.vectype.elems = els;
12715       inst.vectype.el[key_el] = inst.vectype.el[0];
12716       for (j = 0; j < els; j++)
12717         if (j != key_el)
12718           inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12719                                                   types[j]);
12720     }
12721   else if (inst.vectype.elems == 0 && els > 0)
12722     {
12723       unsigned j;
12724       /* No types were given after the mnemonic, so look for types specified
12725          after each operand. We allow some flexibility here; as long as the
12726          "key" operand has a type, we can infer the others.  */
12727       for (j = 0; j < els; j++)
12728         if (inst.operands[j].vectype.type != NT_invtype)
12729           inst.vectype.el[j] = inst.operands[j].vectype;
12730
12731       if (inst.operands[key_el].vectype.type != NT_invtype)
12732         {
12733           for (j = 0; j < els; j++)
12734             if (inst.operands[j].vectype.type == NT_invtype)
12735               inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12736                                                       types[j]);
12737         }
12738       else
12739         {
12740           first_error (_("operand types can't be inferred"));
12741           return badtype;
12742         }
12743     }
12744   else if (inst.vectype.elems != els)
12745     {
12746       first_error (_("type specifier has the wrong number of parts"));
12747       return badtype;
12748     }
12749
12750   for (pass = 0; pass < 2; pass++)
12751     {
12752       for (i = 0; i < els; i++)
12753         {
12754           unsigned thisarg = types[i];
12755           unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
12756             ? modify_types_allowed (key_allowed, thisarg) : thisarg;
12757           enum neon_el_type g_type = inst.vectype.el[i].type;
12758           unsigned g_size = inst.vectype.el[i].size;
12759
12760           /* Decay more-specific signed & unsigned types to sign-insensitive
12761              integer types if sign-specific variants are unavailable.  */
12762           if ((g_type == NT_signed || g_type == NT_unsigned)
12763               && (types_allowed & N_SU_ALL) == 0)
12764             g_type = NT_integer;
12765
12766           /* If only untyped args are allowed, decay any more specific types to
12767              them. Some instructions only care about signs for some element
12768              sizes, so handle that properly.  */
12769           if ((g_size == 8 && (types_allowed & N_8) != 0)
12770               || (g_size == 16 && (types_allowed & N_16) != 0)
12771               || (g_size == 32 && (types_allowed & N_32) != 0)
12772               || (g_size == 64 && (types_allowed & N_64) != 0))
12773             g_type = NT_untyped;
12774
12775           if (pass == 0)
12776             {
12777               if ((thisarg & N_KEY) != 0)
12778                 {
12779                   k_type = g_type;
12780                   k_size = g_size;
12781                   key_allowed = thisarg & ~N_KEY;
12782                 }
12783             }
12784           else
12785             {
12786               if ((thisarg & N_VFP) != 0)
12787                 {
12788                   enum neon_shape_el regshape;
12789                   unsigned regwidth, match;
12790
12791                   /* PR 11136: Catch the case where we are passed a shape of NS_NULL.  */
12792                   if (ns == NS_NULL)
12793                     {
12794                       first_error (_("invalid instruction shape"));
12795                       return badtype;
12796                     }
12797                   regshape = neon_shape_tab[ns].el[i];
12798                   regwidth = neon_shape_el_size[regshape];
12799
12800                   /* In VFP mode, operands must match register widths. If we
12801                      have a key operand, use its width, else use the width of
12802                      the current operand.  */
12803                   if (k_size != -1u)
12804                     match = k_size;
12805                   else
12806                     match = g_size;
12807
12808                   if (regwidth != match)
12809                     {
12810                       first_error (_("operand size must match register width"));
12811                       return badtype;
12812                     }
12813                 }
12814
12815               if ((thisarg & N_EQK) == 0)
12816                 {
12817                   unsigned given_type = type_chk_of_el_type (g_type, g_size);
12818
12819                   if ((given_type & types_allowed) == 0)
12820                     {
12821                       first_error (_("bad type in Neon instruction"));
12822                       return badtype;
12823                     }
12824                 }
12825               else
12826                 {
12827                   enum neon_el_type mod_k_type = k_type;
12828                   unsigned mod_k_size = k_size;
12829                   neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
12830                   if (g_type != mod_k_type || g_size != mod_k_size)
12831                     {
12832                       first_error (_("inconsistent types in Neon instruction"));
12833                       return badtype;
12834                     }
12835                 }
12836             }
12837         }
12838     }
12839
12840   return inst.vectype.el[key_el];
12841 }
12842
12843 /* Neon-style VFP instruction forwarding.  */
12844
12845 /* Thumb VFP instructions have 0xE in the condition field.  */
12846
12847 static void
12848 do_vfp_cond_or_thumb (void)
12849 {
12850   inst.is_neon = 1;
12851
12852   if (thumb_mode)
12853     inst.instruction |= 0xe0000000;
12854   else
12855     inst.instruction |= inst.cond << 28;
12856 }
12857
12858 /* Look up and encode a simple mnemonic, for use as a helper function for the
12859    Neon-style VFP syntax.  This avoids duplication of bits of the insns table,
12860    etc.  It is assumed that operand parsing has already been done, and that the
12861    operands are in the form expected by the given opcode (this isn't necessarily
12862    the same as the form in which they were parsed, hence some massaging must
12863    take place before this function is called).
12864    Checks current arch version against that in the looked-up opcode.  */
12865
12866 static void
12867 do_vfp_nsyn_opcode (const char *opname)
12868 {
12869   const struct asm_opcode *opcode;
12870
12871   opcode = (const struct asm_opcode *) hash_find (arm_ops_hsh, opname);
12872
12873   if (!opcode)
12874     abort ();
12875
12876   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
12877                 thumb_mode ? *opcode->tvariant : *opcode->avariant),
12878               _(BAD_FPU));
12879
12880   inst.is_neon = 1;
12881
12882   if (thumb_mode)
12883     {
12884       inst.instruction = opcode->tvalue;
12885       opcode->tencode ();
12886     }
12887   else
12888     {
12889       inst.instruction = (inst.cond << 28) | opcode->avalue;
12890       opcode->aencode ();
12891     }
12892 }
12893
12894 static void
12895 do_vfp_nsyn_add_sub (enum neon_shape rs)
12896 {
12897   int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
12898
12899   if (rs == NS_FFF)
12900     {
12901       if (is_add)
12902         do_vfp_nsyn_opcode ("fadds");
12903       else
12904         do_vfp_nsyn_opcode ("fsubs");
12905     }
12906   else
12907     {
12908       if (is_add)
12909         do_vfp_nsyn_opcode ("faddd");
12910       else
12911         do_vfp_nsyn_opcode ("fsubd");
12912     }
12913 }
12914
12915 /* Check operand types to see if this is a VFP instruction, and if so call
12916    PFN ().  */
12917
12918 static int
12919 try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
12920 {
12921   enum neon_shape rs;
12922   struct neon_type_el et;
12923
12924   switch (args)
12925     {
12926     case 2:
12927       rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
12928       et = neon_check_type (2, rs,
12929         N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12930       break;
12931
12932     case 3:
12933       rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
12934       et = neon_check_type (3, rs,
12935         N_EQK | N_VFP, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
12936       break;
12937
12938     default:
12939       abort ();
12940     }
12941
12942   if (et.type != NT_invtype)
12943     {
12944       pfn (rs);
12945       return SUCCESS;
12946     }
12947
12948   inst.error = NULL;
12949   return FAIL;
12950 }
12951
12952 static void
12953 do_vfp_nsyn_mla_mls (enum neon_shape rs)
12954 {
12955   int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
12956
12957   if (rs == NS_FFF)
12958     {
12959       if (is_mla)
12960         do_vfp_nsyn_opcode ("fmacs");
12961       else
12962         do_vfp_nsyn_opcode ("fnmacs");
12963     }
12964   else
12965     {
12966       if (is_mla)
12967         do_vfp_nsyn_opcode ("fmacd");
12968       else
12969         do_vfp_nsyn_opcode ("fnmacd");
12970     }
12971 }
12972
12973 static void
12974 do_vfp_nsyn_fma_fms (enum neon_shape rs)
12975 {
12976   int is_fma = (inst.instruction & 0x0fffffff) == N_MNEM_vfma;
12977
12978   if (rs == NS_FFF)
12979     {
12980       if (is_fma)
12981         do_vfp_nsyn_opcode ("ffmas");
12982       else
12983         do_vfp_nsyn_opcode ("ffnmas");
12984     }
12985   else
12986     {
12987       if (is_fma)
12988         do_vfp_nsyn_opcode ("ffmad");
12989       else
12990         do_vfp_nsyn_opcode ("ffnmad");
12991     }
12992 }
12993
12994 static void
12995 do_vfp_nsyn_mul (enum neon_shape rs)
12996 {
12997   if (rs == NS_FFF)
12998     do_vfp_nsyn_opcode ("fmuls");
12999   else
13000     do_vfp_nsyn_opcode ("fmuld");
13001 }
13002
13003 static void
13004 do_vfp_nsyn_abs_neg (enum neon_shape rs)
13005 {
13006   int is_neg = (inst.instruction & 0x80) != 0;
13007   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_VFP | N_KEY);
13008
13009   if (rs == NS_FF)
13010     {
13011       if (is_neg)
13012         do_vfp_nsyn_opcode ("fnegs");
13013       else
13014         do_vfp_nsyn_opcode ("fabss");
13015     }
13016   else
13017     {
13018       if (is_neg)
13019         do_vfp_nsyn_opcode ("fnegd");
13020       else
13021         do_vfp_nsyn_opcode ("fabsd");
13022     }
13023 }
13024
13025 /* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
13026    insns belong to Neon, and are handled elsewhere.  */
13027
13028 static void
13029 do_vfp_nsyn_ldm_stm (int is_dbmode)
13030 {
13031   int is_ldm = (inst.instruction & (1 << 20)) != 0;
13032   if (is_ldm)
13033     {
13034       if (is_dbmode)
13035         do_vfp_nsyn_opcode ("fldmdbs");
13036       else
13037         do_vfp_nsyn_opcode ("fldmias");
13038     }
13039   else
13040     {
13041       if (is_dbmode)
13042         do_vfp_nsyn_opcode ("fstmdbs");
13043       else
13044         do_vfp_nsyn_opcode ("fstmias");
13045     }
13046 }
13047
13048 static void
13049 do_vfp_nsyn_sqrt (void)
13050 {
13051   enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13052   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13053
13054   if (rs == NS_FF)
13055     do_vfp_nsyn_opcode ("fsqrts");
13056   else
13057     do_vfp_nsyn_opcode ("fsqrtd");
13058 }
13059
13060 static void
13061 do_vfp_nsyn_div (void)
13062 {
13063   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13064   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
13065     N_F32 | N_F64 | N_KEY | N_VFP);
13066
13067   if (rs == NS_FFF)
13068     do_vfp_nsyn_opcode ("fdivs");
13069   else
13070     do_vfp_nsyn_opcode ("fdivd");
13071 }
13072
13073 static void
13074 do_vfp_nsyn_nmul (void)
13075 {
13076   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13077   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
13078     N_F32 | N_F64 | N_KEY | N_VFP);
13079
13080   if (rs == NS_FFF)
13081     {
13082       NEON_ENCODE (SINGLE, inst);
13083       do_vfp_sp_dyadic ();
13084     }
13085   else
13086     {
13087       NEON_ENCODE (DOUBLE, inst);
13088       do_vfp_dp_rd_rn_rm ();
13089     }
13090   do_vfp_cond_or_thumb ();
13091 }
13092
13093 static void
13094 do_vfp_nsyn_cmp (void)
13095 {
13096   if (inst.operands[1].isreg)
13097     {
13098       enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13099       neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13100
13101       if (rs == NS_FF)
13102         {
13103           NEON_ENCODE (SINGLE, inst);
13104           do_vfp_sp_monadic ();
13105         }
13106       else
13107         {
13108           NEON_ENCODE (DOUBLE, inst);
13109           do_vfp_dp_rd_rm ();
13110         }
13111     }
13112   else
13113     {
13114       enum neon_shape rs = neon_select_shape (NS_FI, NS_DI, NS_NULL);
13115       neon_check_type (2, rs, N_F32 | N_F64 | N_KEY | N_VFP, N_EQK);
13116
13117       switch (inst.instruction & 0x0fffffff)
13118         {
13119         case N_MNEM_vcmp:
13120           inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
13121           break;
13122         case N_MNEM_vcmpe:
13123           inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
13124           break;
13125         default:
13126           abort ();
13127         }
13128
13129       if (rs == NS_FI)
13130         {
13131           NEON_ENCODE (SINGLE, inst);
13132           do_vfp_sp_compare_z ();
13133         }
13134       else
13135         {
13136           NEON_ENCODE (DOUBLE, inst);
13137           do_vfp_dp_rd ();
13138         }
13139     }
13140   do_vfp_cond_or_thumb ();
13141 }
13142
13143 static void
13144 nsyn_insert_sp (void)
13145 {
13146   inst.operands[1] = inst.operands[0];
13147   memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
13148   inst.operands[0].reg = REG_SP;
13149   inst.operands[0].isreg = 1;
13150   inst.operands[0].writeback = 1;
13151   inst.operands[0].present = 1;
13152 }
13153
13154 static void
13155 do_vfp_nsyn_push (void)
13156 {
13157   nsyn_insert_sp ();
13158   if (inst.operands[1].issingle)
13159     do_vfp_nsyn_opcode ("fstmdbs");
13160   else
13161     do_vfp_nsyn_opcode ("fstmdbd");
13162 }
13163
13164 static void
13165 do_vfp_nsyn_pop (void)
13166 {
13167   nsyn_insert_sp ();
13168   if (inst.operands[1].issingle)
13169     do_vfp_nsyn_opcode ("fldmias");
13170   else
13171     do_vfp_nsyn_opcode ("fldmiad");
13172 }
13173
13174 /* Fix up Neon data-processing instructions, ORing in the correct bits for
13175    ARM mode or Thumb mode and moving the encoded bit 24 to bit 28.  */
13176
13177 static void
13178 neon_dp_fixup (struct arm_it* insn)
13179 {
13180   unsigned int i = insn->instruction;
13181   insn->is_neon = 1;
13182
13183   if (thumb_mode)
13184     {
13185       /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode.  */
13186       if (i & (1 << 24))
13187         i |= 1 << 28;
13188
13189       i &= ~(1 << 24);
13190
13191       i |= 0xef000000;
13192     }
13193   else
13194     i |= 0xf2000000;
13195
13196   insn->instruction = i;
13197 }
13198
13199 /* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
13200    (0, 1, 2, 3).  */
13201
13202 static unsigned
13203 neon_logbits (unsigned x)
13204 {
13205   return ffs (x) - 4;
13206 }
13207
13208 #define LOW4(R) ((R) & 0xf)
13209 #define HI1(R) (((R) >> 4) & 1)
13210
13211 /* Encode insns with bit pattern:
13212
13213   |28/24|23|22 |21 20|19 16|15 12|11    8|7|6|5|4|3  0|
13214   |  U  |x |D  |size | Rn  | Rd  |x x x x|N|Q|M|x| Rm |
13215
13216   SIZE is passed in bits. -1 means size field isn't changed, in case it has a
13217   different meaning for some instruction.  */
13218
13219 static void
13220 neon_three_same (int isquad, int ubit, int size)
13221 {
13222   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13223   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13224   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13225   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13226   inst.instruction |= LOW4 (inst.operands[2].reg);
13227   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
13228   inst.instruction |= (isquad != 0) << 6;
13229   inst.instruction |= (ubit != 0) << 24;
13230   if (size != -1)
13231     inst.instruction |= neon_logbits (size) << 20;
13232
13233   neon_dp_fixup (&inst);
13234 }
13235
13236 /* Encode instructions of the form:
13237
13238   |28/24|23|22|21 20|19 18|17 16|15 12|11      7|6|5|4|3  0|
13239   |  U  |x |D |x  x |size |x  x | Rd  |x x x x x|Q|M|x| Rm |
13240
13241   Don't write size if SIZE == -1.  */
13242
13243 static void
13244 neon_two_same (int qbit, int ubit, int size)
13245 {
13246   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13247   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13248   inst.instruction |= LOW4 (inst.operands[1].reg);
13249   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13250   inst.instruction |= (qbit != 0) << 6;
13251   inst.instruction |= (ubit != 0) << 24;
13252
13253   if (size != -1)
13254     inst.instruction |= neon_logbits (size) << 18;
13255
13256   neon_dp_fixup (&inst);
13257 }
13258
13259 /* Neon instruction encoders, in approximate order of appearance.  */
13260
13261 static void
13262 do_neon_dyadic_i_su (void)
13263 {
13264   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13265   struct neon_type_el et = neon_check_type (3, rs,
13266     N_EQK, N_EQK, N_SU_32 | N_KEY);
13267   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13268 }
13269
13270 static void
13271 do_neon_dyadic_i64_su (void)
13272 {
13273   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13274   struct neon_type_el et = neon_check_type (3, rs,
13275     N_EQK, N_EQK, N_SU_ALL | N_KEY);
13276   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13277 }
13278
13279 static void
13280 neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
13281                 unsigned immbits)
13282 {
13283   unsigned size = et.size >> 3;
13284   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13285   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13286   inst.instruction |= LOW4 (inst.operands[1].reg);
13287   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13288   inst.instruction |= (isquad != 0) << 6;
13289   inst.instruction |= immbits << 16;
13290   inst.instruction |= (size >> 3) << 7;
13291   inst.instruction |= (size & 0x7) << 19;
13292   if (write_ubit)
13293     inst.instruction |= (uval != 0) << 24;
13294
13295   neon_dp_fixup (&inst);
13296 }
13297
13298 static void
13299 do_neon_shl_imm (void)
13300 {
13301   if (!inst.operands[2].isreg)
13302     {
13303       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13304       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
13305       NEON_ENCODE (IMMED, inst);
13306       neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm);
13307     }
13308   else
13309     {
13310       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13311       struct neon_type_el et = neon_check_type (3, rs,
13312         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
13313       unsigned int tmp;
13314
13315       /* VSHL/VQSHL 3-register variants have syntax such as:
13316            vshl.xx Dd, Dm, Dn
13317          whereas other 3-register operations encoded by neon_three_same have
13318          syntax like:
13319            vadd.xx Dd, Dn, Dm
13320          (i.e. with Dn & Dm reversed). Swap operands[1].reg and operands[2].reg
13321          here.  */
13322       tmp = inst.operands[2].reg;
13323       inst.operands[2].reg = inst.operands[1].reg;
13324       inst.operands[1].reg = tmp;
13325       NEON_ENCODE (INTEGER, inst);
13326       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13327     }
13328 }
13329
13330 static void
13331 do_neon_qshl_imm (void)
13332 {
13333   if (!inst.operands[2].isreg)
13334     {
13335       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13336       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
13337
13338       NEON_ENCODE (IMMED, inst);
13339       neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
13340                       inst.operands[2].imm);
13341     }
13342   else
13343     {
13344       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13345       struct neon_type_el et = neon_check_type (3, rs,
13346         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
13347       unsigned int tmp;
13348
13349       /* See note in do_neon_shl_imm.  */
13350       tmp = inst.operands[2].reg;
13351       inst.operands[2].reg = inst.operands[1].reg;
13352       inst.operands[1].reg = tmp;
13353       NEON_ENCODE (INTEGER, inst);
13354       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13355     }
13356 }
13357
13358 static void
13359 do_neon_rshl (void)
13360 {
13361   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13362   struct neon_type_el et = neon_check_type (3, rs,
13363     N_EQK, N_EQK, N_SU_ALL | N_KEY);
13364   unsigned int tmp;
13365
13366   tmp = inst.operands[2].reg;
13367   inst.operands[2].reg = inst.operands[1].reg;
13368   inst.operands[1].reg = tmp;
13369   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13370 }
13371
13372 static int
13373 neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
13374 {
13375   /* Handle .I8 pseudo-instructions.  */
13376   if (size == 8)
13377     {
13378       /* Unfortunately, this will make everything apart from zero out-of-range.
13379          FIXME is this the intended semantics? There doesn't seem much point in
13380          accepting .I8 if so.  */
13381       immediate |= immediate << 8;
13382       size = 16;
13383     }
13384
13385   if (size >= 32)
13386     {
13387       if (immediate == (immediate & 0x000000ff))
13388         {
13389           *immbits = immediate;
13390           return 0x1;
13391         }
13392       else if (immediate == (immediate & 0x0000ff00))
13393         {
13394           *immbits = immediate >> 8;
13395           return 0x3;
13396         }
13397       else if (immediate == (immediate & 0x00ff0000))
13398         {
13399           *immbits = immediate >> 16;
13400           return 0x5;
13401         }
13402       else if (immediate == (immediate & 0xff000000))
13403         {
13404           *immbits = immediate >> 24;
13405           return 0x7;
13406         }
13407       if ((immediate & 0xffff) != (immediate >> 16))
13408         goto bad_immediate;
13409       immediate &= 0xffff;
13410     }
13411
13412   if (immediate == (immediate & 0x000000ff))
13413     {
13414       *immbits = immediate;
13415       return 0x9;
13416     }
13417   else if (immediate == (immediate & 0x0000ff00))
13418     {
13419       *immbits = immediate >> 8;
13420       return 0xb;
13421     }
13422
13423   bad_immediate:
13424   first_error (_("immediate value out of range"));
13425   return FAIL;
13426 }
13427
13428 /* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
13429    A, B, C, D.  */
13430
13431 static int
13432 neon_bits_same_in_bytes (unsigned imm)
13433 {
13434   return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
13435          && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
13436          && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
13437          && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
13438 }
13439
13440 /* For immediate of above form, return 0bABCD.  */
13441
13442 static unsigned
13443 neon_squash_bits (unsigned imm)
13444 {
13445   return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
13446          | ((imm & 0x01000000) >> 21);
13447 }
13448
13449 /* Compress quarter-float representation to 0b...000 abcdefgh.  */
13450
13451 static unsigned
13452 neon_qfloat_bits (unsigned imm)
13453 {
13454   return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
13455 }
13456
13457 /* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
13458    the instruction. *OP is passed as the initial value of the op field, and
13459    may be set to a different value depending on the constant (i.e.
13460    "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
13461    MVN).  If the immediate looks like a repeated pattern then also
13462    try smaller element sizes.  */
13463
13464 static int
13465 neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
13466                          unsigned *immbits, int *op, int size,
13467                          enum neon_el_type type)
13468 {
13469   /* Only permit float immediates (including 0.0/-0.0) if the operand type is
13470      float.  */
13471   if (type == NT_float && !float_p)
13472     return FAIL;
13473
13474   if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
13475     {
13476       if (size != 32 || *op == 1)
13477         return FAIL;
13478       *immbits = neon_qfloat_bits (immlo);
13479       return 0xf;
13480     }
13481
13482   if (size == 64)
13483     {
13484       if (neon_bits_same_in_bytes (immhi)
13485           && neon_bits_same_in_bytes (immlo))
13486         {
13487           if (*op == 1)
13488             return FAIL;
13489           *immbits = (neon_squash_bits (immhi) << 4)
13490                      | neon_squash_bits (immlo);
13491           *op = 1;
13492           return 0xe;
13493         }
13494
13495       if (immhi != immlo)
13496         return FAIL;
13497     }
13498
13499   if (size >= 32)
13500     {
13501       if (immlo == (immlo & 0x000000ff))
13502         {
13503           *immbits = immlo;
13504           return 0x0;
13505         }
13506       else if (immlo == (immlo & 0x0000ff00))
13507         {
13508           *immbits = immlo >> 8;
13509           return 0x2;
13510         }
13511       else if (immlo == (immlo & 0x00ff0000))
13512         {
13513           *immbits = immlo >> 16;
13514           return 0x4;
13515         }
13516       else if (immlo == (immlo & 0xff000000))
13517         {
13518           *immbits = immlo >> 24;
13519           return 0x6;
13520         }
13521       else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
13522         {
13523           *immbits = (immlo >> 8) & 0xff;
13524           return 0xc;
13525         }
13526       else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
13527         {
13528           *immbits = (immlo >> 16) & 0xff;
13529           return 0xd;
13530         }
13531
13532       if ((immlo & 0xffff) != (immlo >> 16))
13533         return FAIL;
13534       immlo &= 0xffff;
13535     }
13536
13537   if (size >= 16)
13538     {
13539       if (immlo == (immlo & 0x000000ff))
13540         {
13541           *immbits = immlo;
13542           return 0x8;
13543         }
13544       else if (immlo == (immlo & 0x0000ff00))
13545         {
13546           *immbits = immlo >> 8;
13547           return 0xa;
13548         }
13549
13550       if ((immlo & 0xff) != (immlo >> 8))
13551         return FAIL;
13552       immlo &= 0xff;
13553     }
13554
13555   if (immlo == (immlo & 0x000000ff))
13556     {
13557       /* Don't allow MVN with 8-bit immediate.  */
13558       if (*op == 1)
13559         return FAIL;
13560       *immbits = immlo;
13561       return 0xe;
13562     }
13563
13564   return FAIL;
13565 }
13566
13567 /* Write immediate bits [7:0] to the following locations:
13568
13569   |28/24|23     19|18 16|15                    4|3     0|
13570   |  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|
13571
13572   This function is used by VMOV/VMVN/VORR/VBIC.  */
13573
13574 static void
13575 neon_write_immbits (unsigned immbits)
13576 {
13577   inst.instruction |= immbits & 0xf;
13578   inst.instruction |= ((immbits >> 4) & 0x7) << 16;
13579   inst.instruction |= ((immbits >> 7) & 0x1) << 24;
13580 }
13581
13582 /* Invert low-order SIZE bits of XHI:XLO.  */
13583
13584 static void
13585 neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
13586 {
13587   unsigned immlo = xlo ? *xlo : 0;
13588   unsigned immhi = xhi ? *xhi : 0;
13589
13590   switch (size)
13591     {
13592     case 8:
13593       immlo = (~immlo) & 0xff;
13594       break;
13595
13596     case 16:
13597       immlo = (~immlo) & 0xffff;
13598       break;
13599
13600     case 64:
13601       immhi = (~immhi) & 0xffffffff;
13602       /* fall through.  */
13603
13604     case 32:
13605       immlo = (~immlo) & 0xffffffff;
13606       break;
13607
13608     default:
13609       abort ();
13610     }
13611
13612   if (xlo)
13613     *xlo = immlo;
13614
13615   if (xhi)
13616     *xhi = immhi;
13617 }
13618
13619 static void
13620 do_neon_logic (void)
13621 {
13622   if (inst.operands[2].present && inst.operands[2].isreg)
13623     {
13624       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13625       neon_check_type (3, rs, N_IGNORE_TYPE);
13626       /* U bit and size field were set as part of the bitmask.  */
13627       NEON_ENCODE (INTEGER, inst);
13628       neon_three_same (neon_quad (rs), 0, -1);
13629     }
13630   else
13631     {
13632       const int three_ops_form = (inst.operands[2].present
13633                                   && !inst.operands[2].isreg);
13634       const int immoperand = (three_ops_form ? 2 : 1);
13635       enum neon_shape rs = (three_ops_form
13636                             ? neon_select_shape (NS_DDI, NS_QQI, NS_NULL)
13637                             : neon_select_shape (NS_DI, NS_QI, NS_NULL));
13638       struct neon_type_el et = neon_check_type (2, rs,
13639         N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
13640       enum neon_opc opcode = (enum neon_opc) inst.instruction & 0x0fffffff;
13641       unsigned immbits;
13642       int cmode;
13643
13644       if (et.type == NT_invtype)
13645         return;
13646
13647       if (three_ops_form)
13648         constraint (inst.operands[0].reg != inst.operands[1].reg,
13649                     _("first and second operands shall be the same register"));
13650
13651       NEON_ENCODE (IMMED, inst);
13652
13653       immbits = inst.operands[immoperand].imm;
13654       if (et.size == 64)
13655         {
13656           /* .i64 is a pseudo-op, so the immediate must be a repeating
13657              pattern.  */
13658           if (immbits != (inst.operands[immoperand].regisimm ?
13659                           inst.operands[immoperand].reg : 0))
13660             {
13661               /* Set immbits to an invalid constant.  */
13662               immbits = 0xdeadbeef;
13663             }
13664         }
13665
13666       switch (opcode)
13667         {
13668         case N_MNEM_vbic:
13669           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13670           break;
13671
13672         case N_MNEM_vorr:
13673           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13674           break;
13675
13676         case N_MNEM_vand:
13677           /* Pseudo-instruction for VBIC.  */
13678           neon_invert_size (&immbits, 0, et.size);
13679           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13680           break;
13681
13682         case N_MNEM_vorn:
13683           /* Pseudo-instruction for VORR.  */
13684           neon_invert_size (&immbits, 0, et.size);
13685           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13686           break;
13687
13688         default:
13689           abort ();
13690         }
13691
13692       if (cmode == FAIL)
13693         return;
13694
13695       inst.instruction |= neon_quad (rs) << 6;
13696       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13697       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13698       inst.instruction |= cmode << 8;
13699       neon_write_immbits (immbits);
13700
13701       neon_dp_fixup (&inst);
13702     }
13703 }
13704
13705 static void
13706 do_neon_bitfield (void)
13707 {
13708   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13709   neon_check_type (3, rs, N_IGNORE_TYPE);
13710   neon_three_same (neon_quad (rs), 0, -1);
13711 }
13712
13713 static void
13714 neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
13715                   unsigned destbits)
13716 {
13717   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13718   struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
13719                                             types | N_KEY);
13720   if (et.type == NT_float)
13721     {
13722       NEON_ENCODE (FLOAT, inst);
13723       neon_three_same (neon_quad (rs), 0, -1);
13724     }
13725   else
13726     {
13727       NEON_ENCODE (INTEGER, inst);
13728       neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
13729     }
13730 }
13731
13732 static void
13733 do_neon_dyadic_if_su (void)
13734 {
13735   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
13736 }
13737
13738 static void
13739 do_neon_dyadic_if_su_d (void)
13740 {
13741   /* This version only allow D registers, but that constraint is enforced during
13742      operand parsing so we don't need to do anything extra here.  */
13743   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
13744 }
13745
13746 static void
13747 do_neon_dyadic_if_i_d (void)
13748 {
13749   /* The "untyped" case can't happen. Do this to stop the "U" bit being
13750      affected if we specify unsigned args.  */
13751   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13752 }
13753
13754 enum vfp_or_neon_is_neon_bits
13755 {
13756   NEON_CHECK_CC = 1,
13757   NEON_CHECK_ARCH = 2
13758 };
13759
13760 /* Call this function if an instruction which may have belonged to the VFP or
13761    Neon instruction sets, but turned out to be a Neon instruction (due to the
13762    operand types involved, etc.). We have to check and/or fix-up a couple of
13763    things:
13764
13765      - Make sure the user hasn't attempted to make a Neon instruction
13766        conditional.
13767      - Alter the value in the condition code field if necessary.
13768      - Make sure that the arch supports Neon instructions.
13769
13770    Which of these operations take place depends on bits from enum
13771    vfp_or_neon_is_neon_bits.
13772
13773    WARNING: This function has side effects! If NEON_CHECK_CC is used and the
13774    current instruction's condition is COND_ALWAYS, the condition field is
13775    changed to inst.uncond_value. This is necessary because instructions shared
13776    between VFP and Neon may be conditional for the VFP variants only, and the
13777    unconditional Neon version must have, e.g., 0xF in the condition field.  */
13778
13779 static int
13780 vfp_or_neon_is_neon (unsigned check)
13781 {
13782   /* Conditions are always legal in Thumb mode (IT blocks).  */
13783   if (!thumb_mode && (check & NEON_CHECK_CC))
13784     {
13785       if (inst.cond != COND_ALWAYS)
13786         {
13787           first_error (_(BAD_COND));
13788           return FAIL;
13789         }
13790       if (inst.uncond_value != -1)
13791         inst.instruction |= inst.uncond_value << 28;
13792     }
13793
13794   if ((check & NEON_CHECK_ARCH)
13795       && !ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1))
13796     {
13797       first_error (_(BAD_FPU));
13798       return FAIL;
13799     }
13800
13801   return SUCCESS;
13802 }
13803
13804 static void
13805 do_neon_addsub_if_i (void)
13806 {
13807   if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
13808     return;
13809
13810   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13811     return;
13812
13813   /* The "untyped" case can't happen. Do this to stop the "U" bit being
13814      affected if we specify unsigned args.  */
13815   neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
13816 }
13817
13818 /* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
13819    result to be:
13820      V<op> A,B     (A is operand 0, B is operand 2)
13821    to mean:
13822      V<op> A,B,A
13823    not:
13824      V<op> A,B,B
13825    so handle that case specially.  */
13826
13827 static void
13828 neon_exchange_operands (void)
13829 {
13830   void *scratch = alloca (sizeof (inst.operands[0]));
13831   if (inst.operands[1].present)
13832     {
13833       /* Swap operands[1] and operands[2].  */
13834       memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
13835       inst.operands[1] = inst.operands[2];
13836       memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
13837     }
13838   else
13839     {
13840       inst.operands[1] = inst.operands[2];
13841       inst.operands[2] = inst.operands[0];
13842     }
13843 }
13844
13845 static void
13846 neon_compare (unsigned regtypes, unsigned immtypes, int invert)
13847 {
13848   if (inst.operands[2].isreg)
13849     {
13850       if (invert)
13851         neon_exchange_operands ();
13852       neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
13853     }
13854   else
13855     {
13856       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
13857       struct neon_type_el et = neon_check_type (2, rs,
13858         N_EQK | N_SIZ, immtypes | N_KEY);
13859
13860       NEON_ENCODE (IMMED, inst);
13861       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13862       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13863       inst.instruction |= LOW4 (inst.operands[1].reg);
13864       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13865       inst.instruction |= neon_quad (rs) << 6;
13866       inst.instruction |= (et.type == NT_float) << 10;
13867       inst.instruction |= neon_logbits (et.size) << 18;
13868
13869       neon_dp_fixup (&inst);
13870     }
13871 }
13872
13873 static void
13874 do_neon_cmp (void)
13875 {
13876   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, FALSE);
13877 }
13878
13879 static void
13880 do_neon_cmp_inv (void)
13881 {
13882   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, TRUE);
13883 }
13884
13885 static void
13886 do_neon_ceq (void)
13887 {
13888   neon_compare (N_IF_32, N_IF_32, FALSE);
13889 }
13890
13891 /* For multiply instructions, we have the possibility of 16-bit or 32-bit
13892    scalars, which are encoded in 5 bits, M : Rm.
13893    For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
13894    M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
13895    index in M.  */
13896
13897 static unsigned
13898 neon_scalar_for_mul (unsigned scalar, unsigned elsize)
13899 {
13900   unsigned regno = NEON_SCALAR_REG (scalar);
13901   unsigned elno = NEON_SCALAR_INDEX (scalar);
13902
13903   switch (elsize)
13904     {
13905     case 16:
13906       if (regno > 7 || elno > 3)
13907         goto bad_scalar;
13908       return regno | (elno << 3);
13909
13910     case 32:
13911       if (regno > 15 || elno > 1)
13912         goto bad_scalar;
13913       return regno | (elno << 4);
13914
13915     default:
13916     bad_scalar:
13917       first_error (_("scalar out of range for multiply instruction"));
13918     }
13919
13920   return 0;
13921 }
13922
13923 /* Encode multiply / multiply-accumulate scalar instructions.  */
13924
13925 static void
13926 neon_mul_mac (struct neon_type_el et, int ubit)
13927 {
13928   unsigned scalar;
13929
13930   /* Give a more helpful error message if we have an invalid type.  */
13931   if (et.type == NT_invtype)
13932     return;
13933
13934   scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
13935   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13936   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13937   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13938   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13939   inst.instruction |= LOW4 (scalar);
13940   inst.instruction |= HI1 (scalar) << 5;
13941   inst.instruction |= (et.type == NT_float) << 8;
13942   inst.instruction |= neon_logbits (et.size) << 20;
13943   inst.instruction |= (ubit != 0) << 24;
13944
13945   neon_dp_fixup (&inst);
13946 }
13947
13948 static void
13949 do_neon_mac_maybe_scalar (void)
13950 {
13951   if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
13952     return;
13953
13954   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13955     return;
13956
13957   if (inst.operands[2].isscalar)
13958     {
13959       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
13960       struct neon_type_el et = neon_check_type (3, rs,
13961         N_EQK, N_EQK, N_I16 | N_I32 | N_F32 | N_KEY);
13962       NEON_ENCODE (SCALAR, inst);
13963       neon_mul_mac (et, neon_quad (rs));
13964     }
13965   else
13966     {
13967       /* The "untyped" case can't happen.  Do this to stop the "U" bit being
13968          affected if we specify unsigned args.  */
13969       neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13970     }
13971 }
13972
13973 static void
13974 do_neon_fmac (void)
13975 {
13976   if (try_vfp_nsyn (3, do_vfp_nsyn_fma_fms) == SUCCESS)
13977     return;
13978
13979   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13980     return;
13981
13982   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
13983 }
13984
13985 static void
13986 do_neon_tst (void)
13987 {
13988   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13989   struct neon_type_el et = neon_check_type (3, rs,
13990     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
13991   neon_three_same (neon_quad (rs), 0, et.size);
13992 }
13993
13994 /* VMUL with 3 registers allows the P8 type. The scalar version supports the
13995    same types as the MAC equivalents. The polynomial type for this instruction
13996    is encoded the same as the integer type.  */
13997
13998 static void
13999 do_neon_mul (void)
14000 {
14001   if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
14002     return;
14003
14004   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14005     return;
14006
14007   if (inst.operands[2].isscalar)
14008     do_neon_mac_maybe_scalar ();
14009   else
14010     neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F32 | N_P8, 0);
14011 }
14012
14013 static void
14014 do_neon_qdmulh (void)
14015 {
14016   if (inst.operands[2].isscalar)
14017     {
14018       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
14019       struct neon_type_el et = neon_check_type (3, rs,
14020         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
14021       NEON_ENCODE (SCALAR, inst);
14022       neon_mul_mac (et, neon_quad (rs));
14023     }
14024   else
14025     {
14026       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14027       struct neon_type_el et = neon_check_type (3, rs,
14028         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
14029       NEON_ENCODE (INTEGER, inst);
14030       /* The U bit (rounding) comes from bit mask.  */
14031       neon_three_same (neon_quad (rs), 0, et.size);
14032     }
14033 }
14034
14035 static void
14036 do_neon_fcmp_absolute (void)
14037 {
14038   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14039   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
14040   /* Size field comes from bit mask.  */
14041   neon_three_same (neon_quad (rs), 1, -1);
14042 }
14043
14044 static void
14045 do_neon_fcmp_absolute_inv (void)
14046 {
14047   neon_exchange_operands ();
14048   do_neon_fcmp_absolute ();
14049 }
14050
14051 static void
14052 do_neon_step (void)
14053 {
14054   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14055   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
14056   neon_three_same (neon_quad (rs), 0, -1);
14057 }
14058
14059 static void
14060 do_neon_abs_neg (void)
14061 {
14062   enum neon_shape rs;
14063   struct neon_type_el et;
14064
14065   if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
14066     return;
14067
14068   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14069     return;
14070
14071   rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14072   et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_F32 | N_KEY);
14073
14074   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14075   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14076   inst.instruction |= LOW4 (inst.operands[1].reg);
14077   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14078   inst.instruction |= neon_quad (rs) << 6;
14079   inst.instruction |= (et.type == NT_float) << 10;
14080   inst.instruction |= neon_logbits (et.size) << 18;
14081
14082   neon_dp_fixup (&inst);
14083 }
14084
14085 static void
14086 do_neon_sli (void)
14087 {
14088   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14089   struct neon_type_el et = neon_check_type (2, rs,
14090     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14091   int imm = inst.operands[2].imm;
14092   constraint (imm < 0 || (unsigned)imm >= et.size,
14093               _("immediate out of range for insert"));
14094   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
14095 }
14096
14097 static void
14098 do_neon_sri (void)
14099 {
14100   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14101   struct neon_type_el et = neon_check_type (2, rs,
14102     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14103   int imm = inst.operands[2].imm;
14104   constraint (imm < 1 || (unsigned)imm > et.size,
14105               _("immediate out of range for insert"));
14106   neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
14107 }
14108
14109 static void
14110 do_neon_qshlu_imm (void)
14111 {
14112   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14113   struct neon_type_el et = neon_check_type (2, rs,
14114     N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
14115   int imm = inst.operands[2].imm;
14116   constraint (imm < 0 || (unsigned)imm >= et.size,
14117               _("immediate out of range for shift"));
14118   /* Only encodes the 'U present' variant of the instruction.
14119      In this case, signed types have OP (bit 8) set to 0.
14120      Unsigned types have OP set to 1.  */
14121   inst.instruction |= (et.type == NT_unsigned) << 8;
14122   /* The rest of the bits are the same as other immediate shifts.  */
14123   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
14124 }
14125
14126 static void
14127 do_neon_qmovn (void)
14128 {
14129   struct neon_type_el et = neon_check_type (2, NS_DQ,
14130     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14131   /* Saturating move where operands can be signed or unsigned, and the
14132      destination has the same signedness.  */
14133   NEON_ENCODE (INTEGER, inst);
14134   if (et.type == NT_unsigned)
14135     inst.instruction |= 0xc0;
14136   else
14137     inst.instruction |= 0x80;
14138   neon_two_same (0, 1, et.size / 2);
14139 }
14140
14141 static void
14142 do_neon_qmovun (void)
14143 {
14144   struct neon_type_el et = neon_check_type (2, NS_DQ,
14145     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14146   /* Saturating move with unsigned results. Operands must be signed.  */
14147   NEON_ENCODE (INTEGER, inst);
14148   neon_two_same (0, 1, et.size / 2);
14149 }
14150
14151 static void
14152 do_neon_rshift_sat_narrow (void)
14153 {
14154   /* FIXME: Types for narrowing. If operands are signed, results can be signed
14155      or unsigned. If operands are unsigned, results must also be unsigned.  */
14156   struct neon_type_el et = neon_check_type (2, NS_DQI,
14157     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14158   int imm = inst.operands[2].imm;
14159   /* This gets the bounds check, size encoding and immediate bits calculation
14160      right.  */
14161   et.size /= 2;
14162
14163   /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
14164      VQMOVN.I<size> <Dd>, <Qm>.  */
14165   if (imm == 0)
14166     {
14167       inst.operands[2].present = 0;
14168       inst.instruction = N_MNEM_vqmovn;
14169       do_neon_qmovn ();
14170       return;
14171     }
14172
14173   constraint (imm < 1 || (unsigned)imm > et.size,
14174               _("immediate out of range"));
14175   neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
14176 }
14177
14178 static void
14179 do_neon_rshift_sat_narrow_u (void)
14180 {
14181   /* FIXME: Types for narrowing. If operands are signed, results can be signed
14182      or unsigned. If operands are unsigned, results must also be unsigned.  */
14183   struct neon_type_el et = neon_check_type (2, NS_DQI,
14184     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14185   int imm = inst.operands[2].imm;
14186   /* This gets the bounds check, size encoding and immediate bits calculation
14187      right.  */
14188   et.size /= 2;
14189
14190   /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
14191      VQMOVUN.I<size> <Dd>, <Qm>.  */
14192   if (imm == 0)
14193     {
14194       inst.operands[2].present = 0;
14195       inst.instruction = N_MNEM_vqmovun;
14196       do_neon_qmovun ();
14197       return;
14198     }
14199
14200   constraint (imm < 1 || (unsigned)imm > et.size,
14201               _("immediate out of range"));
14202   /* FIXME: The manual is kind of unclear about what value U should have in
14203      VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
14204      must be 1.  */
14205   neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
14206 }
14207
14208 static void
14209 do_neon_movn (void)
14210 {
14211   struct neon_type_el et = neon_check_type (2, NS_DQ,
14212     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14213   NEON_ENCODE (INTEGER, inst);
14214   neon_two_same (0, 1, et.size / 2);
14215 }
14216
14217 static void
14218 do_neon_rshift_narrow (void)
14219 {
14220   struct neon_type_el et = neon_check_type (2, NS_DQI,
14221     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14222   int imm = inst.operands[2].imm;
14223   /* This gets the bounds check, size encoding and immediate bits calculation
14224      right.  */
14225   et.size /= 2;
14226
14227   /* If immediate is zero then we are a pseudo-instruction for
14228      VMOVN.I<size> <Dd>, <Qm>  */
14229   if (imm == 0)
14230     {
14231       inst.operands[2].present = 0;
14232       inst.instruction = N_MNEM_vmovn;
14233       do_neon_movn ();
14234       return;
14235     }
14236
14237   constraint (imm < 1 || (unsigned)imm > et.size,
14238               _("immediate out of range for narrowing operation"));
14239   neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
14240 }
14241
14242 static void
14243 do_neon_shll (void)
14244 {
14245   /* FIXME: Type checking when lengthening.  */
14246   struct neon_type_el et = neon_check_type (2, NS_QDI,
14247     N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
14248   unsigned imm = inst.operands[2].imm;
14249
14250   if (imm == et.size)
14251     {
14252       /* Maximum shift variant.  */
14253       NEON_ENCODE (INTEGER, inst);
14254       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14255       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14256       inst.instruction |= LOW4 (inst.operands[1].reg);
14257       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14258       inst.instruction |= neon_logbits (et.size) << 18;
14259
14260       neon_dp_fixup (&inst);
14261     }
14262   else
14263     {
14264       /* A more-specific type check for non-max versions.  */
14265       et = neon_check_type (2, NS_QDI,
14266         N_EQK | N_DBL, N_SU_32 | N_KEY);
14267       NEON_ENCODE (IMMED, inst);
14268       neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
14269     }
14270 }
14271
14272 /* Check the various types for the VCVT instruction, and return which version
14273    the current instruction is.  */
14274
14275 static int
14276 neon_cvt_flavour (enum neon_shape rs)
14277 {
14278 #define CVT_VAR(C,X,Y)                                                  \
14279   et = neon_check_type (2, rs, whole_reg | (X), whole_reg | (Y));       \
14280   if (et.type != NT_invtype)                                            \
14281     {                                                                   \
14282       inst.error = NULL;                                                \
14283       return (C);                                                       \
14284     }
14285   struct neon_type_el et;
14286   unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
14287                         || rs == NS_FF) ? N_VFP : 0;
14288   /* The instruction versions which take an immediate take one register
14289      argument, which is extended to the width of the full register. Thus the
14290      "source" and "destination" registers must have the same width.  Hack that
14291      here by making the size equal to the key (wider, in this case) operand.  */
14292   unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
14293
14294   CVT_VAR (0, N_S32, N_F32);
14295   CVT_VAR (1, N_U32, N_F32);
14296   CVT_VAR (2, N_F32, N_S32);
14297   CVT_VAR (3, N_F32, N_U32);
14298   /* Half-precision conversions.  */
14299   CVT_VAR (4, N_F32, N_F16);
14300   CVT_VAR (5, N_F16, N_F32);
14301
14302   whole_reg = N_VFP;
14303
14304   /* VFP instructions.  */
14305   CVT_VAR (6, N_F32, N_F64);
14306   CVT_VAR (7, N_F64, N_F32);
14307   CVT_VAR (8, N_S32, N_F64 | key);
14308   CVT_VAR (9, N_U32, N_F64 | key);
14309   CVT_VAR (10, N_F64 | key, N_S32);
14310   CVT_VAR (11, N_F64 | key, N_U32);
14311   /* VFP instructions with bitshift.  */
14312   CVT_VAR (12, N_F32 | key, N_S16);
14313   CVT_VAR (13, N_F32 | key, N_U16);
14314   CVT_VAR (14, N_F64 | key, N_S16);
14315   CVT_VAR (15, N_F64 | key, N_U16);
14316   CVT_VAR (16, N_S16, N_F32 | key);
14317   CVT_VAR (17, N_U16, N_F32 | key);
14318   CVT_VAR (18, N_S16, N_F64 | key);
14319   CVT_VAR (19, N_U16, N_F64 | key);
14320
14321   return -1;
14322 #undef CVT_VAR
14323 }
14324
14325 /* Neon-syntax VFP conversions.  */
14326
14327 static void
14328 do_vfp_nsyn_cvt (enum neon_shape rs, int flavour)
14329 {
14330   const char *opname = 0;
14331
14332   if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI)
14333     {
14334       /* Conversions with immediate bitshift.  */
14335       const char *enc[] =
14336         {
14337           "ftosls",
14338           "ftouls",
14339           "fsltos",
14340           "fultos",
14341           NULL,
14342           NULL,
14343           NULL,
14344           NULL,
14345           "ftosld",
14346           "ftould",
14347           "fsltod",
14348           "fultod",
14349           "fshtos",
14350           "fuhtos",
14351           "fshtod",
14352           "fuhtod",
14353           "ftoshs",
14354           "ftouhs",
14355           "ftoshd",
14356           "ftouhd"
14357         };
14358
14359       if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
14360         {
14361           opname = enc[flavour];
14362           constraint (inst.operands[0].reg != inst.operands[1].reg,
14363                       _("operands 0 and 1 must be the same register"));
14364           inst.operands[1] = inst.operands[2];
14365           memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
14366         }
14367     }
14368   else
14369     {
14370       /* Conversions without bitshift.  */
14371       const char *enc[] =
14372         {
14373           "ftosis",
14374           "ftouis",
14375           "fsitos",
14376           "fuitos",
14377           "NULL",
14378           "NULL",
14379           "fcvtsd",
14380           "fcvtds",
14381           "ftosid",
14382           "ftouid",
14383           "fsitod",
14384           "fuitod"
14385         };
14386
14387       if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
14388         opname = enc[flavour];
14389     }
14390
14391   if (opname)
14392     do_vfp_nsyn_opcode (opname);
14393 }
14394
14395 static void
14396 do_vfp_nsyn_cvtz (void)
14397 {
14398   enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_NULL);
14399   int flavour = neon_cvt_flavour (rs);
14400   const char *enc[] =
14401     {
14402       "ftosizs",
14403       "ftouizs",
14404       NULL,
14405       NULL,
14406       NULL,
14407       NULL,
14408       NULL,
14409       NULL,
14410       "ftosizd",
14411       "ftouizd"
14412     };
14413
14414   if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
14415     do_vfp_nsyn_opcode (enc[flavour]);
14416 }
14417
14418 static void
14419 do_neon_cvt_1 (bfd_boolean round_to_zero ATTRIBUTE_UNUSED)
14420 {
14421   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
14422     NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ, NS_NULL);
14423   int flavour = neon_cvt_flavour (rs);
14424
14425   /* PR11109: Handle round-to-zero for VCVT conversions.  */
14426   if (round_to_zero
14427       && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_vfp_v2)
14428       && (flavour == 0 || flavour == 1 || flavour == 8 || flavour == 9)
14429       && (rs == NS_FD || rs == NS_FF))
14430     {
14431       do_vfp_nsyn_cvtz ();
14432       return;
14433     }
14434
14435   /* VFP rather than Neon conversions.  */
14436   if (flavour >= 6)
14437     {
14438       do_vfp_nsyn_cvt (rs, flavour);
14439       return;
14440     }
14441
14442   switch (rs)
14443     {
14444     case NS_DDI:
14445     case NS_QQI:
14446       {
14447         unsigned immbits;
14448         unsigned enctab[] = { 0x0000100, 0x1000100, 0x0, 0x1000000 };
14449
14450         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14451           return;
14452
14453         /* Fixed-point conversion with #0 immediate is encoded as an
14454            integer conversion.  */
14455         if (inst.operands[2].present && inst.operands[2].imm == 0)
14456           goto int_encode;
14457        immbits = 32 - inst.operands[2].imm;
14458         NEON_ENCODE (IMMED, inst);
14459         if (flavour != -1)
14460           inst.instruction |= enctab[flavour];
14461         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14462         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14463         inst.instruction |= LOW4 (inst.operands[1].reg);
14464         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14465         inst.instruction |= neon_quad (rs) << 6;
14466         inst.instruction |= 1 << 21;
14467         inst.instruction |= immbits << 16;
14468
14469         neon_dp_fixup (&inst);
14470       }
14471       break;
14472
14473     case NS_DD:
14474     case NS_QQ:
14475     int_encode:
14476       {
14477         unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080 };
14478
14479         NEON_ENCODE (INTEGER, inst);
14480
14481         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14482           return;
14483
14484         if (flavour != -1)
14485           inst.instruction |= enctab[flavour];
14486
14487         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14488         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14489         inst.instruction |= LOW4 (inst.operands[1].reg);
14490         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14491         inst.instruction |= neon_quad (rs) << 6;
14492         inst.instruction |= 2 << 18;
14493
14494         neon_dp_fixup (&inst);
14495       }
14496     break;
14497
14498     /* Half-precision conversions for Advanced SIMD -- neon.  */
14499     case NS_QD:
14500     case NS_DQ:
14501
14502       if ((rs == NS_DQ)
14503           && (inst.vectype.el[0].size != 16 || inst.vectype.el[1].size != 32))
14504           {
14505             as_bad (_("operand size must match register width"));
14506             break;
14507           }
14508
14509       if ((rs == NS_QD)
14510           && ((inst.vectype.el[0].size != 32 || inst.vectype.el[1].size != 16)))
14511           {
14512             as_bad (_("operand size must match register width"));
14513             break;
14514           }
14515
14516       if (rs == NS_DQ)
14517         inst.instruction = 0x3b60600;
14518       else
14519         inst.instruction = 0x3b60700;
14520
14521       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14522       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14523       inst.instruction |= LOW4 (inst.operands[1].reg);
14524       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14525       neon_dp_fixup (&inst);
14526       break;
14527
14528     default:
14529       /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32).  */
14530       do_vfp_nsyn_cvt (rs, flavour);
14531     }
14532 }
14533
14534 static void
14535 do_neon_cvtr (void)
14536 {
14537   do_neon_cvt_1 (FALSE);
14538 }
14539
14540 static void
14541 do_neon_cvt (void)
14542 {
14543   do_neon_cvt_1 (TRUE);
14544 }
14545
14546 static void
14547 do_neon_cvtb (void)
14548 {
14549   inst.instruction = 0xeb20a40;
14550
14551   /* The sizes are attached to the mnemonic.  */
14552   if (inst.vectype.el[0].type != NT_invtype
14553       && inst.vectype.el[0].size == 16)
14554     inst.instruction |= 0x00010000;
14555
14556   /* Programmer's syntax: the sizes are attached to the operands.  */
14557   else if (inst.operands[0].vectype.type != NT_invtype
14558            && inst.operands[0].vectype.size == 16)
14559     inst.instruction |= 0x00010000;
14560
14561   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
14562   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
14563   do_vfp_cond_or_thumb ();
14564 }
14565
14566
14567 static void
14568 do_neon_cvtt (void)
14569 {
14570   do_neon_cvtb ();
14571   inst.instruction |= 0x80;
14572 }
14573
14574 static void
14575 neon_move_immediate (void)
14576 {
14577   enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
14578   struct neon_type_el et = neon_check_type (2, rs,
14579     N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
14580   unsigned immlo, immhi = 0, immbits;
14581   int op, cmode, float_p;
14582
14583   constraint (et.type == NT_invtype,
14584               _("operand size must be specified for immediate VMOV"));
14585
14586   /* We start out as an MVN instruction if OP = 1, MOV otherwise.  */
14587   op = (inst.instruction & (1 << 5)) != 0;
14588
14589   immlo = inst.operands[1].imm;
14590   if (inst.operands[1].regisimm)
14591     immhi = inst.operands[1].reg;
14592
14593   constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
14594               _("immediate has bits set outside the operand size"));
14595
14596   float_p = inst.operands[1].immisfloat;
14597
14598   if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
14599                                         et.size, et.type)) == FAIL)
14600     {
14601       /* Invert relevant bits only.  */
14602       neon_invert_size (&immlo, &immhi, et.size);
14603       /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
14604          with one or the other; those cases are caught by
14605          neon_cmode_for_move_imm.  */
14606       op = !op;
14607       if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
14608                                             &op, et.size, et.type)) == FAIL)
14609         {
14610           first_error (_("immediate out of range"));
14611           return;
14612         }
14613     }
14614
14615   inst.instruction &= ~(1 << 5);
14616   inst.instruction |= op << 5;
14617
14618   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14619   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14620   inst.instruction |= neon_quad (rs) << 6;
14621   inst.instruction |= cmode << 8;
14622
14623   neon_write_immbits (immbits);
14624 }
14625
14626 static void
14627 do_neon_mvn (void)
14628 {
14629   if (inst.operands[1].isreg)
14630     {
14631       enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14632
14633       NEON_ENCODE (INTEGER, inst);
14634       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14635       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14636       inst.instruction |= LOW4 (inst.operands[1].reg);
14637       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14638       inst.instruction |= neon_quad (rs) << 6;
14639     }
14640   else
14641     {
14642       NEON_ENCODE (IMMED, inst);
14643       neon_move_immediate ();
14644     }
14645
14646   neon_dp_fixup (&inst);
14647 }
14648
14649 /* Encode instructions of form:
14650
14651   |28/24|23|22|21 20|19 16|15 12|11    8|7|6|5|4|3  0|
14652   |  U  |x |D |size | Rn  | Rd  |x x x x|N|x|M|x| Rm |  */
14653
14654 static void
14655 neon_mixed_length (struct neon_type_el et, unsigned size)
14656 {
14657   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14658   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14659   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14660   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14661   inst.instruction |= LOW4 (inst.operands[2].reg);
14662   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14663   inst.instruction |= (et.type == NT_unsigned) << 24;
14664   inst.instruction |= neon_logbits (size) << 20;
14665
14666   neon_dp_fixup (&inst);
14667 }
14668
14669 static void
14670 do_neon_dyadic_long (void)
14671 {
14672   /* FIXME: Type checking for lengthening op.  */
14673   struct neon_type_el et = neon_check_type (3, NS_QDD,
14674     N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
14675   neon_mixed_length (et, et.size);
14676 }
14677
14678 static void
14679 do_neon_abal (void)
14680 {
14681   struct neon_type_el et = neon_check_type (3, NS_QDD,
14682     N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
14683   neon_mixed_length (et, et.size);
14684 }
14685
14686 static void
14687 neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
14688 {
14689   if (inst.operands[2].isscalar)
14690     {
14691       struct neon_type_el et = neon_check_type (3, NS_QDS,
14692         N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
14693       NEON_ENCODE (SCALAR, inst);
14694       neon_mul_mac (et, et.type == NT_unsigned);
14695     }
14696   else
14697     {
14698       struct neon_type_el et = neon_check_type (3, NS_QDD,
14699         N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
14700       NEON_ENCODE (INTEGER, inst);
14701       neon_mixed_length (et, et.size);
14702     }
14703 }
14704
14705 static void
14706 do_neon_mac_maybe_scalar_long (void)
14707 {
14708   neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
14709 }
14710
14711 static void
14712 do_neon_dyadic_wide (void)
14713 {
14714   struct neon_type_el et = neon_check_type (3, NS_QQD,
14715     N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
14716   neon_mixed_length (et, et.size);
14717 }
14718
14719 static void
14720 do_neon_dyadic_narrow (void)
14721 {
14722   struct neon_type_el et = neon_check_type (3, NS_QDD,
14723     N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
14724   /* Operand sign is unimportant, and the U bit is part of the opcode,
14725      so force the operand type to integer.  */
14726   et.type = NT_integer;
14727   neon_mixed_length (et, et.size / 2);
14728 }
14729
14730 static void
14731 do_neon_mul_sat_scalar_long (void)
14732 {
14733   neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
14734 }
14735
14736 static void
14737 do_neon_vmull (void)
14738 {
14739   if (inst.operands[2].isscalar)
14740     do_neon_mac_maybe_scalar_long ();
14741   else
14742     {
14743       struct neon_type_el et = neon_check_type (3, NS_QDD,
14744         N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_KEY);
14745       if (et.type == NT_poly)
14746         NEON_ENCODE (POLY, inst);
14747       else
14748         NEON_ENCODE (INTEGER, inst);
14749       /* For polynomial encoding, size field must be 0b00 and the U bit must be
14750          zero. Should be OK as-is.  */
14751       neon_mixed_length (et, et.size);
14752     }
14753 }
14754
14755 static void
14756 do_neon_ext (void)
14757 {
14758   enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
14759   struct neon_type_el et = neon_check_type (3, rs,
14760     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14761   unsigned imm = (inst.operands[3].imm * et.size) / 8;
14762
14763   constraint (imm >= (unsigned) (neon_quad (rs) ? 16 : 8),
14764               _("shift out of range"));
14765   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14766   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14767   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14768   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14769   inst.instruction |= LOW4 (inst.operands[2].reg);
14770   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14771   inst.instruction |= neon_quad (rs) << 6;
14772   inst.instruction |= imm << 8;
14773
14774   neon_dp_fixup (&inst);
14775 }
14776
14777 static void
14778 do_neon_rev (void)
14779 {
14780   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14781   struct neon_type_el et = neon_check_type (2, rs,
14782     N_EQK, N_8 | N_16 | N_32 | N_KEY);
14783   unsigned op = (inst.instruction >> 7) & 3;
14784   /* N (width of reversed regions) is encoded as part of the bitmask. We
14785      extract it here to check the elements to be reversed are smaller.
14786      Otherwise we'd get a reserved instruction.  */
14787   unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
14788   gas_assert (elsize != 0);
14789   constraint (et.size >= elsize,
14790               _("elements must be smaller than reversal region"));
14791   neon_two_same (neon_quad (rs), 1, et.size);
14792 }
14793
14794 static void
14795 do_neon_dup (void)
14796 {
14797   if (inst.operands[1].isscalar)
14798     {
14799       enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
14800       struct neon_type_el et = neon_check_type (2, rs,
14801         N_EQK, N_8 | N_16 | N_32 | N_KEY);
14802       unsigned sizebits = et.size >> 3;
14803       unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
14804       int logsize = neon_logbits (et.size);
14805       unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
14806
14807       if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
14808         return;
14809
14810       NEON_ENCODE (SCALAR, inst);
14811       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14812       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14813       inst.instruction |= LOW4 (dm);
14814       inst.instruction |= HI1 (dm) << 5;
14815       inst.instruction |= neon_quad (rs) << 6;
14816       inst.instruction |= x << 17;
14817       inst.instruction |= sizebits << 16;
14818
14819       neon_dp_fixup (&inst);
14820     }
14821   else
14822     {
14823       enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
14824       struct neon_type_el et = neon_check_type (2, rs,
14825         N_8 | N_16 | N_32 | N_KEY, N_EQK);
14826       /* Duplicate ARM register to lanes of vector.  */
14827       NEON_ENCODE (ARMREG, inst);
14828       switch (et.size)
14829         {
14830         case 8:  inst.instruction |= 0x400000; break;
14831         case 16: inst.instruction |= 0x000020; break;
14832         case 32: inst.instruction |= 0x000000; break;
14833         default: break;
14834         }
14835       inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
14836       inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
14837       inst.instruction |= HI1 (inst.operands[0].reg) << 7;
14838       inst.instruction |= neon_quad (rs) << 21;
14839       /* The encoding for this instruction is identical for the ARM and Thumb
14840          variants, except for the condition field.  */
14841       do_vfp_cond_or_thumb ();
14842     }
14843 }
14844
14845 /* VMOV has particularly many variations. It can be one of:
14846      0. VMOV<c><q> <Qd>, <Qm>
14847      1. VMOV<c><q> <Dd>, <Dm>
14848    (Register operations, which are VORR with Rm = Rn.)
14849      2. VMOV<c><q>.<dt> <Qd>, #<imm>
14850      3. VMOV<c><q>.<dt> <Dd>, #<imm>
14851    (Immediate loads.)
14852      4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
14853    (ARM register to scalar.)
14854      5. VMOV<c><q> <Dm>, <Rd>, <Rn>
14855    (Two ARM registers to vector.)
14856      6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
14857    (Scalar to ARM register.)
14858      7. VMOV<c><q> <Rd>, <Rn>, <Dm>
14859    (Vector to two ARM registers.)
14860      8. VMOV.F32 <Sd>, <Sm>
14861      9. VMOV.F64 <Dd>, <Dm>
14862    (VFP register moves.)
14863     10. VMOV.F32 <Sd>, #imm
14864     11. VMOV.F64 <Dd>, #imm
14865    (VFP float immediate load.)
14866     12. VMOV <Rd>, <Sm>
14867    (VFP single to ARM reg.)
14868     13. VMOV <Sd>, <Rm>
14869    (ARM reg to VFP single.)
14870     14. VMOV <Rd>, <Re>, <Sn>, <Sm>
14871    (Two ARM regs to two VFP singles.)
14872     15. VMOV <Sd>, <Se>, <Rn>, <Rm>
14873    (Two VFP singles to two ARM regs.)
14874
14875    These cases can be disambiguated using neon_select_shape, except cases 1/9
14876    and 3/11 which depend on the operand type too.
14877
14878    All the encoded bits are hardcoded by this function.
14879
14880    Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
14881    Cases 5, 7 may be used with VFPv2 and above.
14882
14883    FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
14884    can specify a type where it doesn't make sense to, and is ignored).  */
14885
14886 static void
14887 do_neon_mov (void)
14888 {
14889   enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
14890     NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR, NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
14891     NS_NULL);
14892   struct neon_type_el et;
14893   const char *ldconst = 0;
14894
14895   switch (rs)
14896     {
14897     case NS_DD:  /* case 1/9.  */
14898       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
14899       /* It is not an error here if no type is given.  */
14900       inst.error = NULL;
14901       if (et.type == NT_float && et.size == 64)
14902         {
14903           do_vfp_nsyn_opcode ("fcpyd");
14904           break;
14905         }
14906       /* fall through.  */
14907
14908     case NS_QQ:  /* case 0/1.  */
14909       {
14910         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14911           return;
14912         /* The architecture manual I have doesn't explicitly state which
14913            value the U bit should have for register->register moves, but
14914            the equivalent VORR instruction has U = 0, so do that.  */
14915         inst.instruction = 0x0200110;
14916         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14917         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14918         inst.instruction |= LOW4 (inst.operands[1].reg);
14919         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14920         inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14921         inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14922         inst.instruction |= neon_quad (rs) << 6;
14923
14924         neon_dp_fixup (&inst);
14925       }
14926       break;
14927
14928     case NS_DI:  /* case 3/11.  */
14929       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
14930       inst.error = NULL;
14931       if (et.type == NT_float && et.size == 64)
14932         {
14933           /* case 11 (fconstd).  */
14934           ldconst = "fconstd";
14935           goto encode_fconstd;
14936         }
14937       /* fall through.  */
14938
14939     case NS_QI:  /* case 2/3.  */
14940       if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14941         return;
14942       inst.instruction = 0x0800010;
14943       neon_move_immediate ();
14944       neon_dp_fixup (&inst);
14945       break;
14946
14947     case NS_SR:  /* case 4.  */
14948       {
14949         unsigned bcdebits = 0;
14950         int logsize;
14951         unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
14952         unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
14953
14954         et = neon_check_type (2, NS_NULL, N_8 | N_16 | N_32 | N_KEY, N_EQK);
14955         logsize = neon_logbits (et.size);
14956
14957         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
14958                     _(BAD_FPU));
14959         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
14960                     && et.size != 32, _(BAD_FPU));
14961         constraint (et.type == NT_invtype, _("bad type for scalar"));
14962         constraint (x >= 64 / et.size, _("scalar index out of range"));
14963
14964         switch (et.size)
14965           {
14966           case 8:  bcdebits = 0x8; break;
14967           case 16: bcdebits = 0x1; break;
14968           case 32: bcdebits = 0x0; break;
14969           default: ;
14970           }
14971
14972         bcdebits |= x << logsize;
14973
14974         inst.instruction = 0xe000b10;
14975         do_vfp_cond_or_thumb ();
14976         inst.instruction |= LOW4 (dn) << 16;
14977         inst.instruction |= HI1 (dn) << 7;
14978         inst.instruction |= inst.operands[1].reg << 12;
14979         inst.instruction |= (bcdebits & 3) << 5;
14980         inst.instruction |= (bcdebits >> 2) << 21;
14981       }
14982       break;
14983
14984     case NS_DRR:  /* case 5 (fmdrr).  */
14985       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
14986                   _(BAD_FPU));
14987
14988       inst.instruction = 0xc400b10;
14989       do_vfp_cond_or_thumb ();
14990       inst.instruction |= LOW4 (inst.operands[0].reg);
14991       inst.instruction |= HI1 (inst.operands[0].reg) << 5;
14992       inst.instruction |= inst.operands[1].reg << 12;
14993       inst.instruction |= inst.operands[2].reg << 16;
14994       break;
14995
14996     case NS_RS:  /* case 6.  */
14997       {
14998         unsigned logsize;
14999         unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
15000         unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
15001         unsigned abcdebits = 0;
15002
15003         et = neon_check_type (2, NS_NULL,
15004                               N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
15005         logsize = neon_logbits (et.size);
15006
15007         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
15008                     _(BAD_FPU));
15009         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
15010                     && et.size != 32, _(BAD_FPU));
15011         constraint (et.type == NT_invtype, _("bad type for scalar"));
15012         constraint (x >= 64 / et.size, _("scalar index out of range"));
15013
15014         switch (et.size)
15015           {
15016           case 8:  abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
15017           case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
15018           case 32: abcdebits = 0x00; break;
15019           default: ;
15020           }
15021
15022         abcdebits |= x << logsize;
15023         inst.instruction = 0xe100b10;
15024         do_vfp_cond_or_thumb ();
15025         inst.instruction |= LOW4 (dn) << 16;
15026         inst.instruction |= HI1 (dn) << 7;
15027         inst.instruction |= inst.operands[0].reg << 12;
15028         inst.instruction |= (abcdebits & 3) << 5;
15029         inst.instruction |= (abcdebits >> 2) << 21;
15030       }
15031       break;
15032
15033     case NS_RRD:  /* case 7 (fmrrd).  */
15034       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
15035                   _(BAD_FPU));
15036
15037       inst.instruction = 0xc500b10;
15038       do_vfp_cond_or_thumb ();
15039       inst.instruction |= inst.operands[0].reg << 12;
15040       inst.instruction |= inst.operands[1].reg << 16;
15041       inst.instruction |= LOW4 (inst.operands[2].reg);
15042       inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15043       break;
15044
15045     case NS_FF:  /* case 8 (fcpys).  */
15046       do_vfp_nsyn_opcode ("fcpys");
15047       break;
15048
15049     case NS_FI:  /* case 10 (fconsts).  */
15050       ldconst = "fconsts";
15051       encode_fconstd:
15052       if (is_quarter_float (inst.operands[1].imm))
15053         {
15054           inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
15055           do_vfp_nsyn_opcode (ldconst);
15056         }
15057       else
15058         first_error (_("immediate out of range"));
15059       break;
15060
15061     case NS_RF:  /* case 12 (fmrs).  */
15062       do_vfp_nsyn_opcode ("fmrs");
15063       break;
15064
15065     case NS_FR:  /* case 13 (fmsr).  */
15066       do_vfp_nsyn_opcode ("fmsr");
15067       break;
15068
15069     /* The encoders for the fmrrs and fmsrr instructions expect three operands
15070        (one of which is a list), but we have parsed four.  Do some fiddling to
15071        make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
15072        expect.  */
15073     case NS_RRFF:  /* case 14 (fmrrs).  */
15074       constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
15075                   _("VFP registers must be adjacent"));
15076       inst.operands[2].imm = 2;
15077       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
15078       do_vfp_nsyn_opcode ("fmrrs");
15079       break;
15080
15081     case NS_FFRR:  /* case 15 (fmsrr).  */
15082       constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
15083                   _("VFP registers must be adjacent"));
15084       inst.operands[1] = inst.operands[2];
15085       inst.operands[2] = inst.operands[3];
15086       inst.operands[0].imm = 2;
15087       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
15088       do_vfp_nsyn_opcode ("fmsrr");
15089       break;
15090
15091     default:
15092       abort ();
15093     }
15094 }
15095
15096 static void
15097 do_neon_rshift_round_imm (void)
15098 {
15099   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
15100   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
15101   int imm = inst.operands[2].imm;
15102
15103   /* imm == 0 case is encoded as VMOV for V{R}SHR.  */
15104   if (imm == 0)
15105     {
15106       inst.operands[2].present = 0;
15107       do_neon_mov ();
15108       return;
15109     }
15110
15111   constraint (imm < 1 || (unsigned)imm > et.size,
15112               _("immediate out of range for shift"));
15113   neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
15114                   et.size - imm);
15115 }
15116
15117 static void
15118 do_neon_movl (void)
15119 {
15120   struct neon_type_el et = neon_check_type (2, NS_QD,
15121     N_EQK | N_DBL, N_SU_32 | N_KEY);
15122   unsigned sizebits = et.size >> 3;
15123   inst.instruction |= sizebits << 19;
15124   neon_two_same (0, et.type == NT_unsigned, -1);
15125 }
15126
15127 static void
15128 do_neon_trn (void)
15129 {
15130   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15131   struct neon_type_el et = neon_check_type (2, rs,
15132     N_EQK, N_8 | N_16 | N_32 | N_KEY);
15133   NEON_ENCODE (INTEGER, inst);
15134   neon_two_same (neon_quad (rs), 1, et.size);
15135 }
15136
15137 static void
15138 do_neon_zip_uzp (void)
15139 {
15140   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15141   struct neon_type_el et = neon_check_type (2, rs,
15142     N_EQK, N_8 | N_16 | N_32 | N_KEY);
15143   if (rs == NS_DD && et.size == 32)
15144     {
15145       /* Special case: encode as VTRN.32 <Dd>, <Dm>.  */
15146       inst.instruction = N_MNEM_vtrn;
15147       do_neon_trn ();
15148       return;
15149     }
15150   neon_two_same (neon_quad (rs), 1, et.size);
15151 }
15152
15153 static void
15154 do_neon_sat_abs_neg (void)
15155 {
15156   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15157   struct neon_type_el et = neon_check_type (2, rs,
15158     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
15159   neon_two_same (neon_quad (rs), 1, et.size);
15160 }
15161
15162 static void
15163 do_neon_pair_long (void)
15164 {
15165   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15166   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
15167   /* Unsigned is encoded in OP field (bit 7) for these instruction.  */
15168   inst.instruction |= (et.type == NT_unsigned) << 7;
15169   neon_two_same (neon_quad (rs), 1, et.size);
15170 }
15171
15172 static void
15173 do_neon_recip_est (void)
15174 {
15175   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15176   struct neon_type_el et = neon_check_type (2, rs,
15177     N_EQK | N_FLT, N_F32 | N_U32 | N_KEY);
15178   inst.instruction |= (et.type == NT_float) << 8;
15179   neon_two_same (neon_quad (rs), 1, et.size);
15180 }
15181
15182 static void
15183 do_neon_cls (void)
15184 {
15185   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15186   struct neon_type_el et = neon_check_type (2, rs,
15187     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
15188   neon_two_same (neon_quad (rs), 1, et.size);
15189 }
15190
15191 static void
15192 do_neon_clz (void)
15193 {
15194   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15195   struct neon_type_el et = neon_check_type (2, rs,
15196     N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
15197   neon_two_same (neon_quad (rs), 1, et.size);
15198 }
15199
15200 static void
15201 do_neon_cnt (void)
15202 {
15203   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15204   struct neon_type_el et = neon_check_type (2, rs,
15205     N_EQK | N_INT, N_8 | N_KEY);
15206   neon_two_same (neon_quad (rs), 1, et.size);
15207 }
15208
15209 static void
15210 do_neon_swp (void)
15211 {
15212   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15213   neon_two_same (neon_quad (rs), 1, -1);
15214 }
15215
15216 static void
15217 do_neon_tbl_tbx (void)
15218 {
15219   unsigned listlenbits;
15220   neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
15221
15222   if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
15223     {
15224       first_error (_("bad list length for table lookup"));
15225       return;
15226     }
15227
15228   listlenbits = inst.operands[1].imm - 1;
15229   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15230   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15231   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15232   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15233   inst.instruction |= LOW4 (inst.operands[2].reg);
15234   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15235   inst.instruction |= listlenbits << 8;
15236
15237   neon_dp_fixup (&inst);
15238 }
15239
15240 static void
15241 do_neon_ldm_stm (void)
15242 {
15243   /* P, U and L bits are part of bitmask.  */
15244   int is_dbmode = (inst.instruction & (1 << 24)) != 0;
15245   unsigned offsetbits = inst.operands[1].imm * 2;
15246
15247   if (inst.operands[1].issingle)
15248     {
15249       do_vfp_nsyn_ldm_stm (is_dbmode);
15250       return;
15251     }
15252
15253   constraint (is_dbmode && !inst.operands[0].writeback,
15254               _("writeback (!) must be used for VLDMDB and VSTMDB"));
15255
15256   constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
15257               _("register list must contain at least 1 and at most 16 "
15258                 "registers"));
15259
15260   inst.instruction |= inst.operands[0].reg << 16;
15261   inst.instruction |= inst.operands[0].writeback << 21;
15262   inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
15263   inst.instruction |= HI1 (inst.operands[1].reg) << 22;
15264
15265   inst.instruction |= offsetbits;
15266
15267   do_vfp_cond_or_thumb ();
15268 }
15269
15270 static void
15271 do_neon_ldr_str (void)
15272 {
15273   int is_ldr = (inst.instruction & (1 << 20)) != 0;
15274
15275   /* Use of PC in vstr in ARM mode is deprecated in ARMv7.
15276      And is UNPREDICTABLE in thumb mode.  */
15277   if (!is_ldr
15278       && inst.operands[1].reg == REG_PC
15279       && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
15280     {
15281       if (!thumb_mode && warn_on_deprecated)
15282         as_warn (_("Use of PC here is deprecated"));
15283       else
15284         inst.error = _("Use of PC here is UNPREDICTABLE");
15285     }
15286
15287   if (inst.operands[0].issingle)
15288     {
15289       if (is_ldr)
15290         do_vfp_nsyn_opcode ("flds");
15291       else
15292         do_vfp_nsyn_opcode ("fsts");
15293     }
15294   else
15295     {
15296       if (is_ldr)
15297         do_vfp_nsyn_opcode ("fldd");
15298       else
15299         do_vfp_nsyn_opcode ("fstd");
15300     }
15301 }
15302
15303 /* "interleave" version also handles non-interleaving register VLD1/VST1
15304    instructions.  */
15305
15306 static void
15307 do_neon_ld_st_interleave (void)
15308 {
15309   struct neon_type_el et = neon_check_type (1, NS_NULL,
15310                                             N_8 | N_16 | N_32 | N_64);
15311   unsigned alignbits = 0;
15312   unsigned idx;
15313   /* The bits in this table go:
15314      0: register stride of one (0) or two (1)
15315      1,2: register list length, minus one (1, 2, 3, 4).
15316      3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
15317      We use -1 for invalid entries.  */
15318   const int typetable[] =
15319     {
15320       0x7,  -1, 0xa,  -1, 0x6,  -1, 0x2,  -1, /* VLD1 / VST1.  */
15321        -1,  -1, 0x8, 0x9,  -1,  -1, 0x3,  -1, /* VLD2 / VST2.  */
15322        -1,  -1,  -1,  -1, 0x4, 0x5,  -1,  -1, /* VLD3 / VST3.  */
15323        -1,  -1,  -1,  -1,  -1,  -1, 0x0, 0x1  /* VLD4 / VST4.  */
15324     };
15325   int typebits;
15326
15327   if (et.type == NT_invtype)
15328     return;
15329
15330   if (inst.operands[1].immisalign)
15331     switch (inst.operands[1].imm >> 8)
15332       {
15333       case 64: alignbits = 1; break;
15334       case 128:
15335         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2
15336             && NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
15337           goto bad_alignment;
15338         alignbits = 2;
15339         break;
15340       case 256:
15341         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
15342           goto bad_alignment;
15343         alignbits = 3;
15344         break;
15345       default:
15346       bad_alignment:
15347         first_error (_("bad alignment"));
15348         return;
15349       }
15350
15351   inst.instruction |= alignbits << 4;
15352   inst.instruction |= neon_logbits (et.size) << 6;
15353
15354   /* Bits [4:6] of the immediate in a list specifier encode register stride
15355      (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
15356      VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
15357      up the right value for "type" in a table based on this value and the given
15358      list style, then stick it back.  */
15359   idx = ((inst.operands[0].imm >> 4) & 7)
15360         | (((inst.instruction >> 8) & 3) << 3);
15361
15362   typebits = typetable[idx];
15363
15364   constraint (typebits == -1, _("bad list type for instruction"));
15365
15366   inst.instruction &= ~0xf00;
15367   inst.instruction |= typebits << 8;
15368 }
15369
15370 /* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
15371    *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
15372    otherwise. The variable arguments are a list of pairs of legal (size, align)
15373    values, terminated with -1.  */
15374
15375 static int
15376 neon_alignment_bit (int size, int align, int *do_align, ...)
15377 {
15378   va_list ap;
15379   int result = FAIL, thissize, thisalign;
15380
15381   if (!inst.operands[1].immisalign)
15382     {
15383       *do_align = 0;
15384       return SUCCESS;
15385     }
15386
15387   va_start (ap, do_align);
15388
15389   do
15390     {
15391       thissize = va_arg (ap, int);
15392       if (thissize == -1)
15393         break;
15394       thisalign = va_arg (ap, int);
15395
15396       if (size == thissize && align == thisalign)
15397         result = SUCCESS;
15398     }
15399   while (result != SUCCESS);
15400
15401   va_end (ap);
15402
15403   if (result == SUCCESS)
15404     *do_align = 1;
15405   else
15406     first_error (_("unsupported alignment for instruction"));
15407
15408   return result;
15409 }
15410
15411 static void
15412 do_neon_ld_st_lane (void)
15413 {
15414   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
15415   int align_good, do_align = 0;
15416   int logsize = neon_logbits (et.size);
15417   int align = inst.operands[1].imm >> 8;
15418   int n = (inst.instruction >> 8) & 3;
15419   int max_el = 64 / et.size;
15420
15421   if (et.type == NT_invtype)
15422     return;
15423
15424   constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
15425               _("bad list length"));
15426   constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
15427               _("scalar index out of range"));
15428   constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
15429               && et.size == 8,
15430               _("stride of 2 unavailable when element size is 8"));
15431
15432   switch (n)
15433     {
15434     case 0:  /* VLD1 / VST1.  */
15435       align_good = neon_alignment_bit (et.size, align, &do_align, 16, 16,
15436                                        32, 32, -1);
15437       if (align_good == FAIL)
15438         return;
15439       if (do_align)
15440         {
15441           unsigned alignbits = 0;
15442           switch (et.size)
15443             {
15444             case 16: alignbits = 0x1; break;
15445             case 32: alignbits = 0x3; break;
15446             default: ;
15447             }
15448           inst.instruction |= alignbits << 4;
15449         }
15450       break;
15451
15452     case 1:  /* VLD2 / VST2.  */
15453       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 16, 16, 32,
15454                                        32, 64, -1);
15455       if (align_good == FAIL)
15456         return;
15457       if (do_align)
15458         inst.instruction |= 1 << 4;
15459       break;
15460
15461     case 2:  /* VLD3 / VST3.  */
15462       constraint (inst.operands[1].immisalign,
15463                   _("can't use alignment with this instruction"));
15464       break;
15465
15466     case 3:  /* VLD4 / VST4.  */
15467       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15468                                        16, 64, 32, 64, 32, 128, -1);
15469       if (align_good == FAIL)
15470         return;
15471       if (do_align)
15472         {
15473           unsigned alignbits = 0;
15474           switch (et.size)
15475             {
15476             case 8:  alignbits = 0x1; break;
15477             case 16: alignbits = 0x1; break;
15478             case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
15479             default: ;
15480             }
15481           inst.instruction |= alignbits << 4;
15482         }
15483       break;
15484
15485     default: ;
15486     }
15487
15488   /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32.  */
15489   if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15490     inst.instruction |= 1 << (4 + logsize);
15491
15492   inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
15493   inst.instruction |= logsize << 10;
15494 }
15495
15496 /* Encode single n-element structure to all lanes VLD<n> instructions.  */
15497
15498 static void
15499 do_neon_ld_dup (void)
15500 {
15501   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
15502   int align_good, do_align = 0;
15503
15504   if (et.type == NT_invtype)
15505     return;
15506
15507   switch ((inst.instruction >> 8) & 3)
15508     {
15509     case 0:  /* VLD1.  */
15510       gas_assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
15511       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
15512                                        &do_align, 16, 16, 32, 32, -1);
15513       if (align_good == FAIL)
15514         return;
15515       switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
15516         {
15517         case 1: break;
15518         case 2: inst.instruction |= 1 << 5; break;
15519         default: first_error (_("bad list length")); return;
15520         }
15521       inst.instruction |= neon_logbits (et.size) << 6;
15522       break;
15523
15524     case 1:  /* VLD2.  */
15525       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
15526                                        &do_align, 8, 16, 16, 32, 32, 64, -1);
15527       if (align_good == FAIL)
15528         return;
15529       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
15530                   _("bad list length"));
15531       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15532         inst.instruction |= 1 << 5;
15533       inst.instruction |= neon_logbits (et.size) << 6;
15534       break;
15535
15536     case 2:  /* VLD3.  */
15537       constraint (inst.operands[1].immisalign,
15538                   _("can't use alignment with this instruction"));
15539       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
15540                   _("bad list length"));
15541       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15542         inst.instruction |= 1 << 5;
15543       inst.instruction |= neon_logbits (et.size) << 6;
15544       break;
15545
15546     case 3:  /* VLD4.  */
15547       {
15548         int align = inst.operands[1].imm >> 8;
15549         align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15550                                          16, 64, 32, 64, 32, 128, -1);
15551         if (align_good == FAIL)
15552           return;
15553         constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
15554                     _("bad list length"));
15555         if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15556           inst.instruction |= 1 << 5;
15557         if (et.size == 32 && align == 128)
15558           inst.instruction |= 0x3 << 6;
15559         else
15560           inst.instruction |= neon_logbits (et.size) << 6;
15561       }
15562       break;
15563
15564     default: ;
15565     }
15566
15567   inst.instruction |= do_align << 4;
15568 }
15569
15570 /* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
15571    apart from bits [11:4].  */
15572
15573 static void
15574 do_neon_ldx_stx (void)
15575 {
15576   if (inst.operands[1].isreg)
15577     constraint (inst.operands[1].reg == REG_PC, BAD_PC);
15578
15579   switch (NEON_LANE (inst.operands[0].imm))
15580     {
15581     case NEON_INTERLEAVE_LANES:
15582       NEON_ENCODE (INTERLV, inst);
15583       do_neon_ld_st_interleave ();
15584       break;
15585
15586     case NEON_ALL_LANES:
15587       NEON_ENCODE (DUP, inst);
15588       do_neon_ld_dup ();
15589       break;
15590
15591     default:
15592       NEON_ENCODE (LANE, inst);
15593       do_neon_ld_st_lane ();
15594     }
15595
15596   /* L bit comes from bit mask.  */
15597   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15598   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15599   inst.instruction |= inst.operands[1].reg << 16;
15600
15601   if (inst.operands[1].postind)
15602     {
15603       int postreg = inst.operands[1].imm & 0xf;
15604       constraint (!inst.operands[1].immisreg,
15605                   _("post-index must be a register"));
15606       constraint (postreg == 0xd || postreg == 0xf,
15607                   _("bad register for post-index"));
15608       inst.instruction |= postreg;
15609     }
15610   else if (inst.operands[1].writeback)
15611     {
15612       inst.instruction |= 0xd;
15613     }
15614   else
15615     inst.instruction |= 0xf;
15616
15617   if (thumb_mode)
15618     inst.instruction |= 0xf9000000;
15619   else
15620     inst.instruction |= 0xf4000000;
15621 }
15622 \f
15623 /* Overall per-instruction processing.  */
15624
15625 /* We need to be able to fix up arbitrary expressions in some statements.
15626    This is so that we can handle symbols that are an arbitrary distance from
15627    the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
15628    which returns part of an address in a form which will be valid for
15629    a data instruction.  We do this by pushing the expression into a symbol
15630    in the expr_section, and creating a fix for that.  */
15631
15632 static void
15633 fix_new_arm (fragS *       frag,
15634              int           where,
15635              short int     size,
15636              expressionS * exp,
15637              int           pc_rel,
15638              int           reloc)
15639 {
15640   fixS *           new_fix;
15641
15642   switch (exp->X_op)
15643     {
15644     case O_constant:
15645       if (pc_rel)
15646         {
15647           /* Create an absolute valued symbol, so we have something to
15648              refer to in the object file.  Unfortunately for us, gas's
15649              generic expression parsing will already have folded out
15650              any use of .set foo/.type foo %function that may have
15651              been used to set type information of the target location,
15652              that's being specified symbolically.  We have to presume
15653              the user knows what they are doing.  */
15654           char name[16 + 8];
15655           symbolS *symbol;
15656
15657           sprintf (name, "*ABS*0x%lx", (unsigned long)exp->X_add_number);
15658
15659           symbol = symbol_find_or_make (name);
15660           S_SET_SEGMENT (symbol, absolute_section);
15661           symbol_set_frag (symbol, &zero_address_frag);
15662           S_SET_VALUE (symbol, exp->X_add_number);
15663           exp->X_op = O_symbol;
15664           exp->X_add_symbol = symbol;
15665           exp->X_add_number = 0;
15666         }
15667       /* FALLTHROUGH */
15668     case O_symbol:
15669     case O_add:
15670     case O_subtract:
15671       new_fix = fix_new_exp (frag, where, size, exp, pc_rel,
15672                              (enum bfd_reloc_code_real) reloc);
15673       break;
15674
15675     default:
15676       new_fix = (fixS *) fix_new (frag, where, size, make_expr_symbol (exp), 0,
15677                                   pc_rel, (enum bfd_reloc_code_real) reloc);
15678       break;
15679     }
15680
15681   /* Mark whether the fix is to a THUMB instruction, or an ARM
15682      instruction.  */
15683   new_fix->tc_fix_data = thumb_mode;
15684 }
15685
15686 /* Create a frg for an instruction requiring relaxation.  */
15687 static void
15688 output_relax_insn (void)
15689 {
15690   char * to;
15691   symbolS *sym;
15692   int offset;
15693
15694   /* The size of the instruction is unknown, so tie the debug info to the
15695      start of the instruction.  */
15696   dwarf2_emit_insn (0);
15697
15698   switch (inst.reloc.exp.X_op)
15699     {
15700     case O_symbol:
15701       sym = inst.reloc.exp.X_add_symbol;
15702       offset = inst.reloc.exp.X_add_number;
15703       break;
15704     case O_constant:
15705       sym = NULL;
15706       offset = inst.reloc.exp.X_add_number;
15707       break;
15708     default:
15709       sym = make_expr_symbol (&inst.reloc.exp);
15710       offset = 0;
15711       break;
15712   }
15713   to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
15714                  inst.relax, sym, offset, NULL/*offset, opcode*/);
15715   md_number_to_chars (to, inst.instruction, THUMB_SIZE);
15716 }
15717
15718 /* Write a 32-bit thumb instruction to buf.  */
15719 static void
15720 put_thumb32_insn (char * buf, unsigned long insn)
15721 {
15722   md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
15723   md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
15724 }
15725
15726 static void
15727 output_inst (const char * str)
15728 {
15729   char * to = NULL;
15730
15731   if (inst.error)
15732     {
15733       as_bad ("%s -- `%s'", inst.error, str);
15734       return;
15735     }
15736   if (inst.relax)
15737     {
15738       output_relax_insn ();
15739       return;
15740     }
15741   if (inst.size == 0)
15742     return;
15743
15744   to = frag_more (inst.size);
15745   /* PR 9814: Record the thumb mode into the current frag so that we know
15746      what type of NOP padding to use, if necessary.  We override any previous
15747      setting so that if the mode has changed then the NOPS that we use will
15748      match the encoding of the last instruction in the frag.  */
15749   frag_now->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
15750
15751   if (thumb_mode && (inst.size > THUMB_SIZE))
15752     {
15753       gas_assert (inst.size == (2 * THUMB_SIZE));
15754       put_thumb32_insn (to, inst.instruction);
15755     }
15756   else if (inst.size > INSN_SIZE)
15757     {
15758       gas_assert (inst.size == (2 * INSN_SIZE));
15759       md_number_to_chars (to, inst.instruction, INSN_SIZE);
15760       md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
15761     }
15762   else
15763     md_number_to_chars (to, inst.instruction, inst.size);
15764
15765   if (inst.reloc.type != BFD_RELOC_UNUSED)
15766     fix_new_arm (frag_now, to - frag_now->fr_literal,
15767                  inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
15768                  inst.reloc.type);
15769
15770   dwarf2_emit_insn (inst.size);
15771 }
15772
15773 static char *
15774 output_it_inst (int cond, int mask, char * to)
15775 {
15776   unsigned long instruction = 0xbf00;
15777
15778   mask &= 0xf;
15779   instruction |= mask;
15780   instruction |= cond << 4;
15781
15782   if (to == NULL)
15783     {
15784       to = frag_more (2);
15785 #ifdef OBJ_ELF
15786       dwarf2_emit_insn (2);
15787 #endif
15788     }
15789
15790   md_number_to_chars (to, instruction, 2);
15791
15792   return to;
15793 }
15794
15795 /* Tag values used in struct asm_opcode's tag field.  */
15796 enum opcode_tag
15797 {
15798   OT_unconditional,     /* Instruction cannot be conditionalized.
15799                            The ARM condition field is still 0xE.  */
15800   OT_unconditionalF,    /* Instruction cannot be conditionalized
15801                            and carries 0xF in its ARM condition field.  */
15802   OT_csuffix,           /* Instruction takes a conditional suffix.  */
15803   OT_csuffixF,          /* Some forms of the instruction take a conditional
15804                            suffix, others place 0xF where the condition field
15805                            would be.  */
15806   OT_cinfix3,           /* Instruction takes a conditional infix,
15807                            beginning at character index 3.  (In
15808                            unified mode, it becomes a suffix.)  */
15809   OT_cinfix3_deprecated, /* The same as OT_cinfix3.  This is used for
15810                             tsts, cmps, cmns, and teqs. */
15811   OT_cinfix3_legacy,    /* Legacy instruction takes a conditional infix at
15812                            character index 3, even in unified mode.  Used for
15813                            legacy instructions where suffix and infix forms
15814                            may be ambiguous.  */
15815   OT_csuf_or_in3,       /* Instruction takes either a conditional
15816                            suffix or an infix at character index 3.  */
15817   OT_odd_infix_unc,     /* This is the unconditional variant of an
15818                            instruction that takes a conditional infix
15819                            at an unusual position.  In unified mode,
15820                            this variant will accept a suffix.  */
15821   OT_odd_infix_0        /* Values greater than or equal to OT_odd_infix_0
15822                            are the conditional variants of instructions that
15823                            take conditional infixes in unusual positions.
15824                            The infix appears at character index
15825                            (tag - OT_odd_infix_0).  These are not accepted
15826                            in unified mode.  */
15827 };
15828
15829 /* Subroutine of md_assemble, responsible for looking up the primary
15830    opcode from the mnemonic the user wrote.  STR points to the
15831    beginning of the mnemonic.
15832
15833    This is not simply a hash table lookup, because of conditional
15834    variants.  Most instructions have conditional variants, which are
15835    expressed with a _conditional affix_ to the mnemonic.  If we were
15836    to encode each conditional variant as a literal string in the opcode
15837    table, it would have approximately 20,000 entries.
15838
15839    Most mnemonics take this affix as a suffix, and in unified syntax,
15840    'most' is upgraded to 'all'.  However, in the divided syntax, some
15841    instructions take the affix as an infix, notably the s-variants of
15842    the arithmetic instructions.  Of those instructions, all but six
15843    have the infix appear after the third character of the mnemonic.
15844
15845    Accordingly, the algorithm for looking up primary opcodes given
15846    an identifier is:
15847
15848    1. Look up the identifier in the opcode table.
15849       If we find a match, go to step U.
15850
15851    2. Look up the last two characters of the identifier in the
15852       conditions table.  If we find a match, look up the first N-2
15853       characters of the identifier in the opcode table.  If we
15854       find a match, go to step CE.
15855
15856    3. Look up the fourth and fifth characters of the identifier in
15857       the conditions table.  If we find a match, extract those
15858       characters from the identifier, and look up the remaining
15859       characters in the opcode table.  If we find a match, go
15860       to step CM.
15861
15862    4. Fail.
15863
15864    U. Examine the tag field of the opcode structure, in case this is
15865       one of the six instructions with its conditional infix in an
15866       unusual place.  If it is, the tag tells us where to find the
15867       infix; look it up in the conditions table and set inst.cond
15868       accordingly.  Otherwise, this is an unconditional instruction.
15869       Again set inst.cond accordingly.  Return the opcode structure.
15870
15871   CE. Examine the tag field to make sure this is an instruction that
15872       should receive a conditional suffix.  If it is not, fail.
15873       Otherwise, set inst.cond from the suffix we already looked up,
15874       and return the opcode structure.
15875
15876   CM. Examine the tag field to make sure this is an instruction that
15877       should receive a conditional infix after the third character.
15878       If it is not, fail.  Otherwise, undo the edits to the current
15879       line of input and proceed as for case CE.  */
15880
15881 static const struct asm_opcode *
15882 opcode_lookup (char **str)
15883 {
15884   char *end, *base;
15885   char *affix;
15886   const struct asm_opcode *opcode;
15887   const struct asm_cond *cond;
15888   char save[2];
15889
15890   /* Scan up to the end of the mnemonic, which must end in white space,
15891      '.' (in unified mode, or for Neon/VFP instructions), or end of string.  */
15892   for (base = end = *str; *end != '\0'; end++)
15893     if (*end == ' ' || *end == '.')
15894       break;
15895
15896   if (end == base)
15897     return NULL;
15898
15899   /* Handle a possible width suffix and/or Neon type suffix.  */
15900   if (end[0] == '.')
15901     {
15902       int offset = 2;
15903
15904       /* The .w and .n suffixes are only valid if the unified syntax is in
15905          use.  */
15906       if (unified_syntax && end[1] == 'w')
15907         inst.size_req = 4;
15908       else if (unified_syntax && end[1] == 'n')
15909         inst.size_req = 2;
15910       else
15911         offset = 0;
15912
15913       inst.vectype.elems = 0;
15914
15915       *str = end + offset;
15916
15917       if (end[offset] == '.')
15918         {
15919           /* See if we have a Neon type suffix (possible in either unified or
15920              non-unified ARM syntax mode).  */
15921           if (parse_neon_type (&inst.vectype, str) == FAIL)
15922             return NULL;
15923         }
15924       else if (end[offset] != '\0' && end[offset] != ' ')
15925         return NULL;
15926     }
15927   else
15928     *str = end;
15929
15930   /* Look for unaffixed or special-case affixed mnemonic.  */
15931   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15932                                                     end - base);
15933   if (opcode)
15934     {
15935       /* step U */
15936       if (opcode->tag < OT_odd_infix_0)
15937         {
15938           inst.cond = COND_ALWAYS;
15939           return opcode;
15940         }
15941
15942       if (warn_on_deprecated && unified_syntax)
15943         as_warn (_("conditional infixes are deprecated in unified syntax"));
15944       affix = base + (opcode->tag - OT_odd_infix_0);
15945       cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
15946       gas_assert (cond);
15947
15948       inst.cond = cond->value;
15949       return opcode;
15950     }
15951
15952   /* Cannot have a conditional suffix on a mnemonic of less than two
15953      characters.  */
15954   if (end - base < 3)
15955     return NULL;
15956
15957   /* Look for suffixed mnemonic.  */
15958   affix = end - 2;
15959   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
15960   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
15961                                                     affix - base);
15962   if (opcode && cond)
15963     {
15964       /* step CE */
15965       switch (opcode->tag)
15966         {
15967         case OT_cinfix3_legacy:
15968           /* Ignore conditional suffixes matched on infix only mnemonics.  */
15969           break;
15970
15971         case OT_cinfix3:
15972         case OT_cinfix3_deprecated:
15973         case OT_odd_infix_unc:
15974           if (!unified_syntax)
15975             return 0;
15976           /* else fall through */
15977
15978         case OT_csuffix:
15979         case OT_csuffixF:
15980         case OT_csuf_or_in3:
15981           inst.cond = cond->value;
15982           return opcode;
15983
15984         case OT_unconditional:
15985         case OT_unconditionalF:
15986           if (thumb_mode)
15987             inst.cond = cond->value;
15988           else
15989             {
15990               /* Delayed diagnostic.  */
15991               inst.error = BAD_COND;
15992               inst.cond = COND_ALWAYS;
15993             }
15994           return opcode;
15995
15996         default:
15997           return NULL;
15998         }
15999     }
16000
16001   /* Cannot have a usual-position infix on a mnemonic of less than
16002      six characters (five would be a suffix).  */
16003   if (end - base < 6)
16004     return NULL;
16005
16006   /* Look for infixed mnemonic in the usual position.  */
16007   affix = base + 3;
16008   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
16009   if (!cond)
16010     return NULL;
16011
16012   memcpy (save, affix, 2);
16013   memmove (affix, affix + 2, (end - affix) - 2);
16014   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16015                                                     (end - base) - 2);
16016   memmove (affix + 2, affix, (end - affix) - 2);
16017   memcpy (affix, save, 2);
16018
16019   if (opcode
16020       && (opcode->tag == OT_cinfix3
16021           || opcode->tag == OT_cinfix3_deprecated
16022           || opcode->tag == OT_csuf_or_in3
16023           || opcode->tag == OT_cinfix3_legacy))
16024     {
16025       /* Step CM.  */
16026       if (warn_on_deprecated && unified_syntax
16027           && (opcode->tag == OT_cinfix3
16028               || opcode->tag == OT_cinfix3_deprecated))
16029         as_warn (_("conditional infixes are deprecated in unified syntax"));
16030
16031       inst.cond = cond->value;
16032       return opcode;
16033     }
16034
16035   return NULL;
16036 }
16037
16038 /* This function generates an initial IT instruction, leaving its block
16039    virtually open for the new instructions. Eventually,
16040    the mask will be updated by now_it_add_mask () each time
16041    a new instruction needs to be included in the IT block.
16042    Finally, the block is closed with close_automatic_it_block ().
16043    The block closure can be requested either from md_assemble (),
16044    a tencode (), or due to a label hook.  */
16045
16046 static void
16047 new_automatic_it_block (int cond)
16048 {
16049   now_it.state = AUTOMATIC_IT_BLOCK;
16050   now_it.mask = 0x18;
16051   now_it.cc = cond;
16052   now_it.block_length = 1;
16053   mapping_state (MAP_THUMB);
16054   now_it.insn = output_it_inst (cond, now_it.mask, NULL);
16055 }
16056
16057 /* Close an automatic IT block.
16058    See comments in new_automatic_it_block ().  */
16059
16060 static void
16061 close_automatic_it_block (void)
16062 {
16063   now_it.mask = 0x10;
16064   now_it.block_length = 0;
16065 }
16066
16067 /* Update the mask of the current automatically-generated IT
16068    instruction. See comments in new_automatic_it_block ().  */
16069
16070 static void
16071 now_it_add_mask (int cond)
16072 {
16073 #define CLEAR_BIT(value, nbit)  ((value) & ~(1 << (nbit)))
16074 #define SET_BIT_VALUE(value, bitvalue, nbit)  (CLEAR_BIT (value, nbit) \
16075                                               | ((bitvalue) << (nbit)))
16076   const int resulting_bit = (cond & 1);
16077
16078   now_it.mask &= 0xf;
16079   now_it.mask = SET_BIT_VALUE (now_it.mask,
16080                                    resulting_bit,
16081                                   (5 - now_it.block_length));
16082   now_it.mask = SET_BIT_VALUE (now_it.mask,
16083                                    1,
16084                                    ((5 - now_it.block_length) - 1) );
16085   output_it_inst (now_it.cc, now_it.mask, now_it.insn);
16086
16087 #undef CLEAR_BIT
16088 #undef SET_BIT_VALUE
16089 }
16090
16091 /* The IT blocks handling machinery is accessed through the these functions:
16092      it_fsm_pre_encode ()               from md_assemble ()
16093      set_it_insn_type ()                optional, from the tencode functions
16094      set_it_insn_type_last ()           ditto
16095      in_it_block ()                     ditto
16096      it_fsm_post_encode ()              from md_assemble ()
16097      force_automatic_it_block_close ()  from label habdling functions
16098
16099    Rationale:
16100      1) md_assemble () calls it_fsm_pre_encode () before calling tencode (),
16101         initializing the IT insn type with a generic initial value depending
16102         on the inst.condition.
16103      2) During the tencode function, two things may happen:
16104         a) The tencode function overrides the IT insn type by
16105            calling either set_it_insn_type (type) or set_it_insn_type_last ().
16106         b) The tencode function queries the IT block state by
16107            calling in_it_block () (i.e. to determine narrow/not narrow mode).
16108
16109         Both set_it_insn_type and in_it_block run the internal FSM state
16110         handling function (handle_it_state), because: a) setting the IT insn
16111         type may incur in an invalid state (exiting the function),
16112         and b) querying the state requires the FSM to be updated.
16113         Specifically we want to avoid creating an IT block for conditional
16114         branches, so it_fsm_pre_encode is actually a guess and we can't
16115         determine whether an IT block is required until the tencode () routine
16116         has decided what type of instruction this actually it.
16117         Because of this, if set_it_insn_type and in_it_block have to be used,
16118         set_it_insn_type has to be called first.
16119
16120         set_it_insn_type_last () is a wrapper of set_it_insn_type (type), that
16121         determines the insn IT type depending on the inst.cond code.
16122         When a tencode () routine encodes an instruction that can be
16123         either outside an IT block, or, in the case of being inside, has to be
16124         the last one, set_it_insn_type_last () will determine the proper
16125         IT instruction type based on the inst.cond code. Otherwise,
16126         set_it_insn_type can be called for overriding that logic or
16127         for covering other cases.
16128
16129         Calling handle_it_state () may not transition the IT block state to
16130         OUTSIDE_IT_BLOCK immediatelly, since the (current) state could be
16131         still queried. Instead, if the FSM determines that the state should
16132         be transitioned to OUTSIDE_IT_BLOCK, a flag is marked to be closed
16133         after the tencode () function: that's what it_fsm_post_encode () does.
16134
16135         Since in_it_block () calls the state handling function to get an
16136         updated state, an error may occur (due to invalid insns combination).
16137         In that case, inst.error is set.
16138         Therefore, inst.error has to be checked after the execution of
16139         the tencode () routine.
16140
16141      3) Back in md_assemble(), it_fsm_post_encode () is called to commit
16142         any pending state change (if any) that didn't take place in
16143         handle_it_state () as explained above.  */
16144
16145 static void
16146 it_fsm_pre_encode (void)
16147 {
16148   if (inst.cond != COND_ALWAYS)
16149     inst.it_insn_type = INSIDE_IT_INSN;
16150   else
16151     inst.it_insn_type = OUTSIDE_IT_INSN;
16152
16153   now_it.state_handled = 0;
16154 }
16155
16156 /* IT state FSM handling function.  */
16157
16158 static int
16159 handle_it_state (void)
16160 {
16161   now_it.state_handled = 1;
16162
16163   switch (now_it.state)
16164     {
16165     case OUTSIDE_IT_BLOCK:
16166       switch (inst.it_insn_type)
16167         {
16168         case OUTSIDE_IT_INSN:
16169           break;
16170
16171         case INSIDE_IT_INSN:
16172         case INSIDE_IT_LAST_INSN:
16173           if (thumb_mode == 0)
16174             {
16175               if (unified_syntax
16176                   && !(implicit_it_mode & IMPLICIT_IT_MODE_ARM))
16177                 as_tsktsk (_("Warning: conditional outside an IT block"\
16178                              " for Thumb."));
16179             }
16180           else
16181             {
16182               if ((implicit_it_mode & IMPLICIT_IT_MODE_THUMB)
16183                   && ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2))
16184                 {
16185                   /* Automatically generate the IT instruction.  */
16186                   new_automatic_it_block (inst.cond);
16187                   if (inst.it_insn_type == INSIDE_IT_LAST_INSN)
16188                     close_automatic_it_block ();
16189                 }
16190               else
16191                 {
16192                   inst.error = BAD_OUT_IT;
16193                   return FAIL;
16194                 }
16195             }
16196           break;
16197
16198         case IF_INSIDE_IT_LAST_INSN:
16199         case NEUTRAL_IT_INSN:
16200           break;
16201
16202         case IT_INSN:
16203           now_it.state = MANUAL_IT_BLOCK;
16204           now_it.block_length = 0;
16205           break;
16206         }
16207       break;
16208
16209     case AUTOMATIC_IT_BLOCK:
16210       /* Three things may happen now:
16211          a) We should increment current it block size;
16212          b) We should close current it block (closing insn or 4 insns);
16213          c) We should close current it block and start a new one (due
16214          to incompatible conditions or
16215          4 insns-length block reached).  */
16216
16217       switch (inst.it_insn_type)
16218         {
16219         case OUTSIDE_IT_INSN:
16220           /* The closure of the block shall happen immediatelly,
16221              so any in_it_block () call reports the block as closed.  */
16222           force_automatic_it_block_close ();
16223           break;
16224
16225         case INSIDE_IT_INSN:
16226         case INSIDE_IT_LAST_INSN:
16227         case IF_INSIDE_IT_LAST_INSN:
16228           now_it.block_length++;
16229
16230           if (now_it.block_length > 4
16231               || !now_it_compatible (inst.cond))
16232             {
16233               force_automatic_it_block_close ();
16234               if (inst.it_insn_type != IF_INSIDE_IT_LAST_INSN)
16235                 new_automatic_it_block (inst.cond);
16236             }
16237           else
16238             {
16239               now_it_add_mask (inst.cond);
16240             }
16241
16242           if (now_it.state == AUTOMATIC_IT_BLOCK
16243               && (inst.it_insn_type == INSIDE_IT_LAST_INSN
16244                   || inst.it_insn_type == IF_INSIDE_IT_LAST_INSN))
16245             close_automatic_it_block ();
16246           break;
16247
16248         case NEUTRAL_IT_INSN:
16249           now_it.block_length++;
16250
16251           if (now_it.block_length > 4)
16252             force_automatic_it_block_close ();
16253           else
16254             now_it_add_mask (now_it.cc & 1);
16255           break;
16256
16257         case IT_INSN:
16258           close_automatic_it_block ();
16259           now_it.state = MANUAL_IT_BLOCK;
16260           break;
16261         }
16262       break;
16263
16264     case MANUAL_IT_BLOCK:
16265       {
16266         /* Check conditional suffixes.  */
16267         const int cond = now_it.cc ^ ((now_it.mask >> 4) & 1) ^ 1;
16268         int is_last;
16269         now_it.mask <<= 1;
16270         now_it.mask &= 0x1f;
16271         is_last = (now_it.mask == 0x10);
16272
16273         switch (inst.it_insn_type)
16274           {
16275           case OUTSIDE_IT_INSN:
16276             inst.error = BAD_NOT_IT;
16277             return FAIL;
16278
16279           case INSIDE_IT_INSN:
16280             if (cond != inst.cond)
16281               {
16282                 inst.error = BAD_IT_COND;
16283                 return FAIL;
16284               }
16285             break;
16286
16287           case INSIDE_IT_LAST_INSN:
16288           case IF_INSIDE_IT_LAST_INSN:
16289             if (cond != inst.cond)
16290               {
16291                 inst.error = BAD_IT_COND;
16292                 return FAIL;
16293               }
16294             if (!is_last)
16295               {
16296                 inst.error = BAD_BRANCH;
16297                 return FAIL;
16298               }
16299             break;
16300
16301           case NEUTRAL_IT_INSN:
16302             /* The BKPT instruction is unconditional even in an IT block.  */
16303             break;
16304
16305           case IT_INSN:
16306             inst.error = BAD_IT_IT;
16307             return FAIL;
16308           }
16309       }
16310       break;
16311     }
16312
16313   return SUCCESS;
16314 }
16315
16316 static void
16317 it_fsm_post_encode (void)
16318 {
16319   int is_last;
16320
16321   if (!now_it.state_handled)
16322     handle_it_state ();
16323
16324   is_last = (now_it.mask == 0x10);
16325   if (is_last)
16326     {
16327       now_it.state = OUTSIDE_IT_BLOCK;
16328       now_it.mask = 0;
16329     }
16330 }
16331
16332 static void
16333 force_automatic_it_block_close (void)
16334 {
16335   if (now_it.state == AUTOMATIC_IT_BLOCK)
16336     {
16337       close_automatic_it_block ();
16338       now_it.state = OUTSIDE_IT_BLOCK;
16339       now_it.mask = 0;
16340     }
16341 }
16342
16343 static int
16344 in_it_block (void)
16345 {
16346   if (!now_it.state_handled)
16347     handle_it_state ();
16348
16349   return now_it.state != OUTSIDE_IT_BLOCK;
16350 }
16351
16352 void
16353 md_assemble (char *str)
16354 {
16355   char *p = str;
16356   const struct asm_opcode * opcode;
16357
16358   /* Align the previous label if needed.  */
16359   if (last_label_seen != NULL)
16360     {
16361       symbol_set_frag (last_label_seen, frag_now);
16362       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
16363       S_SET_SEGMENT (last_label_seen, now_seg);
16364     }
16365
16366   memset (&inst, '\0', sizeof (inst));
16367   inst.reloc.type = BFD_RELOC_UNUSED;
16368
16369   opcode = opcode_lookup (&p);
16370   if (!opcode)
16371     {
16372       /* It wasn't an instruction, but it might be a register alias of
16373          the form alias .req reg, or a Neon .dn/.qn directive.  */
16374       if (! create_register_alias (str, p)
16375           && ! create_neon_reg_alias (str, p))
16376         as_bad (_("bad instruction `%s'"), str);
16377
16378       return;
16379     }
16380
16381   if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
16382     as_warn (_("s suffix on comparison instruction is deprecated"));
16383
16384   /* The value which unconditional instructions should have in place of the
16385      condition field.  */
16386   inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
16387
16388   if (thumb_mode)
16389     {
16390       arm_feature_set variant;
16391
16392       variant = cpu_variant;
16393       /* Only allow coprocessor instructions on Thumb-2 capable devices.  */
16394       if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
16395         ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
16396       /* Check that this instruction is supported for this CPU.  */
16397       if (!opcode->tvariant
16398           || (thumb_mode == 1
16399               && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
16400         {
16401           as_bad (_("selected processor does not support Thumb mode `%s'"), str);
16402           return;
16403         }
16404       if (inst.cond != COND_ALWAYS && !unified_syntax
16405           && opcode->tencode != do_t_branch)
16406         {
16407           as_bad (_("Thumb does not support conditional execution"));
16408           return;
16409         }
16410
16411       if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2))
16412         {
16413           if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23
16414               && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)
16415                    || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier)))
16416             {
16417               /* Two things are addressed here.
16418                  1) Implicit require narrow instructions on Thumb-1.
16419                     This avoids relaxation accidentally introducing Thumb-2
16420                      instructions.
16421                  2) Reject wide instructions in non Thumb-2 cores.  */
16422               if (inst.size_req == 0)
16423                 inst.size_req = 2;
16424               else if (inst.size_req == 4)
16425                 {
16426                   as_bad (_("selected processor does not support Thumb-2 mode `%s'"), str);
16427                   return;
16428                 }
16429             }
16430         }
16431
16432       inst.instruction = opcode->tvalue;
16433
16434       if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
16435         {
16436           /* Prepare the it_insn_type for those encodings that don't set
16437              it.  */
16438           it_fsm_pre_encode ();
16439
16440           opcode->tencode ();
16441
16442           it_fsm_post_encode ();
16443         }
16444
16445       if (!(inst.error || inst.relax))
16446         {
16447           gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
16448           inst.size = (inst.instruction > 0xffff ? 4 : 2);
16449           if (inst.size_req && inst.size_req != inst.size)
16450             {
16451               as_bad (_("cannot honor width suffix -- `%s'"), str);
16452               return;
16453             }
16454         }
16455
16456       /* Something has gone badly wrong if we try to relax a fixed size
16457          instruction.  */
16458       gas_assert (inst.size_req == 0 || !inst.relax);
16459
16460       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
16461                               *opcode->tvariant);
16462       /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
16463          set those bits when Thumb-2 32-bit instructions are seen.  ie.
16464          anything other than bl/blx and v6-M instructions.
16465          This is overly pessimistic for relaxable instructions.  */
16466       if (((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
16467            || inst.relax)
16468           && !(ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
16469                || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier)))
16470         ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
16471                                 arm_ext_v6t2);
16472
16473       check_neon_suffixes;
16474
16475       if (!inst.error)
16476         {
16477           mapping_state (MAP_THUMB);
16478         }
16479     }
16480   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
16481     {
16482       bfd_boolean is_bx;
16483
16484       /* bx is allowed on v5 cores, and sometimes on v4 cores.  */
16485       is_bx = (opcode->aencode == do_bx);
16486
16487       /* Check that this instruction is supported for this CPU.  */
16488       if (!(is_bx && fix_v4bx)
16489           && !(opcode->avariant &&
16490                ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
16491         {
16492           as_bad (_("selected processor does not support ARM mode `%s'"), str);
16493           return;
16494         }
16495       if (inst.size_req)
16496         {
16497           as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
16498           return;
16499         }
16500
16501       inst.instruction = opcode->avalue;
16502       if (opcode->tag == OT_unconditionalF)
16503         inst.instruction |= 0xF << 28;
16504       else
16505         inst.instruction |= inst.cond << 28;
16506       inst.size = INSN_SIZE;
16507       if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
16508         {
16509           it_fsm_pre_encode ();
16510           opcode->aencode ();
16511           it_fsm_post_encode ();
16512         }
16513       /* Arm mode bx is marked as both v4T and v5 because it's still required
16514          on a hypothetical non-thumb v5 core.  */
16515       if (is_bx)
16516         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
16517       else
16518         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
16519                                 *opcode->avariant);
16520
16521       check_neon_suffixes;
16522
16523       if (!inst.error)
16524         {
16525           mapping_state (MAP_ARM);
16526         }
16527     }
16528   else
16529     {
16530       as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
16531                 "-- `%s'"), str);
16532       return;
16533     }
16534   output_inst (str);
16535 }
16536
16537 static void
16538 check_it_blocks_finished (void)
16539 {
16540 #ifdef OBJ_ELF
16541   asection *sect;
16542
16543   for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
16544     if (seg_info (sect)->tc_segment_info_data.current_it.state
16545         == MANUAL_IT_BLOCK)
16546       {
16547         as_warn (_("section '%s' finished with an open IT block."),
16548                  sect->name);
16549       }
16550 #else
16551   if (now_it.state == MANUAL_IT_BLOCK)
16552     as_warn (_("file finished with an open IT block."));
16553 #endif
16554 }
16555
16556 /* Various frobbings of labels and their addresses.  */
16557
16558 void
16559 arm_start_line_hook (void)
16560 {
16561   last_label_seen = NULL;
16562 }
16563
16564 void
16565 arm_frob_label (symbolS * sym)
16566 {
16567   last_label_seen = sym;
16568
16569   ARM_SET_THUMB (sym, thumb_mode);
16570
16571 #if defined OBJ_COFF || defined OBJ_ELF
16572   ARM_SET_INTERWORK (sym, support_interwork);
16573 #endif
16574
16575   force_automatic_it_block_close ();
16576
16577   /* Note - do not allow local symbols (.Lxxx) to be labelled
16578      as Thumb functions.  This is because these labels, whilst
16579      they exist inside Thumb code, are not the entry points for
16580      possible ARM->Thumb calls.  Also, these labels can be used
16581      as part of a computed goto or switch statement.  eg gcc
16582      can generate code that looks like this:
16583
16584                 ldr  r2, [pc, .Laaa]
16585                 lsl  r3, r3, #2
16586                 ldr  r2, [r3, r2]
16587                 mov  pc, r2
16588
16589        .Lbbb:  .word .Lxxx
16590        .Lccc:  .word .Lyyy
16591        ..etc...
16592        .Laaa:   .word Lbbb
16593
16594      The first instruction loads the address of the jump table.
16595      The second instruction converts a table index into a byte offset.
16596      The third instruction gets the jump address out of the table.
16597      The fourth instruction performs the jump.
16598
16599      If the address stored at .Laaa is that of a symbol which has the
16600      Thumb_Func bit set, then the linker will arrange for this address
16601      to have the bottom bit set, which in turn would mean that the
16602      address computation performed by the third instruction would end
16603      up with the bottom bit set.  Since the ARM is capable of unaligned
16604      word loads, the instruction would then load the incorrect address
16605      out of the jump table, and chaos would ensue.  */
16606   if (label_is_thumb_function_name
16607       && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
16608       && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
16609     {
16610       /* When the address of a Thumb function is taken the bottom
16611          bit of that address should be set.  This will allow
16612          interworking between Arm and Thumb functions to work
16613          correctly.  */
16614
16615       THUMB_SET_FUNC (sym, 1);
16616
16617       label_is_thumb_function_name = FALSE;
16618     }
16619
16620   dwarf2_emit_label (sym);
16621 }
16622
16623 bfd_boolean
16624 arm_data_in_code (void)
16625 {
16626   if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
16627     {
16628       *input_line_pointer = '/';
16629       input_line_pointer += 5;
16630       *input_line_pointer = 0;
16631       return TRUE;
16632     }
16633
16634   return FALSE;
16635 }
16636
16637 char *
16638 arm_canonicalize_symbol_name (char * name)
16639 {
16640   int len;
16641
16642   if (thumb_mode && (len = strlen (name)) > 5
16643       && streq (name + len - 5, "/data"))
16644     *(name + len - 5) = 0;
16645
16646   return name;
16647 }
16648 \f
16649 /* Table of all register names defined by default.  The user can
16650    define additional names with .req.  Note that all register names
16651    should appear in both upper and lowercase variants.  Some registers
16652    also have mixed-case names.  */
16653
16654 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
16655 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
16656 #define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
16657 #define REGSET(p,t) \
16658   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
16659   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
16660   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
16661   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
16662 #define REGSETH(p,t) \
16663   REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
16664   REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
16665   REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
16666   REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
16667 #define REGSET2(p,t) \
16668   REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
16669   REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
16670   REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
16671   REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
16672 #define SPLRBANK(base,bank,t) \
16673   REGDEF(lr_##bank, 768|((base+0)<<16), t), \
16674   REGDEF(sp_##bank, 768|((base+1)<<16), t), \
16675   REGDEF(spsr_##bank, 768|(base<<16)|SPSR_BIT, t), \
16676   REGDEF(LR_##bank, 768|((base+0)<<16), t), \
16677   REGDEF(SP_##bank, 768|((base+1)<<16), t), \
16678   REGDEF(SPSR_##bank, 768|(base<<16)|SPSR_BIT, t)
16679
16680 static const struct reg_entry reg_names[] =
16681 {
16682   /* ARM integer registers.  */
16683   REGSET(r, RN), REGSET(R, RN),
16684
16685   /* ATPCS synonyms.  */
16686   REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
16687   REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
16688   REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
16689
16690   REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
16691   REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
16692   REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
16693
16694   /* Well-known aliases.  */
16695   REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
16696   REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
16697
16698   REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
16699   REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
16700
16701   /* Coprocessor numbers.  */
16702   REGSET(p, CP), REGSET(P, CP),
16703
16704   /* Coprocessor register numbers.  The "cr" variants are for backward
16705      compatibility.  */
16706   REGSET(c,  CN), REGSET(C, CN),
16707   REGSET(cr, CN), REGSET(CR, CN),
16708
16709   /* ARM banked registers.  */
16710   REGDEF(R8_usr,512|(0<<16),RNB), REGDEF(r8_usr,512|(0<<16),RNB),
16711   REGDEF(R9_usr,512|(1<<16),RNB), REGDEF(r9_usr,512|(1<<16),RNB),
16712   REGDEF(R10_usr,512|(2<<16),RNB), REGDEF(r10_usr,512|(2<<16),RNB),
16713   REGDEF(R11_usr,512|(3<<16),RNB), REGDEF(r11_usr,512|(3<<16),RNB),
16714   REGDEF(R12_usr,512|(4<<16),RNB), REGDEF(r12_usr,512|(4<<16),RNB),
16715   REGDEF(SP_usr,512|(5<<16),RNB), REGDEF(sp_usr,512|(5<<16),RNB),
16716   REGDEF(LR_usr,512|(6<<16),RNB), REGDEF(lr_usr,512|(6<<16),RNB),
16717
16718   REGDEF(R8_fiq,512|(8<<16),RNB), REGDEF(r8_fiq,512|(8<<16),RNB),
16719   REGDEF(R9_fiq,512|(9<<16),RNB), REGDEF(r9_fiq,512|(9<<16),RNB),
16720   REGDEF(R10_fiq,512|(10<<16),RNB), REGDEF(r10_fiq,512|(10<<16),RNB),
16721   REGDEF(R11_fiq,512|(11<<16),RNB), REGDEF(r11_fiq,512|(11<<16),RNB),
16722   REGDEF(R12_fiq,512|(12<<16),RNB), REGDEF(r12_fiq,512|(12<<16),RNB),
16723   REGDEF(SP_fiq,512|(13<<16),RNB), REGDEF(SP_fiq,512|(13<<16),RNB),
16724   REGDEF(LR_fiq,512|(14<<16),RNB), REGDEF(lr_fiq,512|(14<<16),RNB),
16725   REGDEF(SPSR_fiq,512|(14<<16)|SPSR_BIT,RNB), REGDEF(spsr_fiq,512|(14<<16)|SPSR_BIT,RNB),
16726
16727   SPLRBANK(0,IRQ,RNB), SPLRBANK(0,irq,RNB),
16728   SPLRBANK(2,SVC,RNB), SPLRBANK(2,svc,RNB),
16729   SPLRBANK(4,ABT,RNB), SPLRBANK(4,abt,RNB),
16730   SPLRBANK(6,UND,RNB), SPLRBANK(6,und,RNB),
16731   SPLRBANK(12,MON,RNB), SPLRBANK(12,mon,RNB),
16732   REGDEF(elr_hyp,768|(14<<16),RNB), REGDEF(ELR_hyp,768|(14<<16),RNB),
16733   REGDEF(sp_hyp,768|(15<<16),RNB), REGDEF(SP_hyp,768|(15<<16),RNB),
16734   REGDEF(spsr_hyp,768|(14<<16)|SPSR_BIT,RNB),
16735   REGDEF(SPSR_hyp,768|(14<<16)|SPSR_BIT,RNB),
16736
16737   /* FPA registers.  */
16738   REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
16739   REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
16740
16741   REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
16742   REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
16743
16744   /* VFP SP registers.  */
16745   REGSET(s,VFS),  REGSET(S,VFS),
16746   REGSETH(s,VFS), REGSETH(S,VFS),
16747
16748   /* VFP DP Registers.  */
16749   REGSET(d,VFD),  REGSET(D,VFD),
16750   /* Extra Neon DP registers.  */
16751   REGSETH(d,VFD), REGSETH(D,VFD),
16752
16753   /* Neon QP registers.  */
16754   REGSET2(q,NQ),  REGSET2(Q,NQ),
16755
16756   /* VFP control registers.  */
16757   REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
16758   REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
16759   REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
16760   REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
16761   REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
16762   REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
16763
16764   /* Maverick DSP coprocessor registers.  */
16765   REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
16766   REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
16767
16768   REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
16769   REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
16770   REGDEF(dspsc,0,DSPSC),
16771
16772   REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
16773   REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
16774   REGDEF(DSPSC,0,DSPSC),
16775
16776   /* iWMMXt data registers - p0, c0-15.  */
16777   REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
16778
16779   /* iWMMXt control registers - p1, c0-3.  */
16780   REGDEF(wcid,  0,MMXWC),  REGDEF(wCID,  0,MMXWC),  REGDEF(WCID,  0,MMXWC),
16781   REGDEF(wcon,  1,MMXWC),  REGDEF(wCon,  1,MMXWC),  REGDEF(WCON,  1,MMXWC),
16782   REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
16783   REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
16784
16785   /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
16786   REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
16787   REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
16788   REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
16789   REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
16790
16791   /* XScale accumulator registers.  */
16792   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
16793 };
16794 #undef REGDEF
16795 #undef REGNUM
16796 #undef REGSET
16797
16798 /* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
16799    within psr_required_here.  */
16800 static const struct asm_psr psrs[] =
16801 {
16802   /* Backward compatibility notation.  Note that "all" is no longer
16803      truly all possible PSR bits.  */
16804   {"all",  PSR_c | PSR_f},
16805   {"flg",  PSR_f},
16806   {"ctl",  PSR_c},
16807
16808   /* Individual flags.  */
16809   {"f",    PSR_f},
16810   {"c",    PSR_c},
16811   {"x",    PSR_x},
16812   {"s",    PSR_s},
16813
16814   /* Combinations of flags.  */
16815   {"fs",   PSR_f | PSR_s},
16816   {"fx",   PSR_f | PSR_x},
16817   {"fc",   PSR_f | PSR_c},
16818   {"sf",   PSR_s | PSR_f},
16819   {"sx",   PSR_s | PSR_x},
16820   {"sc",   PSR_s | PSR_c},
16821   {"xf",   PSR_x | PSR_f},
16822   {"xs",   PSR_x | PSR_s},
16823   {"xc",   PSR_x | PSR_c},
16824   {"cf",   PSR_c | PSR_f},
16825   {"cs",   PSR_c | PSR_s},
16826   {"cx",   PSR_c | PSR_x},
16827   {"fsx",  PSR_f | PSR_s | PSR_x},
16828   {"fsc",  PSR_f | PSR_s | PSR_c},
16829   {"fxs",  PSR_f | PSR_x | PSR_s},
16830   {"fxc",  PSR_f | PSR_x | PSR_c},
16831   {"fcs",  PSR_f | PSR_c | PSR_s},
16832   {"fcx",  PSR_f | PSR_c | PSR_x},
16833   {"sfx",  PSR_s | PSR_f | PSR_x},
16834   {"sfc",  PSR_s | PSR_f | PSR_c},
16835   {"sxf",  PSR_s | PSR_x | PSR_f},
16836   {"sxc",  PSR_s | PSR_x | PSR_c},
16837   {"scf",  PSR_s | PSR_c | PSR_f},
16838   {"scx",  PSR_s | PSR_c | PSR_x},
16839   {"xfs",  PSR_x | PSR_f | PSR_s},
16840   {"xfc",  PSR_x | PSR_f | PSR_c},
16841   {"xsf",  PSR_x | PSR_s | PSR_f},
16842   {"xsc",  PSR_x | PSR_s | PSR_c},
16843   {"xcf",  PSR_x | PSR_c | PSR_f},
16844   {"xcs",  PSR_x | PSR_c | PSR_s},
16845   {"cfs",  PSR_c | PSR_f | PSR_s},
16846   {"cfx",  PSR_c | PSR_f | PSR_x},
16847   {"csf",  PSR_c | PSR_s | PSR_f},
16848   {"csx",  PSR_c | PSR_s | PSR_x},
16849   {"cxf",  PSR_c | PSR_x | PSR_f},
16850   {"cxs",  PSR_c | PSR_x | PSR_s},
16851   {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
16852   {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
16853   {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
16854   {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
16855   {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
16856   {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
16857   {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
16858   {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
16859   {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
16860   {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
16861   {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
16862   {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
16863   {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
16864   {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
16865   {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
16866   {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
16867   {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
16868   {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
16869   {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
16870   {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
16871   {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
16872   {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
16873   {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
16874   {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
16875 };
16876
16877 /* Table of V7M psr names.  */
16878 static const struct asm_psr v7m_psrs[] =
16879 {
16880   {"apsr",        0 }, {"APSR",         0 },
16881   {"iapsr",       1 }, {"IAPSR",        1 },
16882   {"eapsr",       2 }, {"EAPSR",        2 },
16883   {"psr",         3 }, {"PSR",          3 },
16884   {"xpsr",        3 }, {"XPSR",         3 }, {"xPSR",     3 },
16885   {"ipsr",        5 }, {"IPSR",         5 },
16886   {"epsr",        6 }, {"EPSR",         6 },
16887   {"iepsr",       7 }, {"IEPSR",        7 },
16888   {"msp",         8 }, {"MSP",          8 },
16889   {"psp",         9 }, {"PSP",          9 },
16890   {"primask",     16}, {"PRIMASK",      16},
16891   {"basepri",     17}, {"BASEPRI",      17},
16892   {"basepri_max", 18}, {"BASEPRI_MAX",  18},
16893   {"basepri_max", 18}, {"BASEPRI_MASK", 18}, /* Typo, preserved for backwards compatibility.  */
16894   {"faultmask",   19}, {"FAULTMASK",    19},
16895   {"control",     20}, {"CONTROL",      20}
16896 };
16897
16898 /* Table of all shift-in-operand names.  */
16899 static const struct asm_shift_name shift_names [] =
16900 {
16901   { "asl", SHIFT_LSL },  { "ASL", SHIFT_LSL },
16902   { "lsl", SHIFT_LSL },  { "LSL", SHIFT_LSL },
16903   { "lsr", SHIFT_LSR },  { "LSR", SHIFT_LSR },
16904   { "asr", SHIFT_ASR },  { "ASR", SHIFT_ASR },
16905   { "ror", SHIFT_ROR },  { "ROR", SHIFT_ROR },
16906   { "rrx", SHIFT_RRX },  { "RRX", SHIFT_RRX }
16907 };
16908
16909 /* Table of all explicit relocation names.  */
16910 #ifdef OBJ_ELF
16911 static struct reloc_entry reloc_names[] =
16912 {
16913   { "got",     BFD_RELOC_ARM_GOT32   },  { "GOT",     BFD_RELOC_ARM_GOT32   },
16914   { "gotoff",  BFD_RELOC_ARM_GOTOFF  },  { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
16915   { "plt",     BFD_RELOC_ARM_PLT32   },  { "PLT",     BFD_RELOC_ARM_PLT32   },
16916   { "target1", BFD_RELOC_ARM_TARGET1 },  { "TARGET1", BFD_RELOC_ARM_TARGET1 },
16917   { "target2", BFD_RELOC_ARM_TARGET2 },  { "TARGET2", BFD_RELOC_ARM_TARGET2 },
16918   { "sbrel",   BFD_RELOC_ARM_SBREL32 },  { "SBREL",   BFD_RELOC_ARM_SBREL32 },
16919   { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
16920   { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
16921   { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
16922   { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
16923   { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32},
16924   { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL},
16925   { "tlsdesc", BFD_RELOC_ARM_TLS_GOTDESC},
16926         { "TLSDESC", BFD_RELOC_ARM_TLS_GOTDESC},
16927   { "tlscall", BFD_RELOC_ARM_TLS_CALL},
16928         { "TLSCALL", BFD_RELOC_ARM_TLS_CALL},
16929   { "tlsdescseq", BFD_RELOC_ARM_TLS_DESCSEQ},
16930         { "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ}
16931 };
16932 #endif
16933
16934 /* Table of all conditional affixes.  0xF is not defined as a condition code.  */
16935 static const struct asm_cond conds[] =
16936 {
16937   {"eq", 0x0},
16938   {"ne", 0x1},
16939   {"cs", 0x2}, {"hs", 0x2},
16940   {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
16941   {"mi", 0x4},
16942   {"pl", 0x5},
16943   {"vs", 0x6},
16944   {"vc", 0x7},
16945   {"hi", 0x8},
16946   {"ls", 0x9},
16947   {"ge", 0xa},
16948   {"lt", 0xb},
16949   {"gt", 0xc},
16950   {"le", 0xd},
16951   {"al", 0xe}
16952 };
16953
16954 static struct asm_barrier_opt barrier_opt_names[] =
16955 {
16956   { "sy",    0xf }, { "SY",    0xf },
16957   { "un",    0x7 }, { "UN",    0x7 },
16958   { "st",    0xe }, { "ST",    0xe },
16959   { "unst",  0x6 }, { "UNST",  0x6 },
16960   { "ish",   0xb }, { "ISH",   0xb },
16961   { "sh",    0xb }, { "SH",    0xb },
16962   { "ishst", 0xa }, { "ISHST", 0xa },
16963   { "shst",  0xa }, { "SHST",  0xa },
16964   { "nsh",   0x7 }, { "NSH",   0x7 },
16965   { "nshst", 0x6 }, { "NSHST", 0x6 },
16966   { "osh",   0x3 }, { "OSH",   0x3 },
16967   { "oshst", 0x2 }, { "OSHST", 0x2 }
16968 };
16969
16970 /* Table of ARM-format instructions.    */
16971
16972 /* Macros for gluing together operand strings.  N.B. In all cases
16973    other than OPS0, the trailing OP_stop comes from default
16974    zero-initialization of the unspecified elements of the array.  */
16975 #define OPS0()            { OP_stop, }
16976 #define OPS1(a)           { OP_##a, }
16977 #define OPS2(a,b)         { OP_##a,OP_##b, }
16978 #define OPS3(a,b,c)       { OP_##a,OP_##b,OP_##c, }
16979 #define OPS4(a,b,c,d)     { OP_##a,OP_##b,OP_##c,OP_##d, }
16980 #define OPS5(a,b,c,d,e)   { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
16981 #define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
16982
16983 /* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
16984    This is useful when mixing operands for ARM and THUMB, i.e. using the
16985    MIX_ARM_THUMB_OPERANDS macro.
16986    In order to use these macros, prefix the number of operands with _
16987    e.g. _3.  */
16988 #define OPS_1(a)           { a, }
16989 #define OPS_2(a,b)         { a,b, }
16990 #define OPS_3(a,b,c)       { a,b,c, }
16991 #define OPS_4(a,b,c,d)     { a,b,c,d, }
16992 #define OPS_5(a,b,c,d,e)   { a,b,c,d,e, }
16993 #define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
16994
16995 /* These macros abstract out the exact format of the mnemonic table and
16996    save some repeated characters.  */
16997
16998 /* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
16999 #define TxCE(mnem, op, top, nops, ops, ae, te) \
17000   { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
17001     THUMB_VARIANT, do_##ae, do_##te }
17002
17003 /* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
17004    a T_MNEM_xyz enumerator.  */
17005 #define TCE(mnem, aop, top, nops, ops, ae, te) \
17006       TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
17007 #define tCE(mnem, aop, top, nops, ops, ae, te) \
17008       TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
17009
17010 /* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
17011    infix after the third character.  */
17012 #define TxC3(mnem, op, top, nops, ops, ae, te) \
17013   { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
17014     THUMB_VARIANT, do_##ae, do_##te }
17015 #define TxC3w(mnem, op, top, nops, ops, ae, te) \
17016   { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
17017     THUMB_VARIANT, do_##ae, do_##te }
17018 #define TC3(mnem, aop, top, nops, ops, ae, te) \
17019       TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
17020 #define TC3w(mnem, aop, top, nops, ops, ae, te) \
17021       TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
17022 #define tC3(mnem, aop, top, nops, ops, ae, te) \
17023       TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
17024 #define tC3w(mnem, aop, top, nops, ops, ae, te) \
17025       TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
17026
17027 /* Mnemonic with a conditional infix in an unusual place.  Each and every variant has to
17028    appear in the condition table.  */
17029 #define TxCM_(m1, m2, m3, op, top, nops, ops, ae, te)   \
17030   { m1 #m2 m3, OPS##nops ops, sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
17031     0x##op, top, ARM_VARIANT, THUMB_VARIANT, do_##ae, do_##te }
17032
17033 #define TxCM(m1, m2, op, top, nops, ops, ae, te)        \
17034   TxCM_ (m1,   , m2, op, top, nops, ops, ae, te),       \
17035   TxCM_ (m1, eq, m2, op, top, nops, ops, ae, te),       \
17036   TxCM_ (m1, ne, m2, op, top, nops, ops, ae, te),       \
17037   TxCM_ (m1, cs, m2, op, top, nops, ops, ae, te),       \
17038   TxCM_ (m1, hs, m2, op, top, nops, ops, ae, te),       \
17039   TxCM_ (m1, cc, m2, op, top, nops, ops, ae, te),       \
17040   TxCM_ (m1, ul, m2, op, top, nops, ops, ae, te),       \
17041   TxCM_ (m1, lo, m2, op, top, nops, ops, ae, te),       \
17042   TxCM_ (m1, mi, m2, op, top, nops, ops, ae, te),       \
17043   TxCM_ (m1, pl, m2, op, top, nops, ops, ae, te),       \
17044   TxCM_ (m1, vs, m2, op, top, nops, ops, ae, te),       \
17045   TxCM_ (m1, vc, m2, op, top, nops, ops, ae, te),       \
17046   TxCM_ (m1, hi, m2, op, top, nops, ops, ae, te),       \
17047   TxCM_ (m1, ls, m2, op, top, nops, ops, ae, te),       \
17048   TxCM_ (m1, ge, m2, op, top, nops, ops, ae, te),       \
17049   TxCM_ (m1, lt, m2, op, top, nops, ops, ae, te),       \
17050   TxCM_ (m1, gt, m2, op, top, nops, ops, ae, te),       \
17051   TxCM_ (m1, le, m2, op, top, nops, ops, ae, te),       \
17052   TxCM_ (m1, al, m2, op, top, nops, ops, ae, te)
17053
17054 #define TCM(m1,m2, aop, top, nops, ops, ae, te)         \
17055       TxCM (m1,m2, aop, 0x##top, nops, ops, ae, te)
17056 #define tCM(m1,m2, aop, top, nops, ops, ae, te)         \
17057       TxCM (m1,m2, aop, T_MNEM##top, nops, ops, ae, te)
17058
17059 /* Mnemonic that cannot be conditionalized.  The ARM condition-code
17060    field is still 0xE.  Many of the Thumb variants can be executed
17061    conditionally, so this is checked separately.  */
17062 #define TUE(mnem, op, top, nops, ops, ae, te)                           \
17063   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
17064     THUMB_VARIANT, do_##ae, do_##te }
17065
17066 /* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
17067    condition code field.  */
17068 #define TUF(mnem, op, top, nops, ops, ae, te)                           \
17069   { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
17070     THUMB_VARIANT, do_##ae, do_##te }
17071
17072 /* ARM-only variants of all the above.  */
17073 #define CE(mnem,  op, nops, ops, ae)    \
17074   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17075
17076 #define C3(mnem, op, nops, ops, ae)     \
17077   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17078
17079 /* Legacy mnemonics that always have conditional infix after the third
17080    character.  */
17081 #define CL(mnem, op, nops, ops, ae)     \
17082   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
17083     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17084
17085 /* Coprocessor instructions.  Isomorphic between Arm and Thumb-2.  */
17086 #define cCE(mnem,  op, nops, ops, ae)   \
17087   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
17088
17089 /* Legacy coprocessor instructions where conditional infix and conditional
17090    suffix are ambiguous.  For consistency this includes all FPA instructions,
17091    not just the potentially ambiguous ones.  */
17092 #define cCL(mnem, op, nops, ops, ae)    \
17093   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
17094     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
17095
17096 /* Coprocessor, takes either a suffix or a position-3 infix
17097    (for an FPA corner case). */
17098 #define C3E(mnem, op, nops, ops, ae) \
17099   { mnem, OPS##nops ops, OT_csuf_or_in3, \
17100     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
17101
17102 #define xCM_(m1, m2, m3, op, nops, ops, ae)     \
17103   { m1 #m2 m3, OPS##nops ops, \
17104     sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
17105     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17106
17107 #define CM(m1, m2, op, nops, ops, ae)   \
17108   xCM_ (m1,   , m2, op, nops, ops, ae), \
17109   xCM_ (m1, eq, m2, op, nops, ops, ae), \
17110   xCM_ (m1, ne, m2, op, nops, ops, ae), \
17111   xCM_ (m1, cs, m2, op, nops, ops, ae), \
17112   xCM_ (m1, hs, m2, op, nops, ops, ae), \
17113   xCM_ (m1, cc, m2, op, nops, ops, ae), \
17114   xCM_ (m1, ul, m2, op, nops, ops, ae), \
17115   xCM_ (m1, lo, m2, op, nops, ops, ae), \
17116   xCM_ (m1, mi, m2, op, nops, ops, ae), \
17117   xCM_ (m1, pl, m2, op, nops, ops, ae), \
17118   xCM_ (m1, vs, m2, op, nops, ops, ae), \
17119   xCM_ (m1, vc, m2, op, nops, ops, ae), \
17120   xCM_ (m1, hi, m2, op, nops, ops, ae), \
17121   xCM_ (m1, ls, m2, op, nops, ops, ae), \
17122   xCM_ (m1, ge, m2, op, nops, ops, ae), \
17123   xCM_ (m1, lt, m2, op, nops, ops, ae), \
17124   xCM_ (m1, gt, m2, op, nops, ops, ae), \
17125   xCM_ (m1, le, m2, op, nops, ops, ae), \
17126   xCM_ (m1, al, m2, op, nops, ops, ae)
17127
17128 #define UE(mnem, op, nops, ops, ae)     \
17129   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
17130
17131 #define UF(mnem, op, nops, ops, ae)     \
17132   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
17133
17134 /* Neon data-processing. ARM versions are unconditional with cond=0xf.
17135    The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
17136    use the same encoding function for each.  */
17137 #define NUF(mnem, op, nops, ops, enc)                                   \
17138   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op,            \
17139     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17140
17141 /* Neon data processing, version which indirects through neon_enc_tab for
17142    the various overloaded versions of opcodes.  */
17143 #define nUF(mnem, op, nops, ops, enc)                                   \
17144   { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op,    \
17145     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17146
17147 /* Neon insn with conditional suffix for the ARM version, non-overloaded
17148    version.  */
17149 #define NCE_tag(mnem, op, nops, ops, enc, tag)                          \
17150   { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT,             \
17151     THUMB_VARIANT, do_##enc, do_##enc }
17152
17153 #define NCE(mnem, op, nops, ops, enc)                                   \
17154    NCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
17155
17156 #define NCEF(mnem, op, nops, ops, enc)                                  \
17157     NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
17158
17159 /* Neon insn with conditional suffix for the ARM version, overloaded types.  */
17160 #define nCE_tag(mnem, op, nops, ops, enc, tag)                          \
17161   { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op,          \
17162     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17163
17164 #define nCE(mnem, op, nops, ops, enc)                                   \
17165    nCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
17166
17167 #define nCEF(mnem, op, nops, ops, enc)                                  \
17168     nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
17169
17170 #define do_0 0
17171
17172 static const struct asm_opcode insns[] =
17173 {
17174 #define ARM_VARIANT &arm_ext_v1 /* Core ARM Instructions.  */
17175 #define THUMB_VARIANT &arm_ext_v4t
17176  tCE("and",     0000000, _and,     3, (RR, oRR, SH), arit, t_arit3c),
17177  tC3("ands",    0100000, _ands,    3, (RR, oRR, SH), arit, t_arit3c),
17178  tCE("eor",     0200000, _eor,     3, (RR, oRR, SH), arit, t_arit3c),
17179  tC3("eors",    0300000, _eors,    3, (RR, oRR, SH), arit, t_arit3c),
17180  tCE("sub",     0400000, _sub,     3, (RR, oRR, SH), arit, t_add_sub),
17181  tC3("subs",    0500000, _subs,    3, (RR, oRR, SH), arit, t_add_sub),
17182  tCE("add",     0800000, _add,     3, (RR, oRR, SHG), arit, t_add_sub),
17183  tC3("adds",    0900000, _adds,    3, (RR, oRR, SHG), arit, t_add_sub),
17184  tCE("adc",     0a00000, _adc,     3, (RR, oRR, SH), arit, t_arit3c),
17185  tC3("adcs",    0b00000, _adcs,    3, (RR, oRR, SH), arit, t_arit3c),
17186  tCE("sbc",     0c00000, _sbc,     3, (RR, oRR, SH), arit, t_arit3),
17187  tC3("sbcs",    0d00000, _sbcs,    3, (RR, oRR, SH), arit, t_arit3),
17188  tCE("orr",     1800000, _orr,     3, (RR, oRR, SH), arit, t_arit3c),
17189  tC3("orrs",    1900000, _orrs,    3, (RR, oRR, SH), arit, t_arit3c),
17190  tCE("bic",     1c00000, _bic,     3, (RR, oRR, SH), arit, t_arit3),
17191  tC3("bics",    1d00000, _bics,    3, (RR, oRR, SH), arit, t_arit3),
17192
17193  /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
17194     for setting PSR flag bits.  They are obsolete in V6 and do not
17195     have Thumb equivalents. */
17196  tCE("tst",     1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
17197  tC3w("tsts",   1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
17198   CL("tstp",    110f000,           2, (RR, SH),      cmp),
17199  tCE("cmp",     1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
17200  tC3w("cmps",   1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
17201   CL("cmpp",    150f000,           2, (RR, SH),      cmp),
17202  tCE("cmn",     1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
17203  tC3w("cmns",   1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
17204   CL("cmnp",    170f000,           2, (RR, SH),      cmp),
17205
17206  tCE("mov",     1a00000, _mov,     2, (RR, SH),      mov,  t_mov_cmp),
17207  tC3("movs",    1b00000, _movs,    2, (RR, SH),      mov,  t_mov_cmp),
17208  tCE("mvn",     1e00000, _mvn,     2, (RR, SH),      mov,  t_mvn_tst),
17209  tC3("mvns",    1f00000, _mvns,    2, (RR, SH),      mov,  t_mvn_tst),
17210
17211  tCE("ldr",     4100000, _ldr,     2, (RR, ADDRGLDR),ldst, t_ldst),
17212  tC3("ldrb",    4500000, _ldrb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
17213  tCE("str",     4000000, _str,     _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
17214                                                                 OP_RRnpc),
17215                                         OP_ADDRGLDR),ldst, t_ldst),
17216  tC3("strb",    4400000, _strb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
17217
17218  tCE("stm",     8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
17219  tC3("stmia",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
17220  tC3("stmea",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
17221  tCE("ldm",     8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
17222  tC3("ldmia",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
17223  tC3("ldmfd",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
17224
17225  TCE("swi",     f000000, df00,     1, (EXPi),        swi, t_swi),
17226  TCE("svc",     f000000, df00,     1, (EXPi),        swi, t_swi),
17227  tCE("b",       a000000, _b,       1, (EXPr),        branch, t_branch),
17228  TCE("bl",      b000000, f000f800, 1, (EXPr),        bl, t_branch23),
17229
17230   /* Pseudo ops.  */
17231  tCE("adr",     28f0000, _adr,     2, (RR, EXP),     adr,  t_adr),
17232   C3(adrl,      28f0000,           2, (RR, EXP),     adrl),
17233  tCE("nop",     1a00000, _nop,     1, (oI255c),      nop,  t_nop),
17234
17235   /* Thumb-compatibility pseudo ops.  */
17236  tCE("lsl",     1a00000, _lsl,     3, (RR, oRR, SH), shift, t_shift),
17237  tC3("lsls",    1b00000, _lsls,    3, (RR, oRR, SH), shift, t_shift),
17238  tCE("lsr",     1a00020, _lsr,     3, (RR, oRR, SH), shift, t_shift),
17239  tC3("lsrs",    1b00020, _lsrs,    3, (RR, oRR, SH), shift, t_shift),
17240  tCE("asr",     1a00040, _asr,     3, (RR, oRR, SH), shift, t_shift),
17241  tC3("asrs",      1b00040, _asrs,     3, (RR, oRR, SH), shift, t_shift),
17242  tCE("ror",     1a00060, _ror,     3, (RR, oRR, SH), shift, t_shift),
17243  tC3("rors",    1b00060, _rors,    3, (RR, oRR, SH), shift, t_shift),
17244  tCE("neg",     2600000, _neg,     2, (RR, RR),      rd_rn, t_neg),
17245  tC3("negs",    2700000, _negs,    2, (RR, RR),      rd_rn, t_neg),
17246  tCE("push",    92d0000, _push,     1, (REGLST),             push_pop, t_push_pop),
17247  tCE("pop",     8bd0000, _pop,     1, (REGLST),      push_pop, t_push_pop),
17248
17249  /* These may simplify to neg.  */
17250  TCE("rsb",     0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
17251  TC3("rsbs",    0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
17252
17253 #undef  THUMB_VARIANT
17254 #define THUMB_VARIANT  & arm_ext_v6
17255
17256  TCE("cpy",       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
17257
17258  /* V1 instructions with no Thumb analogue prior to V6T2.  */
17259 #undef  THUMB_VARIANT
17260 #define THUMB_VARIANT  & arm_ext_v6t2
17261
17262  TCE("teq",     1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
17263  TC3w("teqs",   1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
17264   CL("teqp",    130f000,           2, (RR, SH),      cmp),
17265
17266  TC3("ldrt",    4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
17267  TC3("ldrbt",   4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
17268  TC3("strt",    4200000, f8400e00, 2, (RR_npcsp, ADDR),   ldstt, t_ldstt),
17269  TC3("strbt",   4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
17270
17271  TC3("stmdb",   9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17272  TC3("stmfd",     9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17273
17274  TC3("ldmdb",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17275  TC3("ldmea",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17276
17277  /* V1 instructions with no Thumb analogue at all.  */
17278   CE("rsc",     0e00000,           3, (RR, oRR, SH), arit),
17279   C3(rscs,      0f00000,           3, (RR, oRR, SH), arit),
17280
17281   C3(stmib,     9800000,           2, (RRw, REGLST), ldmstm),
17282   C3(stmfa,     9800000,           2, (RRw, REGLST), ldmstm),
17283   C3(stmda,     8000000,           2, (RRw, REGLST), ldmstm),
17284   C3(stmed,     8000000,           2, (RRw, REGLST), ldmstm),
17285   C3(ldmib,     9900000,           2, (RRw, REGLST), ldmstm),
17286   C3(ldmed,     9900000,           2, (RRw, REGLST), ldmstm),
17287   C3(ldmda,     8100000,           2, (RRw, REGLST), ldmstm),
17288   C3(ldmfa,     8100000,           2, (RRw, REGLST), ldmstm),
17289
17290 #undef  ARM_VARIANT
17291 #define ARM_VARIANT    & arm_ext_v2     /* ARM 2 - multiplies.  */
17292 #undef  THUMB_VARIANT
17293 #define THUMB_VARIANT  & arm_ext_v4t
17294
17295  tCE("mul",     0000090, _mul,     3, (RRnpc, RRnpc, oRR), mul, t_mul),
17296  tC3("muls",    0100090, _muls,    3, (RRnpc, RRnpc, oRR), mul, t_mul),
17297
17298 #undef  THUMB_VARIANT
17299 #define THUMB_VARIANT  & arm_ext_v6t2
17300
17301  TCE("mla",     0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
17302   C3(mlas,      0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
17303
17304   /* Generic coprocessor instructions.  */
17305  TCE("cdp",     e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
17306  TCE("ldc",     c100000, ec100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
17307  TC3("ldcl",    c500000, ec500000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
17308  TCE("stc",     c000000, ec000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
17309  TC3("stcl",    c400000, ec400000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
17310  TCE("mcr",     e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
17311  TCE("mrc",     e100010, ee100010, 6, (RCP, I7b, APSR_RR, RCN, RCN, oI7b),   co_reg, co_reg),
17312
17313 #undef  ARM_VARIANT
17314 #define ARM_VARIANT  & arm_ext_v2s /* ARM 3 - swp instructions.  */
17315
17316   CE("swp",     1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
17317   C3(swpb,      1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
17318
17319 #undef  ARM_VARIANT
17320 #define ARM_VARIANT    & arm_ext_v3     /* ARM 6 Status register instructions.  */
17321 #undef  THUMB_VARIANT
17322 #define THUMB_VARIANT  & arm_ext_msr
17323
17324  TCE("mrs",     1000000, f3e08000, 2, (RRnpc, rPSR), mrs, t_mrs),
17325  TCE("msr",     120f000, f3808000, 2, (wPSR, RR_EXi), msr, t_msr),
17326
17327 #undef  ARM_VARIANT
17328 #define ARM_VARIANT    & arm_ext_v3m     /* ARM 7M long multiplies.  */
17329 #undef  THUMB_VARIANT
17330 #define THUMB_VARIANT  & arm_ext_v6t2
17331
17332  TCE("smull",   0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17333   CM("smull","s",       0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17334  TCE("umull",   0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17335   CM("umull","s",       0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17336  TCE("smlal",   0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17337   CM("smlal","s",       0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17338  TCE("umlal",   0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17339   CM("umlal","s",       0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17340
17341 #undef  ARM_VARIANT
17342 #define ARM_VARIANT    & arm_ext_v4     /* ARM Architecture 4.  */
17343 #undef  THUMB_VARIANT
17344 #define THUMB_VARIANT  & arm_ext_v4t
17345
17346  tC3("ldrh",    01000b0, _ldrh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17347  tC3("strh",    00000b0, _strh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17348  tC3("ldrsh",   01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17349  tC3("ldrsb",   01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17350  tCM("ld","sh", 01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17351  tCM("ld","sb", 01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17352
17353 #undef  ARM_VARIANT
17354 #define ARM_VARIANT  & arm_ext_v4t_5
17355
17356   /* ARM Architecture 4T.  */
17357   /* Note: bx (and blx) are required on V5, even if the processor does
17358      not support Thumb.  */
17359  TCE("bx",      12fff10, 4700, 1, (RR), bx, t_bx),
17360
17361 #undef  ARM_VARIANT
17362 #define ARM_VARIANT    & arm_ext_v5 /*  ARM Architecture 5T.     */
17363 #undef  THUMB_VARIANT
17364 #define THUMB_VARIANT  & arm_ext_v5t
17365
17366   /* Note: blx has 2 variants; the .value coded here is for
17367      BLX(2).  Only this variant has conditional execution.  */
17368  TCE("blx",     12fff30, 4780, 1, (RR_EXr),                         blx,  t_blx),
17369  TUE("bkpt",    1200070, be00, 1, (oIffffb),                        bkpt, t_bkpt),
17370
17371 #undef  THUMB_VARIANT
17372 #define THUMB_VARIANT  & arm_ext_v6t2
17373
17374  TCE("clz",     16f0f10, fab0f080, 2, (RRnpc, RRnpc),                   rd_rm,  t_clz),
17375  TUF("ldc2",    c100000, fc100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
17376  TUF("ldc2l",   c500000, fc500000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
17377  TUF("stc2",    c000000, fc000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
17378  TUF("stc2l",   c400000, fc400000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
17379  TUF("cdp2",    e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
17380  TUF("mcr2",    e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
17381  TUF("mrc2",    e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
17382
17383 #undef  ARM_VARIANT
17384 #define ARM_VARIANT  & arm_ext_v5exp /*  ARM Architecture 5TExP.  */
17385 #undef THUMB_VARIANT
17386 #define THUMB_VARIANT &arm_ext_v5exp
17387
17388  TCE("smlabb",  1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
17389  TCE("smlatb",  10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
17390  TCE("smlabt",  10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
17391  TCE("smlatt",  10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
17392
17393  TCE("smlawb",  1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
17394  TCE("smlawt",  12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
17395
17396  TCE("smlalbb", 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
17397  TCE("smlaltb", 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
17398  TCE("smlalbt", 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
17399  TCE("smlaltt", 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
17400
17401  TCE("smulbb",  1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
17402  TCE("smultb",  16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
17403  TCE("smulbt",  16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
17404  TCE("smultt",  16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
17405
17406  TCE("smulwb",  12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
17407  TCE("smulwt",  12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
17408
17409  TCE("qadd",    1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
17410  TCE("qdadd",   1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
17411  TCE("qsub",    1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
17412  TCE("qdsub",   1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
17413
17414 #undef  ARM_VARIANT
17415 #define ARM_VARIANT  & arm_ext_v5e /*  ARM Architecture 5TE.  */
17416 #undef THUMB_VARIANT
17417 #define THUMB_VARIANT &arm_ext_v6t2
17418
17419  TUF("pld",     450f000, f810f000, 1, (ADDR),                pld,  t_pld),
17420  TC3("ldrd",    00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
17421      ldrd, t_ldstd),
17422  TC3("strd",    00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
17423                                        ADDRGLDRS), ldrd, t_ldstd),
17424
17425  TCE("mcrr",    c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17426  TCE("mrrc",    c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17427
17428 #undef  ARM_VARIANT
17429 #define ARM_VARIANT  & arm_ext_v5j /*  ARM Architecture 5TEJ.  */
17430
17431  TCE("bxj",     12fff20, f3c08f00, 1, (RR),                       bxj, t_bxj),
17432
17433 #undef  ARM_VARIANT
17434 #define ARM_VARIANT    & arm_ext_v6 /*  ARM V6.  */
17435 #undef  THUMB_VARIANT
17436 #define THUMB_VARIANT  & arm_ext_v6
17437
17438  TUF("cpsie",     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
17439  TUF("cpsid",     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
17440  tCE("rev",       6bf0f30, _rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
17441  tCE("rev16",     6bf0fb0, _rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
17442  tCE("revsh",     6ff0fb0, _revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
17443  tCE("sxth",      6bf0070, _sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
17444  tCE("uxth",      6ff0070, _uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
17445  tCE("sxtb",      6af0070, _sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
17446  tCE("uxtb",      6ef0070, _uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
17447  TUF("setend",    1010000, b650,     1, (ENDI),                     setend, t_setend),
17448
17449 #undef  THUMB_VARIANT
17450 #define THUMB_VARIANT  & arm_ext_v6t2
17451
17452  TCE("ldrex",   1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR),        ldrex, t_ldrex),
17453  TCE("strex",   1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17454                                       strex,  t_strex),
17455  TUF("mcrr2",   c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17456  TUF("mrrc2",   c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17457
17458  TCE("ssat",    6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
17459  TCE("usat",    6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
17460
17461 /*  ARM V6 not included in V7M.  */
17462 #undef  THUMB_VARIANT
17463 #define THUMB_VARIANT  & arm_ext_v6_notm
17464  TUF("rfeia",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
17465   UF(rfeib,     9900a00,           1, (RRw),                       rfe),
17466   UF(rfeda,     8100a00,           1, (RRw),                       rfe),
17467  TUF("rfedb",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
17468  TUF("rfefd",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
17469   UF(rfefa,     9900a00,           1, (RRw),                       rfe),
17470   UF(rfeea,     8100a00,           1, (RRw),                       rfe),
17471  TUF("rfeed",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
17472  TUF("srsia",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
17473   UF(srsib,     9c00500,           2, (oRRw, I31w),                srs),
17474   UF(srsda,     8400500,           2, (oRRw, I31w),                srs),
17475  TUF("srsdb",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
17476
17477 /*  ARM V6 not included in V7M (eg. integer SIMD).  */
17478 #undef  THUMB_VARIANT
17479 #define THUMB_VARIANT  & arm_ext_v6_dsp
17480  TUF("cps",     1020000, f3af8100, 1, (I31b),                     imm0, t_cps),
17481  TCE("pkhbt",   6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
17482  TCE("pkhtb",   6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
17483  TCE("qadd16",  6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17484  TCE("qadd8",   6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17485  TCE("qasx",    6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17486  /* Old name for QASX.  */
17487  TCE("qaddsubx",        6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17488  TCE("qsax",    6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17489  /* Old name for QSAX.  */
17490  TCE("qsubaddx",        6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17491  TCE("qsub16",  6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17492  TCE("qsub8",   6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17493  TCE("sadd16",  6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17494  TCE("sadd8",   6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17495  TCE("sasx",    6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17496  /* Old name for SASX.  */
17497  TCE("saddsubx",        6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17498  TCE("shadd16", 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17499  TCE("shadd8",  6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17500  TCE("shasx",     6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17501  /* Old name for SHASX.  */
17502  TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17503  TCE("shsax",      6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),    rd_rn_rm, t_simd),
17504  /* Old name for SHSAX.  */
17505  TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17506  TCE("shsub16", 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17507  TCE("shsub8",  6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17508  TCE("ssax",    6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17509  /* Old name for SSAX.  */
17510  TCE("ssubaddx",        6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17511  TCE("ssub16",  6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17512  TCE("ssub8",   6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17513  TCE("uadd16",  6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17514  TCE("uadd8",   6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17515  TCE("uasx",    6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17516  /* Old name for UASX.  */
17517  TCE("uaddsubx",        6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17518  TCE("uhadd16", 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17519  TCE("uhadd8",  6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17520  TCE("uhasx",     6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17521  /* Old name for UHASX.  */
17522  TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17523  TCE("uhsax",     6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17524  /* Old name for UHSAX.  */
17525  TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17526  TCE("uhsub16", 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17527  TCE("uhsub8",  6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17528  TCE("uqadd16", 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17529  TCE("uqadd8",  6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17530  TCE("uqasx",     6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17531  /* Old name for UQASX.  */
17532  TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17533  TCE("uqsax",     6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17534  /* Old name for UQSAX.  */
17535  TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
17536  TCE("uqsub16", 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17537  TCE("uqsub8",  6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17538  TCE("usub16",  6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17539  TCE("usax",    6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17540  /* Old name for USAX.  */
17541  TCE("usubaddx",        6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17542  TCE("usub8",   6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17543  TCE("sxtah",   6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17544  TCE("sxtab16", 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17545  TCE("sxtab",   6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17546  TCE("sxtb16",  68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
17547  TCE("uxtah",   6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17548  TCE("uxtab16", 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17549  TCE("uxtab",   6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17550  TCE("uxtb16",  6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
17551  TCE("sel",     6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
17552  TCE("smlad",   7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17553  TCE("smladx",  7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17554  TCE("smlald",  7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17555  TCE("smlaldx", 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17556  TCE("smlsd",   7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17557  TCE("smlsdx",  7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17558  TCE("smlsld",  7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17559  TCE("smlsldx", 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17560  TCE("smmla",   7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17561  TCE("smmlar",  7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17562  TCE("smmls",   75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17563  TCE("smmlsr",  75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17564  TCE("smmul",   750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17565  TCE("smmulr",  750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17566  TCE("smuad",   700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17567  TCE("smuadx",  700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17568  TCE("smusd",   700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17569  TCE("smusdx",  700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
17570  TCE("ssat16",  6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),         ssat16, t_ssat16),
17571  TCE("umaal",   0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
17572  TCE("usad8",   780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),       smul,   t_simd),
17573  TCE("usada8",  7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
17574  TCE("usat16",  6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),         usat16, t_usat16),
17575
17576 #undef  ARM_VARIANT
17577 #define ARM_VARIANT   & arm_ext_v6k
17578 #undef  THUMB_VARIANT
17579 #define THUMB_VARIANT & arm_ext_v6k
17580
17581  tCE("yield",   320f001, _yield,    0, (), noargs, t_hint),
17582  tCE("wfe",     320f002, _wfe,      0, (), noargs, t_hint),
17583  tCE("wfi",     320f003, _wfi,      0, (), noargs, t_hint),
17584  tCE("sev",     320f004, _sev,      0, (), noargs, t_hint),
17585
17586 #undef  THUMB_VARIANT
17587 #define THUMB_VARIANT  & arm_ext_v6_notm
17588  TCE("ldrexd",  1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
17589                                       ldrexd, t_ldrexd),
17590  TCE("strexd",  1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
17591                                        RRnpcb), strexd, t_strexd),
17592
17593 #undef  THUMB_VARIANT
17594 #define THUMB_VARIANT  & arm_ext_v6t2
17595  TCE("ldrexb",  1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
17596      rd_rn,  rd_rn),
17597  TCE("ldrexh",  1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
17598      rd_rn,  rd_rn),
17599  TCE("strexb",  1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17600      strex, t_strexbh),
17601  TCE("strexh",  1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17602      strex, t_strexbh),
17603  TUF("clrex",   57ff01f, f3bf8f2f, 0, (),                             noargs, noargs),
17604
17605 #undef  ARM_VARIANT
17606 #define ARM_VARIANT    & arm_ext_sec
17607 #undef THUMB_VARIANT
17608 #define THUMB_VARIANT  & arm_ext_sec
17609
17610  TCE("smc",     1600070, f7f08000, 1, (EXPi), smc, t_smc),
17611
17612 #undef  ARM_VARIANT
17613 #define ARM_VARIANT    & arm_ext_virt
17614 #undef  THUMB_VARIANT
17615 #define THUMB_VARIANT    & arm_ext_virt
17616
17617  TCE("hvc",     1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
17618  TCE("eret",    160006e, f3de8f00, 0, (), noargs, noargs),
17619
17620 #undef  ARM_VARIANT
17621 #define ARM_VARIANT  & arm_ext_v6t2
17622 #undef  THUMB_VARIANT
17623 #define THUMB_VARIANT  & arm_ext_v6t2
17624
17625  TCE("bfc",     7c0001f, f36f0000, 3, (RRnpc, I31, I32),           bfc, t_bfc),
17626  TCE("bfi",     7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
17627  TCE("sbfx",    7a00050, f3400000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
17628  TCE("ubfx",    7e00050, f3c00000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
17629
17630  TCE("mls",     0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
17631  TCE("movw",    3000000, f2400000, 2, (RRnpc, HALF),                mov16, t_mov16),
17632  TCE("movt",    3400000, f2c00000, 2, (RRnpc, HALF),                mov16, t_mov16),
17633  TCE("rbit",    6ff0f30, fa90f0a0, 2, (RR, RR),                     rd_rm, t_rbit),
17634
17635  TC3("ldrht",   03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17636  TC3("ldrsht",  03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17637  TC3("ldrsbt",  03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17638  TC3("strht",   02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17639
17640  /* Thumb-only instructions.  */
17641 #undef ARM_VARIANT
17642 #define ARM_VARIANT NULL
17643   TUE("cbnz",     0,           b900,     2, (RR, EXP), 0, t_cbz),
17644   TUE("cbz",      0,           b100,     2, (RR, EXP), 0, t_cbz),
17645
17646  /* ARM does not really have an IT instruction, so always allow it.
17647     The opcode is copied from Thumb in order to allow warnings in
17648     -mimplicit-it=[never | arm] modes.  */
17649 #undef  ARM_VARIANT
17650 #define ARM_VARIANT  & arm_ext_v1
17651
17652  TUE("it",        bf08,        bf08,     1, (COND),   it,    t_it),
17653  TUE("itt",       bf0c,        bf0c,     1, (COND),   it,    t_it),
17654  TUE("ite",       bf04,        bf04,     1, (COND),   it,    t_it),
17655  TUE("ittt",      bf0e,        bf0e,     1, (COND),   it,    t_it),
17656  TUE("itet",      bf06,        bf06,     1, (COND),   it,    t_it),
17657  TUE("itte",      bf0a,        bf0a,     1, (COND),   it,    t_it),
17658  TUE("itee",      bf02,        bf02,     1, (COND),   it,    t_it),
17659  TUE("itttt",     bf0f,        bf0f,     1, (COND),   it,    t_it),
17660  TUE("itett",     bf07,        bf07,     1, (COND),   it,    t_it),
17661  TUE("ittet",     bf0b,        bf0b,     1, (COND),   it,    t_it),
17662  TUE("iteet",     bf03,        bf03,     1, (COND),   it,    t_it),
17663  TUE("ittte",     bf0d,        bf0d,     1, (COND),   it,    t_it),
17664  TUE("itete",     bf05,        bf05,     1, (COND),   it,    t_it),
17665  TUE("ittee",     bf09,        bf09,     1, (COND),   it,    t_it),
17666  TUE("iteee",     bf01,        bf01,     1, (COND),   it,    t_it),
17667  /* ARM/Thumb-2 instructions with no Thumb-1 equivalent.  */
17668  TC3("rrx",       01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
17669  TC3("rrxs",      01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
17670
17671  /* Thumb2 only instructions.  */
17672 #undef  ARM_VARIANT
17673 #define ARM_VARIANT  NULL
17674
17675  TCE("addw",    0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
17676  TCE("subw",    0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
17677  TCE("orn",       0, ea600000, 3, (RR, oRR, SH),  0, t_orn),
17678  TCE("orns",      0, ea700000, 3, (RR, oRR, SH),  0, t_orn),
17679  TCE("tbb",       0, e8d0f000, 1, (TB), 0, t_tb),
17680  TCE("tbh",       0, e8d0f010, 1, (TB), 0, t_tb),
17681
17682  /* Hardware division instructions.  */
17683 #undef  ARM_VARIANT
17684 #define ARM_VARIANT    & arm_ext_adiv
17685 #undef  THUMB_VARIANT
17686 #define THUMB_VARIANT  & arm_ext_div
17687
17688  TCE("sdiv",    710f010, fb90f0f0, 3, (RR, oRR, RR), div, t_div),
17689  TCE("udiv",    730f010, fbb0f0f0, 3, (RR, oRR, RR), div, t_div),
17690
17691  /* ARM V6M/V7 instructions.  */
17692 #undef  ARM_VARIANT
17693 #define ARM_VARIANT    & arm_ext_barrier
17694 #undef  THUMB_VARIANT
17695 #define THUMB_VARIANT  & arm_ext_barrier
17696
17697  TUF("dmb",     57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier,  t_barrier),
17698  TUF("dsb",     57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier,  t_barrier),
17699  TUF("isb",     57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier,  t_barrier),
17700
17701  /* ARM V7 instructions.  */
17702 #undef  ARM_VARIANT
17703 #define ARM_VARIANT    & arm_ext_v7
17704 #undef  THUMB_VARIANT
17705 #define THUMB_VARIANT  & arm_ext_v7
17706
17707  TUF("pli",     450f000, f910f000, 1, (ADDR),     pli,      t_pld),
17708  TCE("dbg",     320f0f0, f3af80f0, 1, (I15),      dbg,      t_dbg),
17709
17710 #undef ARM_VARIANT
17711 #define ARM_VARIANT    & arm_ext_mp
17712 #undef THUMB_VARIANT
17713 #define THUMB_VARIANT  & arm_ext_mp
17714
17715  TUF("pldw",    410f000, f830f000, 1, (ADDR),   pld,    t_pld),
17716
17717 #undef  ARM_VARIANT
17718 #define ARM_VARIANT  & fpu_fpa_ext_v1  /* Core FPA instruction set (V1).  */
17719
17720  cCE("wfs",     e200110, 1, (RR),            rd),
17721  cCE("rfs",     e300110, 1, (RR),            rd),
17722  cCE("wfc",     e400110, 1, (RR),            rd),
17723  cCE("rfc",     e500110, 1, (RR),            rd),
17724
17725  cCL("ldfs",    c100100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17726  cCL("ldfd",    c108100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17727  cCL("ldfe",    c500100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17728  cCL("ldfp",    c508100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17729
17730  cCL("stfs",    c000100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17731  cCL("stfd",    c008100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17732  cCL("stfe",    c400100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17733  cCL("stfp",    c408100, 2, (RF, ADDRGLDC),  rd_cpaddr),
17734
17735  cCL("mvfs",    e008100, 2, (RF, RF_IF),     rd_rm),
17736  cCL("mvfsp",   e008120, 2, (RF, RF_IF),     rd_rm),
17737  cCL("mvfsm",   e008140, 2, (RF, RF_IF),     rd_rm),
17738  cCL("mvfsz",   e008160, 2, (RF, RF_IF),     rd_rm),
17739  cCL("mvfd",    e008180, 2, (RF, RF_IF),     rd_rm),
17740  cCL("mvfdp",   e0081a0, 2, (RF, RF_IF),     rd_rm),
17741  cCL("mvfdm",   e0081c0, 2, (RF, RF_IF),     rd_rm),
17742  cCL("mvfdz",   e0081e0, 2, (RF, RF_IF),     rd_rm),
17743  cCL("mvfe",    e088100, 2, (RF, RF_IF),     rd_rm),
17744  cCL("mvfep",   e088120, 2, (RF, RF_IF),     rd_rm),
17745  cCL("mvfem",   e088140, 2, (RF, RF_IF),     rd_rm),
17746  cCL("mvfez",   e088160, 2, (RF, RF_IF),     rd_rm),
17747
17748  cCL("mnfs",    e108100, 2, (RF, RF_IF),     rd_rm),
17749  cCL("mnfsp",   e108120, 2, (RF, RF_IF),     rd_rm),
17750  cCL("mnfsm",   e108140, 2, (RF, RF_IF),     rd_rm),
17751  cCL("mnfsz",   e108160, 2, (RF, RF_IF),     rd_rm),
17752  cCL("mnfd",    e108180, 2, (RF, RF_IF),     rd_rm),
17753  cCL("mnfdp",   e1081a0, 2, (RF, RF_IF),     rd_rm),
17754  cCL("mnfdm",   e1081c0, 2, (RF, RF_IF),     rd_rm),
17755  cCL("mnfdz",   e1081e0, 2, (RF, RF_IF),     rd_rm),
17756  cCL("mnfe",    e188100, 2, (RF, RF_IF),     rd_rm),
17757  cCL("mnfep",   e188120, 2, (RF, RF_IF),     rd_rm),
17758  cCL("mnfem",   e188140, 2, (RF, RF_IF),     rd_rm),
17759  cCL("mnfez",   e188160, 2, (RF, RF_IF),     rd_rm),
17760
17761  cCL("abss",    e208100, 2, (RF, RF_IF),     rd_rm),
17762  cCL("abssp",   e208120, 2, (RF, RF_IF),     rd_rm),
17763  cCL("abssm",   e208140, 2, (RF, RF_IF),     rd_rm),
17764  cCL("abssz",   e208160, 2, (RF, RF_IF),     rd_rm),
17765  cCL("absd",    e208180, 2, (RF, RF_IF),     rd_rm),
17766  cCL("absdp",   e2081a0, 2, (RF, RF_IF),     rd_rm),
17767  cCL("absdm",   e2081c0, 2, (RF, RF_IF),     rd_rm),
17768  cCL("absdz",   e2081e0, 2, (RF, RF_IF),     rd_rm),
17769  cCL("abse",    e288100, 2, (RF, RF_IF),     rd_rm),
17770  cCL("absep",   e288120, 2, (RF, RF_IF),     rd_rm),
17771  cCL("absem",   e288140, 2, (RF, RF_IF),     rd_rm),
17772  cCL("absez",   e288160, 2, (RF, RF_IF),     rd_rm),
17773
17774  cCL("rnds",    e308100, 2, (RF, RF_IF),     rd_rm),
17775  cCL("rndsp",   e308120, 2, (RF, RF_IF),     rd_rm),
17776  cCL("rndsm",   e308140, 2, (RF, RF_IF),     rd_rm),
17777  cCL("rndsz",   e308160, 2, (RF, RF_IF),     rd_rm),
17778  cCL("rndd",    e308180, 2, (RF, RF_IF),     rd_rm),
17779  cCL("rnddp",   e3081a0, 2, (RF, RF_IF),     rd_rm),
17780  cCL("rnddm",   e3081c0, 2, (RF, RF_IF),     rd_rm),
17781  cCL("rnddz",   e3081e0, 2, (RF, RF_IF),     rd_rm),
17782  cCL("rnde",    e388100, 2, (RF, RF_IF),     rd_rm),
17783  cCL("rndep",   e388120, 2, (RF, RF_IF),     rd_rm),
17784  cCL("rndem",   e388140, 2, (RF, RF_IF),     rd_rm),
17785  cCL("rndez",   e388160, 2, (RF, RF_IF),     rd_rm),
17786
17787  cCL("sqts",    e408100, 2, (RF, RF_IF),     rd_rm),
17788  cCL("sqtsp",   e408120, 2, (RF, RF_IF),     rd_rm),
17789  cCL("sqtsm",   e408140, 2, (RF, RF_IF),     rd_rm),
17790  cCL("sqtsz",   e408160, 2, (RF, RF_IF),     rd_rm),
17791  cCL("sqtd",    e408180, 2, (RF, RF_IF),     rd_rm),
17792  cCL("sqtdp",   e4081a0, 2, (RF, RF_IF),     rd_rm),
17793  cCL("sqtdm",   e4081c0, 2, (RF, RF_IF),     rd_rm),
17794  cCL("sqtdz",   e4081e0, 2, (RF, RF_IF),     rd_rm),
17795  cCL("sqte",    e488100, 2, (RF, RF_IF),     rd_rm),
17796  cCL("sqtep",   e488120, 2, (RF, RF_IF),     rd_rm),
17797  cCL("sqtem",   e488140, 2, (RF, RF_IF),     rd_rm),
17798  cCL("sqtez",   e488160, 2, (RF, RF_IF),     rd_rm),
17799
17800  cCL("logs",    e508100, 2, (RF, RF_IF),     rd_rm),
17801  cCL("logsp",   e508120, 2, (RF, RF_IF),     rd_rm),
17802  cCL("logsm",   e508140, 2, (RF, RF_IF),     rd_rm),
17803  cCL("logsz",   e508160, 2, (RF, RF_IF),     rd_rm),
17804  cCL("logd",    e508180, 2, (RF, RF_IF),     rd_rm),
17805  cCL("logdp",   e5081a0, 2, (RF, RF_IF),     rd_rm),
17806  cCL("logdm",   e5081c0, 2, (RF, RF_IF),     rd_rm),
17807  cCL("logdz",   e5081e0, 2, (RF, RF_IF),     rd_rm),
17808  cCL("loge",    e588100, 2, (RF, RF_IF),     rd_rm),
17809  cCL("logep",   e588120, 2, (RF, RF_IF),     rd_rm),
17810  cCL("logem",   e588140, 2, (RF, RF_IF),     rd_rm),
17811  cCL("logez",   e588160, 2, (RF, RF_IF),     rd_rm),
17812
17813  cCL("lgns",    e608100, 2, (RF, RF_IF),     rd_rm),
17814  cCL("lgnsp",   e608120, 2, (RF, RF_IF),     rd_rm),
17815  cCL("lgnsm",   e608140, 2, (RF, RF_IF),     rd_rm),
17816  cCL("lgnsz",   e608160, 2, (RF, RF_IF),     rd_rm),
17817  cCL("lgnd",    e608180, 2, (RF, RF_IF),     rd_rm),
17818  cCL("lgndp",   e6081a0, 2, (RF, RF_IF),     rd_rm),
17819  cCL("lgndm",   e6081c0, 2, (RF, RF_IF),     rd_rm),
17820  cCL("lgndz",   e6081e0, 2, (RF, RF_IF),     rd_rm),
17821  cCL("lgne",    e688100, 2, (RF, RF_IF),     rd_rm),
17822  cCL("lgnep",   e688120, 2, (RF, RF_IF),     rd_rm),
17823  cCL("lgnem",   e688140, 2, (RF, RF_IF),     rd_rm),
17824  cCL("lgnez",   e688160, 2, (RF, RF_IF),     rd_rm),
17825
17826  cCL("exps",    e708100, 2, (RF, RF_IF),     rd_rm),
17827  cCL("expsp",   e708120, 2, (RF, RF_IF),     rd_rm),
17828  cCL("expsm",   e708140, 2, (RF, RF_IF),     rd_rm),
17829  cCL("expsz",   e708160, 2, (RF, RF_IF),     rd_rm),
17830  cCL("expd",    e708180, 2, (RF, RF_IF),     rd_rm),
17831  cCL("expdp",   e7081a0, 2, (RF, RF_IF),     rd_rm),
17832  cCL("expdm",   e7081c0, 2, (RF, RF_IF),     rd_rm),
17833  cCL("expdz",   e7081e0, 2, (RF, RF_IF),     rd_rm),
17834  cCL("expe",    e788100, 2, (RF, RF_IF),     rd_rm),
17835  cCL("expep",   e788120, 2, (RF, RF_IF),     rd_rm),
17836  cCL("expem",   e788140, 2, (RF, RF_IF),     rd_rm),
17837  cCL("expdz",   e788160, 2, (RF, RF_IF),     rd_rm),
17838
17839  cCL("sins",    e808100, 2, (RF, RF_IF),     rd_rm),
17840  cCL("sinsp",   e808120, 2, (RF, RF_IF),     rd_rm),
17841  cCL("sinsm",   e808140, 2, (RF, RF_IF),     rd_rm),
17842  cCL("sinsz",   e808160, 2, (RF, RF_IF),     rd_rm),
17843  cCL("sind",    e808180, 2, (RF, RF_IF),     rd_rm),
17844  cCL("sindp",   e8081a0, 2, (RF, RF_IF),     rd_rm),
17845  cCL("sindm",   e8081c0, 2, (RF, RF_IF),     rd_rm),
17846  cCL("sindz",   e8081e0, 2, (RF, RF_IF),     rd_rm),
17847  cCL("sine",    e888100, 2, (RF, RF_IF),     rd_rm),
17848  cCL("sinep",   e888120, 2, (RF, RF_IF),     rd_rm),
17849  cCL("sinem",   e888140, 2, (RF, RF_IF),     rd_rm),
17850  cCL("sinez",   e888160, 2, (RF, RF_IF),     rd_rm),
17851
17852  cCL("coss",    e908100, 2, (RF, RF_IF),     rd_rm),
17853  cCL("cossp",   e908120, 2, (RF, RF_IF),     rd_rm),
17854  cCL("cossm",   e908140, 2, (RF, RF_IF),     rd_rm),
17855  cCL("cossz",   e908160, 2, (RF, RF_IF),     rd_rm),
17856  cCL("cosd",    e908180, 2, (RF, RF_IF),     rd_rm),
17857  cCL("cosdp",   e9081a0, 2, (RF, RF_IF),     rd_rm),
17858  cCL("cosdm",   e9081c0, 2, (RF, RF_IF),     rd_rm),
17859  cCL("cosdz",   e9081e0, 2, (RF, RF_IF),     rd_rm),
17860  cCL("cose",    e988100, 2, (RF, RF_IF),     rd_rm),
17861  cCL("cosep",   e988120, 2, (RF, RF_IF),     rd_rm),
17862  cCL("cosem",   e988140, 2, (RF, RF_IF),     rd_rm),
17863  cCL("cosez",   e988160, 2, (RF, RF_IF),     rd_rm),
17864
17865  cCL("tans",    ea08100, 2, (RF, RF_IF),     rd_rm),
17866  cCL("tansp",   ea08120, 2, (RF, RF_IF),     rd_rm),
17867  cCL("tansm",   ea08140, 2, (RF, RF_IF),     rd_rm),
17868  cCL("tansz",   ea08160, 2, (RF, RF_IF),     rd_rm),
17869  cCL("tand",    ea08180, 2, (RF, RF_IF),     rd_rm),
17870  cCL("tandp",   ea081a0, 2, (RF, RF_IF),     rd_rm),
17871  cCL("tandm",   ea081c0, 2, (RF, RF_IF),     rd_rm),
17872  cCL("tandz",   ea081e0, 2, (RF, RF_IF),     rd_rm),
17873  cCL("tane",    ea88100, 2, (RF, RF_IF),     rd_rm),
17874  cCL("tanep",   ea88120, 2, (RF, RF_IF),     rd_rm),
17875  cCL("tanem",   ea88140, 2, (RF, RF_IF),     rd_rm),
17876  cCL("tanez",   ea88160, 2, (RF, RF_IF),     rd_rm),
17877
17878  cCL("asns",    eb08100, 2, (RF, RF_IF),     rd_rm),
17879  cCL("asnsp",   eb08120, 2, (RF, RF_IF),     rd_rm),
17880  cCL("asnsm",   eb08140, 2, (RF, RF_IF),     rd_rm),
17881  cCL("asnsz",   eb08160, 2, (RF, RF_IF),     rd_rm),
17882  cCL("asnd",    eb08180, 2, (RF, RF_IF),     rd_rm),
17883  cCL("asndp",   eb081a0, 2, (RF, RF_IF),     rd_rm),
17884  cCL("asndm",   eb081c0, 2, (RF, RF_IF),     rd_rm),
17885  cCL("asndz",   eb081e0, 2, (RF, RF_IF),     rd_rm),
17886  cCL("asne",    eb88100, 2, (RF, RF_IF),     rd_rm),
17887  cCL("asnep",   eb88120, 2, (RF, RF_IF),     rd_rm),
17888  cCL("asnem",   eb88140, 2, (RF, RF_IF),     rd_rm),
17889  cCL("asnez",   eb88160, 2, (RF, RF_IF),     rd_rm),
17890
17891  cCL("acss",    ec08100, 2, (RF, RF_IF),     rd_rm),
17892  cCL("acssp",   ec08120, 2, (RF, RF_IF),     rd_rm),
17893  cCL("acssm",   ec08140, 2, (RF, RF_IF),     rd_rm),
17894  cCL("acssz",   ec08160, 2, (RF, RF_IF),     rd_rm),
17895  cCL("acsd",    ec08180, 2, (RF, RF_IF),     rd_rm),
17896  cCL("acsdp",   ec081a0, 2, (RF, RF_IF),     rd_rm),
17897  cCL("acsdm",   ec081c0, 2, (RF, RF_IF),     rd_rm),
17898  cCL("acsdz",   ec081e0, 2, (RF, RF_IF),     rd_rm),
17899  cCL("acse",    ec88100, 2, (RF, RF_IF),     rd_rm),
17900  cCL("acsep",   ec88120, 2, (RF, RF_IF),     rd_rm),
17901  cCL("acsem",   ec88140, 2, (RF, RF_IF),     rd_rm),
17902  cCL("acsez",   ec88160, 2, (RF, RF_IF),     rd_rm),
17903
17904  cCL("atns",    ed08100, 2, (RF, RF_IF),     rd_rm),
17905  cCL("atnsp",   ed08120, 2, (RF, RF_IF),     rd_rm),
17906  cCL("atnsm",   ed08140, 2, (RF, RF_IF),     rd_rm),
17907  cCL("atnsz",   ed08160, 2, (RF, RF_IF),     rd_rm),
17908  cCL("atnd",    ed08180, 2, (RF, RF_IF),     rd_rm),
17909  cCL("atndp",   ed081a0, 2, (RF, RF_IF),     rd_rm),
17910  cCL("atndm",   ed081c0, 2, (RF, RF_IF),     rd_rm),
17911  cCL("atndz",   ed081e0, 2, (RF, RF_IF),     rd_rm),
17912  cCL("atne",    ed88100, 2, (RF, RF_IF),     rd_rm),
17913  cCL("atnep",   ed88120, 2, (RF, RF_IF),     rd_rm),
17914  cCL("atnem",   ed88140, 2, (RF, RF_IF),     rd_rm),
17915  cCL("atnez",   ed88160, 2, (RF, RF_IF),     rd_rm),
17916
17917  cCL("urds",    ee08100, 2, (RF, RF_IF),     rd_rm),
17918  cCL("urdsp",   ee08120, 2, (RF, RF_IF),     rd_rm),
17919  cCL("urdsm",   ee08140, 2, (RF, RF_IF),     rd_rm),
17920  cCL("urdsz",   ee08160, 2, (RF, RF_IF),     rd_rm),
17921  cCL("urdd",    ee08180, 2, (RF, RF_IF),     rd_rm),
17922  cCL("urddp",   ee081a0, 2, (RF, RF_IF),     rd_rm),
17923  cCL("urddm",   ee081c0, 2, (RF, RF_IF),     rd_rm),
17924  cCL("urddz",   ee081e0, 2, (RF, RF_IF),     rd_rm),
17925  cCL("urde",    ee88100, 2, (RF, RF_IF),     rd_rm),
17926  cCL("urdep",   ee88120, 2, (RF, RF_IF),     rd_rm),
17927  cCL("urdem",   ee88140, 2, (RF, RF_IF),     rd_rm),
17928  cCL("urdez",   ee88160, 2, (RF, RF_IF),     rd_rm),
17929
17930  cCL("nrms",    ef08100, 2, (RF, RF_IF),     rd_rm),
17931  cCL("nrmsp",   ef08120, 2, (RF, RF_IF),     rd_rm),
17932  cCL("nrmsm",   ef08140, 2, (RF, RF_IF),     rd_rm),
17933  cCL("nrmsz",   ef08160, 2, (RF, RF_IF),     rd_rm),
17934  cCL("nrmd",    ef08180, 2, (RF, RF_IF),     rd_rm),
17935  cCL("nrmdp",   ef081a0, 2, (RF, RF_IF),     rd_rm),
17936  cCL("nrmdm",   ef081c0, 2, (RF, RF_IF),     rd_rm),
17937  cCL("nrmdz",   ef081e0, 2, (RF, RF_IF),     rd_rm),
17938  cCL("nrme",    ef88100, 2, (RF, RF_IF),     rd_rm),
17939  cCL("nrmep",   ef88120, 2, (RF, RF_IF),     rd_rm),
17940  cCL("nrmem",   ef88140, 2, (RF, RF_IF),     rd_rm),
17941  cCL("nrmez",   ef88160, 2, (RF, RF_IF),     rd_rm),
17942
17943  cCL("adfs",    e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
17944  cCL("adfsp",   e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
17945  cCL("adfsm",   e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
17946  cCL("adfsz",   e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
17947  cCL("adfd",    e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
17948  cCL("adfdp",   e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17949  cCL("adfdm",   e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17950  cCL("adfdz",   e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17951  cCL("adfe",    e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
17952  cCL("adfep",   e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
17953  cCL("adfem",   e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
17954  cCL("adfez",   e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
17955
17956  cCL("sufs",    e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
17957  cCL("sufsp",   e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
17958  cCL("sufsm",   e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
17959  cCL("sufsz",   e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
17960  cCL("sufd",    e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
17961  cCL("sufdp",   e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17962  cCL("sufdm",   e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17963  cCL("sufdz",   e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17964  cCL("sufe",    e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
17965  cCL("sufep",   e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
17966  cCL("sufem",   e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
17967  cCL("sufez",   e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
17968
17969  cCL("rsfs",    e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
17970  cCL("rsfsp",   e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
17971  cCL("rsfsm",   e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
17972  cCL("rsfsz",   e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
17973  cCL("rsfd",    e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
17974  cCL("rsfdp",   e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17975  cCL("rsfdm",   e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17976  cCL("rsfdz",   e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17977  cCL("rsfe",    e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
17978  cCL("rsfep",   e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
17979  cCL("rsfem",   e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
17980  cCL("rsfez",   e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
17981
17982  cCL("mufs",    e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
17983  cCL("mufsp",   e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
17984  cCL("mufsm",   e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
17985  cCL("mufsz",   e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
17986  cCL("mufd",    e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
17987  cCL("mufdp",   e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
17988  cCL("mufdm",   e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
17989  cCL("mufdz",   e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
17990  cCL("mufe",    e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
17991  cCL("mufep",   e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
17992  cCL("mufem",   e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
17993  cCL("mufez",   e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
17994
17995  cCL("dvfs",    e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
17996  cCL("dvfsp",   e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
17997  cCL("dvfsm",   e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
17998  cCL("dvfsz",   e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
17999  cCL("dvfd",    e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
18000  cCL("dvfdp",   e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18001  cCL("dvfdm",   e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18002  cCL("dvfdz",   e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18003  cCL("dvfe",    e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
18004  cCL("dvfep",   e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
18005  cCL("dvfem",   e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
18006  cCL("dvfez",   e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
18007
18008  cCL("rdfs",    e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
18009  cCL("rdfsp",   e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
18010  cCL("rdfsm",   e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
18011  cCL("rdfsz",   e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
18012  cCL("rdfd",    e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
18013  cCL("rdfdp",   e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18014  cCL("rdfdm",   e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18015  cCL("rdfdz",   e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18016  cCL("rdfe",    e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
18017  cCL("rdfep",   e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
18018  cCL("rdfem",   e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
18019  cCL("rdfez",   e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
18020
18021  cCL("pows",    e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
18022  cCL("powsp",   e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
18023  cCL("powsm",   e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
18024  cCL("powsz",   e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
18025  cCL("powd",    e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
18026  cCL("powdp",   e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18027  cCL("powdm",   e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18028  cCL("powdz",   e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18029  cCL("powe",    e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
18030  cCL("powep",   e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
18031  cCL("powem",   e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
18032  cCL("powez",   e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
18033
18034  cCL("rpws",    e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
18035  cCL("rpwsp",   e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
18036  cCL("rpwsm",   e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
18037  cCL("rpwsz",   e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
18038  cCL("rpwd",    e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
18039  cCL("rpwdp",   e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18040  cCL("rpwdm",   e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18041  cCL("rpwdz",   e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18042  cCL("rpwe",    e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
18043  cCL("rpwep",   e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
18044  cCL("rpwem",   e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
18045  cCL("rpwez",   e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
18046
18047  cCL("rmfs",    e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
18048  cCL("rmfsp",   e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
18049  cCL("rmfsm",   e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
18050  cCL("rmfsz",   e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
18051  cCL("rmfd",    e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
18052  cCL("rmfdp",   e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18053  cCL("rmfdm",   e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18054  cCL("rmfdz",   e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18055  cCL("rmfe",    e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
18056  cCL("rmfep",   e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
18057  cCL("rmfem",   e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
18058  cCL("rmfez",   e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
18059
18060  cCL("fmls",    e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
18061  cCL("fmlsp",   e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
18062  cCL("fmlsm",   e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
18063  cCL("fmlsz",   e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
18064  cCL("fmld",    e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
18065  cCL("fmldp",   e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18066  cCL("fmldm",   e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18067  cCL("fmldz",   e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18068  cCL("fmle",    e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
18069  cCL("fmlep",   e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
18070  cCL("fmlem",   e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
18071  cCL("fmlez",   e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
18072
18073  cCL("fdvs",    ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
18074  cCL("fdvsp",   ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
18075  cCL("fdvsm",   ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
18076  cCL("fdvsz",   ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
18077  cCL("fdvd",    ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
18078  cCL("fdvdp",   ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18079  cCL("fdvdm",   ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18080  cCL("fdvdz",   ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18081  cCL("fdve",    ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
18082  cCL("fdvep",   ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
18083  cCL("fdvem",   ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
18084  cCL("fdvez",   ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
18085
18086  cCL("frds",    eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
18087  cCL("frdsp",   eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
18088  cCL("frdsm",   eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
18089  cCL("frdsz",   eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
18090  cCL("frdd",    eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
18091  cCL("frddp",   eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18092  cCL("frddm",   eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18093  cCL("frddz",   eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18094  cCL("frde",    eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
18095  cCL("frdep",   eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
18096  cCL("frdem",   eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
18097  cCL("frdez",   eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
18098
18099  cCL("pols",    ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
18100  cCL("polsp",   ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
18101  cCL("polsm",   ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
18102  cCL("polsz",   ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
18103  cCL("pold",    ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
18104  cCL("poldp",   ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18105  cCL("poldm",   ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18106  cCL("poldz",   ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18107  cCL("pole",    ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
18108  cCL("polep",   ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
18109  cCL("polem",   ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
18110  cCL("polez",   ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
18111
18112  cCE("cmf",     e90f110, 2, (RF, RF_IF),     fpa_cmp),
18113  C3E("cmfe",    ed0f110, 2, (RF, RF_IF),     fpa_cmp),
18114  cCE("cnf",     eb0f110, 2, (RF, RF_IF),     fpa_cmp),
18115  C3E("cnfe",    ef0f110, 2, (RF, RF_IF),     fpa_cmp),
18116
18117  cCL("flts",    e000110, 2, (RF, RR),        rn_rd),
18118  cCL("fltsp",   e000130, 2, (RF, RR),        rn_rd),
18119  cCL("fltsm",   e000150, 2, (RF, RR),        rn_rd),
18120  cCL("fltsz",   e000170, 2, (RF, RR),        rn_rd),
18121  cCL("fltd",    e000190, 2, (RF, RR),        rn_rd),
18122  cCL("fltdp",   e0001b0, 2, (RF, RR),        rn_rd),
18123  cCL("fltdm",   e0001d0, 2, (RF, RR),        rn_rd),
18124  cCL("fltdz",   e0001f0, 2, (RF, RR),        rn_rd),
18125  cCL("flte",    e080110, 2, (RF, RR),        rn_rd),
18126  cCL("fltep",   e080130, 2, (RF, RR),        rn_rd),
18127  cCL("fltem",   e080150, 2, (RF, RR),        rn_rd),
18128  cCL("fltez",   e080170, 2, (RF, RR),        rn_rd),
18129
18130   /* The implementation of the FIX instruction is broken on some
18131      assemblers, in that it accepts a precision specifier as well as a
18132      rounding specifier, despite the fact that this is meaningless.
18133      To be more compatible, we accept it as well, though of course it
18134      does not set any bits.  */
18135  cCE("fix",     e100110, 2, (RR, RF),        rd_rm),
18136  cCL("fixp",    e100130, 2, (RR, RF),        rd_rm),
18137  cCL("fixm",    e100150, 2, (RR, RF),        rd_rm),
18138  cCL("fixz",    e100170, 2, (RR, RF),        rd_rm),
18139  cCL("fixsp",   e100130, 2, (RR, RF),        rd_rm),
18140  cCL("fixsm",   e100150, 2, (RR, RF),        rd_rm),
18141  cCL("fixsz",   e100170, 2, (RR, RF),        rd_rm),
18142  cCL("fixdp",   e100130, 2, (RR, RF),        rd_rm),
18143  cCL("fixdm",   e100150, 2, (RR, RF),        rd_rm),
18144  cCL("fixdz",   e100170, 2, (RR, RF),        rd_rm),
18145  cCL("fixep",   e100130, 2, (RR, RF),        rd_rm),
18146  cCL("fixem",   e100150, 2, (RR, RF),        rd_rm),
18147  cCL("fixez",   e100170, 2, (RR, RF),        rd_rm),
18148
18149   /* Instructions that were new with the real FPA, call them V2.  */
18150 #undef  ARM_VARIANT
18151 #define ARM_VARIANT  & fpu_fpa_ext_v2
18152
18153  cCE("lfm",     c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18154  cCL("lfmfd",   c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18155  cCL("lfmea",   d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18156  cCE("sfm",     c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18157  cCL("sfmfd",   d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18158  cCL("sfmea",   c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18159
18160 #undef  ARM_VARIANT
18161 #define ARM_VARIANT  & fpu_vfp_ext_v1xd  /* VFP V1xD (single precision).  */
18162
18163   /* Moves and type conversions.  */
18164  cCE("fcpys",   eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
18165  cCE("fmrs",    e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
18166  cCE("fmsr",    e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
18167  cCE("fmstat",  ef1fa10, 0, (),               noargs),
18168  cCE("vmrs",    ef00a10, 2, (APSR_RR, RVC),   vmrs),
18169  cCE("vmsr",    ee00a10, 2, (RVC, RR),        vmsr),
18170  cCE("fsitos",  eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
18171  cCE("fuitos",  eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
18172  cCE("ftosis",  ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
18173  cCE("ftosizs", ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
18174  cCE("ftouis",  ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
18175  cCE("ftouizs", ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
18176  cCE("fmrx",    ef00a10, 2, (RR, RVC),        rd_rn),
18177  cCE("fmxr",    ee00a10, 2, (RVC, RR),        rn_rd),
18178
18179   /* Memory operations.  */
18180  cCE("flds",    d100a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
18181  cCE("fsts",    d000a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
18182  cCE("fldmias", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
18183  cCE("fldmfds", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
18184  cCE("fldmdbs", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
18185  cCE("fldmeas", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
18186  cCE("fldmiax", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
18187  cCE("fldmfdx", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
18188  cCE("fldmdbx", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
18189  cCE("fldmeax", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
18190  cCE("fstmias", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
18191  cCE("fstmeas", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
18192  cCE("fstmdbs", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
18193  cCE("fstmfds", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
18194  cCE("fstmiax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
18195  cCE("fstmeax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
18196  cCE("fstmdbx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
18197  cCE("fstmfdx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
18198
18199   /* Monadic operations.  */
18200  cCE("fabss",   eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
18201  cCE("fnegs",   eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
18202  cCE("fsqrts",  eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
18203
18204   /* Dyadic operations.  */
18205  cCE("fadds",   e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18206  cCE("fsubs",   e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18207  cCE("fmuls",   e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18208  cCE("fdivs",   e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18209  cCE("fmacs",   e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18210  cCE("fmscs",   e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18211  cCE("fnmuls",  e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18212  cCE("fnmacs",  e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18213  cCE("fnmscs",  e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18214
18215   /* Comparisons.  */
18216  cCE("fcmps",   eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
18217  cCE("fcmpzs",  eb50a40, 1, (RVS),            vfp_sp_compare_z),
18218  cCE("fcmpes",  eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
18219  cCE("fcmpezs", eb50ac0, 1, (RVS),            vfp_sp_compare_z),
18220
18221  /* Double precision load/store are still present on single precision
18222     implementations.  */
18223  cCE("fldd",    d100b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
18224  cCE("fstd",    d000b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
18225  cCE("fldmiad", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
18226  cCE("fldmfdd", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
18227  cCE("fldmdbd", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
18228  cCE("fldmead", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
18229  cCE("fstmiad", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
18230  cCE("fstmead", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
18231  cCE("fstmdbd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
18232  cCE("fstmfdd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
18233
18234 #undef  ARM_VARIANT
18235 #define ARM_VARIANT  & fpu_vfp_ext_v1 /* VFP V1 (Double precision).  */
18236
18237   /* Moves and type conversions.  */
18238  cCE("fcpyd",   eb00b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
18239  cCE("fcvtds",  eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
18240  cCE("fcvtsd",  eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
18241  cCE("fmdhr",   e200b10, 2, (RVD, RR),        vfp_dp_rn_rd),
18242  cCE("fmdlr",   e000b10, 2, (RVD, RR),        vfp_dp_rn_rd),
18243  cCE("fmrdh",   e300b10, 2, (RR, RVD),        vfp_dp_rd_rn),
18244  cCE("fmrdl",   e100b10, 2, (RR, RVD),        vfp_dp_rd_rn),
18245  cCE("fsitod",  eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
18246  cCE("fuitod",  eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
18247  cCE("ftosid",  ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
18248  cCE("ftosizd", ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
18249  cCE("ftouid",  ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
18250  cCE("ftouizd", ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
18251
18252   /* Monadic operations.  */
18253  cCE("fabsd",   eb00bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
18254  cCE("fnegd",   eb10b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
18255  cCE("fsqrtd",  eb10bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
18256
18257   /* Dyadic operations.  */
18258  cCE("faddd",   e300b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18259  cCE("fsubd",   e300b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18260  cCE("fmuld",   e200b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18261  cCE("fdivd",   e800b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18262  cCE("fmacd",   e000b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18263  cCE("fmscd",   e100b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18264  cCE("fnmuld",  e200b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18265  cCE("fnmacd",  e000b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18266  cCE("fnmscd",  e100b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18267
18268   /* Comparisons.  */
18269  cCE("fcmpd",   eb40b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
18270  cCE("fcmpzd",  eb50b40, 1, (RVD),            vfp_dp_rd),
18271  cCE("fcmped",  eb40bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
18272  cCE("fcmpezd", eb50bc0, 1, (RVD),            vfp_dp_rd),
18273
18274 #undef  ARM_VARIANT
18275 #define ARM_VARIANT  & fpu_vfp_ext_v2
18276
18277  cCE("fmsrr",   c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
18278  cCE("fmrrs",   c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
18279  cCE("fmdrr",   c400b10, 3, (RVD, RR, RR),    vfp_dp_rm_rd_rn),
18280  cCE("fmrrd",   c500b10, 3, (RR, RR, RVD),    vfp_dp_rd_rn_rm),
18281
18282 /* Instructions which may belong to either the Neon or VFP instruction sets.
18283    Individual encoder functions perform additional architecture checks.  */
18284 #undef  ARM_VARIANT
18285 #define ARM_VARIANT    & fpu_vfp_ext_v1xd
18286 #undef  THUMB_VARIANT
18287 #define THUMB_VARIANT  & fpu_vfp_ext_v1xd
18288
18289   /* These mnemonics are unique to VFP.  */
18290  NCE(vsqrt,     0,       2, (RVSD, RVSD),       vfp_nsyn_sqrt),
18291  NCE(vdiv,      0,       3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
18292  nCE(vnmul,     _vnmul,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18293  nCE(vnmla,     _vnmla,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18294  nCE(vnmls,     _vnmls,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18295  nCE(vcmp,      _vcmp,    2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
18296  nCE(vcmpe,     _vcmpe,   2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
18297  NCE(vpush,     0,       1, (VRSDLST),          vfp_nsyn_push),
18298  NCE(vpop,      0,       1, (VRSDLST),          vfp_nsyn_pop),
18299  NCE(vcvtz,     0,       2, (RVSD, RVSD),       vfp_nsyn_cvtz),
18300
18301   /* Mnemonics shared by Neon and VFP.  */
18302  nCEF(vmul,     _vmul,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
18303  nCEF(vmla,     _vmla,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
18304  nCEF(vmls,     _vmls,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
18305
18306  nCEF(vadd,     _vadd,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
18307  nCEF(vsub,     _vsub,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
18308
18309  NCEF(vabs,     1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
18310  NCEF(vneg,     1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
18311
18312  NCE(vldm,      c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18313  NCE(vldmia,    c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18314  NCE(vldmdb,    d100b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18315  NCE(vstm,      c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18316  NCE(vstmia,    c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18317  NCE(vstmdb,    d000b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18318  NCE(vldr,      d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
18319  NCE(vstr,      d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
18320
18321  nCEF(vcvt,     _vcvt,   3, (RNSDQ, RNSDQ, oI32z), neon_cvt),
18322  nCEF(vcvtr,    _vcvt,   2, (RNSDQ, RNSDQ), neon_cvtr),
18323  nCEF(vcvtb,    _vcvt,   2, (RVS, RVS), neon_cvtb),
18324  nCEF(vcvtt,    _vcvt,   2, (RVS, RVS), neon_cvtt),
18325
18326
18327   /* NOTE: All VMOV encoding is special-cased!  */
18328  NCE(vmov,      0,       1, (VMOV), neon_mov),
18329  NCE(vmovq,     0,       1, (VMOV), neon_mov),
18330
18331 #undef  THUMB_VARIANT
18332 #define THUMB_VARIANT  & fpu_neon_ext_v1
18333 #undef  ARM_VARIANT
18334 #define ARM_VARIANT    & fpu_neon_ext_v1
18335
18336   /* Data processing with three registers of the same length.  */
18337   /* integer ops, valid types S8 S16 S32 U8 U16 U32.  */
18338  NUF(vaba,      0000710, 3, (RNDQ, RNDQ,  RNDQ), neon_dyadic_i_su),
18339  NUF(vabaq,     0000710, 3, (RNQ,  RNQ,   RNQ),  neon_dyadic_i_su),
18340  NUF(vhadd,     0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
18341  NUF(vhaddq,    0000000, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
18342  NUF(vrhadd,    0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
18343  NUF(vrhaddq,   0000100, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
18344  NUF(vhsub,     0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
18345  NUF(vhsubq,    0000200, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
18346   /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64.  */
18347  NUF(vqadd,     0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
18348  NUF(vqaddq,    0000010, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
18349  NUF(vqsub,     0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
18350  NUF(vqsubq,    0000210, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
18351  NUF(vrshl,     0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
18352  NUF(vrshlq,    0000500, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
18353  NUF(vqrshl,    0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
18354  NUF(vqrshlq,   0000510, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
18355   /* If not immediate, fall back to neon_dyadic_i64_su.
18356      shl_imm should accept I8 I16 I32 I64,
18357      qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64.  */
18358  nUF(vshl,      _vshl,    3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
18359  nUF(vshlq,     _vshl,    3, (RNQ,  oRNQ,  RNDQ_I63b), neon_shl_imm),
18360  nUF(vqshl,     _vqshl,   3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
18361  nUF(vqshlq,    _vqshl,   3, (RNQ,  oRNQ,  RNDQ_I63b), neon_qshl_imm),
18362   /* Logic ops, types optional & ignored.  */
18363  nUF(vand,      _vand,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18364  nUF(vandq,     _vand,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
18365  nUF(vbic,      _vbic,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18366  nUF(vbicq,     _vbic,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
18367  nUF(vorr,      _vorr,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18368  nUF(vorrq,     _vorr,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
18369  nUF(vorn,      _vorn,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18370  nUF(vornq,     _vorn,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
18371  nUF(veor,      _veor,    3, (RNDQ, oRNDQ, RNDQ),      neon_logic),
18372  nUF(veorq,     _veor,    3, (RNQ,  oRNQ,  RNQ),       neon_logic),
18373   /* Bitfield ops, untyped.  */
18374  NUF(vbsl,      1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
18375  NUF(vbslq,     1100110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
18376  NUF(vbit,      1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
18377  NUF(vbitq,     1200110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
18378  NUF(vbif,      1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
18379  NUF(vbifq,     1300110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
18380   /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32.  */
18381  nUF(vabd,      _vabd,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
18382  nUF(vabdq,     _vabd,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
18383  nUF(vmax,      _vmax,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
18384  nUF(vmaxq,     _vmax,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
18385  nUF(vmin,      _vmin,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
18386  nUF(vminq,     _vmin,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
18387   /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
18388      back to neon_dyadic_if_su.  */
18389  nUF(vcge,      _vcge,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
18390  nUF(vcgeq,     _vcge,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
18391  nUF(vcgt,      _vcgt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
18392  nUF(vcgtq,     _vcgt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
18393  nUF(vclt,      _vclt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
18394  nUF(vcltq,     _vclt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
18395  nUF(vcle,      _vcle,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
18396  nUF(vcleq,     _vcle,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
18397   /* Comparison. Type I8 I16 I32 F32.  */
18398  nUF(vceq,      _vceq,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
18399  nUF(vceqq,     _vceq,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_ceq),
18400   /* As above, D registers only.  */
18401  nUF(vpmax,     _vpmax,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
18402  nUF(vpmin,     _vpmin,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
18403   /* Int and float variants, signedness unimportant.  */
18404  nUF(vmlaq,     _vmla,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
18405  nUF(vmlsq,     _vmls,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
18406  nUF(vpadd,     _vpadd,   3, (RND,  oRND,  RND),       neon_dyadic_if_i_d),
18407   /* Add/sub take types I8 I16 I32 I64 F32.  */
18408  nUF(vaddq,     _vadd,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
18409  nUF(vsubq,     _vsub,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
18410   /* vtst takes sizes 8, 16, 32.  */
18411  NUF(vtst,      0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
18412  NUF(vtstq,     0000810, 3, (RNQ,  oRNQ,  RNQ),  neon_tst),
18413   /* VMUL takes I8 I16 I32 F32 P8.  */
18414  nUF(vmulq,     _vmul,     3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mul),
18415   /* VQD{R}MULH takes S16 S32.  */
18416  nUF(vqdmulh,   _vqdmulh,  3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
18417  nUF(vqdmulhq,  _vqdmulh,  3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
18418  nUF(vqrdmulh,  _vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
18419  nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
18420  NUF(vacge,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
18421  NUF(vacgeq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
18422  NUF(vacgt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
18423  NUF(vacgtq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
18424  NUF(vaclt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
18425  NUF(vacltq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
18426  NUF(vacle,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
18427  NUF(vacleq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
18428  NUF(vrecps,    0000f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
18429  NUF(vrecpsq,   0000f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
18430  NUF(vrsqrts,   0200f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
18431  NUF(vrsqrtsq,  0200f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
18432
18433   /* Two address, int/float. Types S8 S16 S32 F32.  */
18434  NUF(vabsq,     1b10300, 2, (RNQ,  RNQ),      neon_abs_neg),
18435  NUF(vnegq,     1b10380, 2, (RNQ,  RNQ),      neon_abs_neg),
18436
18437   /* Data processing with two registers and a shift amount.  */
18438   /* Right shifts, and variants with rounding.
18439      Types accepted S8 S16 S32 S64 U8 U16 U32 U64.  */
18440  NUF(vshr,      0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
18441  NUF(vshrq,     0800010, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
18442  NUF(vrshr,     0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
18443  NUF(vrshrq,    0800210, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
18444  NUF(vsra,      0800110, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
18445  NUF(vsraq,     0800110, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
18446  NUF(vrsra,     0800310, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
18447  NUF(vrsraq,    0800310, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
18448   /* Shift and insert. Sizes accepted 8 16 32 64.  */
18449  NUF(vsli,      1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
18450  NUF(vsliq,     1800510, 3, (RNQ,  oRNQ,  I63), neon_sli),
18451  NUF(vsri,      1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
18452  NUF(vsriq,     1800410, 3, (RNQ,  oRNQ,  I64), neon_sri),
18453   /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64.  */
18454  NUF(vqshlu,    1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
18455  NUF(vqshluq,   1800610, 3, (RNQ,  oRNQ,  I63), neon_qshlu_imm),
18456   /* Right shift immediate, saturating & narrowing, with rounding variants.
18457      Types accepted S16 S32 S64 U16 U32 U64.  */
18458  NUF(vqshrn,    0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
18459  NUF(vqrshrn,   0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
18460   /* As above, unsigned. Types accepted S16 S32 S64.  */
18461  NUF(vqshrun,   0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
18462  NUF(vqrshrun,  0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
18463   /* Right shift narrowing. Types accepted I16 I32 I64.  */
18464  NUF(vshrn,     0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
18465  NUF(vrshrn,    0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
18466   /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant.  */
18467  nUF(vshll,     _vshll,   3, (RNQ, RND, I32),  neon_shll),
18468   /* CVT with optional immediate for fixed-point variant.  */
18469  nUF(vcvtq,     _vcvt,    3, (RNQ, RNQ, oI32b), neon_cvt),
18470
18471  nUF(vmvn,      _vmvn,    2, (RNDQ, RNDQ_Ibig), neon_mvn),
18472  nUF(vmvnq,     _vmvn,    2, (RNQ,  RNDQ_Ibig), neon_mvn),
18473
18474   /* Data processing, three registers of different lengths.  */
18475   /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32.  */
18476  NUF(vabal,     0800500, 3, (RNQ, RND, RND),  neon_abal),
18477  NUF(vabdl,     0800700, 3, (RNQ, RND, RND),  neon_dyadic_long),
18478  NUF(vaddl,     0800000, 3, (RNQ, RND, RND),  neon_dyadic_long),
18479  NUF(vsubl,     0800200, 3, (RNQ, RND, RND),  neon_dyadic_long),
18480   /* If not scalar, fall back to neon_dyadic_long.
18481      Vector types as above, scalar types S16 S32 U16 U32.  */
18482  nUF(vmlal,     _vmlal,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
18483  nUF(vmlsl,     _vmlsl,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
18484   /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32.  */
18485  NUF(vaddw,     0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
18486  NUF(vsubw,     0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
18487   /* Dyadic, narrowing insns. Types I16 I32 I64.  */
18488  NUF(vaddhn,    0800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
18489  NUF(vraddhn,   1800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
18490  NUF(vsubhn,    0800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
18491  NUF(vrsubhn,   1800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
18492   /* Saturating doubling multiplies. Types S16 S32.  */
18493  nUF(vqdmlal,   _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18494  nUF(vqdmlsl,   _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18495  nUF(vqdmull,   _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18496   /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
18497      S16 S32 U16 U32.  */
18498  nUF(vmull,     _vmull,   3, (RNQ, RND, RND_RNSC), neon_vmull),
18499
18500   /* Extract. Size 8.  */
18501  NUF(vext,      0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
18502  NUF(vextq,     0b00000, 4, (RNQ,  oRNQ,  RNQ,  I15), neon_ext),
18503
18504   /* Two registers, miscellaneous.  */
18505   /* Reverse. Sizes 8 16 32 (must be < size in opcode).  */
18506  NUF(vrev64,    1b00000, 2, (RNDQ, RNDQ),     neon_rev),
18507  NUF(vrev64q,   1b00000, 2, (RNQ,  RNQ),      neon_rev),
18508  NUF(vrev32,    1b00080, 2, (RNDQ, RNDQ),     neon_rev),
18509  NUF(vrev32q,   1b00080, 2, (RNQ,  RNQ),      neon_rev),
18510  NUF(vrev16,    1b00100, 2, (RNDQ, RNDQ),     neon_rev),
18511  NUF(vrev16q,   1b00100, 2, (RNQ,  RNQ),      neon_rev),
18512   /* Vector replicate. Sizes 8 16 32.  */
18513  nCE(vdup,      _vdup,    2, (RNDQ, RR_RNSC),  neon_dup),
18514  nCE(vdupq,     _vdup,    2, (RNQ,  RR_RNSC),  neon_dup),
18515   /* VMOVL. Types S8 S16 S32 U8 U16 U32.  */
18516  NUF(vmovl,     0800a10, 2, (RNQ, RND),       neon_movl),
18517   /* VMOVN. Types I16 I32 I64.  */
18518  nUF(vmovn,     _vmovn,   2, (RND, RNQ),       neon_movn),
18519   /* VQMOVN. Types S16 S32 S64 U16 U32 U64.  */
18520  nUF(vqmovn,    _vqmovn,  2, (RND, RNQ),       neon_qmovn),
18521   /* VQMOVUN. Types S16 S32 S64.  */
18522  nUF(vqmovun,   _vqmovun, 2, (RND, RNQ),       neon_qmovun),
18523   /* VZIP / VUZP. Sizes 8 16 32.  */
18524  NUF(vzip,      1b20180, 2, (RNDQ, RNDQ),     neon_zip_uzp),
18525  NUF(vzipq,     1b20180, 2, (RNQ,  RNQ),      neon_zip_uzp),
18526  NUF(vuzp,      1b20100, 2, (RNDQ, RNDQ),     neon_zip_uzp),
18527  NUF(vuzpq,     1b20100, 2, (RNQ,  RNQ),      neon_zip_uzp),
18528   /* VQABS / VQNEG. Types S8 S16 S32.  */
18529  NUF(vqabs,     1b00700, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
18530  NUF(vqabsq,    1b00700, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
18531  NUF(vqneg,     1b00780, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
18532  NUF(vqnegq,    1b00780, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
18533   /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32.  */
18534  NUF(vpadal,    1b00600, 2, (RNDQ, RNDQ),     neon_pair_long),
18535  NUF(vpadalq,   1b00600, 2, (RNQ,  RNQ),      neon_pair_long),
18536  NUF(vpaddl,    1b00200, 2, (RNDQ, RNDQ),     neon_pair_long),
18537  NUF(vpaddlq,   1b00200, 2, (RNQ,  RNQ),      neon_pair_long),
18538   /* Reciprocal estimates. Types U32 F32.  */
18539  NUF(vrecpe,    1b30400, 2, (RNDQ, RNDQ),     neon_recip_est),
18540  NUF(vrecpeq,   1b30400, 2, (RNQ,  RNQ),      neon_recip_est),
18541  NUF(vrsqrte,   1b30480, 2, (RNDQ, RNDQ),     neon_recip_est),
18542  NUF(vrsqrteq,  1b30480, 2, (RNQ,  RNQ),      neon_recip_est),
18543   /* VCLS. Types S8 S16 S32.  */
18544  NUF(vcls,      1b00400, 2, (RNDQ, RNDQ),     neon_cls),
18545  NUF(vclsq,     1b00400, 2, (RNQ,  RNQ),      neon_cls),
18546   /* VCLZ. Types I8 I16 I32.  */
18547  NUF(vclz,      1b00480, 2, (RNDQ, RNDQ),     neon_clz),
18548  NUF(vclzq,     1b00480, 2, (RNQ,  RNQ),      neon_clz),
18549   /* VCNT. Size 8.  */
18550  NUF(vcnt,      1b00500, 2, (RNDQ, RNDQ),     neon_cnt),
18551  NUF(vcntq,     1b00500, 2, (RNQ,  RNQ),      neon_cnt),
18552   /* Two address, untyped.  */
18553  NUF(vswp,      1b20000, 2, (RNDQ, RNDQ),     neon_swp),
18554  NUF(vswpq,     1b20000, 2, (RNQ,  RNQ),      neon_swp),
18555   /* VTRN. Sizes 8 16 32.  */
18556  nUF(vtrn,      _vtrn,    2, (RNDQ, RNDQ),     neon_trn),
18557  nUF(vtrnq,     _vtrn,    2, (RNQ,  RNQ),      neon_trn),
18558
18559   /* Table lookup. Size 8.  */
18560  NUF(vtbl,      1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
18561  NUF(vtbx,      1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
18562
18563 #undef  THUMB_VARIANT
18564 #define THUMB_VARIANT  & fpu_vfp_v3_or_neon_ext
18565 #undef  ARM_VARIANT
18566 #define ARM_VARIANT    & fpu_vfp_v3_or_neon_ext
18567
18568   /* Neon element/structure load/store.  */
18569  nUF(vld1,      _vld1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18570  nUF(vst1,      _vst1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18571  nUF(vld2,      _vld2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18572  nUF(vst2,      _vst2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18573  nUF(vld3,      _vld3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18574  nUF(vst3,      _vst3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18575  nUF(vld4,      _vld4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18576  nUF(vst4,      _vst4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
18577
18578 #undef  THUMB_VARIANT
18579 #define THUMB_VARIANT &fpu_vfp_ext_v3xd
18580 #undef ARM_VARIANT
18581 #define ARM_VARIANT &fpu_vfp_ext_v3xd
18582  cCE("fconsts",   eb00a00, 2, (RVS, I255),      vfp_sp_const),
18583  cCE("fshtos",    eba0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
18584  cCE("fsltos",    eba0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
18585  cCE("fuhtos",    ebb0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
18586  cCE("fultos",    ebb0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
18587  cCE("ftoshs",    ebe0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
18588  cCE("ftosls",    ebe0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
18589  cCE("ftouhs",    ebf0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
18590  cCE("ftouls",    ebf0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
18591
18592 #undef THUMB_VARIANT
18593 #define THUMB_VARIANT  & fpu_vfp_ext_v3
18594 #undef  ARM_VARIANT
18595 #define ARM_VARIANT    & fpu_vfp_ext_v3
18596
18597  cCE("fconstd",   eb00b00, 2, (RVD, I255),      vfp_dp_const),
18598  cCE("fshtod",    eba0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
18599  cCE("fsltod",    eba0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
18600  cCE("fuhtod",    ebb0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
18601  cCE("fultod",    ebb0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
18602  cCE("ftoshd",    ebe0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
18603  cCE("ftosld",    ebe0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
18604  cCE("ftouhd",    ebf0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
18605  cCE("ftould",    ebf0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
18606
18607 #undef ARM_VARIANT
18608 #define ARM_VARIANT &fpu_vfp_ext_fma
18609 #undef THUMB_VARIANT
18610 #define THUMB_VARIANT &fpu_vfp_ext_fma
18611  /* Mnemonics shared by Neon and VFP.  These are included in the
18612     VFP FMA variant; NEON and VFP FMA always includes the NEON
18613     FMA instructions.  */
18614  nCEF(vfma,     _vfma,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
18615  nCEF(vfms,     _vfms,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
18616  /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
18617     the v form should always be used.  */
18618  cCE("ffmas",   ea00a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18619  cCE("ffnmas",  ea00a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
18620  cCE("ffmad",   ea00b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18621  cCE("ffnmad",  ea00b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
18622  nCE(vfnma,     _vfnma,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18623  nCE(vfnms,     _vfnms,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18624
18625 #undef THUMB_VARIANT
18626 #undef  ARM_VARIANT
18627 #define ARM_VARIANT  & arm_cext_xscale /* Intel XScale extensions.  */
18628
18629  cCE("mia",     e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18630  cCE("miaph",   e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18631  cCE("miabb",   e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18632  cCE("miabt",   e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18633  cCE("miatb",   e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18634  cCE("miatt",   e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18635  cCE("mar",     c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
18636  cCE("mra",     c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
18637
18638 #undef  ARM_VARIANT
18639 #define ARM_VARIANT  & arm_cext_iwmmxt /* Intel Wireless MMX technology.  */
18640
18641  cCE("tandcb",  e13f130, 1, (RR),                   iwmmxt_tandorc),
18642  cCE("tandch",  e53f130, 1, (RR),                   iwmmxt_tandorc),
18643  cCE("tandcw",  e93f130, 1, (RR),                   iwmmxt_tandorc),
18644  cCE("tbcstb",  e400010, 2, (RIWR, RR),             rn_rd),
18645  cCE("tbcsth",  e400050, 2, (RIWR, RR),             rn_rd),
18646  cCE("tbcstw",  e400090, 2, (RIWR, RR),             rn_rd),
18647  cCE("textrcb", e130170, 2, (RR, I7),               iwmmxt_textrc),
18648  cCE("textrch", e530170, 2, (RR, I7),               iwmmxt_textrc),
18649  cCE("textrcw", e930170, 2, (RR, I7),               iwmmxt_textrc),
18650  cCE("textrmub",        e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18651  cCE("textrmuh",        e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18652  cCE("textrmuw",        e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18653  cCE("textrmsb",        e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18654  cCE("textrmsh",        e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18655  cCE("textrmsw",        e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
18656  cCE("tinsrb",  e600010, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
18657  cCE("tinsrh",  e600050, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
18658  cCE("tinsrw",  e600090, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
18659  cCE("tmcr",    e000110, 2, (RIWC_RIWG, RR),        rn_rd),
18660  cCE("tmcrr",   c400000, 3, (RIWR, RR, RR),         rm_rd_rn),
18661  cCE("tmia",    e200010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18662  cCE("tmiaph",  e280010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18663  cCE("tmiabb",  e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18664  cCE("tmiabt",  e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18665  cCE("tmiatb",  e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18666  cCE("tmiatt",  e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
18667  cCE("tmovmskb",        e100030, 2, (RR, RIWR),             rd_rn),
18668  cCE("tmovmskh",        e500030, 2, (RR, RIWR),             rd_rn),
18669  cCE("tmovmskw",        e900030, 2, (RR, RIWR),             rd_rn),
18670  cCE("tmrc",    e100110, 2, (RR, RIWC_RIWG),        rd_rn),
18671  cCE("tmrrc",   c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
18672  cCE("torcb",   e13f150, 1, (RR),                   iwmmxt_tandorc),
18673  cCE("torch",   e53f150, 1, (RR),                   iwmmxt_tandorc),
18674  cCE("torcw",   e93f150, 1, (RR),                   iwmmxt_tandorc),
18675  cCE("waccb",   e0001c0, 2, (RIWR, RIWR),           rd_rn),
18676  cCE("wacch",   e4001c0, 2, (RIWR, RIWR),           rd_rn),
18677  cCE("waccw",   e8001c0, 2, (RIWR, RIWR),           rd_rn),
18678  cCE("waddbss", e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18679  cCE("waddb",   e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18680  cCE("waddbus", e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18681  cCE("waddhss", e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18682  cCE("waddh",   e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18683  cCE("waddhus", e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18684  cCE("waddwss", eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18685  cCE("waddw",   e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18686  cCE("waddwus", e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18687  cCE("waligni", e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
18688  cCE("walignr0",        e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18689  cCE("walignr1",        e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18690  cCE("walignr2",        ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18691  cCE("walignr3",        eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18692  cCE("wand",    e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18693  cCE("wandn",   e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18694  cCE("wavg2b",  e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18695  cCE("wavg2br", e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18696  cCE("wavg2h",  ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18697  cCE("wavg2hr", ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18698  cCE("wcmpeqb", e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18699  cCE("wcmpeqh", e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18700  cCE("wcmpeqw", e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18701  cCE("wcmpgtub",        e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18702  cCE("wcmpgtuh",        e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18703  cCE("wcmpgtuw",        e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18704  cCE("wcmpgtsb",        e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18705  cCE("wcmpgtsh",        e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18706  cCE("wcmpgtsw",        eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18707  cCE("wldrb",   c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18708  cCE("wldrh",   c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18709  cCE("wldrw",   c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
18710  cCE("wldrd",   c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
18711  cCE("wmacs",   e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18712  cCE("wmacsz",  e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18713  cCE("wmacu",   e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18714  cCE("wmacuz",  e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18715  cCE("wmadds",  ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18716  cCE("wmaddu",  e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18717  cCE("wmaxsb",  e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18718  cCE("wmaxsh",  e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18719  cCE("wmaxsw",  ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18720  cCE("wmaxub",  e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18721  cCE("wmaxuh",  e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18722  cCE("wmaxuw",  e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18723  cCE("wminsb",  e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18724  cCE("wminsh",  e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18725  cCE("wminsw",  eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18726  cCE("wminub",  e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18727  cCE("wminuh",  e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18728  cCE("wminuw",  e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18729  cCE("wmov",    e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
18730  cCE("wmulsm",  e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18731  cCE("wmulsl",  e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18732  cCE("wmulum",  e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18733  cCE("wmulul",  e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18734  cCE("wor",     e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18735  cCE("wpackhss",        e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18736  cCE("wpackhus",        e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18737  cCE("wpackwss",        eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18738  cCE("wpackwus",        e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18739  cCE("wpackdss",        ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18740  cCE("wpackdus",        ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18741  cCE("wrorh",   e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18742  cCE("wrorhg",  e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18743  cCE("wrorw",   eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18744  cCE("wrorwg",  eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18745  cCE("wrord",   ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18746  cCE("wrordg",  ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18747  cCE("wsadb",   e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18748  cCE("wsadbz",  e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18749  cCE("wsadh",   e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18750  cCE("wsadhz",  e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18751  cCE("wshufh",  e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
18752  cCE("wsllh",   e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18753  cCE("wsllhg",  e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18754  cCE("wsllw",   e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18755  cCE("wsllwg",  e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18756  cCE("wslld",   ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18757  cCE("wslldg",  ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18758  cCE("wsrah",   e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18759  cCE("wsrahg",  e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18760  cCE("wsraw",   e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18761  cCE("wsrawg",  e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18762  cCE("wsrad",   ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18763  cCE("wsradg",  ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18764  cCE("wsrlh",   e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18765  cCE("wsrlhg",  e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18766  cCE("wsrlw",   ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18767  cCE("wsrlwg",  ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18768  cCE("wsrld",   ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18769  cCE("wsrldg",  ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
18770  cCE("wstrb",   c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18771  cCE("wstrh",   c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
18772  cCE("wstrw",   c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
18773  cCE("wstrd",   c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
18774  cCE("wsubbss", e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18775  cCE("wsubb",   e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18776  cCE("wsubbus", e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18777  cCE("wsubhss", e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18778  cCE("wsubh",   e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18779  cCE("wsubhus", e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18780  cCE("wsubwss", eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18781  cCE("wsubw",   e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18782  cCE("wsubwus", e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18783  cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR),         rd_rn),
18784  cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR),         rd_rn),
18785  cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR),         rd_rn),
18786  cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR),         rd_rn),
18787  cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR),         rd_rn),
18788  cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR),         rd_rn),
18789  cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18790  cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18791  cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18792  cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR),         rd_rn),
18793  cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR),         rd_rn),
18794  cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR),         rd_rn),
18795  cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR),         rd_rn),
18796  cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR),         rd_rn),
18797  cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR),         rd_rn),
18798  cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18799  cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18800  cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
18801  cCE("wxor",    e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18802  cCE("wzero",   e300000, 1, (RIWR),                 iwmmxt_wzero),
18803
18804 #undef  ARM_VARIANT
18805 #define ARM_VARIANT  & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2.  */
18806
18807  cCE("torvscb",   e12f190, 1, (RR),                 iwmmxt_tandorc),
18808  cCE("torvsch",   e52f190, 1, (RR),                 iwmmxt_tandorc),
18809  cCE("torvscw",   e92f190, 1, (RR),                 iwmmxt_tandorc),
18810  cCE("wabsb",     e2001c0, 2, (RIWR, RIWR),           rd_rn),
18811  cCE("wabsh",     e6001c0, 2, (RIWR, RIWR),           rd_rn),
18812  cCE("wabsw",     ea001c0, 2, (RIWR, RIWR),           rd_rn),
18813  cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18814  cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18815  cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18816  cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18817  cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18818  cCE("waddhc",    e600180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18819  cCE("waddwc",    ea00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18820  cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18821  cCE("wavg4",   e400000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18822  cCE("wavg4r",    e500000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18823  cCE("wmaddsn",   ee00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18824  cCE("wmaddsx",   eb00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18825  cCE("wmaddun",   ec00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18826  cCE("wmaddux",   e900100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18827  cCE("wmerge",    e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
18828  cCE("wmiabb",    e0000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18829  cCE("wmiabt",    e1000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18830  cCE("wmiatb",    e2000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18831  cCE("wmiatt",    e3000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18832  cCE("wmiabbn",   e4000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18833  cCE("wmiabtn",   e5000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18834  cCE("wmiatbn",   e6000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18835  cCE("wmiattn",   e7000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18836  cCE("wmiawbb",   e800120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18837  cCE("wmiawbt",   e900120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18838  cCE("wmiawtb",   ea00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18839  cCE("wmiawtt",   eb00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18840  cCE("wmiawbbn",  ec00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18841  cCE("wmiawbtn",  ed00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18842  cCE("wmiawtbn",  ee00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18843  cCE("wmiawttn",  ef00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18844  cCE("wmulsmr",   ef00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18845  cCE("wmulumr",   ed00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18846  cCE("wmulwumr",  ec000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18847  cCE("wmulwsmr",  ee000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18848  cCE("wmulwum",   ed000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18849  cCE("wmulwsm",   ef000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18850  cCE("wmulwl",    eb000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18851  cCE("wqmiabb",   e8000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18852  cCE("wqmiabt",   e9000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18853  cCE("wqmiatb",   ea000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18854  cCE("wqmiatt",   eb000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18855  cCE("wqmiabbn",  ec000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18856  cCE("wqmiabtn",  ed000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18857  cCE("wqmiatbn",  ee000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18858  cCE("wqmiattn",  ef000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18859  cCE("wqmulm",    e100080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18860  cCE("wqmulmr",   e300080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18861  cCE("wqmulwm",   ec000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18862  cCE("wqmulwmr",  ee000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18863  cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
18864
18865 #undef  ARM_VARIANT
18866 #define ARM_VARIANT  & arm_cext_maverick /* Cirrus Maverick instructions.  */
18867
18868  cCE("cfldrs",  c100400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
18869  cCE("cfldrd",  c500400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
18870  cCE("cfldr32", c100500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
18871  cCE("cfldr64", c500500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
18872  cCE("cfstrs",  c000400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
18873  cCE("cfstrd",  c400400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
18874  cCE("cfstr32", c000500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
18875  cCE("cfstr64", c400500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
18876  cCE("cfmvsr",  e000450, 2, (RMF, RR),                rn_rd),
18877  cCE("cfmvrs",  e100450, 2, (RR, RMF),                rd_rn),
18878  cCE("cfmvdlr", e000410, 2, (RMD, RR),                rn_rd),
18879  cCE("cfmvrdl", e100410, 2, (RR, RMD),                rd_rn),
18880  cCE("cfmvdhr", e000430, 2, (RMD, RR),                rn_rd),
18881  cCE("cfmvrdh", e100430, 2, (RR, RMD),                rd_rn),
18882  cCE("cfmv64lr",        e000510, 2, (RMDX, RR),               rn_rd),
18883  cCE("cfmvr64l",        e100510, 2, (RR, RMDX),               rd_rn),
18884  cCE("cfmv64hr",        e000530, 2, (RMDX, RR),               rn_rd),
18885  cCE("cfmvr64h",        e100530, 2, (RR, RMDX),               rd_rn),
18886  cCE("cfmval32",        e200440, 2, (RMAX, RMFX),             rd_rn),
18887  cCE("cfmv32al",        e100440, 2, (RMFX, RMAX),             rd_rn),
18888  cCE("cfmvam32",        e200460, 2, (RMAX, RMFX),             rd_rn),
18889  cCE("cfmv32am",        e100460, 2, (RMFX, RMAX),             rd_rn),
18890  cCE("cfmvah32",        e200480, 2, (RMAX, RMFX),             rd_rn),
18891  cCE("cfmv32ah",        e100480, 2, (RMFX, RMAX),             rd_rn),
18892  cCE("cfmva32", e2004a0, 2, (RMAX, RMFX),             rd_rn),
18893  cCE("cfmv32a", e1004a0, 2, (RMFX, RMAX),             rd_rn),
18894  cCE("cfmva64", e2004c0, 2, (RMAX, RMDX),             rd_rn),
18895  cCE("cfmv64a", e1004c0, 2, (RMDX, RMAX),             rd_rn),
18896  cCE("cfmvsc32",        e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
18897  cCE("cfmv32sc",        e1004e0, 2, (RMDX, RMDS),             rd),
18898  cCE("cfcpys",  e000400, 2, (RMF, RMF),               rd_rn),
18899  cCE("cfcpyd",  e000420, 2, (RMD, RMD),               rd_rn),
18900  cCE("cfcvtsd", e000460, 2, (RMD, RMF),               rd_rn),
18901  cCE("cfcvtds", e000440, 2, (RMF, RMD),               rd_rn),
18902  cCE("cfcvt32s",        e000480, 2, (RMF, RMFX),              rd_rn),
18903  cCE("cfcvt32d",        e0004a0, 2, (RMD, RMFX),              rd_rn),
18904  cCE("cfcvt64s",        e0004c0, 2, (RMF, RMDX),              rd_rn),
18905  cCE("cfcvt64d",        e0004e0, 2, (RMD, RMDX),              rd_rn),
18906  cCE("cfcvts32",        e100580, 2, (RMFX, RMF),              rd_rn),
18907  cCE("cfcvtd32",        e1005a0, 2, (RMFX, RMD),              rd_rn),
18908  cCE("cftruncs32",e1005c0, 2, (RMFX, RMF),            rd_rn),
18909  cCE("cftruncd32",e1005e0, 2, (RMFX, RMD),            rd_rn),
18910  cCE("cfrshl32",        e000550, 3, (RMFX, RMFX, RR),         mav_triple),
18911  cCE("cfrshl64",        e000570, 3, (RMDX, RMDX, RR),         mav_triple),
18912  cCE("cfsh32",  e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
18913  cCE("cfsh64",  e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
18914  cCE("cfcmps",  e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
18915  cCE("cfcmpd",  e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
18916  cCE("cfcmp32", e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
18917  cCE("cfcmp64", e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
18918  cCE("cfabss",  e300400, 2, (RMF, RMF),               rd_rn),
18919  cCE("cfabsd",  e300420, 2, (RMD, RMD),               rd_rn),
18920  cCE("cfnegs",  e300440, 2, (RMF, RMF),               rd_rn),
18921  cCE("cfnegd",  e300460, 2, (RMD, RMD),               rd_rn),
18922  cCE("cfadds",  e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
18923  cCE("cfaddd",  e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
18924  cCE("cfsubs",  e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
18925  cCE("cfsubd",  e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
18926  cCE("cfmuls",  e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
18927  cCE("cfmuld",  e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
18928  cCE("cfabs32", e300500, 2, (RMFX, RMFX),             rd_rn),
18929  cCE("cfabs64", e300520, 2, (RMDX, RMDX),             rd_rn),
18930  cCE("cfneg32", e300540, 2, (RMFX, RMFX),             rd_rn),
18931  cCE("cfneg64", e300560, 2, (RMDX, RMDX),             rd_rn),
18932  cCE("cfadd32", e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18933  cCE("cfadd64", e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
18934  cCE("cfsub32", e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18935  cCE("cfsub64", e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
18936  cCE("cfmul32", e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18937  cCE("cfmul64", e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
18938  cCE("cfmac32", e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18939  cCE("cfmsc32", e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
18940  cCE("cfmadd32",        e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
18941  cCE("cfmsub32",        e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
18942  cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
18943  cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
18944 };
18945 #undef ARM_VARIANT
18946 #undef THUMB_VARIANT
18947 #undef TCE
18948 #undef TCM
18949 #undef TUE
18950 #undef TUF
18951 #undef TCC
18952 #undef cCE
18953 #undef cCL
18954 #undef C3E
18955 #undef CE
18956 #undef CM
18957 #undef UE
18958 #undef UF
18959 #undef UT
18960 #undef NUF
18961 #undef nUF
18962 #undef NCE
18963 #undef nCE
18964 #undef OPS0
18965 #undef OPS1
18966 #undef OPS2
18967 #undef OPS3
18968 #undef OPS4
18969 #undef OPS5
18970 #undef OPS6
18971 #undef do_0
18972 \f
18973 /* MD interface: bits in the object file.  */
18974
18975 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
18976    for use in the a.out file, and stores them in the array pointed to by buf.
18977    This knows about the endian-ness of the target machine and does
18978    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
18979    2 (short) and 4 (long)  Floating numbers are put out as a series of
18980    LITTLENUMS (shorts, here at least).  */
18981
18982 void
18983 md_number_to_chars (char * buf, valueT val, int n)
18984 {
18985   if (target_big_endian)
18986     number_to_chars_bigendian (buf, val, n);
18987   else
18988     number_to_chars_littleendian (buf, val, n);
18989 }
18990
18991 static valueT
18992 md_chars_to_number (char * buf, int n)
18993 {
18994   valueT result = 0;
18995   unsigned char * where = (unsigned char *) buf;
18996
18997   if (target_big_endian)
18998     {
18999       while (n--)
19000         {
19001           result <<= 8;
19002           result |= (*where++ & 255);
19003         }
19004     }
19005   else
19006     {
19007       while (n--)
19008         {
19009           result <<= 8;
19010           result |= (where[n] & 255);
19011         }
19012     }
19013
19014   return result;
19015 }
19016
19017 /* MD interface: Sections.  */
19018
19019 /* Calculate the maximum variable size (i.e., excluding fr_fix)
19020    that an rs_machine_dependent frag may reach.  */
19021
19022 unsigned int
19023 arm_frag_max_var (fragS *fragp)
19024 {
19025   /* We only use rs_machine_dependent for variable-size Thumb instructions,
19026      which are either THUMB_SIZE (2) or INSN_SIZE (4).
19027
19028      Note that we generate relaxable instructions even for cases that don't
19029      really need it, like an immediate that's a trivial constant.  So we're
19030      overestimating the instruction size for some of those cases.  Rather
19031      than putting more intelligence here, it would probably be better to
19032      avoid generating a relaxation frag in the first place when it can be
19033      determined up front that a short instruction will suffice.  */
19034
19035   gas_assert (fragp->fr_type == rs_machine_dependent);
19036   return INSN_SIZE;
19037 }
19038
19039 /* Estimate the size of a frag before relaxing.  Assume everything fits in
19040    2 bytes.  */
19041
19042 int
19043 md_estimate_size_before_relax (fragS * fragp,
19044                                segT    segtype ATTRIBUTE_UNUSED)
19045 {
19046   fragp->fr_var = 2;
19047   return 2;
19048 }
19049
19050 /* Convert a machine dependent frag.  */
19051
19052 void
19053 md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
19054 {
19055   unsigned long insn;
19056   unsigned long old_op;
19057   char *buf;
19058   expressionS exp;
19059   fixS *fixp;
19060   int reloc_type;
19061   int pc_rel;
19062   int opcode;
19063
19064   buf = fragp->fr_literal + fragp->fr_fix;
19065
19066   old_op = bfd_get_16(abfd, buf);
19067   if (fragp->fr_symbol)
19068     {
19069       exp.X_op = O_symbol;
19070       exp.X_add_symbol = fragp->fr_symbol;
19071     }
19072   else
19073     {
19074       exp.X_op = O_constant;
19075     }
19076   exp.X_add_number = fragp->fr_offset;
19077   opcode = fragp->fr_subtype;
19078   switch (opcode)
19079     {
19080     case T_MNEM_ldr_pc:
19081     case T_MNEM_ldr_pc2:
19082     case T_MNEM_ldr_sp:
19083     case T_MNEM_str_sp:
19084     case T_MNEM_ldr:
19085     case T_MNEM_ldrb:
19086     case T_MNEM_ldrh:
19087     case T_MNEM_str:
19088     case T_MNEM_strb:
19089     case T_MNEM_strh:
19090       if (fragp->fr_var == 4)
19091         {
19092           insn = THUMB_OP32 (opcode);
19093           if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
19094             {
19095               insn |= (old_op & 0x700) << 4;
19096             }
19097           else
19098             {
19099               insn |= (old_op & 7) << 12;
19100               insn |= (old_op & 0x38) << 13;
19101             }
19102           insn |= 0x00000c00;
19103           put_thumb32_insn (buf, insn);
19104           reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
19105         }
19106       else
19107         {
19108           reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
19109         }
19110       pc_rel = (opcode == T_MNEM_ldr_pc2);
19111       break;
19112     case T_MNEM_adr:
19113       if (fragp->fr_var == 4)
19114         {
19115           insn = THUMB_OP32 (opcode);
19116           insn |= (old_op & 0xf0) << 4;
19117           put_thumb32_insn (buf, insn);
19118           reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
19119         }
19120       else
19121         {
19122           reloc_type = BFD_RELOC_ARM_THUMB_ADD;
19123           exp.X_add_number -= 4;
19124         }
19125       pc_rel = 1;
19126       break;
19127     case T_MNEM_mov:
19128     case T_MNEM_movs:
19129     case T_MNEM_cmp:
19130     case T_MNEM_cmn:
19131       if (fragp->fr_var == 4)
19132         {
19133           int r0off = (opcode == T_MNEM_mov
19134                        || opcode == T_MNEM_movs) ? 0 : 8;
19135           insn = THUMB_OP32 (opcode);
19136           insn = (insn & 0xe1ffffff) | 0x10000000;
19137           insn |= (old_op & 0x700) << r0off;
19138           put_thumb32_insn (buf, insn);
19139           reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
19140         }
19141       else
19142         {
19143           reloc_type = BFD_RELOC_ARM_THUMB_IMM;
19144         }
19145       pc_rel = 0;
19146       break;
19147     case T_MNEM_b:
19148       if (fragp->fr_var == 4)
19149         {
19150           insn = THUMB_OP32(opcode);
19151           put_thumb32_insn (buf, insn);
19152           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
19153         }
19154       else
19155         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
19156       pc_rel = 1;
19157       break;
19158     case T_MNEM_bcond:
19159       if (fragp->fr_var == 4)
19160         {
19161           insn = THUMB_OP32(opcode);
19162           insn |= (old_op & 0xf00) << 14;
19163           put_thumb32_insn (buf, insn);
19164           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
19165         }
19166       else
19167         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
19168       pc_rel = 1;
19169       break;
19170     case T_MNEM_add_sp:
19171     case T_MNEM_add_pc:
19172     case T_MNEM_inc_sp:
19173     case T_MNEM_dec_sp:
19174       if (fragp->fr_var == 4)
19175         {
19176           /* ??? Choose between add and addw.  */
19177           insn = THUMB_OP32 (opcode);
19178           insn |= (old_op & 0xf0) << 4;
19179           put_thumb32_insn (buf, insn);
19180           if (opcode == T_MNEM_add_pc)
19181             reloc_type = BFD_RELOC_ARM_T32_IMM12;
19182           else
19183             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
19184         }
19185       else
19186         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
19187       pc_rel = 0;
19188       break;
19189
19190     case T_MNEM_addi:
19191     case T_MNEM_addis:
19192     case T_MNEM_subi:
19193     case T_MNEM_subis:
19194       if (fragp->fr_var == 4)
19195         {
19196           insn = THUMB_OP32 (opcode);
19197           insn |= (old_op & 0xf0) << 4;
19198           insn |= (old_op & 0xf) << 16;
19199           put_thumb32_insn (buf, insn);
19200           if (insn & (1 << 20))
19201             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
19202           else
19203             reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
19204         }
19205       else
19206         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
19207       pc_rel = 0;
19208       break;
19209     default:
19210       abort ();
19211     }
19212   fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
19213                       (enum bfd_reloc_code_real) reloc_type);
19214   fixp->fx_file = fragp->fr_file;
19215   fixp->fx_line = fragp->fr_line;
19216   fragp->fr_fix += fragp->fr_var;
19217 }
19218
19219 /* Return the size of a relaxable immediate operand instruction.
19220    SHIFT and SIZE specify the form of the allowable immediate.  */
19221 static int
19222 relax_immediate (fragS *fragp, int size, int shift)
19223 {
19224   offsetT offset;
19225   offsetT mask;
19226   offsetT low;
19227
19228   /* ??? Should be able to do better than this.  */
19229   if (fragp->fr_symbol)
19230     return 4;
19231
19232   low = (1 << shift) - 1;
19233   mask = (1 << (shift + size)) - (1 << shift);
19234   offset = fragp->fr_offset;
19235   /* Force misaligned offsets to 32-bit variant.  */
19236   if (offset & low)
19237     return 4;
19238   if (offset & ~mask)
19239     return 4;
19240   return 2;
19241 }
19242
19243 /* Get the address of a symbol during relaxation.  */
19244 static addressT
19245 relaxed_symbol_addr (fragS *fragp, long stretch)
19246 {
19247   fragS *sym_frag;
19248   addressT addr;
19249   symbolS *sym;
19250
19251   sym = fragp->fr_symbol;
19252   sym_frag = symbol_get_frag (sym);
19253   know (S_GET_SEGMENT (sym) != absolute_section
19254         || sym_frag == &zero_address_frag);
19255   addr = S_GET_VALUE (sym) + fragp->fr_offset;
19256
19257   /* If frag has yet to be reached on this pass, assume it will
19258      move by STRETCH just as we did.  If this is not so, it will
19259      be because some frag between grows, and that will force
19260      another pass.  */
19261
19262   if (stretch != 0
19263       && sym_frag->relax_marker != fragp->relax_marker)
19264     {
19265       fragS *f;
19266
19267       /* Adjust stretch for any alignment frag.  Note that if have
19268          been expanding the earlier code, the symbol may be
19269          defined in what appears to be an earlier frag.  FIXME:
19270          This doesn't handle the fr_subtype field, which specifies
19271          a maximum number of bytes to skip when doing an
19272          alignment.  */
19273       for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
19274         {
19275           if (f->fr_type == rs_align || f->fr_type == rs_align_code)
19276             {
19277               if (stretch < 0)
19278                 stretch = - ((- stretch)
19279                              & ~ ((1 << (int) f->fr_offset) - 1));
19280               else
19281                 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
19282               if (stretch == 0)
19283                 break;
19284             }
19285         }
19286       if (f != NULL)
19287         addr += stretch;
19288     }
19289
19290   return addr;
19291 }
19292
19293 /* Return the size of a relaxable adr pseudo-instruction or PC-relative
19294    load.  */
19295 static int
19296 relax_adr (fragS *fragp, asection *sec, long stretch)
19297 {
19298   addressT addr;
19299   offsetT val;
19300
19301   /* Assume worst case for symbols not known to be in the same section.  */
19302   if (fragp->fr_symbol == NULL
19303       || !S_IS_DEFINED (fragp->fr_symbol)
19304       || sec != S_GET_SEGMENT (fragp->fr_symbol)
19305       || S_IS_WEAK (fragp->fr_symbol))
19306     return 4;
19307
19308   val = relaxed_symbol_addr (fragp, stretch);
19309   addr = fragp->fr_address + fragp->fr_fix;
19310   addr = (addr + 4) & ~3;
19311   /* Force misaligned targets to 32-bit variant.  */
19312   if (val & 3)
19313     return 4;
19314   val -= addr;
19315   if (val < 0 || val > 1020)
19316     return 4;
19317   return 2;
19318 }
19319
19320 /* Return the size of a relaxable add/sub immediate instruction.  */
19321 static int
19322 relax_addsub (fragS *fragp, asection *sec)
19323 {
19324   char *buf;
19325   int op;
19326
19327   buf = fragp->fr_literal + fragp->fr_fix;
19328   op = bfd_get_16(sec->owner, buf);
19329   if ((op & 0xf) == ((op >> 4) & 0xf))
19330     return relax_immediate (fragp, 8, 0);
19331   else
19332     return relax_immediate (fragp, 3, 0);
19333 }
19334
19335
19336 /* Return the size of a relaxable branch instruction.  BITS is the
19337    size of the offset field in the narrow instruction.  */
19338
19339 static int
19340 relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
19341 {
19342   addressT addr;
19343   offsetT val;
19344   offsetT limit;
19345
19346   /* Assume worst case for symbols not known to be in the same section.  */
19347   if (!S_IS_DEFINED (fragp->fr_symbol)
19348       || sec != S_GET_SEGMENT (fragp->fr_symbol)
19349       || S_IS_WEAK (fragp->fr_symbol))
19350     return 4;
19351
19352 #ifdef OBJ_ELF
19353   if (S_IS_DEFINED (fragp->fr_symbol)
19354       && ARM_IS_FUNC (fragp->fr_symbol))
19355       return 4;
19356
19357   /* PR 12532.  Global symbols with default visibility might
19358      be preempted, so do not relax relocations to them.  */
19359   if ((ELF_ST_VISIBILITY (S_GET_OTHER (fragp->fr_symbol)) == STV_DEFAULT)
19360       && (! S_IS_LOCAL (fragp->fr_symbol)))
19361     return 4;
19362 #endif
19363
19364   val = relaxed_symbol_addr (fragp, stretch);
19365   addr = fragp->fr_address + fragp->fr_fix + 4;
19366   val -= addr;
19367
19368   /* Offset is a signed value *2 */
19369   limit = 1 << bits;
19370   if (val >= limit || val < -limit)
19371     return 4;
19372   return 2;
19373 }
19374
19375
19376 /* Relax a machine dependent frag.  This returns the amount by which
19377    the current size of the frag should change.  */
19378
19379 int
19380 arm_relax_frag (asection *sec, fragS *fragp, long stretch)
19381 {
19382   int oldsize;
19383   int newsize;
19384
19385   oldsize = fragp->fr_var;
19386   switch (fragp->fr_subtype)
19387     {
19388     case T_MNEM_ldr_pc2:
19389       newsize = relax_adr (fragp, sec, stretch);
19390       break;
19391     case T_MNEM_ldr_pc:
19392     case T_MNEM_ldr_sp:
19393     case T_MNEM_str_sp:
19394       newsize = relax_immediate (fragp, 8, 2);
19395       break;
19396     case T_MNEM_ldr:
19397     case T_MNEM_str:
19398       newsize = relax_immediate (fragp, 5, 2);
19399       break;
19400     case T_MNEM_ldrh:
19401     case T_MNEM_strh:
19402       newsize = relax_immediate (fragp, 5, 1);
19403       break;
19404     case T_MNEM_ldrb:
19405     case T_MNEM_strb:
19406       newsize = relax_immediate (fragp, 5, 0);
19407       break;
19408     case T_MNEM_adr:
19409       newsize = relax_adr (fragp, sec, stretch);
19410       break;
19411     case T_MNEM_mov:
19412     case T_MNEM_movs:
19413     case T_MNEM_cmp:
19414     case T_MNEM_cmn:
19415       newsize = relax_immediate (fragp, 8, 0);
19416       break;
19417     case T_MNEM_b:
19418       newsize = relax_branch (fragp, sec, 11, stretch);
19419       break;
19420     case T_MNEM_bcond:
19421       newsize = relax_branch (fragp, sec, 8, stretch);
19422       break;
19423     case T_MNEM_add_sp:
19424     case T_MNEM_add_pc:
19425       newsize = relax_immediate (fragp, 8, 2);
19426       break;
19427     case T_MNEM_inc_sp:
19428     case T_MNEM_dec_sp:
19429       newsize = relax_immediate (fragp, 7, 2);
19430       break;
19431     case T_MNEM_addi:
19432     case T_MNEM_addis:
19433     case T_MNEM_subi:
19434     case T_MNEM_subis:
19435       newsize = relax_addsub (fragp, sec);
19436       break;
19437     default:
19438       abort ();
19439     }
19440
19441   fragp->fr_var = newsize;
19442   /* Freeze wide instructions that are at or before the same location as
19443      in the previous pass.  This avoids infinite loops.
19444      Don't freeze them unconditionally because targets may be artificially
19445      misaligned by the expansion of preceding frags.  */
19446   if (stretch <= 0 && newsize > 2)
19447     {
19448       md_convert_frag (sec->owner, sec, fragp);
19449       frag_wane (fragp);
19450     }
19451
19452   return newsize - oldsize;
19453 }
19454
19455 /* Round up a section size to the appropriate boundary.  */
19456
19457 valueT
19458 md_section_align (segT   segment ATTRIBUTE_UNUSED,
19459                   valueT size)
19460 {
19461 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
19462   if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
19463     {
19464       /* For a.out, force the section size to be aligned.  If we don't do
19465          this, BFD will align it for us, but it will not write out the
19466          final bytes of the section.  This may be a bug in BFD, but it is
19467          easier to fix it here since that is how the other a.out targets
19468          work.  */
19469       int align;
19470
19471       align = bfd_get_section_alignment (stdoutput, segment);
19472       size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
19473     }
19474 #endif
19475
19476   return size;
19477 }
19478
19479 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
19480    of an rs_align_code fragment.  */
19481
19482 void
19483 arm_handle_align (fragS * fragP)
19484 {
19485   static char const arm_noop[2][2][4] =
19486     {
19487       {  /* ARMv1 */
19488         {0x00, 0x00, 0xa0, 0xe1},  /* LE */
19489         {0xe1, 0xa0, 0x00, 0x00},  /* BE */
19490       },
19491       {  /* ARMv6k */
19492         {0x00, 0xf0, 0x20, 0xe3},  /* LE */
19493         {0xe3, 0x20, 0xf0, 0x00},  /* BE */
19494       },
19495     };
19496   static char const thumb_noop[2][2][2] =
19497     {
19498       {  /* Thumb-1 */
19499         {0xc0, 0x46},  /* LE */
19500         {0x46, 0xc0},  /* BE */
19501       },
19502       {  /* Thumb-2 */
19503         {0x00, 0xbf},  /* LE */
19504         {0xbf, 0x00}   /* BE */
19505       }
19506     };
19507   static char const wide_thumb_noop[2][4] =
19508     {  /* Wide Thumb-2 */
19509       {0xaf, 0xf3, 0x00, 0x80},  /* LE */
19510       {0xf3, 0xaf, 0x80, 0x00},  /* BE */
19511     };
19512
19513   unsigned bytes, fix, noop_size;
19514   char * p;
19515   const char * noop;
19516   const char *narrow_noop = NULL;
19517 #ifdef OBJ_ELF
19518   enum mstate state;
19519 #endif
19520
19521   if (fragP->fr_type != rs_align_code)
19522     return;
19523
19524   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
19525   p = fragP->fr_literal + fragP->fr_fix;
19526   fix = 0;
19527
19528   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
19529     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
19530
19531   gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
19532
19533   if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
19534     {
19535       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
19536         {
19537           narrow_noop = thumb_noop[1][target_big_endian];
19538           noop = wide_thumb_noop[target_big_endian];
19539         }
19540       else
19541         noop = thumb_noop[0][target_big_endian];
19542       noop_size = 2;
19543 #ifdef OBJ_ELF
19544       state = MAP_THUMB;
19545 #endif
19546     }
19547   else
19548     {
19549       noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k) != 0]
19550                      [target_big_endian];
19551       noop_size = 4;
19552 #ifdef OBJ_ELF
19553       state = MAP_ARM;
19554 #endif
19555     }
19556
19557   fragP->fr_var = noop_size;
19558
19559   if (bytes & (noop_size - 1))
19560     {
19561       fix = bytes & (noop_size - 1);
19562 #ifdef OBJ_ELF
19563       insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
19564 #endif
19565       memset (p, 0, fix);
19566       p += fix;
19567       bytes -= fix;
19568     }
19569
19570   if (narrow_noop)
19571     {
19572       if (bytes & noop_size)
19573         {
19574           /* Insert a narrow noop.  */
19575           memcpy (p, narrow_noop, noop_size);
19576           p += noop_size;
19577           bytes -= noop_size;
19578           fix += noop_size;
19579         }
19580
19581       /* Use wide noops for the remainder */
19582       noop_size = 4;
19583     }
19584
19585   while (bytes >= noop_size)
19586     {
19587       memcpy (p, noop, noop_size);
19588       p += noop_size;
19589       bytes -= noop_size;
19590       fix += noop_size;
19591     }
19592
19593   fragP->fr_fix += fix;
19594 }
19595
19596 /* Called from md_do_align.  Used to create an alignment
19597    frag in a code section.  */
19598
19599 void
19600 arm_frag_align_code (int n, int max)
19601 {
19602   char * p;
19603
19604   /* We assume that there will never be a requirement
19605      to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes.  */
19606   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
19607     {
19608       char err_msg[128];
19609
19610       sprintf (err_msg,
19611         _("alignments greater than %d bytes not supported in .text sections."),
19612         MAX_MEM_FOR_RS_ALIGN_CODE + 1);
19613       as_fatal ("%s", err_msg);
19614     }
19615
19616   p = frag_var (rs_align_code,
19617                 MAX_MEM_FOR_RS_ALIGN_CODE,
19618                 1,
19619                 (relax_substateT) max,
19620                 (symbolS *) NULL,
19621                 (offsetT) n,
19622                 (char *) NULL);
19623   *p = 0;
19624 }
19625
19626 /* Perform target specific initialisation of a frag.
19627    Note - despite the name this initialisation is not done when the frag
19628    is created, but only when its type is assigned.  A frag can be created
19629    and used a long time before its type is set, so beware of assuming that
19630    this initialisationis performed first.  */
19631
19632 #ifndef OBJ_ELF
19633 void
19634 arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
19635 {
19636   /* Record whether this frag is in an ARM or a THUMB area.  */
19637   fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
19638 }
19639
19640 #else /* OBJ_ELF is defined.  */
19641 void
19642 arm_init_frag (fragS * fragP, int max_chars)
19643 {
19644   /* If the current ARM vs THUMB mode has not already
19645      been recorded into this frag then do so now.  */
19646   if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
19647     {
19648       fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
19649
19650       /* Record a mapping symbol for alignment frags.  We will delete this
19651          later if the alignment ends up empty.  */
19652       switch (fragP->fr_type)
19653         {
19654           case rs_align:
19655           case rs_align_test:
19656           case rs_fill:
19657             mapping_state_2 (MAP_DATA, max_chars);
19658             break;
19659           case rs_align_code:
19660             mapping_state_2 (thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
19661             break;
19662           default:
19663             break;
19664         }
19665     }
19666 }
19667
19668 /* When we change sections we need to issue a new mapping symbol.  */
19669
19670 void
19671 arm_elf_change_section (void)
19672 {
19673   /* Link an unlinked unwind index table section to the .text section.  */
19674   if (elf_section_type (now_seg) == SHT_ARM_EXIDX
19675       && elf_linked_to_section (now_seg) == NULL)
19676     elf_linked_to_section (now_seg) = text_section;
19677 }
19678
19679 int
19680 arm_elf_section_type (const char * str, size_t len)
19681 {
19682   if (len == 5 && strncmp (str, "exidx", 5) == 0)
19683     return SHT_ARM_EXIDX;
19684
19685   return -1;
19686 }
19687 \f
19688 /* Code to deal with unwinding tables.  */
19689
19690 static void add_unwind_adjustsp (offsetT);
19691
19692 /* Generate any deferred unwind frame offset.  */
19693
19694 static void
19695 flush_pending_unwind (void)
19696 {
19697   offsetT offset;
19698
19699   offset = unwind.pending_offset;
19700   unwind.pending_offset = 0;
19701   if (offset != 0)
19702     add_unwind_adjustsp (offset);
19703 }
19704
19705 /* Add an opcode to this list for this function.  Two-byte opcodes should
19706    be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
19707    order.  */
19708
19709 static void
19710 add_unwind_opcode (valueT op, int length)
19711 {
19712   /* Add any deferred stack adjustment.  */
19713   if (unwind.pending_offset)
19714     flush_pending_unwind ();
19715
19716   unwind.sp_restored = 0;
19717
19718   if (unwind.opcode_count + length > unwind.opcode_alloc)
19719     {
19720       unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
19721       if (unwind.opcodes)
19722         unwind.opcodes = (unsigned char *) xrealloc (unwind.opcodes,
19723                                                      unwind.opcode_alloc);
19724       else
19725         unwind.opcodes = (unsigned char *) xmalloc (unwind.opcode_alloc);
19726     }
19727   while (length > 0)
19728     {
19729       length--;
19730       unwind.opcodes[unwind.opcode_count] = op & 0xff;
19731       op >>= 8;
19732       unwind.opcode_count++;
19733     }
19734 }
19735
19736 /* Add unwind opcodes to adjust the stack pointer.  */
19737
19738 static void
19739 add_unwind_adjustsp (offsetT offset)
19740 {
19741   valueT op;
19742
19743   if (offset > 0x200)
19744     {
19745       /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
19746       char bytes[5];
19747       int n;
19748       valueT o;
19749
19750       /* Long form: 0xb2, uleb128.  */
19751       /* This might not fit in a word so add the individual bytes,
19752          remembering the list is built in reverse order.  */
19753       o = (valueT) ((offset - 0x204) >> 2);
19754       if (o == 0)
19755         add_unwind_opcode (0, 1);
19756
19757       /* Calculate the uleb128 encoding of the offset.  */
19758       n = 0;
19759       while (o)
19760         {
19761           bytes[n] = o & 0x7f;
19762           o >>= 7;
19763           if (o)
19764             bytes[n] |= 0x80;
19765           n++;
19766         }
19767       /* Add the insn.  */
19768       for (; n; n--)
19769         add_unwind_opcode (bytes[n - 1], 1);
19770       add_unwind_opcode (0xb2, 1);
19771     }
19772   else if (offset > 0x100)
19773     {
19774       /* Two short opcodes.  */
19775       add_unwind_opcode (0x3f, 1);
19776       op = (offset - 0x104) >> 2;
19777       add_unwind_opcode (op, 1);
19778     }
19779   else if (offset > 0)
19780     {
19781       /* Short opcode.  */
19782       op = (offset - 4) >> 2;
19783       add_unwind_opcode (op, 1);
19784     }
19785   else if (offset < 0)
19786     {
19787       offset = -offset;
19788       while (offset > 0x100)
19789         {
19790           add_unwind_opcode (0x7f, 1);
19791           offset -= 0x100;
19792         }
19793       op = ((offset - 4) >> 2) | 0x40;
19794       add_unwind_opcode (op, 1);
19795     }
19796 }
19797
19798 /* Finish the list of unwind opcodes for this function.  */
19799 static void
19800 finish_unwind_opcodes (void)
19801 {
19802   valueT op;
19803
19804   if (unwind.fp_used)
19805     {
19806       /* Adjust sp as necessary.  */
19807       unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
19808       flush_pending_unwind ();
19809
19810       /* After restoring sp from the frame pointer.  */
19811       op = 0x90 | unwind.fp_reg;
19812       add_unwind_opcode (op, 1);
19813     }
19814   else
19815     flush_pending_unwind ();
19816 }
19817
19818
19819 /* Start an exception table entry.  If idx is nonzero this is an index table
19820    entry.  */
19821
19822 static void
19823 start_unwind_section (const segT text_seg, int idx)
19824 {
19825   const char * text_name;
19826   const char * prefix;
19827   const char * prefix_once;
19828   const char * group_name;
19829   size_t prefix_len;
19830   size_t text_len;
19831   char * sec_name;
19832   size_t sec_name_len;
19833   int type;
19834   int flags;
19835   int linkonce;
19836
19837   if (idx)
19838     {
19839       prefix = ELF_STRING_ARM_unwind;
19840       prefix_once = ELF_STRING_ARM_unwind_once;
19841       type = SHT_ARM_EXIDX;
19842     }
19843   else
19844     {
19845       prefix = ELF_STRING_ARM_unwind_info;
19846       prefix_once = ELF_STRING_ARM_unwind_info_once;
19847       type = SHT_PROGBITS;
19848     }
19849
19850   text_name = segment_name (text_seg);
19851   if (streq (text_name, ".text"))
19852     text_name = "";
19853
19854   if (strncmp (text_name, ".gnu.linkonce.t.",
19855                strlen (".gnu.linkonce.t.")) == 0)
19856     {
19857       prefix = prefix_once;
19858       text_name += strlen (".gnu.linkonce.t.");
19859     }
19860
19861   prefix_len = strlen (prefix);
19862   text_len = strlen (text_name);
19863   sec_name_len = prefix_len + text_len;
19864   sec_name = (char *) xmalloc (sec_name_len + 1);
19865   memcpy (sec_name, prefix, prefix_len);
19866   memcpy (sec_name + prefix_len, text_name, text_len);
19867   sec_name[prefix_len + text_len] = '\0';
19868
19869   flags = SHF_ALLOC;
19870   linkonce = 0;
19871   group_name = 0;
19872
19873   /* Handle COMDAT group.  */
19874   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
19875     {
19876       group_name = elf_group_name (text_seg);
19877       if (group_name == NULL)
19878         {
19879           as_bad (_("Group section `%s' has no group signature"),
19880                   segment_name (text_seg));
19881           ignore_rest_of_line ();
19882           return;
19883         }
19884       flags |= SHF_GROUP;
19885       linkonce = 1;
19886     }
19887
19888   obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
19889
19890   /* Set the section link for index tables.  */
19891   if (idx)
19892     elf_linked_to_section (now_seg) = text_seg;
19893 }
19894
19895
19896 /* Start an unwind table entry.  HAVE_DATA is nonzero if we have additional
19897    personality routine data.  Returns zero, or the index table value for
19898    and inline entry.  */
19899
19900 static valueT
19901 create_unwind_entry (int have_data)
19902 {
19903   int size;
19904   addressT where;
19905   char *ptr;
19906   /* The current word of data.  */
19907   valueT data;
19908   /* The number of bytes left in this word.  */
19909   int n;
19910
19911   finish_unwind_opcodes ();
19912
19913   /* Remember the current text section.  */
19914   unwind.saved_seg = now_seg;
19915   unwind.saved_subseg = now_subseg;
19916
19917   start_unwind_section (now_seg, 0);
19918
19919   if (unwind.personality_routine == NULL)
19920     {
19921       if (unwind.personality_index == -2)
19922         {
19923           if (have_data)
19924             as_bad (_("handlerdata in cantunwind frame"));
19925           return 1; /* EXIDX_CANTUNWIND.  */
19926         }
19927
19928       /* Use a default personality routine if none is specified.  */
19929       if (unwind.personality_index == -1)
19930         {
19931           if (unwind.opcode_count > 3)
19932             unwind.personality_index = 1;
19933           else
19934             unwind.personality_index = 0;
19935         }
19936
19937       /* Space for the personality routine entry.  */
19938       if (unwind.personality_index == 0)
19939         {
19940           if (unwind.opcode_count > 3)
19941             as_bad (_("too many unwind opcodes for personality routine 0"));
19942
19943           if (!have_data)
19944             {
19945               /* All the data is inline in the index table.  */
19946               data = 0x80;
19947               n = 3;
19948               while (unwind.opcode_count > 0)
19949                 {
19950                   unwind.opcode_count--;
19951                   data = (data << 8) | unwind.opcodes[unwind.opcode_count];
19952                   n--;
19953                 }
19954
19955               /* Pad with "finish" opcodes.  */
19956               while (n--)
19957                 data = (data << 8) | 0xb0;
19958
19959               return data;
19960             }
19961           size = 0;
19962         }
19963       else
19964         /* We get two opcodes "free" in the first word.  */
19965         size = unwind.opcode_count - 2;
19966     }
19967   else
19968     {
19969       gas_assert (unwind.personality_index == -1);
19970
19971       /* An extra byte is required for the opcode count.        */
19972       size = unwind.opcode_count + 1;
19973     }
19974
19975   size = (size + 3) >> 2;
19976   if (size > 0xff)
19977     as_bad (_("too many unwind opcodes"));
19978
19979   frag_align (2, 0, 0);
19980   record_alignment (now_seg, 2);
19981   unwind.table_entry = expr_build_dot ();
19982
19983   /* Allocate the table entry.  */
19984   ptr = frag_more ((size << 2) + 4);
19985   /* PR 13449: Zero the table entries in case some of them are not used.  */
19986   memset (ptr, 0, (size << 2) + 4);
19987   where = frag_now_fix () - ((size << 2) + 4);
19988
19989   switch (unwind.personality_index)
19990     {
19991     case -1:
19992       /* ??? Should this be a PLT generating relocation?  */
19993       /* Custom personality routine.  */
19994       fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
19995                BFD_RELOC_ARM_PREL31);
19996
19997       where += 4;
19998       ptr += 4;
19999
20000       /* Set the first byte to the number of additional words.  */
20001       data = size > 0 ? size - 1 : 0;
20002       n = 3;
20003       break;
20004
20005     /* ABI defined personality routines.  */
20006     case 0:
20007       /* Three opcodes bytes are packed into the first word.  */
20008       data = 0x80;
20009       n = 3;
20010       break;
20011
20012     case 1:
20013     case 2:
20014       /* The size and first two opcode bytes go in the first word.  */
20015       data = ((0x80 + unwind.personality_index) << 8) | size;
20016       n = 2;
20017       break;
20018
20019     default:
20020       /* Should never happen.  */
20021       abort ();
20022     }
20023
20024   /* Pack the opcodes into words (MSB first), reversing the list at the same
20025      time.  */
20026   while (unwind.opcode_count > 0)
20027     {
20028       if (n == 0)
20029         {
20030           md_number_to_chars (ptr, data, 4);
20031           ptr += 4;
20032           n = 4;
20033           data = 0;
20034         }
20035       unwind.opcode_count--;
20036       n--;
20037       data = (data << 8) | unwind.opcodes[unwind.opcode_count];
20038     }
20039
20040   /* Finish off the last word.  */
20041   if (n < 4)
20042     {
20043       /* Pad with "finish" opcodes.  */
20044       while (n--)
20045         data = (data << 8) | 0xb0;
20046
20047       md_number_to_chars (ptr, data, 4);
20048     }
20049
20050   if (!have_data)
20051     {
20052       /* Add an empty descriptor if there is no user-specified data.   */
20053       ptr = frag_more (4);
20054       md_number_to_chars (ptr, 0, 4);
20055     }
20056
20057   return 0;
20058 }
20059
20060
20061 /* Initialize the DWARF-2 unwind information for this procedure.  */
20062
20063 void
20064 tc_arm_frame_initial_instructions (void)
20065 {
20066   cfi_add_CFA_def_cfa (REG_SP, 0);
20067 }
20068 #endif /* OBJ_ELF */
20069
20070 /* Convert REGNAME to a DWARF-2 register number.  */
20071
20072 int
20073 tc_arm_regname_to_dw2regnum (char *regname)
20074 {
20075   int reg = arm_reg_parse (&regname, REG_TYPE_RN);
20076
20077   if (reg == FAIL)
20078     return -1;
20079
20080   return reg;
20081 }
20082
20083 #ifdef TE_PE
20084 void
20085 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
20086 {
20087   expressionS exp;
20088
20089   exp.X_op = O_secrel;
20090   exp.X_add_symbol = symbol;
20091   exp.X_add_number = 0;
20092   emit_expr (&exp, size);
20093 }
20094 #endif
20095
20096 /* MD interface: Symbol and relocation handling.  */
20097
20098 /* Return the address within the segment that a PC-relative fixup is
20099    relative to.  For ARM, PC-relative fixups applied to instructions
20100    are generally relative to the location of the fixup plus 8 bytes.
20101    Thumb branches are offset by 4, and Thumb loads relative to PC
20102    require special handling.  */
20103
20104 long
20105 md_pcrel_from_section (fixS * fixP, segT seg)
20106 {
20107   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
20108
20109   /* If this is pc-relative and we are going to emit a relocation
20110      then we just want to put out any pipeline compensation that the linker
20111      will need.  Otherwise we want to use the calculated base.
20112      For WinCE we skip the bias for externals as well, since this
20113      is how the MS ARM-CE assembler behaves and we want to be compatible.  */
20114   if (fixP->fx_pcrel
20115       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
20116           || (arm_force_relocation (fixP)
20117 #ifdef TE_WINCE
20118               && !S_IS_EXTERNAL (fixP->fx_addsy)
20119 #endif
20120               )))
20121     base = 0;
20122
20123
20124   switch (fixP->fx_r_type)
20125     {
20126       /* PC relative addressing on the Thumb is slightly odd as the
20127          bottom two bits of the PC are forced to zero for the
20128          calculation.  This happens *after* application of the
20129          pipeline offset.  However, Thumb adrl already adjusts for
20130          this, so we need not do it again.  */
20131     case BFD_RELOC_ARM_THUMB_ADD:
20132       return base & ~3;
20133
20134     case BFD_RELOC_ARM_THUMB_OFFSET:
20135     case BFD_RELOC_ARM_T32_OFFSET_IMM:
20136     case BFD_RELOC_ARM_T32_ADD_PC12:
20137     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
20138       return (base + 4) & ~3;
20139
20140       /* Thumb branches are simply offset by +4.  */
20141     case BFD_RELOC_THUMB_PCREL_BRANCH7:
20142     case BFD_RELOC_THUMB_PCREL_BRANCH9:
20143     case BFD_RELOC_THUMB_PCREL_BRANCH12:
20144     case BFD_RELOC_THUMB_PCREL_BRANCH20:
20145     case BFD_RELOC_THUMB_PCREL_BRANCH25:
20146       return base + 4;
20147
20148     case BFD_RELOC_THUMB_PCREL_BRANCH23:
20149       if (fixP->fx_addsy
20150           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20151           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
20152           && ARM_IS_FUNC (fixP->fx_addsy)
20153           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20154         base = fixP->fx_where + fixP->fx_frag->fr_address;
20155        return base + 4;
20156
20157       /* BLX is like branches above, but forces the low two bits of PC to
20158          zero.  */
20159     case BFD_RELOC_THUMB_PCREL_BLX:
20160       if (fixP->fx_addsy
20161           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20162           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
20163           && THUMB_IS_FUNC (fixP->fx_addsy)
20164           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20165         base = fixP->fx_where + fixP->fx_frag->fr_address;
20166       return (base + 4) & ~3;
20167
20168       /* ARM mode branches are offset by +8.  However, the Windows CE
20169          loader expects the relocation not to take this into account.  */
20170     case BFD_RELOC_ARM_PCREL_BLX:
20171       if (fixP->fx_addsy
20172           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20173           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
20174           && ARM_IS_FUNC (fixP->fx_addsy)
20175           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20176         base = fixP->fx_where + fixP->fx_frag->fr_address;
20177       return base + 8;
20178
20179     case BFD_RELOC_ARM_PCREL_CALL:
20180       if (fixP->fx_addsy
20181           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20182           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
20183           && THUMB_IS_FUNC (fixP->fx_addsy)
20184           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20185         base = fixP->fx_where + fixP->fx_frag->fr_address;
20186       return base + 8;
20187
20188     case BFD_RELOC_ARM_PCREL_BRANCH:
20189     case BFD_RELOC_ARM_PCREL_JUMP:
20190     case BFD_RELOC_ARM_PLT32:
20191 #ifdef TE_WINCE
20192       /* When handling fixups immediately, because we have already
20193          discovered the value of a symbol, or the address of the frag involved
20194          we must account for the offset by +8, as the OS loader will never see the reloc.
20195          see fixup_segment() in write.c
20196          The S_IS_EXTERNAL test handles the case of global symbols.
20197          Those need the calculated base, not just the pipe compensation the linker will need.  */
20198       if (fixP->fx_pcrel
20199           && fixP->fx_addsy != NULL
20200           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20201           && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
20202         return base + 8;
20203       return base;
20204 #else
20205       return base + 8;
20206 #endif
20207
20208
20209       /* ARM mode loads relative to PC are also offset by +8.  Unlike
20210          branches, the Windows CE loader *does* expect the relocation
20211          to take this into account.  */
20212     case BFD_RELOC_ARM_OFFSET_IMM:
20213     case BFD_RELOC_ARM_OFFSET_IMM8:
20214     case BFD_RELOC_ARM_HWLITERAL:
20215     case BFD_RELOC_ARM_LITERAL:
20216     case BFD_RELOC_ARM_CP_OFF_IMM:
20217       return base + 8;
20218
20219
20220       /* Other PC-relative relocations are un-offset.  */
20221     default:
20222       return base;
20223     }
20224 }
20225
20226 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
20227    Otherwise we have no need to default values of symbols.  */
20228
20229 symbolS *
20230 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
20231 {
20232 #ifdef OBJ_ELF
20233   if (name[0] == '_' && name[1] == 'G'
20234       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
20235     {
20236       if (!GOT_symbol)
20237         {
20238           if (symbol_find (name))
20239             as_bad (_("GOT already in the symbol table"));
20240
20241           GOT_symbol = symbol_new (name, undefined_section,
20242                                    (valueT) 0, & zero_address_frag);
20243         }
20244
20245       return GOT_symbol;
20246     }
20247 #endif
20248
20249   return NULL;
20250 }
20251
20252 /* Subroutine of md_apply_fix.   Check to see if an immediate can be
20253    computed as two separate immediate values, added together.  We
20254    already know that this value cannot be computed by just one ARM
20255    instruction.  */
20256
20257 static unsigned int
20258 validate_immediate_twopart (unsigned int   val,
20259                             unsigned int * highpart)
20260 {
20261   unsigned int a;
20262   unsigned int i;
20263
20264   for (i = 0; i < 32; i += 2)
20265     if (((a = rotate_left (val, i)) & 0xff) != 0)
20266       {
20267         if (a & 0xff00)
20268           {
20269             if (a & ~ 0xffff)
20270               continue;
20271             * highpart = (a  >> 8) | ((i + 24) << 7);
20272           }
20273         else if (a & 0xff0000)
20274           {
20275             if (a & 0xff000000)
20276               continue;
20277             * highpart = (a >> 16) | ((i + 16) << 7);
20278           }
20279         else
20280           {
20281             gas_assert (a & 0xff000000);
20282             * highpart = (a >> 24) | ((i + 8) << 7);
20283           }
20284
20285         return (a & 0xff) | (i << 7);
20286       }
20287
20288   return FAIL;
20289 }
20290
20291 static int
20292 validate_offset_imm (unsigned int val, int hwse)
20293 {
20294   if ((hwse && val > 255) || val > 4095)
20295     return FAIL;
20296   return val;
20297 }
20298
20299 /* Subroutine of md_apply_fix.   Do those data_ops which can take a
20300    negative immediate constant by altering the instruction.  A bit of
20301    a hack really.
20302         MOV <-> MVN
20303         AND <-> BIC
20304         ADC <-> SBC
20305         by inverting the second operand, and
20306         ADD <-> SUB
20307         CMP <-> CMN
20308         by negating the second operand.  */
20309
20310 static int
20311 negate_data_op (unsigned long * instruction,
20312                 unsigned long   value)
20313 {
20314   int op, new_inst;
20315   unsigned long negated, inverted;
20316
20317   negated = encode_arm_immediate (-value);
20318   inverted = encode_arm_immediate (~value);
20319
20320   op = (*instruction >> DATA_OP_SHIFT) & 0xf;
20321   switch (op)
20322     {
20323       /* First negates.  */
20324     case OPCODE_SUB:             /* ADD <-> SUB  */
20325       new_inst = OPCODE_ADD;
20326       value = negated;
20327       break;
20328
20329     case OPCODE_ADD:
20330       new_inst = OPCODE_SUB;
20331       value = negated;
20332       break;
20333
20334     case OPCODE_CMP:             /* CMP <-> CMN  */
20335       new_inst = OPCODE_CMN;
20336       value = negated;
20337       break;
20338
20339     case OPCODE_CMN:
20340       new_inst = OPCODE_CMP;
20341       value = negated;
20342       break;
20343
20344       /* Now Inverted ops.  */
20345     case OPCODE_MOV:             /* MOV <-> MVN  */
20346       new_inst = OPCODE_MVN;
20347       value = inverted;
20348       break;
20349
20350     case OPCODE_MVN:
20351       new_inst = OPCODE_MOV;
20352       value = inverted;
20353       break;
20354
20355     case OPCODE_AND:             /* AND <-> BIC  */
20356       new_inst = OPCODE_BIC;
20357       value = inverted;
20358       break;
20359
20360     case OPCODE_BIC:
20361       new_inst = OPCODE_AND;
20362       value = inverted;
20363       break;
20364
20365     case OPCODE_ADC:              /* ADC <-> SBC  */
20366       new_inst = OPCODE_SBC;
20367       value = inverted;
20368       break;
20369
20370     case OPCODE_SBC:
20371       new_inst = OPCODE_ADC;
20372       value = inverted;
20373       break;
20374
20375       /* We cannot do anything.  */
20376     default:
20377       return FAIL;
20378     }
20379
20380   if (value == (unsigned) FAIL)
20381     return FAIL;
20382
20383   *instruction &= OPCODE_MASK;
20384   *instruction |= new_inst << DATA_OP_SHIFT;
20385   return value;
20386 }
20387
20388 /* Like negate_data_op, but for Thumb-2.   */
20389
20390 static unsigned int
20391 thumb32_negate_data_op (offsetT *instruction, unsigned int value)
20392 {
20393   int op, new_inst;
20394   int rd;
20395   unsigned int negated, inverted;
20396
20397   negated = encode_thumb32_immediate (-value);
20398   inverted = encode_thumb32_immediate (~value);
20399
20400   rd = (*instruction >> 8) & 0xf;
20401   op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
20402   switch (op)
20403     {
20404       /* ADD <-> SUB.  Includes CMP <-> CMN.  */
20405     case T2_OPCODE_SUB:
20406       new_inst = T2_OPCODE_ADD;
20407       value = negated;
20408       break;
20409
20410     case T2_OPCODE_ADD:
20411       new_inst = T2_OPCODE_SUB;
20412       value = negated;
20413       break;
20414
20415       /* ORR <-> ORN.  Includes MOV <-> MVN.  */
20416     case T2_OPCODE_ORR:
20417       new_inst = T2_OPCODE_ORN;
20418       value = inverted;
20419       break;
20420
20421     case T2_OPCODE_ORN:
20422       new_inst = T2_OPCODE_ORR;
20423       value = inverted;
20424       break;
20425
20426       /* AND <-> BIC.  TST has no inverted equivalent.  */
20427     case T2_OPCODE_AND:
20428       new_inst = T2_OPCODE_BIC;
20429       if (rd == 15)
20430         value = FAIL;
20431       else
20432         value = inverted;
20433       break;
20434
20435     case T2_OPCODE_BIC:
20436       new_inst = T2_OPCODE_AND;
20437       value = inverted;
20438       break;
20439
20440       /* ADC <-> SBC  */
20441     case T2_OPCODE_ADC:
20442       new_inst = T2_OPCODE_SBC;
20443       value = inverted;
20444       break;
20445
20446     case T2_OPCODE_SBC:
20447       new_inst = T2_OPCODE_ADC;
20448       value = inverted;
20449       break;
20450
20451       /* We cannot do anything.  */
20452     default:
20453       return FAIL;
20454     }
20455
20456   if (value == (unsigned int)FAIL)
20457     return FAIL;
20458
20459   *instruction &= T2_OPCODE_MASK;
20460   *instruction |= new_inst << T2_DATA_OP_SHIFT;
20461   return value;
20462 }
20463
20464 /* Read a 32-bit thumb instruction from buf.  */
20465 static unsigned long
20466 get_thumb32_insn (char * buf)
20467 {
20468   unsigned long insn;
20469   insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
20470   insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20471
20472   return insn;
20473 }
20474
20475
20476 /* We usually want to set the low bit on the address of thumb function
20477    symbols.  In particular .word foo - . should have the low bit set.
20478    Generic code tries to fold the difference of two symbols to
20479    a constant.  Prevent this and force a relocation when the first symbols
20480    is a thumb function.  */
20481
20482 bfd_boolean
20483 arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
20484 {
20485   if (op == O_subtract
20486       && l->X_op == O_symbol
20487       && r->X_op == O_symbol
20488       && THUMB_IS_FUNC (l->X_add_symbol))
20489     {
20490       l->X_op = O_subtract;
20491       l->X_op_symbol = r->X_add_symbol;
20492       l->X_add_number -= r->X_add_number;
20493       return TRUE;
20494     }
20495
20496   /* Process as normal.  */
20497   return FALSE;
20498 }
20499
20500 /* Encode Thumb2 unconditional branches and calls. The encoding
20501    for the 2 are identical for the immediate values.  */
20502
20503 static void
20504 encode_thumb2_b_bl_offset (char * buf, offsetT value)
20505 {
20506 #define T2I1I2MASK  ((1 << 13) | (1 << 11))
20507   offsetT newval;
20508   offsetT newval2;
20509   addressT S, I1, I2, lo, hi;
20510
20511   S = (value >> 24) & 0x01;
20512   I1 = (value >> 23) & 0x01;
20513   I2 = (value >> 22) & 0x01;
20514   hi = (value >> 12) & 0x3ff;
20515   lo = (value >> 1) & 0x7ff;
20516   newval   = md_chars_to_number (buf, THUMB_SIZE);
20517   newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20518   newval  |= (S << 10) | hi;
20519   newval2 &=  ~T2I1I2MASK;
20520   newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
20521   md_number_to_chars (buf, newval, THUMB_SIZE);
20522   md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
20523 }
20524
20525 void
20526 md_apply_fix (fixS *    fixP,
20527                valueT * valP,
20528                segT     seg)
20529 {
20530   offsetT        value = * valP;
20531   offsetT        newval;
20532   unsigned int   newimm;
20533   unsigned long  temp;
20534   int            sign;
20535   char *         buf = fixP->fx_where + fixP->fx_frag->fr_literal;
20536
20537   gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
20538
20539   /* Note whether this will delete the relocation.  */
20540
20541   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
20542     fixP->fx_done = 1;
20543
20544   /* On a 64-bit host, silently truncate 'value' to 32 bits for
20545      consistency with the behaviour on 32-bit hosts.  Remember value
20546      for emit_reloc.  */
20547   value &= 0xffffffff;
20548   value ^= 0x80000000;
20549   value -= 0x80000000;
20550
20551   *valP = value;
20552   fixP->fx_addnumber = value;
20553
20554   /* Same treatment for fixP->fx_offset.  */
20555   fixP->fx_offset &= 0xffffffff;
20556   fixP->fx_offset ^= 0x80000000;
20557   fixP->fx_offset -= 0x80000000;
20558
20559   switch (fixP->fx_r_type)
20560     {
20561     case BFD_RELOC_NONE:
20562       /* This will need to go in the object file.  */
20563       fixP->fx_done = 0;
20564       break;
20565
20566     case BFD_RELOC_ARM_IMMEDIATE:
20567       /* We claim that this fixup has been processed here,
20568          even if in fact we generate an error because we do
20569          not have a reloc for it, so tc_gen_reloc will reject it.  */
20570       fixP->fx_done = 1;
20571
20572       if (fixP->fx_addsy)
20573         {
20574           const char *msg = 0;
20575
20576           if (! S_IS_DEFINED (fixP->fx_addsy))
20577             msg = _("undefined symbol %s used as an immediate value");
20578           else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
20579             msg = _("symbol %s is in a different section");
20580           else if (S_IS_WEAK (fixP->fx_addsy))
20581             msg = _("symbol %s is weak and may be overridden later");
20582
20583           if (msg)
20584             {
20585               as_bad_where (fixP->fx_file, fixP->fx_line,
20586                             msg, S_GET_NAME (fixP->fx_addsy));
20587               break;
20588             }
20589         }
20590
20591       newimm = encode_arm_immediate (value);
20592       temp = md_chars_to_number (buf, INSN_SIZE);
20593
20594       /* If the instruction will fail, see if we can fix things up by
20595          changing the opcode.  */
20596       if (newimm == (unsigned int) FAIL
20597           && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL)
20598         {
20599           as_bad_where (fixP->fx_file, fixP->fx_line,
20600                         _("invalid constant (%lx) after fixup"),
20601                         (unsigned long) value);
20602           break;
20603         }
20604
20605       newimm |= (temp & 0xfffff000);
20606       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
20607       break;
20608
20609     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
20610       {
20611         unsigned int highpart = 0;
20612         unsigned int newinsn  = 0xe1a00000; /* nop.  */
20613
20614         if (fixP->fx_addsy)
20615           {
20616             const char *msg = 0;
20617
20618             if (! S_IS_DEFINED (fixP->fx_addsy))
20619               msg = _("undefined symbol %s used as an immediate value");
20620             else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
20621               msg = _("symbol %s is in a different section");
20622             else if (S_IS_WEAK (fixP->fx_addsy))
20623               msg = _("symbol %s is weak and may be overridden later");
20624
20625             if (msg)
20626               {
20627                 as_bad_where (fixP->fx_file, fixP->fx_line,
20628                               msg, S_GET_NAME (fixP->fx_addsy));
20629                 break;
20630               }
20631           }
20632
20633         newimm = encode_arm_immediate (value);
20634         temp = md_chars_to_number (buf, INSN_SIZE);
20635
20636         /* If the instruction will fail, see if we can fix things up by
20637            changing the opcode.  */
20638         if (newimm == (unsigned int) FAIL
20639             && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
20640           {
20641             /* No ?  OK - try using two ADD instructions to generate
20642                the value.  */
20643             newimm = validate_immediate_twopart (value, & highpart);
20644
20645             /* Yes - then make sure that the second instruction is
20646                also an add.  */
20647             if (newimm != (unsigned int) FAIL)
20648               newinsn = temp;
20649             /* Still No ?  Try using a negated value.  */
20650             else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
20651               temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
20652             /* Otherwise - give up.  */
20653             else
20654               {
20655                 as_bad_where (fixP->fx_file, fixP->fx_line,
20656                               _("unable to compute ADRL instructions for PC offset of 0x%lx"),
20657                               (long) value);
20658                 break;
20659               }
20660
20661             /* Replace the first operand in the 2nd instruction (which
20662                is the PC) with the destination register.  We have
20663                already added in the PC in the first instruction and we
20664                do not want to do it again.  */
20665             newinsn &= ~ 0xf0000;
20666             newinsn |= ((newinsn & 0x0f000) << 4);
20667           }
20668
20669         newimm |= (temp & 0xfffff000);
20670         md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
20671
20672         highpart |= (newinsn & 0xfffff000);
20673         md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
20674       }
20675       break;
20676
20677     case BFD_RELOC_ARM_OFFSET_IMM:
20678       if (!fixP->fx_done && seg->use_rela_p)
20679         value = 0;
20680
20681     case BFD_RELOC_ARM_LITERAL:
20682       sign = value > 0;
20683
20684       if (value < 0)
20685         value = - value;
20686
20687       if (validate_offset_imm (value, 0) == FAIL)
20688         {
20689           if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
20690             as_bad_where (fixP->fx_file, fixP->fx_line,
20691                           _("invalid literal constant: pool needs to be closer"));
20692           else
20693             as_bad_where (fixP->fx_file, fixP->fx_line,
20694                           _("bad immediate value for offset (%ld)"),
20695                           (long) value);
20696           break;
20697         }
20698
20699       newval = md_chars_to_number (buf, INSN_SIZE);
20700       if (value == 0)
20701         newval &= 0xfffff000;
20702       else
20703         {
20704           newval &= 0xff7ff000;
20705           newval |= value | (sign ? INDEX_UP : 0);
20706         }
20707       md_number_to_chars (buf, newval, INSN_SIZE);
20708       break;
20709
20710     case BFD_RELOC_ARM_OFFSET_IMM8:
20711     case BFD_RELOC_ARM_HWLITERAL:
20712       sign = value > 0;
20713
20714       if (value < 0)
20715         value = - value;
20716
20717       if (validate_offset_imm (value, 1) == FAIL)
20718         {
20719           if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
20720             as_bad_where (fixP->fx_file, fixP->fx_line,
20721                           _("invalid literal constant: pool needs to be closer"));
20722           else
20723             as_bad (_("bad immediate value for 8-bit offset (%ld)"),
20724                     (long) value);
20725           break;
20726         }
20727
20728       newval = md_chars_to_number (buf, INSN_SIZE);
20729       if (value == 0)
20730         newval &= 0xfffff0f0;
20731       else
20732         {
20733           newval &= 0xff7ff0f0;
20734           newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
20735         }
20736       md_number_to_chars (buf, newval, INSN_SIZE);
20737       break;
20738
20739     case BFD_RELOC_ARM_T32_OFFSET_U8:
20740       if (value < 0 || value > 1020 || value % 4 != 0)
20741         as_bad_where (fixP->fx_file, fixP->fx_line,
20742                       _("bad immediate value for offset (%ld)"), (long) value);
20743       value /= 4;
20744
20745       newval = md_chars_to_number (buf+2, THUMB_SIZE);
20746       newval |= value;
20747       md_number_to_chars (buf+2, newval, THUMB_SIZE);
20748       break;
20749
20750     case BFD_RELOC_ARM_T32_OFFSET_IMM:
20751       /* This is a complicated relocation used for all varieties of Thumb32
20752          load/store instruction with immediate offset:
20753
20754          1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
20755                                                    *4, optional writeback(W)
20756                                                    (doubleword load/store)
20757
20758          1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
20759          1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
20760          1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
20761          1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
20762          1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
20763
20764          Uppercase letters indicate bits that are already encoded at
20765          this point.  Lowercase letters are our problem.  For the
20766          second block of instructions, the secondary opcode nybble
20767          (bits 8..11) is present, and bit 23 is zero, even if this is
20768          a PC-relative operation.  */
20769       newval = md_chars_to_number (buf, THUMB_SIZE);
20770       newval <<= 16;
20771       newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
20772
20773       if ((newval & 0xf0000000) == 0xe0000000)
20774         {
20775           /* Doubleword load/store: 8-bit offset, scaled by 4.  */
20776           if (value >= 0)
20777             newval |= (1 << 23);
20778           else
20779             value = -value;
20780           if (value % 4 != 0)
20781             {
20782               as_bad_where (fixP->fx_file, fixP->fx_line,
20783                             _("offset not a multiple of 4"));
20784               break;
20785             }
20786           value /= 4;
20787           if (value > 0xff)
20788             {
20789               as_bad_where (fixP->fx_file, fixP->fx_line,
20790                             _("offset out of range"));
20791               break;
20792             }
20793           newval &= ~0xff;
20794         }
20795       else if ((newval & 0x000f0000) == 0x000f0000)
20796         {
20797           /* PC-relative, 12-bit offset.  */
20798           if (value >= 0)
20799             newval |= (1 << 23);
20800           else
20801             value = -value;
20802           if (value > 0xfff)
20803             {
20804               as_bad_where (fixP->fx_file, fixP->fx_line,
20805                             _("offset out of range"));
20806               break;
20807             }
20808           newval &= ~0xfff;
20809         }
20810       else if ((newval & 0x00000100) == 0x00000100)
20811         {
20812           /* Writeback: 8-bit, +/- offset.  */
20813           if (value >= 0)
20814             newval |= (1 << 9);
20815           else
20816             value = -value;
20817           if (value > 0xff)
20818             {
20819               as_bad_where (fixP->fx_file, fixP->fx_line,
20820                             _("offset out of range"));
20821               break;
20822             }
20823           newval &= ~0xff;
20824         }
20825       else if ((newval & 0x00000f00) == 0x00000e00)
20826         {
20827           /* T-instruction: positive 8-bit offset.  */
20828           if (value < 0 || value > 0xff)
20829             {
20830               as_bad_where (fixP->fx_file, fixP->fx_line,
20831                             _("offset out of range"));
20832               break;
20833             }
20834           newval &= ~0xff;
20835           newval |= value;
20836         }
20837       else
20838         {
20839           /* Positive 12-bit or negative 8-bit offset.  */
20840           int limit;
20841           if (value >= 0)
20842             {
20843               newval |= (1 << 23);
20844               limit = 0xfff;
20845             }
20846           else
20847             {
20848               value = -value;
20849               limit = 0xff;
20850             }
20851           if (value > limit)
20852             {
20853               as_bad_where (fixP->fx_file, fixP->fx_line,
20854                             _("offset out of range"));
20855               break;
20856             }
20857           newval &= ~limit;
20858         }
20859
20860       newval |= value;
20861       md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
20862       md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
20863       break;
20864
20865     case BFD_RELOC_ARM_SHIFT_IMM:
20866       newval = md_chars_to_number (buf, INSN_SIZE);
20867       if (((unsigned long) value) > 32
20868           || (value == 32
20869               && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
20870         {
20871           as_bad_where (fixP->fx_file, fixP->fx_line,
20872                         _("shift expression is too large"));
20873           break;
20874         }
20875
20876       if (value == 0)
20877         /* Shifts of zero must be done as lsl.  */
20878         newval &= ~0x60;
20879       else if (value == 32)
20880         value = 0;
20881       newval &= 0xfffff07f;
20882       newval |= (value & 0x1f) << 7;
20883       md_number_to_chars (buf, newval, INSN_SIZE);
20884       break;
20885
20886     case BFD_RELOC_ARM_T32_IMMEDIATE:
20887     case BFD_RELOC_ARM_T32_ADD_IMM:
20888     case BFD_RELOC_ARM_T32_IMM12:
20889     case BFD_RELOC_ARM_T32_ADD_PC12:
20890       /* We claim that this fixup has been processed here,
20891          even if in fact we generate an error because we do
20892          not have a reloc for it, so tc_gen_reloc will reject it.  */
20893       fixP->fx_done = 1;
20894
20895       if (fixP->fx_addsy
20896           && ! S_IS_DEFINED (fixP->fx_addsy))
20897         {
20898           as_bad_where (fixP->fx_file, fixP->fx_line,
20899                         _("undefined symbol %s used as an immediate value"),
20900                         S_GET_NAME (fixP->fx_addsy));
20901           break;
20902         }
20903
20904       newval = md_chars_to_number (buf, THUMB_SIZE);
20905       newval <<= 16;
20906       newval |= md_chars_to_number (buf+2, THUMB_SIZE);
20907
20908       newimm = FAIL;
20909       if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
20910           || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
20911         {
20912           newimm = encode_thumb32_immediate (value);
20913           if (newimm == (unsigned int) FAIL)
20914             newimm = thumb32_negate_data_op (&newval, value);
20915         }
20916       if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
20917           && newimm == (unsigned int) FAIL)
20918         {
20919           /* Turn add/sum into addw/subw.  */
20920           if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
20921             newval = (newval & 0xfeffffff) | 0x02000000;
20922           /* No flat 12-bit imm encoding for addsw/subsw.  */
20923           if ((newval & 0x00100000) == 0)
20924             {
20925               /* 12 bit immediate for addw/subw.  */
20926               if (value < 0)
20927                 {
20928                   value = -value;
20929                   newval ^= 0x00a00000;
20930                 }
20931               if (value > 0xfff)
20932                 newimm = (unsigned int) FAIL;
20933               else
20934                 newimm = value;
20935             }
20936         }
20937
20938       if (newimm == (unsigned int)FAIL)
20939         {
20940           as_bad_where (fixP->fx_file, fixP->fx_line,
20941                         _("invalid constant (%lx) after fixup"),
20942                         (unsigned long) value);
20943           break;
20944         }
20945
20946       newval |= (newimm & 0x800) << 15;
20947       newval |= (newimm & 0x700) << 4;
20948       newval |= (newimm & 0x0ff);
20949
20950       md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
20951       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
20952       break;
20953
20954     case BFD_RELOC_ARM_SMC:
20955       if (((unsigned long) value) > 0xffff)
20956         as_bad_where (fixP->fx_file, fixP->fx_line,
20957                       _("invalid smc expression"));
20958       newval = md_chars_to_number (buf, INSN_SIZE);
20959       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
20960       md_number_to_chars (buf, newval, INSN_SIZE);
20961       break;
20962
20963     case BFD_RELOC_ARM_HVC:
20964       if (((unsigned long) value) > 0xffff)
20965         as_bad_where (fixP->fx_file, fixP->fx_line,
20966                       _("invalid hvc expression"));
20967       newval = md_chars_to_number (buf, INSN_SIZE);
20968       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
20969       md_number_to_chars (buf, newval, INSN_SIZE);
20970       break;
20971
20972     case BFD_RELOC_ARM_SWI:
20973       if (fixP->tc_fix_data != 0)
20974         {
20975           if (((unsigned long) value) > 0xff)
20976             as_bad_where (fixP->fx_file, fixP->fx_line,
20977                           _("invalid swi expression"));
20978           newval = md_chars_to_number (buf, THUMB_SIZE);
20979           newval |= value;
20980           md_number_to_chars (buf, newval, THUMB_SIZE);
20981         }
20982       else
20983         {
20984           if (((unsigned long) value) > 0x00ffffff)
20985             as_bad_where (fixP->fx_file, fixP->fx_line,
20986                           _("invalid swi expression"));
20987           newval = md_chars_to_number (buf, INSN_SIZE);
20988           newval |= value;
20989           md_number_to_chars (buf, newval, INSN_SIZE);
20990         }
20991       break;
20992
20993     case BFD_RELOC_ARM_MULTI:
20994       if (((unsigned long) value) > 0xffff)
20995         as_bad_where (fixP->fx_file, fixP->fx_line,
20996                       _("invalid expression in load/store multiple"));
20997       newval = value | md_chars_to_number (buf, INSN_SIZE);
20998       md_number_to_chars (buf, newval, INSN_SIZE);
20999       break;
21000
21001 #ifdef OBJ_ELF
21002     case BFD_RELOC_ARM_PCREL_CALL:
21003
21004       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
21005           && fixP->fx_addsy
21006           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21007           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21008           && THUMB_IS_FUNC (fixP->fx_addsy))
21009         /* Flip the bl to blx. This is a simple flip
21010            bit here because we generate PCREL_CALL for
21011            unconditional bls.  */
21012         {
21013           newval = md_chars_to_number (buf, INSN_SIZE);
21014           newval = newval | 0x10000000;
21015           md_number_to_chars (buf, newval, INSN_SIZE);
21016           temp = 1;
21017           fixP->fx_done = 1;
21018         }
21019       else
21020         temp = 3;
21021       goto arm_branch_common;
21022
21023     case BFD_RELOC_ARM_PCREL_JUMP:
21024       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
21025           && fixP->fx_addsy
21026           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21027           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21028           && THUMB_IS_FUNC (fixP->fx_addsy))
21029         {
21030           /* This would map to a bl<cond>, b<cond>,
21031              b<always> to a Thumb function. We
21032              need to force a relocation for this particular
21033              case.  */
21034           newval = md_chars_to_number (buf, INSN_SIZE);
21035           fixP->fx_done = 0;
21036         }
21037
21038     case BFD_RELOC_ARM_PLT32:
21039 #endif
21040     case BFD_RELOC_ARM_PCREL_BRANCH:
21041       temp = 3;
21042       goto arm_branch_common;
21043
21044     case BFD_RELOC_ARM_PCREL_BLX:
21045
21046       temp = 1;
21047       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
21048           && fixP->fx_addsy
21049           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21050           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21051           && ARM_IS_FUNC (fixP->fx_addsy))
21052         {
21053           /* Flip the blx to a bl and warn.  */
21054           const char *name = S_GET_NAME (fixP->fx_addsy);
21055           newval = 0xeb000000;
21056           as_warn_where (fixP->fx_file, fixP->fx_line,
21057                          _("blx to '%s' an ARM ISA state function changed to bl"),
21058                           name);
21059           md_number_to_chars (buf, newval, INSN_SIZE);
21060           temp = 3;
21061           fixP->fx_done = 1;
21062         }
21063
21064 #ifdef OBJ_ELF
21065        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
21066          fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
21067 #endif
21068
21069     arm_branch_common:
21070       /* We are going to store value (shifted right by two) in the
21071          instruction, in a 24 bit, signed field.  Bits 26 through 32 either
21072          all clear or all set and bit 0 must be clear.  For B/BL bit 1 must
21073          also be be clear.  */
21074       if (value & temp)
21075         as_bad_where (fixP->fx_file, fixP->fx_line,
21076                       _("misaligned branch destination"));
21077       if ((value & (offsetT)0xfe000000) != (offsetT)0
21078           && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
21079         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
21080
21081       if (fixP->fx_done || !seg->use_rela_p)
21082         {
21083           newval = md_chars_to_number (buf, INSN_SIZE);
21084           newval |= (value >> 2) & 0x00ffffff;
21085           /* Set the H bit on BLX instructions.  */
21086           if (temp == 1)
21087             {
21088               if (value & 2)
21089                 newval |= 0x01000000;
21090               else
21091                 newval &= ~0x01000000;
21092             }
21093           md_number_to_chars (buf, newval, INSN_SIZE);
21094         }
21095       break;
21096
21097     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
21098       /* CBZ can only branch forward.  */
21099
21100       /* Attempts to use CBZ to branch to the next instruction
21101          (which, strictly speaking, are prohibited) will be turned into
21102          no-ops.
21103
21104          FIXME: It may be better to remove the instruction completely and
21105          perform relaxation.  */
21106       if (value == -2)
21107         {
21108           newval = md_chars_to_number (buf, THUMB_SIZE);
21109           newval = 0xbf00; /* NOP encoding T1 */
21110           md_number_to_chars (buf, newval, THUMB_SIZE);
21111         }
21112       else
21113         {
21114           if (value & ~0x7e)
21115             as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
21116
21117           if (fixP->fx_done || !seg->use_rela_p)
21118             {
21119               newval = md_chars_to_number (buf, THUMB_SIZE);
21120               newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
21121               md_number_to_chars (buf, newval, THUMB_SIZE);
21122             }
21123         }
21124       break;
21125
21126     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.  */
21127       if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
21128         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
21129
21130       if (fixP->fx_done || !seg->use_rela_p)
21131         {
21132           newval = md_chars_to_number (buf, THUMB_SIZE);
21133           newval |= (value & 0x1ff) >> 1;
21134           md_number_to_chars (buf, newval, THUMB_SIZE);
21135         }
21136       break;
21137
21138     case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
21139       if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
21140         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
21141
21142       if (fixP->fx_done || !seg->use_rela_p)
21143         {
21144           newval = md_chars_to_number (buf, THUMB_SIZE);
21145           newval |= (value & 0xfff) >> 1;
21146           md_number_to_chars (buf, newval, THUMB_SIZE);
21147         }
21148       break;
21149
21150     case BFD_RELOC_THUMB_PCREL_BRANCH20:
21151       if (fixP->fx_addsy
21152           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21153           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21154           && ARM_IS_FUNC (fixP->fx_addsy)
21155           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21156         {
21157           /* Force a relocation for a branch 20 bits wide.  */
21158           fixP->fx_done = 0;
21159         }
21160       if ((value & ~0x1fffff) && ((value & ~0x0fffff) != ~0x0fffff))
21161         as_bad_where (fixP->fx_file, fixP->fx_line,
21162                       _("conditional branch out of range"));
21163
21164       if (fixP->fx_done || !seg->use_rela_p)
21165         {
21166           offsetT newval2;
21167           addressT S, J1, J2, lo, hi;
21168
21169           S  = (value & 0x00100000) >> 20;
21170           J2 = (value & 0x00080000) >> 19;
21171           J1 = (value & 0x00040000) >> 18;
21172           hi = (value & 0x0003f000) >> 12;
21173           lo = (value & 0x00000ffe) >> 1;
21174
21175           newval   = md_chars_to_number (buf, THUMB_SIZE);
21176           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21177           newval  |= (S << 10) | hi;
21178           newval2 |= (J1 << 13) | (J2 << 11) | lo;
21179           md_number_to_chars (buf, newval, THUMB_SIZE);
21180           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
21181         }
21182       break;
21183
21184     case BFD_RELOC_THUMB_PCREL_BLX:
21185       /* If there is a blx from a thumb state function to
21186          another thumb function flip this to a bl and warn
21187          about it.  */
21188
21189       if (fixP->fx_addsy
21190           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21191           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21192           && THUMB_IS_FUNC (fixP->fx_addsy))
21193         {
21194           const char *name = S_GET_NAME (fixP->fx_addsy);
21195           as_warn_where (fixP->fx_file, fixP->fx_line,
21196                          _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
21197                          name);
21198           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21199           newval = newval | 0x1000;
21200           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
21201           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
21202           fixP->fx_done = 1;
21203         }
21204
21205
21206       goto thumb_bl_common;
21207
21208     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21209       /* A bl from Thumb state ISA to an internal ARM state function
21210          is converted to a blx.  */
21211       if (fixP->fx_addsy
21212           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21213           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
21214           && ARM_IS_FUNC (fixP->fx_addsy)
21215           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21216         {
21217           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21218           newval = newval & ~0x1000;
21219           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
21220           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
21221           fixP->fx_done = 1;
21222         }
21223
21224     thumb_bl_common:
21225
21226 #ifdef OBJ_ELF
21227        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4 &&
21228            fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
21229          fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
21230 #endif
21231
21232       if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
21233         /* For a BLX instruction, make sure that the relocation is rounded up
21234            to a word boundary.  This follows the semantics of the instruction
21235            which specifies that bit 1 of the target address will come from bit
21236            1 of the base address.  */
21237         value = (value + 1) & ~ 1;
21238
21239        if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
21240          {
21241            if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2)))
21242              as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
21243            else if ((value & ~0x1ffffff)
21244                     && ((value & ~0x1ffffff) != ~0x1ffffff))
21245              as_bad_where (fixP->fx_file, fixP->fx_line,
21246                            _("Thumb2 branch out of range"));
21247          }
21248
21249       if (fixP->fx_done || !seg->use_rela_p)
21250         encode_thumb2_b_bl_offset (buf, value);
21251
21252       break;
21253
21254     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21255       if ((value & ~0x0ffffff) && ((value & ~0x0ffffff) != ~0x0ffffff))
21256         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
21257
21258       if (fixP->fx_done || !seg->use_rela_p)
21259           encode_thumb2_b_bl_offset (buf, value);
21260
21261       break;
21262
21263     case BFD_RELOC_8:
21264       if (fixP->fx_done || !seg->use_rela_p)
21265         md_number_to_chars (buf, value, 1);
21266       break;
21267
21268     case BFD_RELOC_16:
21269       if (fixP->fx_done || !seg->use_rela_p)
21270         md_number_to_chars (buf, value, 2);
21271       break;
21272
21273 #ifdef OBJ_ELF
21274     case BFD_RELOC_ARM_TLS_CALL:
21275     case BFD_RELOC_ARM_THM_TLS_CALL:
21276     case BFD_RELOC_ARM_TLS_DESCSEQ:
21277     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
21278       S_SET_THREAD_LOCAL (fixP->fx_addsy);
21279       break;
21280
21281     case BFD_RELOC_ARM_TLS_GOTDESC:
21282     case BFD_RELOC_ARM_TLS_GD32:
21283     case BFD_RELOC_ARM_TLS_LE32:
21284     case BFD_RELOC_ARM_TLS_IE32:
21285     case BFD_RELOC_ARM_TLS_LDM32:
21286     case BFD_RELOC_ARM_TLS_LDO32:
21287       S_SET_THREAD_LOCAL (fixP->fx_addsy);
21288       /* fall through */
21289
21290     case BFD_RELOC_ARM_GOT32:
21291     case BFD_RELOC_ARM_GOTOFF:
21292       if (fixP->fx_done || !seg->use_rela_p)
21293         md_number_to_chars (buf, 0, 4);
21294       break;
21295
21296     case BFD_RELOC_ARM_GOT_PREL:
21297       if (fixP->fx_done || !seg->use_rela_p)
21298         md_number_to_chars (buf, value, 4);
21299       break;
21300
21301     case BFD_RELOC_ARM_TARGET2:
21302       /* TARGET2 is not partial-inplace, so we need to write the
21303          addend here for REL targets, because it won't be written out
21304          during reloc processing later.  */
21305       if (fixP->fx_done || !seg->use_rela_p)
21306         md_number_to_chars (buf, fixP->fx_offset, 4);
21307       break;
21308 #endif
21309
21310     case BFD_RELOC_RVA:
21311     case BFD_RELOC_32:
21312     case BFD_RELOC_ARM_TARGET1:
21313     case BFD_RELOC_ARM_ROSEGREL32:
21314     case BFD_RELOC_ARM_SBREL32:
21315     case BFD_RELOC_32_PCREL:
21316 #ifdef TE_PE
21317     case BFD_RELOC_32_SECREL:
21318 #endif
21319       if (fixP->fx_done || !seg->use_rela_p)
21320 #ifdef TE_WINCE
21321         /* For WinCE we only do this for pcrel fixups.  */
21322         if (fixP->fx_done || fixP->fx_pcrel)
21323 #endif
21324           md_number_to_chars (buf, value, 4);
21325       break;
21326
21327 #ifdef OBJ_ELF
21328     case BFD_RELOC_ARM_PREL31:
21329       if (fixP->fx_done || !seg->use_rela_p)
21330         {
21331           newval = md_chars_to_number (buf, 4) & 0x80000000;
21332           if ((value ^ (value >> 1)) & 0x40000000)
21333             {
21334               as_bad_where (fixP->fx_file, fixP->fx_line,
21335                             _("rel31 relocation overflow"));
21336             }
21337           newval |= value & 0x7fffffff;
21338           md_number_to_chars (buf, newval, 4);
21339         }
21340       break;
21341 #endif
21342
21343     case BFD_RELOC_ARM_CP_OFF_IMM:
21344     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
21345       if (value < -1023 || value > 1023 || (value & 3))
21346         as_bad_where (fixP->fx_file, fixP->fx_line,
21347                       _("co-processor offset out of range"));
21348     cp_off_common:
21349       sign = value > 0;
21350       if (value < 0)
21351         value = -value;
21352       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
21353           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
21354         newval = md_chars_to_number (buf, INSN_SIZE);
21355       else
21356         newval = get_thumb32_insn (buf);
21357       if (value == 0)
21358         newval &= 0xffffff00;
21359       else
21360         {
21361           newval &= 0xff7fff00;
21362           newval |= (value >> 2) | (sign ? INDEX_UP : 0);
21363         }
21364       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
21365           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
21366         md_number_to_chars (buf, newval, INSN_SIZE);
21367       else
21368         put_thumb32_insn (buf, newval);
21369       break;
21370
21371     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
21372     case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
21373       if (value < -255 || value > 255)
21374         as_bad_where (fixP->fx_file, fixP->fx_line,
21375                       _("co-processor offset out of range"));
21376       value *= 4;
21377       goto cp_off_common;
21378
21379     case BFD_RELOC_ARM_THUMB_OFFSET:
21380       newval = md_chars_to_number (buf, THUMB_SIZE);
21381       /* Exactly what ranges, and where the offset is inserted depends
21382          on the type of instruction, we can establish this from the
21383          top 4 bits.  */
21384       switch (newval >> 12)
21385         {
21386         case 4: /* PC load.  */
21387           /* Thumb PC loads are somewhat odd, bit 1 of the PC is
21388              forced to zero for these loads; md_pcrel_from has already
21389              compensated for this.  */
21390           if (value & 3)
21391             as_bad_where (fixP->fx_file, fixP->fx_line,
21392                           _("invalid offset, target not word aligned (0x%08lX)"),
21393                           (((unsigned long) fixP->fx_frag->fr_address
21394                             + (unsigned long) fixP->fx_where) & ~3)
21395                           + (unsigned long) value);
21396
21397           if (value & ~0x3fc)
21398             as_bad_where (fixP->fx_file, fixP->fx_line,
21399                           _("invalid offset, value too big (0x%08lX)"),
21400                           (long) value);
21401
21402           newval |= value >> 2;
21403           break;
21404
21405         case 9: /* SP load/store.  */
21406           if (value & ~0x3fc)
21407             as_bad_where (fixP->fx_file, fixP->fx_line,
21408                           _("invalid offset, value too big (0x%08lX)"),
21409                           (long) value);
21410           newval |= value >> 2;
21411           break;
21412
21413         case 6: /* Word load/store.  */
21414           if (value & ~0x7c)
21415             as_bad_where (fixP->fx_file, fixP->fx_line,
21416                           _("invalid offset, value too big (0x%08lX)"),
21417                           (long) value);
21418           newval |= value << 4; /* 6 - 2.  */
21419           break;
21420
21421         case 7: /* Byte load/store.  */
21422           if (value & ~0x1f)
21423             as_bad_where (fixP->fx_file, fixP->fx_line,
21424                           _("invalid offset, value too big (0x%08lX)"),
21425                           (long) value);
21426           newval |= value << 6;
21427           break;
21428
21429         case 8: /* Halfword load/store.  */
21430           if (value & ~0x3e)
21431             as_bad_where (fixP->fx_file, fixP->fx_line,
21432                           _("invalid offset, value too big (0x%08lX)"),
21433                           (long) value);
21434           newval |= value << 5; /* 6 - 1.  */
21435           break;
21436
21437         default:
21438           as_bad_where (fixP->fx_file, fixP->fx_line,
21439                         "Unable to process relocation for thumb opcode: %lx",
21440                         (unsigned long) newval);
21441           break;
21442         }
21443       md_number_to_chars (buf, newval, THUMB_SIZE);
21444       break;
21445
21446     case BFD_RELOC_ARM_THUMB_ADD:
21447       /* This is a complicated relocation, since we use it for all of
21448          the following immediate relocations:
21449
21450             3bit ADD/SUB
21451             8bit ADD/SUB
21452             9bit ADD/SUB SP word-aligned
21453            10bit ADD PC/SP word-aligned
21454
21455          The type of instruction being processed is encoded in the
21456          instruction field:
21457
21458            0x8000  SUB
21459            0x00F0  Rd
21460            0x000F  Rs
21461       */
21462       newval = md_chars_to_number (buf, THUMB_SIZE);
21463       {
21464         int rd = (newval >> 4) & 0xf;
21465         int rs = newval & 0xf;
21466         int subtract = !!(newval & 0x8000);
21467
21468         /* Check for HI regs, only very restricted cases allowed:
21469            Adjusting SP, and using PC or SP to get an address.  */
21470         if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
21471             || (rs > 7 && rs != REG_SP && rs != REG_PC))
21472           as_bad_where (fixP->fx_file, fixP->fx_line,
21473                         _("invalid Hi register with immediate"));
21474
21475         /* If value is negative, choose the opposite instruction.  */
21476         if (value < 0)
21477           {
21478             value = -value;
21479             subtract = !subtract;
21480             if (value < 0)
21481               as_bad_where (fixP->fx_file, fixP->fx_line,
21482                             _("immediate value out of range"));
21483           }
21484
21485         if (rd == REG_SP)
21486           {
21487             if (value & ~0x1fc)
21488               as_bad_where (fixP->fx_file, fixP->fx_line,
21489                             _("invalid immediate for stack address calculation"));
21490             newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
21491             newval |= value >> 2;
21492           }
21493         else if (rs == REG_PC || rs == REG_SP)
21494           {
21495             if (subtract || value & ~0x3fc)
21496               as_bad_where (fixP->fx_file, fixP->fx_line,
21497                             _("invalid immediate for address calculation (value = 0x%08lX)"),
21498                             (unsigned long) value);
21499             newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
21500             newval |= rd << 8;
21501             newval |= value >> 2;
21502           }
21503         else if (rs == rd)
21504           {
21505             if (value & ~0xff)
21506               as_bad_where (fixP->fx_file, fixP->fx_line,
21507                             _("immediate value out of range"));
21508             newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
21509             newval |= (rd << 8) | value;
21510           }
21511         else
21512           {
21513             if (value & ~0x7)
21514               as_bad_where (fixP->fx_file, fixP->fx_line,
21515                             _("immediate value out of range"));
21516             newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
21517             newval |= rd | (rs << 3) | (value << 6);
21518           }
21519       }
21520       md_number_to_chars (buf, newval, THUMB_SIZE);
21521       break;
21522
21523     case BFD_RELOC_ARM_THUMB_IMM:
21524       newval = md_chars_to_number (buf, THUMB_SIZE);
21525       if (value < 0 || value > 255)
21526         as_bad_where (fixP->fx_file, fixP->fx_line,
21527                       _("invalid immediate: %ld is out of range"),
21528                       (long) value);
21529       newval |= value;
21530       md_number_to_chars (buf, newval, THUMB_SIZE);
21531       break;
21532
21533     case BFD_RELOC_ARM_THUMB_SHIFT:
21534       /* 5bit shift value (0..32).  LSL cannot take 32.  */
21535       newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
21536       temp = newval & 0xf800;
21537       if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
21538         as_bad_where (fixP->fx_file, fixP->fx_line,
21539                       _("invalid shift value: %ld"), (long) value);
21540       /* Shifts of zero must be encoded as LSL.  */
21541       if (value == 0)
21542         newval = (newval & 0x003f) | T_OPCODE_LSL_I;
21543       /* Shifts of 32 are encoded as zero.  */
21544       else if (value == 32)
21545         value = 0;
21546       newval |= value << 6;
21547       md_number_to_chars (buf, newval, THUMB_SIZE);
21548       break;
21549
21550     case BFD_RELOC_VTABLE_INHERIT:
21551     case BFD_RELOC_VTABLE_ENTRY:
21552       fixP->fx_done = 0;
21553       return;
21554
21555     case BFD_RELOC_ARM_MOVW:
21556     case BFD_RELOC_ARM_MOVT:
21557     case BFD_RELOC_ARM_THUMB_MOVW:
21558     case BFD_RELOC_ARM_THUMB_MOVT:
21559       if (fixP->fx_done || !seg->use_rela_p)
21560         {
21561           /* REL format relocations are limited to a 16-bit addend.  */
21562           if (!fixP->fx_done)
21563             {
21564               if (value < -0x8000 || value > 0x7fff)
21565                   as_bad_where (fixP->fx_file, fixP->fx_line,
21566                                 _("offset out of range"));
21567             }
21568           else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
21569                    || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
21570             {
21571               value >>= 16;
21572             }
21573
21574           if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
21575               || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
21576             {
21577               newval = get_thumb32_insn (buf);
21578               newval &= 0xfbf08f00;
21579               newval |= (value & 0xf000) << 4;
21580               newval |= (value & 0x0800) << 15;
21581               newval |= (value & 0x0700) << 4;
21582               newval |= (value & 0x00ff);
21583               put_thumb32_insn (buf, newval);
21584             }
21585           else
21586             {
21587               newval = md_chars_to_number (buf, 4);
21588               newval &= 0xfff0f000;
21589               newval |= value & 0x0fff;
21590               newval |= (value & 0xf000) << 4;
21591               md_number_to_chars (buf, newval, 4);
21592             }
21593         }
21594       return;
21595
21596    case BFD_RELOC_ARM_ALU_PC_G0_NC:
21597    case BFD_RELOC_ARM_ALU_PC_G0:
21598    case BFD_RELOC_ARM_ALU_PC_G1_NC:
21599    case BFD_RELOC_ARM_ALU_PC_G1:
21600    case BFD_RELOC_ARM_ALU_PC_G2:
21601    case BFD_RELOC_ARM_ALU_SB_G0_NC:
21602    case BFD_RELOC_ARM_ALU_SB_G0:
21603    case BFD_RELOC_ARM_ALU_SB_G1_NC:
21604    case BFD_RELOC_ARM_ALU_SB_G1:
21605    case BFD_RELOC_ARM_ALU_SB_G2:
21606      gas_assert (!fixP->fx_done);
21607      if (!seg->use_rela_p)
21608        {
21609          bfd_vma insn;
21610          bfd_vma encoded_addend;
21611          bfd_vma addend_abs = abs (value);
21612
21613          /* Check that the absolute value of the addend can be
21614             expressed as an 8-bit constant plus a rotation.  */
21615          encoded_addend = encode_arm_immediate (addend_abs);
21616          if (encoded_addend == (unsigned int) FAIL)
21617            as_bad_where (fixP->fx_file, fixP->fx_line,
21618                          _("the offset 0x%08lX is not representable"),
21619                          (unsigned long) addend_abs);
21620
21621          /* Extract the instruction.  */
21622          insn = md_chars_to_number (buf, INSN_SIZE);
21623
21624          /* If the addend is positive, use an ADD instruction.
21625             Otherwise use a SUB.  Take care not to destroy the S bit.  */
21626          insn &= 0xff1fffff;
21627          if (value < 0)
21628            insn |= 1 << 22;
21629          else
21630            insn |= 1 << 23;
21631
21632          /* Place the encoded addend into the first 12 bits of the
21633             instruction.  */
21634          insn &= 0xfffff000;
21635          insn |= encoded_addend;
21636
21637          /* Update the instruction.  */
21638          md_number_to_chars (buf, insn, INSN_SIZE);
21639        }
21640      break;
21641
21642     case BFD_RELOC_ARM_LDR_PC_G0:
21643     case BFD_RELOC_ARM_LDR_PC_G1:
21644     case BFD_RELOC_ARM_LDR_PC_G2:
21645     case BFD_RELOC_ARM_LDR_SB_G0:
21646     case BFD_RELOC_ARM_LDR_SB_G1:
21647     case BFD_RELOC_ARM_LDR_SB_G2:
21648       gas_assert (!fixP->fx_done);
21649       if (!seg->use_rela_p)
21650         {
21651           bfd_vma insn;
21652           bfd_vma addend_abs = abs (value);
21653
21654           /* Check that the absolute value of the addend can be
21655              encoded in 12 bits.  */
21656           if (addend_abs >= 0x1000)
21657             as_bad_where (fixP->fx_file, fixP->fx_line,
21658                           _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
21659                           (unsigned long) addend_abs);
21660
21661           /* Extract the instruction.  */
21662           insn = md_chars_to_number (buf, INSN_SIZE);
21663
21664           /* If the addend is negative, clear bit 23 of the instruction.
21665              Otherwise set it.  */
21666           if (value < 0)
21667             insn &= ~(1 << 23);
21668           else
21669             insn |= 1 << 23;
21670
21671           /* Place the absolute value of the addend into the first 12 bits
21672              of the instruction.  */
21673           insn &= 0xfffff000;
21674           insn |= addend_abs;
21675
21676           /* Update the instruction.  */
21677           md_number_to_chars (buf, insn, INSN_SIZE);
21678         }
21679       break;
21680
21681     case BFD_RELOC_ARM_LDRS_PC_G0:
21682     case BFD_RELOC_ARM_LDRS_PC_G1:
21683     case BFD_RELOC_ARM_LDRS_PC_G2:
21684     case BFD_RELOC_ARM_LDRS_SB_G0:
21685     case BFD_RELOC_ARM_LDRS_SB_G1:
21686     case BFD_RELOC_ARM_LDRS_SB_G2:
21687       gas_assert (!fixP->fx_done);
21688       if (!seg->use_rela_p)
21689         {
21690           bfd_vma insn;
21691           bfd_vma addend_abs = abs (value);
21692
21693           /* Check that the absolute value of the addend can be
21694              encoded in 8 bits.  */
21695           if (addend_abs >= 0x100)
21696             as_bad_where (fixP->fx_file, fixP->fx_line,
21697                           _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
21698                           (unsigned long) addend_abs);
21699
21700           /* Extract the instruction.  */
21701           insn = md_chars_to_number (buf, INSN_SIZE);
21702
21703           /* If the addend is negative, clear bit 23 of the instruction.
21704              Otherwise set it.  */
21705           if (value < 0)
21706             insn &= ~(1 << 23);
21707           else
21708             insn |= 1 << 23;
21709
21710           /* Place the first four bits of the absolute value of the addend
21711              into the first 4 bits of the instruction, and the remaining
21712              four into bits 8 .. 11.  */
21713           insn &= 0xfffff0f0;
21714           insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
21715
21716           /* Update the instruction.  */
21717           md_number_to_chars (buf, insn, INSN_SIZE);
21718         }
21719       break;
21720
21721     case BFD_RELOC_ARM_LDC_PC_G0:
21722     case BFD_RELOC_ARM_LDC_PC_G1:
21723     case BFD_RELOC_ARM_LDC_PC_G2:
21724     case BFD_RELOC_ARM_LDC_SB_G0:
21725     case BFD_RELOC_ARM_LDC_SB_G1:
21726     case BFD_RELOC_ARM_LDC_SB_G2:
21727       gas_assert (!fixP->fx_done);
21728       if (!seg->use_rela_p)
21729         {
21730           bfd_vma insn;
21731           bfd_vma addend_abs = abs (value);
21732
21733           /* Check that the absolute value of the addend is a multiple of
21734              four and, when divided by four, fits in 8 bits.  */
21735           if (addend_abs & 0x3)
21736             as_bad_where (fixP->fx_file, fixP->fx_line,
21737                           _("bad offset 0x%08lX (must be word-aligned)"),
21738                           (unsigned long) addend_abs);
21739
21740           if ((addend_abs >> 2) > 0xff)
21741             as_bad_where (fixP->fx_file, fixP->fx_line,
21742                           _("bad offset 0x%08lX (must be an 8-bit number of words)"),
21743                           (unsigned long) addend_abs);
21744
21745           /* Extract the instruction.  */
21746           insn = md_chars_to_number (buf, INSN_SIZE);
21747
21748           /* If the addend is negative, clear bit 23 of the instruction.
21749              Otherwise set it.  */
21750           if (value < 0)
21751             insn &= ~(1 << 23);
21752           else
21753             insn |= 1 << 23;
21754
21755           /* Place the addend (divided by four) into the first eight
21756              bits of the instruction.  */
21757           insn &= 0xfffffff0;
21758           insn |= addend_abs >> 2;
21759
21760           /* Update the instruction.  */
21761           md_number_to_chars (buf, insn, INSN_SIZE);
21762         }
21763       break;
21764
21765     case BFD_RELOC_ARM_V4BX:
21766       /* This will need to go in the object file.  */
21767       fixP->fx_done = 0;
21768       break;
21769
21770     case BFD_RELOC_UNUSED:
21771     default:
21772       as_bad_where (fixP->fx_file, fixP->fx_line,
21773                     _("bad relocation fixup type (%d)"), fixP->fx_r_type);
21774     }
21775 }
21776
21777 /* Translate internal representation of relocation info to BFD target
21778    format.  */
21779
21780 arelent *
21781 tc_gen_reloc (asection *section, fixS *fixp)
21782 {
21783   arelent * reloc;
21784   bfd_reloc_code_real_type code;
21785
21786   reloc = (arelent *) xmalloc (sizeof (arelent));
21787
21788   reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
21789   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
21790   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
21791
21792   if (fixp->fx_pcrel)
21793     {
21794       if (section->use_rela_p)
21795         fixp->fx_offset -= md_pcrel_from_section (fixp, section);
21796       else
21797         fixp->fx_offset = reloc->address;
21798     }
21799   reloc->addend = fixp->fx_offset;
21800
21801   switch (fixp->fx_r_type)
21802     {
21803     case BFD_RELOC_8:
21804       if (fixp->fx_pcrel)
21805         {
21806           code = BFD_RELOC_8_PCREL;
21807           break;
21808         }
21809
21810     case BFD_RELOC_16:
21811       if (fixp->fx_pcrel)
21812         {
21813           code = BFD_RELOC_16_PCREL;
21814           break;
21815         }
21816
21817     case BFD_RELOC_32:
21818       if (fixp->fx_pcrel)
21819         {
21820           code = BFD_RELOC_32_PCREL;
21821           break;
21822         }
21823
21824     case BFD_RELOC_ARM_MOVW:
21825       if (fixp->fx_pcrel)
21826         {
21827           code = BFD_RELOC_ARM_MOVW_PCREL;
21828           break;
21829         }
21830
21831     case BFD_RELOC_ARM_MOVT:
21832       if (fixp->fx_pcrel)
21833         {
21834           code = BFD_RELOC_ARM_MOVT_PCREL;
21835           break;
21836         }
21837
21838     case BFD_RELOC_ARM_THUMB_MOVW:
21839       if (fixp->fx_pcrel)
21840         {
21841           code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
21842           break;
21843         }
21844
21845     case BFD_RELOC_ARM_THUMB_MOVT:
21846       if (fixp->fx_pcrel)
21847         {
21848           code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
21849           break;
21850         }
21851
21852     case BFD_RELOC_NONE:
21853     case BFD_RELOC_ARM_PCREL_BRANCH:
21854     case BFD_RELOC_ARM_PCREL_BLX:
21855     case BFD_RELOC_RVA:
21856     case BFD_RELOC_THUMB_PCREL_BRANCH7:
21857     case BFD_RELOC_THUMB_PCREL_BRANCH9:
21858     case BFD_RELOC_THUMB_PCREL_BRANCH12:
21859     case BFD_RELOC_THUMB_PCREL_BRANCH20:
21860     case BFD_RELOC_THUMB_PCREL_BRANCH23:
21861     case BFD_RELOC_THUMB_PCREL_BRANCH25:
21862     case BFD_RELOC_VTABLE_ENTRY:
21863     case BFD_RELOC_VTABLE_INHERIT:
21864 #ifdef TE_PE
21865     case BFD_RELOC_32_SECREL:
21866 #endif
21867       code = fixp->fx_r_type;
21868       break;
21869
21870     case BFD_RELOC_THUMB_PCREL_BLX:
21871 #ifdef OBJ_ELF
21872       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
21873         code = BFD_RELOC_THUMB_PCREL_BRANCH23;
21874       else
21875 #endif
21876         code = BFD_RELOC_THUMB_PCREL_BLX;
21877       break;
21878
21879     case BFD_RELOC_ARM_LITERAL:
21880     case BFD_RELOC_ARM_HWLITERAL:
21881       /* If this is called then the a literal has
21882          been referenced across a section boundary.  */
21883       as_bad_where (fixp->fx_file, fixp->fx_line,
21884                     _("literal referenced across section boundary"));
21885       return NULL;
21886
21887 #ifdef OBJ_ELF
21888     case BFD_RELOC_ARM_TLS_CALL:
21889     case BFD_RELOC_ARM_THM_TLS_CALL:
21890     case BFD_RELOC_ARM_TLS_DESCSEQ:
21891     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
21892     case BFD_RELOC_ARM_GOT32:
21893     case BFD_RELOC_ARM_GOTOFF:
21894     case BFD_RELOC_ARM_GOT_PREL:
21895     case BFD_RELOC_ARM_PLT32:
21896     case BFD_RELOC_ARM_TARGET1:
21897     case BFD_RELOC_ARM_ROSEGREL32:
21898     case BFD_RELOC_ARM_SBREL32:
21899     case BFD_RELOC_ARM_PREL31:
21900     case BFD_RELOC_ARM_TARGET2:
21901     case BFD_RELOC_ARM_TLS_LE32:
21902     case BFD_RELOC_ARM_TLS_LDO32:
21903     case BFD_RELOC_ARM_PCREL_CALL:
21904     case BFD_RELOC_ARM_PCREL_JUMP:
21905     case BFD_RELOC_ARM_ALU_PC_G0_NC:
21906     case BFD_RELOC_ARM_ALU_PC_G0:
21907     case BFD_RELOC_ARM_ALU_PC_G1_NC:
21908     case BFD_RELOC_ARM_ALU_PC_G1:
21909     case BFD_RELOC_ARM_ALU_PC_G2:
21910     case BFD_RELOC_ARM_LDR_PC_G0:
21911     case BFD_RELOC_ARM_LDR_PC_G1:
21912     case BFD_RELOC_ARM_LDR_PC_G2:
21913     case BFD_RELOC_ARM_LDRS_PC_G0:
21914     case BFD_RELOC_ARM_LDRS_PC_G1:
21915     case BFD_RELOC_ARM_LDRS_PC_G2:
21916     case BFD_RELOC_ARM_LDC_PC_G0:
21917     case BFD_RELOC_ARM_LDC_PC_G1:
21918     case BFD_RELOC_ARM_LDC_PC_G2:
21919     case BFD_RELOC_ARM_ALU_SB_G0_NC:
21920     case BFD_RELOC_ARM_ALU_SB_G0:
21921     case BFD_RELOC_ARM_ALU_SB_G1_NC:
21922     case BFD_RELOC_ARM_ALU_SB_G1:
21923     case BFD_RELOC_ARM_ALU_SB_G2:
21924     case BFD_RELOC_ARM_LDR_SB_G0:
21925     case BFD_RELOC_ARM_LDR_SB_G1:
21926     case BFD_RELOC_ARM_LDR_SB_G2:
21927     case BFD_RELOC_ARM_LDRS_SB_G0:
21928     case BFD_RELOC_ARM_LDRS_SB_G1:
21929     case BFD_RELOC_ARM_LDRS_SB_G2:
21930     case BFD_RELOC_ARM_LDC_SB_G0:
21931     case BFD_RELOC_ARM_LDC_SB_G1:
21932     case BFD_RELOC_ARM_LDC_SB_G2:
21933     case BFD_RELOC_ARM_V4BX:
21934       code = fixp->fx_r_type;
21935       break;
21936
21937     case BFD_RELOC_ARM_TLS_GOTDESC:
21938     case BFD_RELOC_ARM_TLS_GD32:
21939     case BFD_RELOC_ARM_TLS_IE32:
21940     case BFD_RELOC_ARM_TLS_LDM32:
21941       /* BFD will include the symbol's address in the addend.
21942          But we don't want that, so subtract it out again here.  */
21943       if (!S_IS_COMMON (fixp->fx_addsy))
21944         reloc->addend -= (*reloc->sym_ptr_ptr)->value;
21945       code = fixp->fx_r_type;
21946       break;
21947 #endif
21948
21949     case BFD_RELOC_ARM_IMMEDIATE:
21950       as_bad_where (fixp->fx_file, fixp->fx_line,
21951                     _("internal relocation (type: IMMEDIATE) not fixed up"));
21952       return NULL;
21953
21954     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
21955       as_bad_where (fixp->fx_file, fixp->fx_line,
21956                     _("ADRL used for a symbol not defined in the same file"));
21957       return NULL;
21958
21959     case BFD_RELOC_ARM_OFFSET_IMM:
21960       if (section->use_rela_p)
21961         {
21962           code = fixp->fx_r_type;
21963           break;
21964         }
21965
21966       if (fixp->fx_addsy != NULL
21967           && !S_IS_DEFINED (fixp->fx_addsy)
21968           && S_IS_LOCAL (fixp->fx_addsy))
21969         {
21970           as_bad_where (fixp->fx_file, fixp->fx_line,
21971                         _("undefined local label `%s'"),
21972                         S_GET_NAME (fixp->fx_addsy));
21973           return NULL;
21974         }
21975
21976       as_bad_where (fixp->fx_file, fixp->fx_line,
21977                     _("internal_relocation (type: OFFSET_IMM) not fixed up"));
21978       return NULL;
21979
21980     default:
21981       {
21982         char * type;
21983
21984         switch (fixp->fx_r_type)
21985           {
21986           case BFD_RELOC_NONE:             type = "NONE";         break;
21987           case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
21988           case BFD_RELOC_ARM_SHIFT_IMM:    type = "SHIFT_IMM";    break;
21989           case BFD_RELOC_ARM_SMC:          type = "SMC";          break;
21990           case BFD_RELOC_ARM_SWI:          type = "SWI";          break;
21991           case BFD_RELOC_ARM_MULTI:        type = "MULTI";        break;
21992           case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";   break;
21993           case BFD_RELOC_ARM_T32_OFFSET_IMM: type = "T32_OFFSET_IMM"; break;
21994           case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
21995           case BFD_RELOC_ARM_THUMB_ADD:    type = "THUMB_ADD";    break;
21996           case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
21997           case BFD_RELOC_ARM_THUMB_IMM:    type = "THUMB_IMM";    break;
21998           case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
21999           default:                         type = _("<unknown>"); break;
22000           }
22001         as_bad_where (fixp->fx_file, fixp->fx_line,
22002                       _("cannot represent %s relocation in this object file format"),
22003                       type);
22004         return NULL;
22005       }
22006     }
22007
22008 #ifdef OBJ_ELF
22009   if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
22010       && GOT_symbol
22011       && fixp->fx_addsy == GOT_symbol)
22012     {
22013       code = BFD_RELOC_ARM_GOTPC;
22014       reloc->addend = fixp->fx_offset = reloc->address;
22015     }
22016 #endif
22017
22018   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
22019
22020   if (reloc->howto == NULL)
22021     {
22022       as_bad_where (fixp->fx_file, fixp->fx_line,
22023                     _("cannot represent %s relocation in this object file format"),
22024                     bfd_get_reloc_code_name (code));
22025       return NULL;
22026     }
22027
22028   /* HACK: Since arm ELF uses Rel instead of Rela, encode the
22029      vtable entry to be used in the relocation's section offset.  */
22030   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
22031     reloc->address = fixp->fx_offset;
22032
22033   return reloc;
22034 }
22035
22036 /* This fix_new is called by cons via TC_CONS_FIX_NEW.  */
22037
22038 void
22039 cons_fix_new_arm (fragS *       frag,
22040                   int           where,
22041                   int           size,
22042                   expressionS * exp)
22043 {
22044   bfd_reloc_code_real_type type;
22045   int pcrel = 0;
22046
22047   /* Pick a reloc.
22048      FIXME: @@ Should look at CPU word size.  */
22049   switch (size)
22050     {
22051     case 1:
22052       type = BFD_RELOC_8;
22053       break;
22054     case 2:
22055       type = BFD_RELOC_16;
22056       break;
22057     case 4:
22058     default:
22059       type = BFD_RELOC_32;
22060       break;
22061     case 8:
22062       type = BFD_RELOC_64;
22063       break;
22064     }
22065
22066 #ifdef TE_PE
22067   if (exp->X_op == O_secrel)
22068   {
22069     exp->X_op = O_symbol;
22070     type = BFD_RELOC_32_SECREL;
22071   }
22072 #endif
22073
22074   fix_new_exp (frag, where, (int) size, exp, pcrel, type);
22075 }
22076
22077 #if defined (OBJ_COFF)
22078 void
22079 arm_validate_fix (fixS * fixP)
22080 {
22081   /* If the destination of the branch is a defined symbol which does not have
22082      the THUMB_FUNC attribute, then we must be calling a function which has
22083      the (interfacearm) attribute.  We look for the Thumb entry point to that
22084      function and change the branch to refer to that function instead.  */
22085   if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
22086       && fixP->fx_addsy != NULL
22087       && S_IS_DEFINED (fixP->fx_addsy)
22088       && ! THUMB_IS_FUNC (fixP->fx_addsy))
22089     {
22090       fixP->fx_addsy = find_real_start (fixP->fx_addsy);
22091     }
22092 }
22093 #endif
22094
22095
22096 int
22097 arm_force_relocation (struct fix * fixp)
22098 {
22099 #if defined (OBJ_COFF) && defined (TE_PE)
22100   if (fixp->fx_r_type == BFD_RELOC_RVA)
22101     return 1;
22102 #endif
22103
22104   /* In case we have a call or a branch to a function in ARM ISA mode from
22105      a thumb function or vice-versa force the relocation. These relocations
22106      are cleared off for some cores that might have blx and simple transformations
22107      are possible.  */
22108
22109 #ifdef OBJ_ELF
22110   switch (fixp->fx_r_type)
22111     {
22112     case BFD_RELOC_ARM_PCREL_JUMP:
22113     case BFD_RELOC_ARM_PCREL_CALL:
22114     case BFD_RELOC_THUMB_PCREL_BLX:
22115       if (THUMB_IS_FUNC (fixp->fx_addsy))
22116         return 1;
22117       break;
22118
22119     case BFD_RELOC_ARM_PCREL_BLX:
22120     case BFD_RELOC_THUMB_PCREL_BRANCH25:
22121     case BFD_RELOC_THUMB_PCREL_BRANCH20:
22122     case BFD_RELOC_THUMB_PCREL_BRANCH23:
22123       if (ARM_IS_FUNC (fixp->fx_addsy))
22124         return 1;
22125       break;
22126
22127     default:
22128       break;
22129     }
22130 #endif
22131
22132   /* Resolve these relocations even if the symbol is extern or weak.
22133      Technically this is probably wrong due to symbol preemption.
22134      In practice these relocations do not have enough range to be useful
22135      at dynamic link time, and some code (e.g. in the Linux kernel)
22136      expects these references to be resolved.  */
22137   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
22138       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
22139       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM8
22140       || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
22141       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
22142       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2
22143       || fixp->fx_r_type == BFD_RELOC_ARM_THUMB_OFFSET
22144       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
22145       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
22146       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
22147       || fixp->fx_r_type == BFD_RELOC_ARM_T32_OFFSET_IMM
22148       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12
22149       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM
22150       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM_S2)
22151     return 0;
22152
22153   /* Always leave these relocations for the linker.  */
22154   if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
22155        && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
22156       || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
22157     return 1;
22158
22159   /* Always generate relocations against function symbols.  */
22160   if (fixp->fx_r_type == BFD_RELOC_32
22161       && fixp->fx_addsy
22162       && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
22163     return 1;
22164
22165   return generic_force_reloc (fixp);
22166 }
22167
22168 #if defined (OBJ_ELF) || defined (OBJ_COFF)
22169 /* Relocations against function names must be left unadjusted,
22170    so that the linker can use this information to generate interworking
22171    stubs.  The MIPS version of this function
22172    also prevents relocations that are mips-16 specific, but I do not
22173    know why it does this.
22174
22175    FIXME:
22176    There is one other problem that ought to be addressed here, but
22177    which currently is not:  Taking the address of a label (rather
22178    than a function) and then later jumping to that address.  Such
22179    addresses also ought to have their bottom bit set (assuming that
22180    they reside in Thumb code), but at the moment they will not.  */
22181
22182 bfd_boolean
22183 arm_fix_adjustable (fixS * fixP)
22184 {
22185   if (fixP->fx_addsy == NULL)
22186     return 1;
22187
22188   /* Preserve relocations against symbols with function type.  */
22189   if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
22190     return FALSE;
22191
22192   if (THUMB_IS_FUNC (fixP->fx_addsy)
22193       && fixP->fx_subsy == NULL)
22194     return FALSE;
22195
22196   /* We need the symbol name for the VTABLE entries.  */
22197   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
22198       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
22199     return FALSE;
22200
22201   /* Don't allow symbols to be discarded on GOT related relocs.  */
22202   if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
22203       || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
22204       || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
22205       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
22206       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
22207       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
22208       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
22209       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
22210       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GOTDESC
22211       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_CALL
22212       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_CALL
22213       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_DESCSEQ
22214       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_DESCSEQ
22215       || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
22216     return FALSE;
22217
22218   /* Similarly for group relocations.  */
22219   if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
22220        && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
22221       || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
22222     return FALSE;
22223
22224   /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols.  */
22225   if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
22226       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
22227       || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
22228       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
22229       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
22230       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
22231       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
22232       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
22233     return FALSE;
22234
22235   return TRUE;
22236 }
22237 #endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
22238
22239 #ifdef OBJ_ELF
22240
22241 const char *
22242 elf32_arm_target_format (void)
22243 {
22244 #ifdef TE_SYMBIAN
22245   return (target_big_endian
22246           ? "elf32-bigarm-symbian"
22247           : "elf32-littlearm-symbian");
22248 #elif defined (TE_VXWORKS)
22249   return (target_big_endian
22250           ? "elf32-bigarm-vxworks"
22251           : "elf32-littlearm-vxworks");
22252 #else
22253   if (target_big_endian)
22254     return "elf32-bigarm";
22255   else
22256     return "elf32-littlearm";
22257 #endif
22258 }
22259
22260 void
22261 armelf_frob_symbol (symbolS * symp,
22262                     int *     puntp)
22263 {
22264   elf_frob_symbol (symp, puntp);
22265 }
22266 #endif
22267
22268 /* MD interface: Finalization.  */
22269
22270 void
22271 arm_cleanup (void)
22272 {
22273   literal_pool * pool;
22274
22275   /* Ensure that all the IT blocks are properly closed.  */
22276   check_it_blocks_finished ();
22277
22278   for (pool = list_of_pools; pool; pool = pool->next)
22279     {
22280       /* Put it at the end of the relevant section.  */
22281       subseg_set (pool->section, pool->sub_section);
22282 #ifdef OBJ_ELF
22283       arm_elf_change_section ();
22284 #endif
22285       s_ltorg (0);
22286     }
22287 }
22288
22289 #ifdef OBJ_ELF
22290 /* Remove any excess mapping symbols generated for alignment frags in
22291    SEC.  We may have created a mapping symbol before a zero byte
22292    alignment; remove it if there's a mapping symbol after the
22293    alignment.  */
22294 static void
22295 check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
22296                        void *dummy ATTRIBUTE_UNUSED)
22297 {
22298   segment_info_type *seginfo = seg_info (sec);
22299   fragS *fragp;
22300
22301   if (seginfo == NULL || seginfo->frchainP == NULL)
22302     return;
22303
22304   for (fragp = seginfo->frchainP->frch_root;
22305        fragp != NULL;
22306        fragp = fragp->fr_next)
22307     {
22308       symbolS *sym = fragp->tc_frag_data.last_map;
22309       fragS *next = fragp->fr_next;
22310
22311       /* Variable-sized frags have been converted to fixed size by
22312          this point.  But if this was variable-sized to start with,
22313          there will be a fixed-size frag after it.  So don't handle
22314          next == NULL.  */
22315       if (sym == NULL || next == NULL)
22316         continue;
22317
22318       if (S_GET_VALUE (sym) < next->fr_address)
22319         /* Not at the end of this frag.  */
22320         continue;
22321       know (S_GET_VALUE (sym) == next->fr_address);
22322
22323       do
22324         {
22325           if (next->tc_frag_data.first_map != NULL)
22326             {
22327               /* Next frag starts with a mapping symbol.  Discard this
22328                  one.  */
22329               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
22330               break;
22331             }
22332
22333           if (next->fr_next == NULL)
22334             {
22335               /* This mapping symbol is at the end of the section.  Discard
22336                  it.  */
22337               know (next->fr_fix == 0 && next->fr_var == 0);
22338               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
22339               break;
22340             }
22341
22342           /* As long as we have empty frags without any mapping symbols,
22343              keep looking.  */
22344           /* If the next frag is non-empty and does not start with a
22345              mapping symbol, then this mapping symbol is required.  */
22346           if (next->fr_address != next->fr_next->fr_address)
22347             break;
22348
22349           next = next->fr_next;
22350         }
22351       while (next != NULL);
22352     }
22353 }
22354 #endif
22355
22356 /* Adjust the symbol table.  This marks Thumb symbols as distinct from
22357    ARM ones.  */
22358
22359 void
22360 arm_adjust_symtab (void)
22361 {
22362 #ifdef OBJ_COFF
22363   symbolS * sym;
22364
22365   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
22366     {
22367       if (ARM_IS_THUMB (sym))
22368         {
22369           if (THUMB_IS_FUNC (sym))
22370             {
22371               /* Mark the symbol as a Thumb function.  */
22372               if (   S_GET_STORAGE_CLASS (sym) == C_STAT
22373                   || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!  */
22374                 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
22375
22376               else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
22377                 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
22378               else
22379                 as_bad (_("%s: unexpected function type: %d"),
22380                         S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
22381             }
22382           else switch (S_GET_STORAGE_CLASS (sym))
22383             {
22384             case C_EXT:
22385               S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
22386               break;
22387             case C_STAT:
22388               S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
22389               break;
22390             case C_LABEL:
22391               S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
22392               break;
22393             default:
22394               /* Do nothing.  */
22395               break;
22396             }
22397         }
22398
22399       if (ARM_IS_INTERWORK (sym))
22400         coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
22401     }
22402 #endif
22403 #ifdef OBJ_ELF
22404   symbolS * sym;
22405   char      bind;
22406
22407   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
22408     {
22409       if (ARM_IS_THUMB (sym))
22410         {
22411           elf_symbol_type * elf_sym;
22412
22413           elf_sym = elf_symbol (symbol_get_bfdsym (sym));
22414           bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
22415
22416           if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
22417                 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
22418             {
22419               /* If it's a .thumb_func, declare it as so,
22420                  otherwise tag label as .code 16.  */
22421               if (THUMB_IS_FUNC (sym))
22422                 elf_sym->internal_elf_sym.st_target_internal
22423                   = ST_BRANCH_TO_THUMB;
22424               else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
22425                 elf_sym->internal_elf_sym.st_info =
22426                   ELF_ST_INFO (bind, STT_ARM_16BIT);
22427             }
22428         }
22429     }
22430
22431   /* Remove any overlapping mapping symbols generated by alignment frags.  */
22432   bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
22433   /* Now do generic ELF adjustments.  */
22434   elf_adjust_symtab ();
22435 #endif
22436 }
22437
22438 /* MD interface: Initialization.  */
22439
22440 static void
22441 set_constant_flonums (void)
22442 {
22443   int i;
22444
22445   for (i = 0; i < NUM_FLOAT_VALS; i++)
22446     if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
22447       abort ();
22448 }
22449
22450 /* Auto-select Thumb mode if it's the only available instruction set for the
22451    given architecture.  */
22452
22453 static void
22454 autoselect_thumb_from_cpu_variant (void)
22455 {
22456   if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
22457     opcode_select (16);
22458 }
22459
22460 void
22461 md_begin (void)
22462 {
22463   unsigned mach;
22464   unsigned int i;
22465
22466   if (   (arm_ops_hsh = hash_new ()) == NULL
22467       || (arm_cond_hsh = hash_new ()) == NULL
22468       || (arm_shift_hsh = hash_new ()) == NULL
22469       || (arm_psr_hsh = hash_new ()) == NULL
22470       || (arm_v7m_psr_hsh = hash_new ()) == NULL
22471       || (arm_reg_hsh = hash_new ()) == NULL
22472       || (arm_reloc_hsh = hash_new ()) == NULL
22473       || (arm_barrier_opt_hsh = hash_new ()) == NULL)
22474     as_fatal (_("virtual memory exhausted"));
22475
22476   for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
22477     hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
22478   for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
22479     hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
22480   for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
22481     hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
22482   for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
22483     hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
22484   for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
22485     hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
22486                  (void *) (v7m_psrs + i));
22487   for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
22488     hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
22489   for (i = 0;
22490        i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
22491        i++)
22492     hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
22493                  (void *) (barrier_opt_names + i));
22494 #ifdef OBJ_ELF
22495   for (i = 0; i < ARRAY_SIZE (reloc_names); i++)
22496     {
22497       struct reloc_entry * entry = reloc_names + i;
22498
22499       if (arm_is_eabi() && entry->reloc == BFD_RELOC_ARM_PLT32)
22500         /* This makes encode_branch() use the EABI versions of this relocation.  */
22501         entry->reloc = BFD_RELOC_UNUSED;
22502
22503       hash_insert (arm_reloc_hsh, entry->name, (void *) entry);
22504     }
22505 #endif
22506
22507   set_constant_flonums ();
22508
22509   /* Set the cpu variant based on the command-line options.  We prefer
22510      -mcpu= over -march= if both are set (as for GCC); and we prefer
22511      -mfpu= over any other way of setting the floating point unit.
22512      Use of legacy options with new options are faulted.  */
22513   if (legacy_cpu)
22514     {
22515       if (mcpu_cpu_opt || march_cpu_opt)
22516         as_bad (_("use of old and new-style options to set CPU type"));
22517
22518       mcpu_cpu_opt = legacy_cpu;
22519     }
22520   else if (!mcpu_cpu_opt)
22521     mcpu_cpu_opt = march_cpu_opt;
22522
22523   if (legacy_fpu)
22524     {
22525       if (mfpu_opt)
22526         as_bad (_("use of old and new-style options to set FPU type"));
22527
22528       mfpu_opt = legacy_fpu;
22529     }
22530   else if (!mfpu_opt)
22531     {
22532 #if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
22533         || defined (TE_NetBSD) || defined (TE_VXWORKS))
22534       /* Some environments specify a default FPU.  If they don't, infer it
22535          from the processor.  */
22536       if (mcpu_fpu_opt)
22537         mfpu_opt = mcpu_fpu_opt;
22538       else
22539         mfpu_opt = march_fpu_opt;
22540 #else
22541       mfpu_opt = &fpu_default;
22542 #endif
22543     }
22544
22545   if (!mfpu_opt)
22546     {
22547       if (mcpu_cpu_opt != NULL)
22548         mfpu_opt = &fpu_default;
22549       else if (mcpu_fpu_opt != NULL && ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
22550         mfpu_opt = &fpu_arch_vfp_v2;
22551       else
22552         mfpu_opt = &fpu_arch_fpa;
22553     }
22554
22555 #ifdef CPU_DEFAULT
22556   if (!mcpu_cpu_opt)
22557     {
22558       mcpu_cpu_opt = &cpu_default;
22559       selected_cpu = cpu_default;
22560     }
22561 #else
22562   if (mcpu_cpu_opt)
22563     selected_cpu = *mcpu_cpu_opt;
22564   else
22565     mcpu_cpu_opt = &arm_arch_any;
22566 #endif
22567
22568   ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
22569
22570   autoselect_thumb_from_cpu_variant ();
22571
22572   arm_arch_used = thumb_arch_used = arm_arch_none;
22573
22574 #if defined OBJ_COFF || defined OBJ_ELF
22575   {
22576     unsigned int flags = 0;
22577
22578 #if defined OBJ_ELF
22579     flags = meabi_flags;
22580
22581     switch (meabi_flags)
22582       {
22583       case EF_ARM_EABI_UNKNOWN:
22584 #endif
22585         /* Set the flags in the private structure.  */
22586         if (uses_apcs_26)      flags |= F_APCS26;
22587         if (support_interwork) flags |= F_INTERWORK;
22588         if (uses_apcs_float)   flags |= F_APCS_FLOAT;
22589         if (pic_code)          flags |= F_PIC;
22590         if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
22591           flags |= F_SOFT_FLOAT;
22592
22593         switch (mfloat_abi_opt)
22594           {
22595           case ARM_FLOAT_ABI_SOFT:
22596           case ARM_FLOAT_ABI_SOFTFP:
22597             flags |= F_SOFT_FLOAT;
22598             break;
22599
22600           case ARM_FLOAT_ABI_HARD:
22601             if (flags & F_SOFT_FLOAT)
22602               as_bad (_("hard-float conflicts with specified fpu"));
22603             break;
22604           }
22605
22606         /* Using pure-endian doubles (even if soft-float).      */
22607         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
22608           flags |= F_VFP_FLOAT;
22609
22610 #if defined OBJ_ELF
22611         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
22612             flags |= EF_ARM_MAVERICK_FLOAT;
22613         break;
22614
22615       case EF_ARM_EABI_VER4:
22616       case EF_ARM_EABI_VER5:
22617         /* No additional flags to set.  */
22618         break;
22619
22620       default:
22621         abort ();
22622       }
22623 #endif
22624     bfd_set_private_flags (stdoutput, flags);
22625
22626     /* We have run out flags in the COFF header to encode the
22627        status of ATPCS support, so instead we create a dummy,
22628        empty, debug section called .arm.atpcs.  */
22629     if (atpcs)
22630       {
22631         asection * sec;
22632
22633         sec = bfd_make_section (stdoutput, ".arm.atpcs");
22634
22635         if (sec != NULL)
22636           {
22637             bfd_set_section_flags
22638               (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
22639             bfd_set_section_size (stdoutput, sec, 0);
22640             bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
22641           }
22642       }
22643   }
22644 #endif
22645
22646   /* Record the CPU type as well.  */
22647   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
22648     mach = bfd_mach_arm_iWMMXt2;
22649   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
22650     mach = bfd_mach_arm_iWMMXt;
22651   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
22652     mach = bfd_mach_arm_XScale;
22653   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
22654     mach = bfd_mach_arm_ep9312;
22655   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
22656     mach = bfd_mach_arm_5TE;
22657   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
22658     {
22659       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
22660         mach = bfd_mach_arm_5T;
22661       else
22662         mach = bfd_mach_arm_5;
22663     }
22664   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
22665     {
22666       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
22667         mach = bfd_mach_arm_4T;
22668       else
22669         mach = bfd_mach_arm_4;
22670     }
22671   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
22672     mach = bfd_mach_arm_3M;
22673   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
22674     mach = bfd_mach_arm_3;
22675   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
22676     mach = bfd_mach_arm_2a;
22677   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
22678     mach = bfd_mach_arm_2;
22679   else
22680     mach = bfd_mach_arm_unknown;
22681
22682   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
22683 }
22684
22685 /* Command line processing.  */
22686
22687 /* md_parse_option
22688       Invocation line includes a switch not recognized by the base assembler.
22689       See if it's a processor-specific option.
22690
22691       This routine is somewhat complicated by the need for backwards
22692       compatibility (since older releases of gcc can't be changed).
22693       The new options try to make the interface as compatible as
22694       possible with GCC.
22695
22696       New options (supported) are:
22697
22698               -mcpu=<cpu name>           Assemble for selected processor
22699               -march=<architecture name> Assemble for selected architecture
22700               -mfpu=<fpu architecture>   Assemble for selected FPU.
22701               -EB/-mbig-endian           Big-endian
22702               -EL/-mlittle-endian        Little-endian
22703               -k                         Generate PIC code
22704               -mthumb                    Start in Thumb mode
22705               -mthumb-interwork          Code supports ARM/Thumb interworking
22706
22707               -m[no-]warn-deprecated     Warn about deprecated features
22708
22709       For now we will also provide support for:
22710
22711               -mapcs-32                  32-bit Program counter
22712               -mapcs-26                  26-bit Program counter
22713               -macps-float               Floats passed in FP registers
22714               -mapcs-reentrant           Reentrant code
22715               -matpcs
22716       (sometime these will probably be replaced with -mapcs=<list of options>
22717       and -matpcs=<list of options>)
22718
22719       The remaining options are only supported for back-wards compatibility.
22720       Cpu variants, the arm part is optional:
22721               -m[arm]1                Currently not supported.
22722               -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
22723               -m[arm]3                Arm 3 processor
22724               -m[arm]6[xx],           Arm 6 processors
22725               -m[arm]7[xx][t][[d]m]   Arm 7 processors
22726               -m[arm]8[10]            Arm 8 processors
22727               -m[arm]9[20][tdmi]      Arm 9 processors
22728               -mstrongarm[110[0]]     StrongARM processors
22729               -mxscale                XScale processors
22730               -m[arm]v[2345[t[e]]]    Arm architectures
22731               -mall                   All (except the ARM1)
22732       FP variants:
22733               -mfpa10, -mfpa11        FPA10 and 11 co-processor instructions
22734               -mfpe-old               (No float load/store multiples)
22735               -mvfpxd                 VFP Single precision
22736               -mvfp                   All VFP
22737               -mno-fpu                Disable all floating point instructions
22738
22739       The following CPU names are recognized:
22740               arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
22741               arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
22742               arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
22743               arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
22744               arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
22745               arm10t arm10e, arm1020t, arm1020e, arm10200e,
22746               strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
22747
22748       */
22749
22750 const char * md_shortopts = "m:k";
22751
22752 #ifdef ARM_BI_ENDIAN
22753 #define OPTION_EB (OPTION_MD_BASE + 0)
22754 #define OPTION_EL (OPTION_MD_BASE + 1)
22755 #else
22756 #if TARGET_BYTES_BIG_ENDIAN
22757 #define OPTION_EB (OPTION_MD_BASE + 0)
22758 #else
22759 #define OPTION_EL (OPTION_MD_BASE + 1)
22760 #endif
22761 #endif
22762 #define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
22763
22764 struct option md_longopts[] =
22765 {
22766 #ifdef OPTION_EB
22767   {"EB", no_argument, NULL, OPTION_EB},
22768 #endif
22769 #ifdef OPTION_EL
22770   {"EL", no_argument, NULL, OPTION_EL},
22771 #endif
22772   {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
22773   {NULL, no_argument, NULL, 0}
22774 };
22775
22776 size_t md_longopts_size = sizeof (md_longopts);
22777
22778 struct arm_option_table
22779 {
22780   char *option;         /* Option name to match.  */
22781   char *help;           /* Help information.  */
22782   int  *var;            /* Variable to change.  */
22783   int   value;          /* What to change it to.  */
22784   char *deprecated;     /* If non-null, print this message.  */
22785 };
22786
22787 struct arm_option_table arm_opts[] =
22788 {
22789   {"k",      N_("generate PIC code"),      &pic_code,    1, NULL},
22790   {"mthumb", N_("assemble Thumb code"),    &thumb_mode,  1, NULL},
22791   {"mthumb-interwork", N_("support ARM/Thumb interworking"),
22792    &support_interwork, 1, NULL},
22793   {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
22794   {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
22795   {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
22796    1, NULL},
22797   {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
22798   {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
22799   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
22800   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
22801    NULL},
22802
22803   /* These are recognized by the assembler, but have no affect on code.  */
22804   {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
22805   {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
22806
22807   {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
22808   {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
22809    &warn_on_deprecated, 0, NULL},
22810   {NULL, NULL, NULL, 0, NULL}
22811 };
22812
22813 struct arm_legacy_option_table
22814 {
22815   char *option;                         /* Option name to match.  */
22816   const arm_feature_set **var;          /* Variable to change.  */
22817   const arm_feature_set value;          /* What to change it to.  */
22818   char *deprecated;                     /* If non-null, print this message.  */
22819 };
22820
22821 const struct arm_legacy_option_table arm_legacy_opts[] =
22822 {
22823   /* DON'T add any new processors to this list -- we want the whole list
22824      to go away...  Add them to the processors table instead.  */
22825   {"marm1",      &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
22826   {"m1",         &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
22827   {"marm2",      &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
22828   {"m2",         &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
22829   {"marm250",    &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
22830   {"m250",       &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
22831   {"marm3",      &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
22832   {"m3",         &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
22833   {"marm6",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
22834   {"m6",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
22835   {"marm600",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
22836   {"m600",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
22837   {"marm610",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
22838   {"m610",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
22839   {"marm620",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
22840   {"m620",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
22841   {"marm7",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
22842   {"m7",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
22843   {"marm70",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
22844   {"m70",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
22845   {"marm700",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
22846   {"m700",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
22847   {"marm700i",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
22848   {"m700i",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
22849   {"marm710",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
22850   {"m710",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
22851   {"marm710c",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
22852   {"m710c",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
22853   {"marm720",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
22854   {"m720",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
22855   {"marm7d",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
22856   {"m7d",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
22857   {"marm7di",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
22858   {"m7di",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
22859   {"marm7m",     &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
22860   {"m7m",        &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
22861   {"marm7dm",    &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
22862   {"m7dm",       &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
22863   {"marm7dmi",   &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
22864   {"m7dmi",      &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
22865   {"marm7100",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
22866   {"m7100",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
22867   {"marm7500",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
22868   {"m7500",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
22869   {"marm7500fe", &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
22870   {"m7500fe",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
22871   {"marm7t",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22872   {"m7t",        &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22873   {"marm7tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22874   {"m7tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
22875   {"marm710t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
22876   {"m710t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
22877   {"marm720t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
22878   {"m720t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
22879   {"marm740t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
22880   {"m740t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
22881   {"marm8",      &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
22882   {"m8",         &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
22883   {"marm810",    &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
22884   {"m810",       &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
22885   {"marm9",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
22886   {"m9",         &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
22887   {"marm9tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
22888   {"m9tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
22889   {"marm920",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
22890   {"m920",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
22891   {"marm940",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
22892   {"m940",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
22893   {"mstrongarm", &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
22894   {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
22895    N_("use -mcpu=strongarm110")},
22896   {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
22897    N_("use -mcpu=strongarm1100")},
22898   {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
22899    N_("use -mcpu=strongarm1110")},
22900   {"mxscale",    &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
22901   {"miwmmxt",    &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
22902   {"mall",       &legacy_cpu, ARM_ANY,         N_("use -mcpu=all")},
22903
22904   /* Architecture variants -- don't add any more to this list either.  */
22905   {"mv2",        &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
22906   {"marmv2",     &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
22907   {"mv2a",       &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
22908   {"marmv2a",    &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
22909   {"mv3",        &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
22910   {"marmv3",     &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
22911   {"mv3m",       &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
22912   {"marmv3m",    &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
22913   {"mv4",        &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
22914   {"marmv4",     &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
22915   {"mv4t",       &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
22916   {"marmv4t",    &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
22917   {"mv5",        &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
22918   {"marmv5",     &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
22919   {"mv5t",       &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
22920   {"marmv5t",    &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
22921   {"mv5e",       &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
22922   {"marmv5e",    &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
22923
22924   /* Floating point variants -- don't add any more to this list either.  */
22925   {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
22926   {"mfpa10",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
22927   {"mfpa11",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
22928   {"mno-fpu",  &legacy_fpu, ARM_ARCH_NONE,
22929    N_("use either -mfpu=softfpa or -mfpu=softvfp")},
22930
22931   {NULL, NULL, ARM_ARCH_NONE, NULL}
22932 };
22933
22934 struct arm_cpu_option_table
22935 {
22936   char *name;
22937   size_t name_len;
22938   const arm_feature_set value;
22939   /* For some CPUs we assume an FPU unless the user explicitly sets
22940      -mfpu=...  */
22941   const arm_feature_set default_fpu;
22942   /* The canonical name of the CPU, or NULL to use NAME converted to upper
22943      case.  */
22944   const char *canonical_name;
22945 };
22946
22947 /* This list should, at a minimum, contain all the cpu names
22948    recognized by GCC.  */
22949 #define ARM_CPU_OPT(N, V, DF, CN) { N, sizeof (N) - 1, V, DF, CN }
22950 static const struct arm_cpu_option_table arm_cpus[] =
22951 {
22952   ARM_CPU_OPT ("all",           ARM_ANY,         FPU_ARCH_FPA,    NULL),
22953   ARM_CPU_OPT ("arm1",          ARM_ARCH_V1,     FPU_ARCH_FPA,    NULL),
22954   ARM_CPU_OPT ("arm2",          ARM_ARCH_V2,     FPU_ARCH_FPA,    NULL),
22955   ARM_CPU_OPT ("arm250",        ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL),
22956   ARM_CPU_OPT ("arm3",          ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL),
22957   ARM_CPU_OPT ("arm6",          ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22958   ARM_CPU_OPT ("arm60",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22959   ARM_CPU_OPT ("arm600",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22960   ARM_CPU_OPT ("arm610",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22961   ARM_CPU_OPT ("arm620",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22962   ARM_CPU_OPT ("arm7",          ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22963   ARM_CPU_OPT ("arm7m",         ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
22964   ARM_CPU_OPT ("arm7d",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22965   ARM_CPU_OPT ("arm7dm",        ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
22966   ARM_CPU_OPT ("arm7di",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22967   ARM_CPU_OPT ("arm7dmi",       ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL),
22968   ARM_CPU_OPT ("arm70",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22969   ARM_CPU_OPT ("arm700",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22970   ARM_CPU_OPT ("arm700i",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22971   ARM_CPU_OPT ("arm710",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22972   ARM_CPU_OPT ("arm710t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
22973   ARM_CPU_OPT ("arm720",        ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22974   ARM_CPU_OPT ("arm720t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
22975   ARM_CPU_OPT ("arm740t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
22976   ARM_CPU_OPT ("arm710c",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22977   ARM_CPU_OPT ("arm7100",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22978   ARM_CPU_OPT ("arm7500",       ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22979   ARM_CPU_OPT ("arm7500fe",     ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL),
22980   ARM_CPU_OPT ("arm7t",         ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
22981   ARM_CPU_OPT ("arm7tdmi",      ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
22982   ARM_CPU_OPT ("arm7tdmi-s",    ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
22983   ARM_CPU_OPT ("arm8",          ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
22984   ARM_CPU_OPT ("arm810",        ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
22985   ARM_CPU_OPT ("strongarm",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
22986   ARM_CPU_OPT ("strongarm1",    ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
22987   ARM_CPU_OPT ("strongarm110",  ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
22988   ARM_CPU_OPT ("strongarm1100", ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
22989   ARM_CPU_OPT ("strongarm1110", ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
22990   ARM_CPU_OPT ("arm9",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
22991   ARM_CPU_OPT ("arm920",        ARM_ARCH_V4T,    FPU_ARCH_FPA,    "ARM920T"),
22992   ARM_CPU_OPT ("arm920t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
22993   ARM_CPU_OPT ("arm922t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
22994   ARM_CPU_OPT ("arm940t",       ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
22995   ARM_CPU_OPT ("arm9tdmi",      ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL),
22996   ARM_CPU_OPT ("fa526",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
22997   ARM_CPU_OPT ("fa626",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL),
22998   /* For V5 or later processors we default to using VFP; but the user
22999      should really set the FPU type explicitly.  */
23000   ARM_CPU_OPT ("arm9e-r0",      ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
23001   ARM_CPU_OPT ("arm9e",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23002   ARM_CPU_OPT ("arm926ej",      ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"),
23003   ARM_CPU_OPT ("arm926ejs",     ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"),
23004   ARM_CPU_OPT ("arm926ej-s",    ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL),
23005   ARM_CPU_OPT ("arm946e-r0",    ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
23006   ARM_CPU_OPT ("arm946e",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM946E-S"),
23007   ARM_CPU_OPT ("arm946e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23008   ARM_CPU_OPT ("arm966e-r0",    ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
23009   ARM_CPU_OPT ("arm966e",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM966E-S"),
23010   ARM_CPU_OPT ("arm966e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23011   ARM_CPU_OPT ("arm968e-s",     ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23012   ARM_CPU_OPT ("arm10t",        ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
23013   ARM_CPU_OPT ("arm10tdmi",     ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
23014   ARM_CPU_OPT ("arm10e",        ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23015   ARM_CPU_OPT ("arm1020",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM1020E"),
23016   ARM_CPU_OPT ("arm1020t",      ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL),
23017   ARM_CPU_OPT ("arm1020e",      ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23018   ARM_CPU_OPT ("arm1022e",      ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23019   ARM_CPU_OPT ("arm1026ejs",    ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2,
23020                                                                  "ARM1026EJ-S"),
23021   ARM_CPU_OPT ("arm1026ej-s",   ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL),
23022   ARM_CPU_OPT ("fa606te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23023   ARM_CPU_OPT ("fa616te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23024   ARM_CPU_OPT ("fa626te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23025   ARM_CPU_OPT ("fmp626",        ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23026   ARM_CPU_OPT ("fa726te",       ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL),
23027   ARM_CPU_OPT ("arm1136js",     ARM_ARCH_V6,     FPU_NONE,        "ARM1136J-S"),
23028   ARM_CPU_OPT ("arm1136j-s",    ARM_ARCH_V6,     FPU_NONE,        NULL),
23029   ARM_CPU_OPT ("arm1136jfs",    ARM_ARCH_V6,     FPU_ARCH_VFP_V2,
23030                                                                  "ARM1136JF-S"),
23031   ARM_CPU_OPT ("arm1136jf-s",   ARM_ARCH_V6,     FPU_ARCH_VFP_V2, NULL),
23032   ARM_CPU_OPT ("mpcore",        ARM_ARCH_V6K,    FPU_ARCH_VFP_V2, "MPCore"),
23033   ARM_CPU_OPT ("mpcorenovfp",   ARM_ARCH_V6K,    FPU_NONE,        "MPCore"),
23034   ARM_CPU_OPT ("arm1156t2-s",   ARM_ARCH_V6T2,   FPU_NONE,        NULL),
23035   ARM_CPU_OPT ("arm1156t2f-s",  ARM_ARCH_V6T2,   FPU_ARCH_VFP_V2, NULL),
23036   ARM_CPU_OPT ("arm1176jz-s",   ARM_ARCH_V6ZK,   FPU_NONE,        NULL),
23037   ARM_CPU_OPT ("arm1176jzf-s",  ARM_ARCH_V6ZK,   FPU_ARCH_VFP_V2, NULL),
23038   ARM_CPU_OPT ("cortex-a5",     ARM_ARCH_V7A_MP_SEC,
23039                                                  FPU_NONE,        "Cortex-A5"),
23040   ARM_CPU_OPT ("cortex-a7",     ARM_ARCH_V7A_IDIV_MP_SEC_VIRT,
23041                                                  FPU_ARCH_NEON_VFP_V4,
23042                                                                   "Cortex-A7"),
23043   ARM_CPU_OPT ("cortex-a8",     ARM_ARCH_V7A_SEC,
23044                                                  ARM_FEATURE (0, FPU_VFP_V3
23045                                                         | FPU_NEON_EXT_V1),
23046                                                                   "Cortex-A8"),
23047   ARM_CPU_OPT ("cortex-a9",     ARM_ARCH_V7A_MP_SEC,
23048                                                  ARM_FEATURE (0, FPU_VFP_V3
23049                                                         | FPU_NEON_EXT_V1),
23050                                                                   "Cortex-A9"),
23051   ARM_CPU_OPT ("cortex-a15",    ARM_ARCH_V7A_IDIV_MP_SEC_VIRT,
23052                                                  FPU_ARCH_NEON_VFP_V4,
23053                                                                   "Cortex-A15"),
23054   ARM_CPU_OPT ("cortex-r4",     ARM_ARCH_V7R,    FPU_NONE,        "Cortex-R4"),
23055   ARM_CPU_OPT ("cortex-r4f",    ARM_ARCH_V7R,    FPU_ARCH_VFP_V3D16,
23056                                                                   "Cortex-R4F"),
23057   ARM_CPU_OPT ("cortex-r5",     ARM_ARCH_V7R_IDIV,
23058                                                  FPU_NONE,        "Cortex-R5"),
23059   ARM_CPU_OPT ("cortex-m4",     ARM_ARCH_V7EM,   FPU_NONE,        "Cortex-M4"),
23060   ARM_CPU_OPT ("cortex-m3",     ARM_ARCH_V7M,    FPU_NONE,        "Cortex-M3"),
23061   ARM_CPU_OPT ("cortex-m1",     ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M1"),
23062   ARM_CPU_OPT ("cortex-m0",     ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M0"),
23063   ARM_CPU_OPT ("cortex-m0plus", ARM_ARCH_V6SM,   FPU_NONE,        "Cortex-M0+"),
23064   /* ??? XSCALE is really an architecture.  */
23065   ARM_CPU_OPT ("xscale",        ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
23066   /* ??? iwmmxt is not a processor.  */
23067   ARM_CPU_OPT ("iwmmxt",        ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL),
23068   ARM_CPU_OPT ("iwmmxt2",       ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL),
23069   ARM_CPU_OPT ("i80200",        ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
23070   /* Maverick */
23071   ARM_CPU_OPT ("ep9312",        ARM_FEATURE (ARM_AEXT_V4T, ARM_CEXT_MAVERICK),
23072                                                  FPU_ARCH_MAVERICK,
23073                                                                   "ARM920T"),
23074   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL }
23075 };
23076 #undef ARM_CPU_OPT
23077
23078 struct arm_arch_option_table
23079 {
23080   char *name;
23081   size_t name_len;
23082   const arm_feature_set value;
23083   const arm_feature_set default_fpu;
23084 };
23085
23086 /* This list should, at a minimum, contain all the architecture names
23087    recognized by GCC.  */
23088 #define ARM_ARCH_OPT(N, V, DF) { N, sizeof (N) - 1, V, DF }
23089 static const struct arm_arch_option_table arm_archs[] =
23090 {
23091   ARM_ARCH_OPT ("all",          ARM_ANY,         FPU_ARCH_FPA),
23092   ARM_ARCH_OPT ("armv1",        ARM_ARCH_V1,     FPU_ARCH_FPA),
23093   ARM_ARCH_OPT ("armv2",        ARM_ARCH_V2,     FPU_ARCH_FPA),
23094   ARM_ARCH_OPT ("armv2a",       ARM_ARCH_V2S,    FPU_ARCH_FPA),
23095   ARM_ARCH_OPT ("armv2s",       ARM_ARCH_V2S,    FPU_ARCH_FPA),
23096   ARM_ARCH_OPT ("armv3",        ARM_ARCH_V3,     FPU_ARCH_FPA),
23097   ARM_ARCH_OPT ("armv3m",       ARM_ARCH_V3M,    FPU_ARCH_FPA),
23098   ARM_ARCH_OPT ("armv4",        ARM_ARCH_V4,     FPU_ARCH_FPA),
23099   ARM_ARCH_OPT ("armv4xm",      ARM_ARCH_V4xM,   FPU_ARCH_FPA),
23100   ARM_ARCH_OPT ("armv4t",       ARM_ARCH_V4T,    FPU_ARCH_FPA),
23101   ARM_ARCH_OPT ("armv4txm",     ARM_ARCH_V4TxM,  FPU_ARCH_FPA),
23102   ARM_ARCH_OPT ("armv5",        ARM_ARCH_V5,     FPU_ARCH_VFP),
23103   ARM_ARCH_OPT ("armv5t",       ARM_ARCH_V5T,    FPU_ARCH_VFP),
23104   ARM_ARCH_OPT ("armv5txm",     ARM_ARCH_V5TxM,  FPU_ARCH_VFP),
23105   ARM_ARCH_OPT ("armv5te",      ARM_ARCH_V5TE,   FPU_ARCH_VFP),
23106   ARM_ARCH_OPT ("armv5texp",    ARM_ARCH_V5TExP, FPU_ARCH_VFP),
23107   ARM_ARCH_OPT ("armv5tej",     ARM_ARCH_V5TEJ,  FPU_ARCH_VFP),
23108   ARM_ARCH_OPT ("armv6",        ARM_ARCH_V6,     FPU_ARCH_VFP),
23109   ARM_ARCH_OPT ("armv6j",       ARM_ARCH_V6,     FPU_ARCH_VFP),
23110   ARM_ARCH_OPT ("armv6k",       ARM_ARCH_V6K,    FPU_ARCH_VFP),
23111   ARM_ARCH_OPT ("armv6z",       ARM_ARCH_V6Z,    FPU_ARCH_VFP),
23112   ARM_ARCH_OPT ("armv6zk",      ARM_ARCH_V6ZK,   FPU_ARCH_VFP),
23113   ARM_ARCH_OPT ("armv6t2",      ARM_ARCH_V6T2,   FPU_ARCH_VFP),
23114   ARM_ARCH_OPT ("armv6kt2",     ARM_ARCH_V6KT2,  FPU_ARCH_VFP),
23115   ARM_ARCH_OPT ("armv6zt2",     ARM_ARCH_V6ZT2,  FPU_ARCH_VFP),
23116   ARM_ARCH_OPT ("armv6zkt2",    ARM_ARCH_V6ZKT2, FPU_ARCH_VFP),
23117   ARM_ARCH_OPT ("armv6-m",      ARM_ARCH_V6M,    FPU_ARCH_VFP),
23118   ARM_ARCH_OPT ("armv6s-m",     ARM_ARCH_V6SM,   FPU_ARCH_VFP),
23119   ARM_ARCH_OPT ("armv7",        ARM_ARCH_V7,     FPU_ARCH_VFP),
23120   /* The official spelling of the ARMv7 profile variants is the dashed form.
23121      Accept the non-dashed form for compatibility with old toolchains.  */
23122   ARM_ARCH_OPT ("armv7a",       ARM_ARCH_V7A,    FPU_ARCH_VFP),
23123   ARM_ARCH_OPT ("armv7r",       ARM_ARCH_V7R,    FPU_ARCH_VFP),
23124   ARM_ARCH_OPT ("armv7m",       ARM_ARCH_V7M,    FPU_ARCH_VFP),
23125   ARM_ARCH_OPT ("armv7-a",      ARM_ARCH_V7A,    FPU_ARCH_VFP),
23126   ARM_ARCH_OPT ("armv7-r",      ARM_ARCH_V7R,    FPU_ARCH_VFP),
23127   ARM_ARCH_OPT ("armv7-m",      ARM_ARCH_V7M,    FPU_ARCH_VFP),
23128   ARM_ARCH_OPT ("armv7e-m",     ARM_ARCH_V7EM,   FPU_ARCH_VFP),
23129   ARM_ARCH_OPT ("xscale",       ARM_ARCH_XSCALE, FPU_ARCH_VFP),
23130   ARM_ARCH_OPT ("iwmmxt",       ARM_ARCH_IWMMXT, FPU_ARCH_VFP),
23131   ARM_ARCH_OPT ("iwmmxt2",      ARM_ARCH_IWMMXT2,FPU_ARCH_VFP),
23132   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
23133 };
23134 #undef ARM_ARCH_OPT
23135
23136 /* ISA extensions in the co-processor and main instruction set space.  */
23137 struct arm_option_extension_value_table
23138 {
23139   char *name;
23140   size_t name_len;
23141   const arm_feature_set value;
23142   const arm_feature_set allowed_archs;
23143 };
23144
23145 /* The following table must be in alphabetical order with a NULL last entry.
23146    */
23147 #define ARM_EXT_OPT(N, V, AA) { N, sizeof (N) - 1, V, AA }
23148 static const struct arm_option_extension_value_table arm_extensions[] =
23149 {
23150   ARM_EXT_OPT ("idiv",  ARM_FEATURE (ARM_EXT_ADIV | ARM_EXT_DIV, 0),
23151                                    ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
23152   ARM_EXT_OPT ("iwmmxt",ARM_FEATURE (0, ARM_CEXT_IWMMXT),       ARM_ANY),
23153   ARM_EXT_OPT ("iwmmxt2",
23154                         ARM_FEATURE (0, ARM_CEXT_IWMMXT2),      ARM_ANY),
23155   ARM_EXT_OPT ("maverick",
23156                         ARM_FEATURE (0, ARM_CEXT_MAVERICK),     ARM_ANY),
23157   ARM_EXT_OPT ("mp",    ARM_FEATURE (ARM_EXT_MP, 0),
23158                                    ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
23159   ARM_EXT_OPT ("os",    ARM_FEATURE (ARM_EXT_OS, 0),
23160                                    ARM_FEATURE (ARM_EXT_V6M, 0)),
23161   ARM_EXT_OPT ("sec",   ARM_FEATURE (ARM_EXT_SEC, 0),
23162                                    ARM_FEATURE (ARM_EXT_V6K | ARM_EXT_V7A, 0)),
23163   ARM_EXT_OPT ("virt",  ARM_FEATURE (ARM_EXT_VIRT | ARM_EXT_ADIV
23164                                      | ARM_EXT_DIV, 0),
23165                                    ARM_FEATURE (ARM_EXT_V7A, 0)),
23166   ARM_EXT_OPT ("xscale",ARM_FEATURE (0, ARM_CEXT_XSCALE),       ARM_ANY),
23167   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
23168 };
23169 #undef ARM_EXT_OPT
23170
23171 /* ISA floating-point and Advanced SIMD extensions.  */
23172 struct arm_option_fpu_value_table
23173 {
23174   char *name;
23175   const arm_feature_set value;
23176 };
23177
23178 /* This list should, at a minimum, contain all the fpu names
23179    recognized by GCC.  */
23180 static const struct arm_option_fpu_value_table arm_fpus[] =
23181 {
23182   {"softfpa",           FPU_NONE},
23183   {"fpe",               FPU_ARCH_FPE},
23184   {"fpe2",              FPU_ARCH_FPE},
23185   {"fpe3",              FPU_ARCH_FPA},  /* Third release supports LFM/SFM.  */
23186   {"fpa",               FPU_ARCH_FPA},
23187   {"fpa10",             FPU_ARCH_FPA},
23188   {"fpa11",             FPU_ARCH_FPA},
23189   {"arm7500fe",         FPU_ARCH_FPA},
23190   {"softvfp",           FPU_ARCH_VFP},
23191   {"softvfp+vfp",       FPU_ARCH_VFP_V2},
23192   {"vfp",               FPU_ARCH_VFP_V2},
23193   {"vfp9",              FPU_ARCH_VFP_V2},
23194   {"vfp3",              FPU_ARCH_VFP_V3}, /* For backwards compatbility.  */
23195   {"vfp10",             FPU_ARCH_VFP_V2},
23196   {"vfp10-r0",          FPU_ARCH_VFP_V1},
23197   {"vfpxd",             FPU_ARCH_VFP_V1xD},
23198   {"vfpv2",             FPU_ARCH_VFP_V2},
23199   {"vfpv3",             FPU_ARCH_VFP_V3},
23200   {"vfpv3-fp16",        FPU_ARCH_VFP_V3_FP16},
23201   {"vfpv3-d16",         FPU_ARCH_VFP_V3D16},
23202   {"vfpv3-d16-fp16",    FPU_ARCH_VFP_V3D16_FP16},
23203   {"vfpv3xd",           FPU_ARCH_VFP_V3xD},
23204   {"vfpv3xd-fp16",      FPU_ARCH_VFP_V3xD_FP16},
23205   {"arm1020t",          FPU_ARCH_VFP_V1},
23206   {"arm1020e",          FPU_ARCH_VFP_V2},
23207   {"arm1136jfs",        FPU_ARCH_VFP_V2},
23208   {"arm1136jf-s",       FPU_ARCH_VFP_V2},
23209   {"maverick",          FPU_ARCH_MAVERICK},
23210   {"neon",              FPU_ARCH_VFP_V3_PLUS_NEON_V1},
23211   {"neon-fp16",         FPU_ARCH_NEON_FP16},
23212   {"vfpv4",             FPU_ARCH_VFP_V4},
23213   {"vfpv4-d16",         FPU_ARCH_VFP_V4D16},
23214   {"fpv4-sp-d16",       FPU_ARCH_VFP_V4_SP_D16},
23215   {"neon-vfpv4",        FPU_ARCH_NEON_VFP_V4},
23216   {NULL,                ARM_ARCH_NONE}
23217 };
23218
23219 struct arm_option_value_table
23220 {
23221   char *name;
23222   long value;
23223 };
23224
23225 static const struct arm_option_value_table arm_float_abis[] =
23226 {
23227   {"hard",      ARM_FLOAT_ABI_HARD},
23228   {"softfp",    ARM_FLOAT_ABI_SOFTFP},
23229   {"soft",      ARM_FLOAT_ABI_SOFT},
23230   {NULL,        0}
23231 };
23232
23233 #ifdef OBJ_ELF
23234 /* We only know how to output GNU and ver 4/5 (AAELF) formats.  */
23235 static const struct arm_option_value_table arm_eabis[] =
23236 {
23237   {"gnu",       EF_ARM_EABI_UNKNOWN},
23238   {"4",         EF_ARM_EABI_VER4},
23239   {"5",         EF_ARM_EABI_VER5},
23240   {NULL,        0}
23241 };
23242 #endif
23243
23244 struct arm_long_option_table
23245 {
23246   char * option;                /* Substring to match.  */
23247   char * help;                  /* Help information.  */
23248   int (* func) (char * subopt); /* Function to decode sub-option.  */
23249   char * deprecated;            /* If non-null, print this message.  */
23250 };
23251
23252 static bfd_boolean
23253 arm_parse_extension (char *str, const arm_feature_set **opt_p)
23254 {
23255   arm_feature_set *ext_set = (arm_feature_set *)
23256       xmalloc (sizeof (arm_feature_set));
23257
23258   /* We insist on extensions being specified in alphabetical order, and with
23259      extensions being added before being removed.  We achieve this by having
23260      the global ARM_EXTENSIONS table in alphabetical order, and using the
23261      ADDING_VALUE variable to indicate whether we are adding an extension (1)
23262      or removing it (0) and only allowing it to change in the order
23263      -1 -> 1 -> 0.  */
23264   const struct arm_option_extension_value_table * opt = NULL;
23265   int adding_value = -1;
23266
23267   /* Copy the feature set, so that we can modify it.  */
23268   *ext_set = **opt_p;
23269   *opt_p = ext_set;
23270
23271   while (str != NULL && *str != 0)
23272     {
23273       char *ext;
23274       size_t len;
23275
23276       if (*str != '+')
23277         {
23278           as_bad (_("invalid architectural extension"));
23279           return FALSE;
23280         }
23281
23282       str++;
23283       ext = strchr (str, '+');
23284
23285       if (ext != NULL)
23286         len = ext - str;
23287       else
23288         len = strlen (str);
23289
23290       if (len >= 2 && strncmp (str, "no", 2) == 0)
23291         {
23292           if (adding_value != 0)
23293             {
23294               adding_value = 0;
23295               opt = arm_extensions;
23296             }
23297
23298           len -= 2;
23299           str += 2;
23300         }
23301       else if (len > 0)
23302         {
23303           if (adding_value == -1)
23304             {
23305               adding_value = 1;
23306               opt = arm_extensions;
23307             }
23308           else if (adding_value != 1)
23309             {
23310               as_bad (_("must specify extensions to add before specifying "
23311                         "those to remove"));
23312               return FALSE;
23313             }
23314         }
23315
23316       if (len == 0)
23317         {
23318           as_bad (_("missing architectural extension"));
23319           return FALSE;
23320         }
23321
23322       gas_assert (adding_value != -1);
23323       gas_assert (opt != NULL);
23324
23325       /* Scan over the options table trying to find an exact match. */
23326       for (; opt->name != NULL; opt++)
23327         if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
23328           {
23329             /* Check we can apply the extension to this architecture.  */
23330             if (!ARM_CPU_HAS_FEATURE (*ext_set, opt->allowed_archs))
23331               {
23332                 as_bad (_("extension does not apply to the base architecture"));
23333                 return FALSE;
23334               }
23335
23336             /* Add or remove the extension.  */
23337             if (adding_value)
23338               ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
23339             else
23340               ARM_CLEAR_FEATURE (*ext_set, *ext_set, opt->value);
23341
23342             break;
23343           }
23344
23345       if (opt->name == NULL)
23346         {
23347           /* Did we fail to find an extension because it wasn't specified in
23348              alphabetical order, or because it does not exist?  */
23349
23350           for (opt = arm_extensions; opt->name != NULL; opt++)
23351             if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
23352               break;
23353
23354           if (opt->name == NULL)
23355             as_bad (_("unknown architectural extension `%s'"), str);
23356           else
23357             as_bad (_("architectural extensions must be specified in "
23358                       "alphabetical order"));
23359
23360           return FALSE;
23361         }
23362       else
23363         {
23364           /* We should skip the extension we've just matched the next time
23365              round.  */
23366           opt++;
23367         }
23368
23369       str = ext;
23370     };
23371
23372   return TRUE;
23373 }
23374
23375 static bfd_boolean
23376 arm_parse_cpu (char *str)
23377 {
23378   const struct arm_cpu_option_table *opt;
23379   char *ext = strchr (str, '+');
23380   size_t len;
23381
23382   if (ext != NULL)
23383     len = ext - str;
23384   else
23385     len = strlen (str);
23386
23387   if (len == 0)
23388     {
23389       as_bad (_("missing cpu name `%s'"), str);
23390       return FALSE;
23391     }
23392
23393   for (opt = arm_cpus; opt->name != NULL; opt++)
23394     if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
23395       {
23396         mcpu_cpu_opt = &opt->value;
23397         mcpu_fpu_opt = &opt->default_fpu;
23398         if (opt->canonical_name)
23399           strcpy (selected_cpu_name, opt->canonical_name);
23400         else
23401           {
23402             size_t i;
23403
23404             for (i = 0; i < len; i++)
23405               selected_cpu_name[i] = TOUPPER (opt->name[i]);
23406             selected_cpu_name[i] = 0;
23407           }
23408
23409         if (ext != NULL)
23410           return arm_parse_extension (ext, &mcpu_cpu_opt);
23411
23412         return TRUE;
23413       }
23414
23415   as_bad (_("unknown cpu `%s'"), str);
23416   return FALSE;
23417 }
23418
23419 static bfd_boolean
23420 arm_parse_arch (char *str)
23421 {
23422   const struct arm_arch_option_table *opt;
23423   char *ext = strchr (str, '+');
23424   size_t len;
23425
23426   if (ext != NULL)
23427     len = ext - str;
23428   else
23429     len = strlen (str);
23430
23431   if (len == 0)
23432     {
23433       as_bad (_("missing architecture name `%s'"), str);
23434       return FALSE;
23435     }
23436
23437   for (opt = arm_archs; opt->name != NULL; opt++)
23438     if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
23439       {
23440         march_cpu_opt = &opt->value;
23441         march_fpu_opt = &opt->default_fpu;
23442         strcpy (selected_cpu_name, opt->name);
23443
23444         if (ext != NULL)
23445           return arm_parse_extension (ext, &march_cpu_opt);
23446
23447         return TRUE;
23448       }
23449
23450   as_bad (_("unknown architecture `%s'\n"), str);
23451   return FALSE;
23452 }
23453
23454 static bfd_boolean
23455 arm_parse_fpu (char * str)
23456 {
23457   const struct arm_option_fpu_value_table * opt;
23458
23459   for (opt = arm_fpus; opt->name != NULL; opt++)
23460     if (streq (opt->name, str))
23461       {
23462         mfpu_opt = &opt->value;
23463         return TRUE;
23464       }
23465
23466   as_bad (_("unknown floating point format `%s'\n"), str);
23467   return FALSE;
23468 }
23469
23470 static bfd_boolean
23471 arm_parse_float_abi (char * str)
23472 {
23473   const struct arm_option_value_table * opt;
23474
23475   for (opt = arm_float_abis; opt->name != NULL; opt++)
23476     if (streq (opt->name, str))
23477       {
23478         mfloat_abi_opt = opt->value;
23479         return TRUE;
23480       }
23481
23482   as_bad (_("unknown floating point abi `%s'\n"), str);
23483   return FALSE;
23484 }
23485
23486 #ifdef OBJ_ELF
23487 static bfd_boolean
23488 arm_parse_eabi (char * str)
23489 {
23490   const struct arm_option_value_table *opt;
23491
23492   for (opt = arm_eabis; opt->name != NULL; opt++)
23493     if (streq (opt->name, str))
23494       {
23495         meabi_flags = opt->value;
23496         return TRUE;
23497       }
23498   as_bad (_("unknown EABI `%s'\n"), str);
23499   return FALSE;
23500 }
23501 #endif
23502
23503 static bfd_boolean
23504 arm_parse_it_mode (char * str)
23505 {
23506   bfd_boolean ret = TRUE;
23507
23508   if (streq ("arm", str))
23509     implicit_it_mode = IMPLICIT_IT_MODE_ARM;
23510   else if (streq ("thumb", str))
23511     implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
23512   else if (streq ("always", str))
23513     implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
23514   else if (streq ("never", str))
23515     implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
23516   else
23517     {
23518       as_bad (_("unknown implicit IT mode `%s', should be "\
23519                 "arm, thumb, always, or never."), str);
23520       ret = FALSE;
23521     }
23522
23523   return ret;
23524 }
23525
23526 struct arm_long_option_table arm_long_opts[] =
23527 {
23528   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
23529    arm_parse_cpu, NULL},
23530   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
23531    arm_parse_arch, NULL},
23532   {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
23533    arm_parse_fpu, NULL},
23534   {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
23535    arm_parse_float_abi, NULL},
23536 #ifdef OBJ_ELF
23537   {"meabi=", N_("<ver>\t\t  assemble for eabi version <ver>"),
23538    arm_parse_eabi, NULL},
23539 #endif
23540   {"mimplicit-it=", N_("<mode>\t  controls implicit insertion of IT instructions"),
23541    arm_parse_it_mode, NULL},
23542   {NULL, NULL, 0, NULL}
23543 };
23544
23545 int
23546 md_parse_option (int c, char * arg)
23547 {
23548   struct arm_option_table *opt;
23549   const struct arm_legacy_option_table *fopt;
23550   struct arm_long_option_table *lopt;
23551
23552   switch (c)
23553     {
23554 #ifdef OPTION_EB
23555     case OPTION_EB:
23556       target_big_endian = 1;
23557       break;
23558 #endif
23559
23560 #ifdef OPTION_EL
23561     case OPTION_EL:
23562       target_big_endian = 0;
23563       break;
23564 #endif
23565
23566     case OPTION_FIX_V4BX:
23567       fix_v4bx = TRUE;
23568       break;
23569
23570     case 'a':
23571       /* Listing option.  Just ignore these, we don't support additional
23572          ones.  */
23573       return 0;
23574
23575     default:
23576       for (opt = arm_opts; opt->option != NULL; opt++)
23577         {
23578           if (c == opt->option[0]
23579               && ((arg == NULL && opt->option[1] == 0)
23580                   || streq (arg, opt->option + 1)))
23581             {
23582               /* If the option is deprecated, tell the user.  */
23583               if (warn_on_deprecated && opt->deprecated != NULL)
23584                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
23585                            arg ? arg : "", _(opt->deprecated));
23586
23587               if (opt->var != NULL)
23588                 *opt->var = opt->value;
23589
23590               return 1;
23591             }
23592         }
23593
23594       for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
23595         {
23596           if (c == fopt->option[0]
23597               && ((arg == NULL && fopt->option[1] == 0)
23598                   || streq (arg, fopt->option + 1)))
23599             {
23600               /* If the option is deprecated, tell the user.  */
23601               if (warn_on_deprecated && fopt->deprecated != NULL)
23602                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
23603                            arg ? arg : "", _(fopt->deprecated));
23604
23605               if (fopt->var != NULL)
23606                 *fopt->var = &fopt->value;
23607
23608               return 1;
23609             }
23610         }
23611
23612       for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
23613         {
23614           /* These options are expected to have an argument.  */
23615           if (c == lopt->option[0]
23616               && arg != NULL
23617               && strncmp (arg, lopt->option + 1,
23618                           strlen (lopt->option + 1)) == 0)
23619             {
23620               /* If the option is deprecated, tell the user.  */
23621               if (warn_on_deprecated && lopt->deprecated != NULL)
23622                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
23623                            _(lopt->deprecated));
23624
23625               /* Call the sup-option parser.  */
23626               return lopt->func (arg + strlen (lopt->option) - 1);
23627             }
23628         }
23629
23630       return 0;
23631     }
23632
23633   return 1;
23634 }
23635
23636 void
23637 md_show_usage (FILE * fp)
23638 {
23639   struct arm_option_table *opt;
23640   struct arm_long_option_table *lopt;
23641
23642   fprintf (fp, _(" ARM-specific assembler options:\n"));
23643
23644   for (opt = arm_opts; opt->option != NULL; opt++)
23645     if (opt->help != NULL)
23646       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
23647
23648   for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
23649     if (lopt->help != NULL)
23650       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
23651
23652 #ifdef OPTION_EB
23653   fprintf (fp, _("\
23654   -EB                     assemble code for a big-endian cpu\n"));
23655 #endif
23656
23657 #ifdef OPTION_EL
23658   fprintf (fp, _("\
23659   -EL                     assemble code for a little-endian cpu\n"));
23660 #endif
23661
23662   fprintf (fp, _("\
23663   --fix-v4bx              Allow BX in ARMv4 code\n"));
23664 }
23665
23666
23667 #ifdef OBJ_ELF
23668 typedef struct
23669 {
23670   int val;
23671   arm_feature_set flags;
23672 } cpu_arch_ver_table;
23673
23674 /* Mapping from CPU features to EABI CPU arch values.  Table must be sorted
23675    least features first.  */
23676 static const cpu_arch_ver_table cpu_arch_ver[] =
23677 {
23678     {1, ARM_ARCH_V4},
23679     {2, ARM_ARCH_V4T},
23680     {3, ARM_ARCH_V5},
23681     {3, ARM_ARCH_V5T},
23682     {4, ARM_ARCH_V5TE},
23683     {5, ARM_ARCH_V5TEJ},
23684     {6, ARM_ARCH_V6},
23685     {9, ARM_ARCH_V6K},
23686     {7, ARM_ARCH_V6Z},
23687     {11, ARM_ARCH_V6M},
23688     {12, ARM_ARCH_V6SM},
23689     {8, ARM_ARCH_V6T2},
23690     {10, ARM_ARCH_V7A},
23691     {10, ARM_ARCH_V7R},
23692     {10, ARM_ARCH_V7M},
23693     {0, ARM_ARCH_NONE}
23694 };
23695
23696 /* Set an attribute if it has not already been set by the user.  */
23697 static void
23698 aeabi_set_attribute_int (int tag, int value)
23699 {
23700   if (tag < 1
23701       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
23702       || !attributes_set_explicitly[tag])
23703     bfd_elf_add_proc_attr_int (stdoutput, tag, value);
23704 }
23705
23706 static void
23707 aeabi_set_attribute_string (int tag, const char *value)
23708 {
23709   if (tag < 1
23710       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
23711       || !attributes_set_explicitly[tag])
23712     bfd_elf_add_proc_attr_string (stdoutput, tag, value);
23713 }
23714
23715 /* Set the public EABI object attributes.  */
23716 static void
23717 aeabi_set_public_attributes (void)
23718 {
23719   int arch;
23720   char profile;
23721   int virt_sec = 0;
23722   arm_feature_set flags;
23723   arm_feature_set tmp;
23724   const cpu_arch_ver_table *p;
23725
23726   /* Choose the architecture based on the capabilities of the requested cpu
23727      (if any) and/or the instructions actually used.  */
23728   ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
23729   ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
23730   ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
23731
23732   if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any))
23733     ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v1);
23734
23735   if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_any))
23736     ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v4t);
23737
23738   /* Allow the user to override the reported architecture.  */
23739   if (object_arch)
23740     {
23741       ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
23742       ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
23743     }
23744
23745   /* We need to make sure that the attributes do not identify us as v6S-M
23746      when the only v6S-M feature in use is the Operating System Extensions.  */
23747   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_os))
23748       if (!ARM_CPU_HAS_FEATURE (flags, arm_arch_v6m_only))
23749         ARM_CLEAR_FEATURE (flags, flags, arm_ext_os);
23750
23751   tmp = flags;
23752   arch = 0;
23753   for (p = cpu_arch_ver; p->val; p++)
23754     {
23755       if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
23756         {
23757           arch = p->val;
23758           ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
23759         }
23760     }
23761
23762   /* The table lookup above finds the last architecture to contribute
23763      a new feature.  Unfortunately, Tag13 is a subset of the union of
23764      v6T2 and v7-M, so it is never seen as contributing a new feature.
23765      We can not search for the last entry which is entirely used,
23766      because if no CPU is specified we build up only those flags
23767      actually used.  Perhaps we should separate out the specified
23768      and implicit cases.  Avoid taking this path for -march=all by
23769      checking for contradictory v7-A / v7-M features.  */
23770   if (arch == 10
23771       && !ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a)
23772       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m)
23773       && ARM_CPU_HAS_FEATURE (flags, arm_ext_v6_dsp))
23774     arch = 13;
23775
23776   /* Tag_CPU_name.  */
23777   if (selected_cpu_name[0])
23778     {
23779       char *q;
23780
23781       q = selected_cpu_name;
23782       if (strncmp (q, "armv", 4) == 0)
23783         {
23784           int i;
23785
23786           q += 4;
23787           for (i = 0; q[i]; i++)
23788             q[i] = TOUPPER (q[i]);
23789         }
23790       aeabi_set_attribute_string (Tag_CPU_name, q);
23791     }
23792
23793   /* Tag_CPU_arch.  */
23794   aeabi_set_attribute_int (Tag_CPU_arch, arch);
23795
23796   /* Tag_CPU_arch_profile.  */
23797   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
23798     profile = 'A';
23799   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
23800     profile = 'R';
23801   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_m))
23802     profile = 'M';
23803   else
23804     profile = '\0';
23805
23806   if (profile != '\0')
23807     aeabi_set_attribute_int (Tag_CPU_arch_profile, profile);
23808
23809   /* Tag_ARM_ISA_use.  */
23810   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
23811       || arch == 0)
23812     aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
23813
23814   /* Tag_THUMB_ISA_use.  */
23815   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
23816       || arch == 0)
23817     aeabi_set_attribute_int (Tag_THUMB_ISA_use,
23818         ARM_CPU_HAS_FEATURE (flags, arm_arch_t2) ? 2 : 1);
23819
23820   /* Tag_VFP_arch.  */
23821   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
23822     aeabi_set_attribute_int (Tag_VFP_arch,
23823                              ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
23824                              ? 5 : 6);
23825   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
23826     aeabi_set_attribute_int (Tag_VFP_arch, 3);
23827   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
23828     aeabi_set_attribute_int (Tag_VFP_arch, 4);
23829   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
23830     aeabi_set_attribute_int (Tag_VFP_arch, 2);
23831   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
23832            || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
23833     aeabi_set_attribute_int (Tag_VFP_arch, 1);
23834
23835   /* Tag_ABI_HardFP_use.  */
23836   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd)
23837       && !ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1))
23838     aeabi_set_attribute_int (Tag_ABI_HardFP_use, 1);
23839
23840   /* Tag_WMMX_arch.  */
23841   if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
23842     aeabi_set_attribute_int (Tag_WMMX_arch, 2);
23843   else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
23844     aeabi_set_attribute_int (Tag_WMMX_arch, 1);
23845
23846   /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch).  */
23847   if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
23848     aeabi_set_attribute_int
23849       (Tag_Advanced_SIMD_arch, (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma)
23850                                 ? 2 : 1));
23851
23852   /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch).  */
23853   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16))
23854     aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
23855
23856   /* Tag_DIV_use.
23857
23858      We set Tag_DIV_use to two when integer divide instructions have been used
23859      in ARM state, or when Thumb integer divide instructions have been used,
23860      but we have no architecture profile set, nor have we any ARM instructions.
23861
23862      For new architectures we will have to check these tests.  */
23863   gas_assert (arch <= TAG_CPU_ARCH_V7E_M);
23864   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_adiv)
23865       || (profile == '\0'
23866           && ARM_CPU_HAS_FEATURE (flags, arm_ext_div)
23867           && !ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any)))
23868     aeabi_set_attribute_int (Tag_DIV_use, 2);
23869
23870   /* Tag_MP_extension_use.  */
23871   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_mp))
23872     aeabi_set_attribute_int (Tag_MPextension_use, 1);
23873
23874   /* Tag Virtualization_use.  */
23875   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_sec))
23876     virt_sec |= 1;
23877   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_virt))
23878     virt_sec |= 2;
23879   if (virt_sec != 0)
23880     aeabi_set_attribute_int (Tag_Virtualization_use, virt_sec);
23881 }
23882
23883 /* Add the default contents for the .ARM.attributes section.  */
23884 void
23885 arm_md_end (void)
23886 {
23887   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
23888     return;
23889
23890   aeabi_set_public_attributes ();
23891 }
23892 #endif /* OBJ_ELF */
23893
23894
23895 /* Parse a .cpu directive.  */
23896
23897 static void
23898 s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
23899 {
23900   const struct arm_cpu_option_table *opt;
23901   char *name;
23902   char saved_char;
23903
23904   name = input_line_pointer;
23905   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23906     input_line_pointer++;
23907   saved_char = *input_line_pointer;
23908   *input_line_pointer = 0;
23909
23910   /* Skip the first "all" entry.  */
23911   for (opt = arm_cpus + 1; opt->name != NULL; opt++)
23912     if (streq (opt->name, name))
23913       {
23914         mcpu_cpu_opt = &opt->value;
23915         selected_cpu = opt->value;
23916         if (opt->canonical_name)
23917           strcpy (selected_cpu_name, opt->canonical_name);
23918         else
23919           {
23920             int i;
23921             for (i = 0; opt->name[i]; i++)
23922               selected_cpu_name[i] = TOUPPER (opt->name[i]);
23923
23924             selected_cpu_name[i] = 0;
23925           }
23926         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23927         *input_line_pointer = saved_char;
23928         demand_empty_rest_of_line ();
23929         return;
23930       }
23931   as_bad (_("unknown cpu `%s'"), name);
23932   *input_line_pointer = saved_char;
23933   ignore_rest_of_line ();
23934 }
23935
23936
23937 /* Parse a .arch directive.  */
23938
23939 static void
23940 s_arm_arch (int ignored ATTRIBUTE_UNUSED)
23941 {
23942   const struct arm_arch_option_table *opt;
23943   char saved_char;
23944   char *name;
23945
23946   name = input_line_pointer;
23947   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23948     input_line_pointer++;
23949   saved_char = *input_line_pointer;
23950   *input_line_pointer = 0;
23951
23952   /* Skip the first "all" entry.  */
23953   for (opt = arm_archs + 1; opt->name != NULL; opt++)
23954     if (streq (opt->name, name))
23955       {
23956         mcpu_cpu_opt = &opt->value;
23957         selected_cpu = opt->value;
23958         strcpy (selected_cpu_name, opt->name);
23959         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
23960         *input_line_pointer = saved_char;
23961         demand_empty_rest_of_line ();
23962         return;
23963       }
23964
23965   as_bad (_("unknown architecture `%s'\n"), name);
23966   *input_line_pointer = saved_char;
23967   ignore_rest_of_line ();
23968 }
23969
23970
23971 /* Parse a .object_arch directive.  */
23972
23973 static void
23974 s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
23975 {
23976   const struct arm_arch_option_table *opt;
23977   char saved_char;
23978   char *name;
23979
23980   name = input_line_pointer;
23981   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
23982     input_line_pointer++;
23983   saved_char = *input_line_pointer;
23984   *input_line_pointer = 0;
23985
23986   /* Skip the first "all" entry.  */
23987   for (opt = arm_archs + 1; opt->name != NULL; opt++)
23988     if (streq (opt->name, name))
23989       {
23990         object_arch = &opt->value;
23991         *input_line_pointer = saved_char;
23992         demand_empty_rest_of_line ();
23993         return;
23994       }
23995
23996   as_bad (_("unknown architecture `%s'\n"), name);
23997   *input_line_pointer = saved_char;
23998   ignore_rest_of_line ();
23999 }
24000
24001 /* Parse a .arch_extension directive.  */
24002
24003 static void
24004 s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
24005 {
24006   const struct arm_option_extension_value_table *opt;
24007   char saved_char;
24008   char *name;
24009   int adding_value = 1;
24010
24011   name = input_line_pointer;
24012   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
24013     input_line_pointer++;
24014   saved_char = *input_line_pointer;
24015   *input_line_pointer = 0;
24016
24017   if (strlen (name) >= 2
24018       && strncmp (name, "no", 2) == 0)
24019     {
24020       adding_value = 0;
24021       name += 2;
24022     }
24023
24024   for (opt = arm_extensions; opt->name != NULL; opt++)
24025     if (streq (opt->name, name))
24026       {
24027         if (!ARM_CPU_HAS_FEATURE (*mcpu_cpu_opt, opt->allowed_archs))
24028           {
24029             as_bad (_("architectural extension `%s' is not allowed for the "
24030                       "current base architecture"), name);
24031             break;
24032           }
24033
24034         if (adding_value)
24035           ARM_MERGE_FEATURE_SETS (selected_cpu, selected_cpu, opt->value);
24036         else
24037           ARM_CLEAR_FEATURE (selected_cpu, selected_cpu, opt->value);
24038
24039         mcpu_cpu_opt = &selected_cpu;
24040         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
24041         *input_line_pointer = saved_char;
24042         demand_empty_rest_of_line ();
24043         return;
24044       }
24045
24046   if (opt->name == NULL)
24047     as_bad (_("unknown architecture `%s'\n"), name);
24048
24049   *input_line_pointer = saved_char;
24050   ignore_rest_of_line ();
24051 }
24052
24053 /* Parse a .fpu directive.  */
24054
24055 static void
24056 s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
24057 {
24058   const struct arm_option_fpu_value_table *opt;
24059   char saved_char;
24060   char *name;
24061
24062   name = input_line_pointer;
24063   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
24064     input_line_pointer++;
24065   saved_char = *input_line_pointer;
24066   *input_line_pointer = 0;
24067
24068   for (opt = arm_fpus; opt->name != NULL; opt++)
24069     if (streq (opt->name, name))
24070       {
24071         mfpu_opt = &opt->value;
24072         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
24073         *input_line_pointer = saved_char;
24074         demand_empty_rest_of_line ();
24075         return;
24076       }
24077
24078   as_bad (_("unknown floating point format `%s'\n"), name);
24079   *input_line_pointer = saved_char;
24080   ignore_rest_of_line ();
24081 }
24082
24083 /* Copy symbol information.  */
24084
24085 void
24086 arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
24087 {
24088   ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
24089 }
24090
24091 #ifdef OBJ_ELF
24092 /* Given a symbolic attribute NAME, return the proper integer value.
24093    Returns -1 if the attribute is not known.  */
24094
24095 int
24096 arm_convert_symbolic_attribute (const char *name)
24097 {
24098   static const struct
24099   {
24100     const char * name;
24101     const int    tag;
24102   }
24103   attribute_table[] =
24104     {
24105       /* When you modify this table you should
24106          also modify the list in doc/c-arm.texi.  */
24107 #define T(tag) {#tag, tag}
24108       T (Tag_CPU_raw_name),
24109       T (Tag_CPU_name),
24110       T (Tag_CPU_arch),
24111       T (Tag_CPU_arch_profile),
24112       T (Tag_ARM_ISA_use),
24113       T (Tag_THUMB_ISA_use),
24114       T (Tag_FP_arch),
24115       T (Tag_VFP_arch),
24116       T (Tag_WMMX_arch),
24117       T (Tag_Advanced_SIMD_arch),
24118       T (Tag_PCS_config),
24119       T (Tag_ABI_PCS_R9_use),
24120       T (Tag_ABI_PCS_RW_data),
24121       T (Tag_ABI_PCS_RO_data),
24122       T (Tag_ABI_PCS_GOT_use),
24123       T (Tag_ABI_PCS_wchar_t),
24124       T (Tag_ABI_FP_rounding),
24125       T (Tag_ABI_FP_denormal),
24126       T (Tag_ABI_FP_exceptions),
24127       T (Tag_ABI_FP_user_exceptions),
24128       T (Tag_ABI_FP_number_model),
24129       T (Tag_ABI_align_needed),
24130       T (Tag_ABI_align8_needed),
24131       T (Tag_ABI_align_preserved),
24132       T (Tag_ABI_align8_preserved),
24133       T (Tag_ABI_enum_size),
24134       T (Tag_ABI_HardFP_use),
24135       T (Tag_ABI_VFP_args),
24136       T (Tag_ABI_WMMX_args),
24137       T (Tag_ABI_optimization_goals),
24138       T (Tag_ABI_FP_optimization_goals),
24139       T (Tag_compatibility),
24140       T (Tag_CPU_unaligned_access),
24141       T (Tag_FP_HP_extension),
24142       T (Tag_VFP_HP_extension),
24143       T (Tag_ABI_FP_16bit_format),
24144       T (Tag_MPextension_use),
24145       T (Tag_DIV_use),
24146       T (Tag_nodefaults),
24147       T (Tag_also_compatible_with),
24148       T (Tag_conformance),
24149       T (Tag_T2EE_use),
24150       T (Tag_Virtualization_use),
24151       /* We deliberately do not include Tag_MPextension_use_legacy.  */
24152 #undef T
24153     };
24154   unsigned int i;
24155
24156   if (name == NULL)
24157     return -1;
24158
24159   for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
24160     if (streq (name, attribute_table[i].name))
24161       return attribute_table[i].tag;
24162
24163   return -1;
24164 }
24165
24166
24167 /* Apply sym value for relocations only in the case that
24168    they are for local symbols and you have the respective
24169    architectural feature for blx and simple switches.  */
24170 int
24171 arm_apply_sym_value (struct fix * fixP)
24172 {
24173   if (fixP->fx_addsy
24174       && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
24175       && !S_FORCE_RELOC (fixP->fx_addsy, TRUE))
24176     {
24177       switch (fixP->fx_r_type)
24178         {
24179         case BFD_RELOC_ARM_PCREL_BLX:
24180         case BFD_RELOC_THUMB_PCREL_BRANCH23:
24181           if (ARM_IS_FUNC (fixP->fx_addsy))
24182             return 1;
24183           break;
24184
24185         case BFD_RELOC_ARM_PCREL_CALL:
24186         case BFD_RELOC_THUMB_PCREL_BLX:
24187           if (THUMB_IS_FUNC (fixP->fx_addsy))
24188               return 1;
24189           break;
24190
24191         default:
24192           break;
24193         }
24194
24195     }
24196   return 0;
24197 }
24198 #endif /* OBJ_ELF */