]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/binutils/gas/config/tc-arm.c
MFC r274856:
[FreeBSD/stable/10.git] / contrib / binutils / 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
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 2, 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 <limits.h>
29 #include <stdarg.h>
30 #define  NO_RELOC 0
31 #include "as.h"
32 #include "safe-ctype.h"
33 #include "subsegs.h"
34 #include "obstack.h"
35
36 #include "opcode/arm.h"
37
38 #ifdef OBJ_ELF
39 #include "elf/arm.h"
40 #include "dw2gencfi.h"
41 #endif
42
43 #include "dwarf2dbg.h"
44
45 #define WARN_DEPRECATED 1
46
47 #ifdef OBJ_ELF
48 /* Must be at least the size of the largest unwind opcode (currently two).  */
49 #define ARM_OPCODE_CHUNK_SIZE 8
50
51 /* This structure holds the unwinding state.  */
52
53 static struct
54 {
55   symbolS *       proc_start;
56   symbolS *       table_entry;
57   symbolS *       personality_routine;
58   int             personality_index;
59   /* The segment containing the function.  */
60   segT            saved_seg;
61   subsegT         saved_subseg;
62   /* Opcodes generated from this function.  */
63   unsigned char * opcodes;
64   int             opcode_count;
65   int             opcode_alloc;
66   /* The number of bytes pushed to the stack.  */
67   offsetT         frame_size;
68   /* We don't add stack adjustment opcodes immediately so that we can merge
69      multiple adjustments.  We can also omit the final adjustment
70      when using a frame pointer.  */
71   offsetT         pending_offset;
72   /* These two fields are set by both unwind_movsp and unwind_setfp.  They
73      hold the reg+offset to use when restoring sp from a frame pointer.  */
74   offsetT         fp_offset;
75   int             fp_reg;
76   /* Nonzero if an unwind_setfp directive has been seen.  */
77   unsigned        fp_used:1;
78   /* Nonzero if the last opcode restores sp from fp_reg.  */
79   unsigned        sp_restored:1;
80 } unwind;
81
82 /* Bit N indicates that an R_ARM_NONE relocation has been output for
83    __aeabi_unwind_cpp_prN already if set. This enables dependencies to be
84    emitted only once per section, to save unnecessary bloat.  */
85 static unsigned int marked_pr_dependency = 0;
86
87 #endif /* OBJ_ELF */
88
89 /* Results from operand parsing worker functions.  */
90
91 typedef enum
92 {
93   PARSE_OPERAND_SUCCESS,
94   PARSE_OPERAND_FAIL,
95   PARSE_OPERAND_FAIL_NO_BACKTRACK
96 } parse_operand_result;
97
98 enum arm_float_abi
99 {
100   ARM_FLOAT_ABI_HARD,
101   ARM_FLOAT_ABI_SOFTFP,
102   ARM_FLOAT_ABI_SOFT
103 };
104
105 /* Types of processor to assemble for.  */
106 #ifndef CPU_DEFAULT
107 #if defined __XSCALE__
108 #define CPU_DEFAULT     ARM_ARCH_XSCALE
109 #else
110 #if defined __thumb__
111 #define CPU_DEFAULT     ARM_ARCH_V5T
112 #endif
113 #endif
114 #endif
115
116 #ifndef FPU_DEFAULT
117 # ifdef TE_LINUX
118 #  define FPU_DEFAULT FPU_ARCH_FPA
119 # elif defined (TE_NetBSD)
120 #  ifdef OBJ_ELF
121 #   define FPU_DEFAULT FPU_ARCH_VFP     /* Soft-float, but VFP order.  */
122 #  else
123     /* Legacy a.out format.  */
124 #   define FPU_DEFAULT FPU_ARCH_FPA     /* Soft-float, but FPA order.  */
125 #  endif
126 # elif defined (TE_VXWORKS)
127 #  define FPU_DEFAULT FPU_ARCH_VFP      /* Soft-float, VFP order.  */
128 # else
129    /* For backwards compatibility, default to FPA.  */
130 #  define FPU_DEFAULT FPU_ARCH_FPA
131 # endif
132 #endif /* ifndef FPU_DEFAULT */
133
134 #define streq(a, b)           (strcmp (a, b) == 0)
135
136 static arm_feature_set cpu_variant;
137 static arm_feature_set arm_arch_used;
138 static arm_feature_set thumb_arch_used;
139
140 /* Flags stored in private area of BFD structure.  */
141 static int uses_apcs_26      = FALSE;
142 static int atpcs             = FALSE;
143 static int support_interwork = FALSE;
144 static int uses_apcs_float   = FALSE;
145 static int pic_code          = FALSE;
146
147 /* Variables that we set while parsing command-line options.  Once all
148    options have been read we re-process these values to set the real
149    assembly flags.  */
150 static const arm_feature_set *legacy_cpu = NULL;
151 static const arm_feature_set *legacy_fpu = NULL;
152
153 static const arm_feature_set *mcpu_cpu_opt = NULL;
154 static const arm_feature_set *mcpu_fpu_opt = NULL;
155 static const arm_feature_set *march_cpu_opt = NULL;
156 static const arm_feature_set *march_fpu_opt = NULL;
157 static const arm_feature_set *mfpu_opt = NULL;
158 static const arm_feature_set *object_arch = NULL;
159
160 /* Constants for known architecture features.  */
161 static const arm_feature_set fpu_default = FPU_DEFAULT;
162 static const arm_feature_set fpu_arch_vfp_v1 = FPU_ARCH_VFP_V1;
163 static const arm_feature_set fpu_arch_vfp_v2 = FPU_ARCH_VFP_V2;
164 static const arm_feature_set fpu_arch_vfp_v3 = FPU_ARCH_VFP_V3;
165 static const arm_feature_set fpu_arch_neon_v1 = FPU_ARCH_NEON_V1;
166 static const arm_feature_set fpu_arch_fpa = FPU_ARCH_FPA;
167 static const arm_feature_set fpu_any_hard = FPU_ANY_HARD;
168 static const arm_feature_set fpu_arch_maverick = FPU_ARCH_MAVERICK;
169 static const arm_feature_set fpu_endian_pure = FPU_ARCH_ENDIAN_PURE;
170
171 #ifdef CPU_DEFAULT
172 static const arm_feature_set cpu_default = CPU_DEFAULT;
173 #endif
174
175 static const arm_feature_set arm_ext_v1 = ARM_FEATURE (ARM_EXT_V1, 0);
176 static const arm_feature_set arm_ext_v2 = ARM_FEATURE (ARM_EXT_V1, 0);
177 static const arm_feature_set arm_ext_v2s = ARM_FEATURE (ARM_EXT_V2S, 0);
178 static const arm_feature_set arm_ext_v3 = ARM_FEATURE (ARM_EXT_V3, 0);
179 static const arm_feature_set arm_ext_v3m = ARM_FEATURE (ARM_EXT_V3M, 0);
180 static const arm_feature_set arm_ext_v4 = ARM_FEATURE (ARM_EXT_V4, 0);
181 static const arm_feature_set arm_ext_v4t = ARM_FEATURE (ARM_EXT_V4T, 0);
182 static const arm_feature_set arm_ext_v5 = ARM_FEATURE (ARM_EXT_V5, 0);
183 static const arm_feature_set arm_ext_v4t_5 =
184   ARM_FEATURE (ARM_EXT_V4T | ARM_EXT_V5, 0);
185 static const arm_feature_set arm_ext_v5t = ARM_FEATURE (ARM_EXT_V5T, 0);
186 static const arm_feature_set arm_ext_v5e = ARM_FEATURE (ARM_EXT_V5E, 0);
187 static const arm_feature_set arm_ext_v5exp = ARM_FEATURE (ARM_EXT_V5ExP, 0);
188 static const arm_feature_set arm_ext_v5j = ARM_FEATURE (ARM_EXT_V5J, 0);
189 static const arm_feature_set arm_ext_v6 = ARM_FEATURE (ARM_EXT_V6, 0);
190 static const arm_feature_set arm_ext_v6k = ARM_FEATURE (ARM_EXT_V6K, 0);
191 static const arm_feature_set arm_ext_v6z = ARM_FEATURE (ARM_EXT_V6Z, 0);
192 static const arm_feature_set arm_ext_v6t2 = ARM_FEATURE (ARM_EXT_V6T2, 0);
193 static const arm_feature_set arm_ext_v6_notm = ARM_FEATURE (ARM_EXT_V6_NOTM, 0);
194 static const arm_feature_set arm_ext_div = ARM_FEATURE (ARM_EXT_DIV, 0);
195 static const arm_feature_set arm_ext_v7 = ARM_FEATURE (ARM_EXT_V7, 0);
196 static const arm_feature_set arm_ext_v7a = ARM_FEATURE (ARM_EXT_V7A, 0);
197 static const arm_feature_set arm_ext_v7r = ARM_FEATURE (ARM_EXT_V7R, 0);
198 static const arm_feature_set arm_ext_v7m = ARM_FEATURE (ARM_EXT_V7M, 0);
199
200 static const arm_feature_set arm_arch_any = ARM_ANY;
201 static const arm_feature_set arm_arch_full = ARM_FEATURE (-1, -1);
202 static const arm_feature_set arm_arch_t2 = ARM_ARCH_THUMB2;
203 static const arm_feature_set arm_arch_none = ARM_ARCH_NONE;
204
205 static const arm_feature_set arm_cext_iwmmxt2 =
206   ARM_FEATURE (0, ARM_CEXT_IWMMXT2);
207 static const arm_feature_set arm_cext_iwmmxt =
208   ARM_FEATURE (0, ARM_CEXT_IWMMXT);
209 static const arm_feature_set arm_cext_xscale =
210   ARM_FEATURE (0, ARM_CEXT_XSCALE);
211 static const arm_feature_set arm_cext_maverick =
212   ARM_FEATURE (0, ARM_CEXT_MAVERICK);
213 static const arm_feature_set fpu_fpa_ext_v1 = ARM_FEATURE (0, FPU_FPA_EXT_V1);
214 static const arm_feature_set fpu_fpa_ext_v2 = ARM_FEATURE (0, FPU_FPA_EXT_V2);
215 static const arm_feature_set fpu_vfp_ext_v1xd =
216   ARM_FEATURE (0, FPU_VFP_EXT_V1xD);
217 static const arm_feature_set fpu_vfp_ext_v1 = ARM_FEATURE (0, FPU_VFP_EXT_V1);
218 static const arm_feature_set fpu_vfp_ext_v2 = ARM_FEATURE (0, FPU_VFP_EXT_V2);
219 static const arm_feature_set fpu_vfp_ext_v3 = ARM_FEATURE (0, FPU_VFP_EXT_V3);
220 static const arm_feature_set fpu_neon_ext_v1 = ARM_FEATURE (0, FPU_NEON_EXT_V1);
221 static const arm_feature_set fpu_vfp_v3_or_neon_ext =
222   ARM_FEATURE (0, FPU_NEON_EXT_V1 | FPU_VFP_EXT_V3);
223
224 static int mfloat_abi_opt = -1;
225 /* Record user cpu selection for object attributes.  */
226 static arm_feature_set selected_cpu = ARM_ARCH_NONE;
227 /* Must be long enough to hold any of the names in arm_cpus.  */
228 static char selected_cpu_name[16];
229 #ifdef OBJ_ELF
230 # ifdef EABI_DEFAULT
231 static int meabi_flags = EABI_DEFAULT;
232 # else
233 static int meabi_flags = EF_ARM_EABI_UNKNOWN;
234 # endif
235
236 bfd_boolean
237 arm_is_eabi(void)
238 {
239   return (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4);
240 }
241 #endif
242
243 #ifdef OBJ_ELF
244 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
245 symbolS * GOT_symbol;
246 #endif
247
248 /* 0: assemble for ARM,
249    1: assemble for Thumb,
250    2: assemble for Thumb even though target CPU does not support thumb
251       instructions.  */
252 static int thumb_mode = 0;
253
254 /* If unified_syntax is true, we are processing the new unified
255    ARM/Thumb syntax.  Important differences from the old ARM mode:
256
257      - Immediate operands do not require a # prefix.
258      - Conditional affixes always appear at the end of the
259        instruction.  (For backward compatibility, those instructions
260        that formerly had them in the middle, continue to accept them
261        there.)
262      - The IT instruction may appear, and if it does is validated
263        against subsequent conditional affixes.  It does not generate
264        machine code.
265
266    Important differences from the old Thumb mode:
267
268      - Immediate operands do not require a # prefix.
269      - Most of the V6T2 instructions are only available in unified mode.
270      - The .N and .W suffixes are recognized and honored (it is an error
271        if they cannot be honored).
272      - All instructions set the flags if and only if they have an 's' affix.
273      - Conditional affixes may be used.  They are validated against
274        preceding IT instructions.  Unlike ARM mode, you cannot use a
275        conditional affix except in the scope of an IT instruction.  */
276
277 static bfd_boolean unified_syntax = FALSE;
278
279 enum neon_el_type
280 {
281   NT_invtype,
282   NT_untyped,
283   NT_integer,
284   NT_float,
285   NT_poly,
286   NT_signed,
287   NT_unsigned
288 };
289
290 struct neon_type_el
291 {
292   enum neon_el_type type;
293   unsigned size;
294 };
295
296 #define NEON_MAX_TYPE_ELS 4
297
298 struct neon_type
299 {
300   struct neon_type_el el[NEON_MAX_TYPE_ELS];
301   unsigned elems;
302 };
303
304 struct arm_it
305 {
306   const char *  error;
307   unsigned long instruction;
308   int           size;
309   int           size_req;
310   int           cond;
311   /* "uncond_value" is set to the value in place of the conditional field in
312      unconditional versions of the instruction, or -1 if nothing is
313      appropriate.  */
314   int           uncond_value;
315   struct neon_type vectype;
316   /* Set to the opcode if the instruction needs relaxation.
317      Zero if the instruction is not relaxed.  */
318   unsigned long relax;
319   struct
320   {
321     bfd_reloc_code_real_type type;
322     expressionS              exp;
323     int                      pc_rel;
324   } reloc;
325
326   struct
327   {
328     unsigned reg;
329     signed int imm;
330     struct neon_type_el vectype;
331     unsigned present    : 1;  /* Operand present.  */
332     unsigned isreg      : 1;  /* Operand was a register.  */
333     unsigned immisreg   : 1;  /* .imm field is a second register.  */
334     unsigned isscalar   : 1;  /* Operand is a (Neon) scalar.  */
335     unsigned immisalign : 1;  /* Immediate is an alignment specifier.  */
336     unsigned immisfloat : 1;  /* Immediate was parsed as a float.  */
337     /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
338        instructions. This allows us to disambiguate ARM <-> vector insns.  */
339     unsigned regisimm   : 1;  /* 64-bit immediate, reg forms high 32 bits.  */
340     unsigned isvec      : 1;  /* Is a single, double or quad VFP/Neon reg.  */
341     unsigned isquad     : 1;  /* Operand is Neon quad-precision register.  */
342     unsigned issingle   : 1;  /* Operand is VFP single-precision register.  */
343     unsigned hasreloc   : 1;  /* Operand has relocation suffix.  */
344     unsigned writeback  : 1;  /* Operand has trailing !  */
345     unsigned preind     : 1;  /* Preindexed address.  */
346     unsigned postind    : 1;  /* Postindexed address.  */
347     unsigned negative   : 1;  /* Index register was negated.  */
348     unsigned shifted    : 1;  /* Shift applied to operation.  */
349     unsigned shift_kind : 3;  /* Shift operation (enum shift_kind).  */
350   } operands[6];
351 };
352
353 static struct arm_it inst;
354
355 #define NUM_FLOAT_VALS 8
356
357 const char * fp_const[] =
358 {
359   "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
360 };
361
362 /* Number of littlenums required to hold an extended precision number.  */
363 #define MAX_LITTLENUMS 6
364
365 LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
366
367 #define FAIL    (-1)
368 #define SUCCESS (0)
369
370 #define SUFF_S 1
371 #define SUFF_D 2
372 #define SUFF_E 3
373 #define SUFF_P 4
374
375 #define CP_T_X   0x00008000
376 #define CP_T_Y   0x00400000
377
378 #define CONDS_BIT        0x00100000
379 #define LOAD_BIT         0x00100000
380
381 #define DOUBLE_LOAD_FLAG 0x00000001
382
383 struct asm_cond
384 {
385   const char *  template;
386   unsigned long value;
387 };
388
389 #define COND_ALWAYS 0xE
390
391 struct asm_psr
392 {
393   const char *template;
394   unsigned long field;
395 };
396
397 struct asm_barrier_opt
398 {
399   const char *template;
400   unsigned long value;
401 };
402
403 /* The bit that distinguishes CPSR and SPSR.  */
404 #define SPSR_BIT   (1 << 22)
405
406 /* The individual PSR flag bits.  */
407 #define PSR_c   (1 << 16)
408 #define PSR_x   (1 << 17)
409 #define PSR_s   (1 << 18)
410 #define PSR_f   (1 << 19)
411
412 struct reloc_entry
413 {
414   char *name;
415   bfd_reloc_code_real_type reloc;
416 };
417
418 enum vfp_reg_pos
419 {
420   VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
421   VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
422 };
423
424 enum vfp_ldstm_type
425 {
426   VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
427 };
428
429 /* Bits for DEFINED field in neon_typed_alias.  */
430 #define NTA_HASTYPE  1
431 #define NTA_HASINDEX 2
432
433 struct neon_typed_alias
434 {
435   unsigned char defined;
436   unsigned char index;
437   struct neon_type_el eltype;
438 };
439
440 /* ARM register categories.  This includes coprocessor numbers and various
441    architecture extensions' registers.  */
442 enum arm_reg_type
443 {
444   REG_TYPE_RN,
445   REG_TYPE_CP,
446   REG_TYPE_CN,
447   REG_TYPE_FN,
448   REG_TYPE_VFS,
449   REG_TYPE_VFD,
450   REG_TYPE_NQ,
451   REG_TYPE_VFSD,
452   REG_TYPE_NDQ,
453   REG_TYPE_NSDQ,
454   REG_TYPE_VFC,
455   REG_TYPE_MVF,
456   REG_TYPE_MVD,
457   REG_TYPE_MVFX,
458   REG_TYPE_MVDX,
459   REG_TYPE_MVAX,
460   REG_TYPE_DSPSC,
461   REG_TYPE_MMXWR,
462   REG_TYPE_MMXWC,
463   REG_TYPE_MMXWCG,
464   REG_TYPE_XSCALE,
465 };
466
467 /* Structure for a hash table entry for a register.
468    If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
469    information which states whether a vector type or index is specified (for a
470    register alias created with .dn or .qn). Otherwise NEON should be NULL.  */
471 struct reg_entry
472 {
473   const char        *name;
474   unsigned char      number;
475   unsigned char      type;
476   unsigned char      builtin;
477   struct neon_typed_alias *neon;
478 };
479
480 /* Diagnostics used when we don't get a register of the expected type.  */
481 const char *const reg_expected_msgs[] =
482 {
483   N_("ARM register expected"),
484   N_("bad or missing co-processor number"),
485   N_("co-processor register expected"),
486   N_("FPA register expected"),
487   N_("VFP single precision register expected"),
488   N_("VFP/Neon double precision register expected"),
489   N_("Neon quad precision register expected"),
490   N_("VFP single or double precision register expected"),
491   N_("Neon double or quad precision register expected"),
492   N_("VFP single, double or Neon quad precision register expected"),
493   N_("VFP system register expected"),
494   N_("Maverick MVF register expected"),
495   N_("Maverick MVD register expected"),
496   N_("Maverick MVFX register expected"),
497   N_("Maverick MVDX register expected"),
498   N_("Maverick MVAX register expected"),
499   N_("Maverick DSPSC register expected"),
500   N_("iWMMXt data register expected"),
501   N_("iWMMXt control register expected"),
502   N_("iWMMXt scalar register expected"),
503   N_("XScale accumulator register expected"),
504 };
505
506 /* Some well known registers that we refer to directly elsewhere.  */
507 #define REG_SP  13
508 #define REG_LR  14
509 #define REG_PC  15
510
511 /* ARM instructions take 4bytes in the object file, Thumb instructions
512    take 2:  */
513 #define INSN_SIZE       4
514
515 struct asm_opcode
516 {
517   /* Basic string to match.  */
518   const char *template;
519
520   /* Parameters to instruction.  */
521   unsigned char operands[8];
522
523   /* Conditional tag - see opcode_lookup.  */
524   unsigned int tag : 4;
525
526   /* Basic instruction code.  */
527   unsigned int avalue : 28;
528
529   /* Thumb-format instruction code.  */
530   unsigned int tvalue;
531
532   /* Which architecture variant provides this instruction.  */
533   const arm_feature_set *avariant;
534   const arm_feature_set *tvariant;
535
536   /* Function to call to encode instruction in ARM format.  */
537   void (* aencode) (void);
538
539   /* Function to call to encode instruction in Thumb format.  */
540   void (* tencode) (void);
541 };
542
543 /* Defines for various bits that we will want to toggle.  */
544 #define INST_IMMEDIATE  0x02000000
545 #define OFFSET_REG      0x02000000
546 #define HWOFFSET_IMM    0x00400000
547 #define SHIFT_BY_REG    0x00000010
548 #define PRE_INDEX       0x01000000
549 #define INDEX_UP        0x00800000
550 #define WRITE_BACK      0x00200000
551 #define LDM_TYPE_2_OR_3 0x00400000
552 #define CPSI_MMOD       0x00020000
553
554 #define LITERAL_MASK    0xf000f000
555 #define OPCODE_MASK     0xfe1fffff
556 #define V4_STR_BIT      0x00000020
557
558 #define T2_SUBS_PC_LR   0xf3de8f00
559
560 #define DATA_OP_SHIFT   21
561
562 #define T2_OPCODE_MASK  0xfe1fffff
563 #define T2_DATA_OP_SHIFT 21
564
565 /* Codes to distinguish the arithmetic instructions.  */
566 #define OPCODE_AND      0
567 #define OPCODE_EOR      1
568 #define OPCODE_SUB      2
569 #define OPCODE_RSB      3
570 #define OPCODE_ADD      4
571 #define OPCODE_ADC      5
572 #define OPCODE_SBC      6
573 #define OPCODE_RSC      7
574 #define OPCODE_TST      8
575 #define OPCODE_TEQ      9
576 #define OPCODE_CMP      10
577 #define OPCODE_CMN      11
578 #define OPCODE_ORR      12
579 #define OPCODE_MOV      13
580 #define OPCODE_BIC      14
581 #define OPCODE_MVN      15
582
583 #define T2_OPCODE_AND   0
584 #define T2_OPCODE_BIC   1
585 #define T2_OPCODE_ORR   2
586 #define T2_OPCODE_ORN   3
587 #define T2_OPCODE_EOR   4
588 #define T2_OPCODE_ADD   8
589 #define T2_OPCODE_ADC   10
590 #define T2_OPCODE_SBC   11
591 #define T2_OPCODE_SUB   13
592 #define T2_OPCODE_RSB   14
593
594 #define T_OPCODE_MUL 0x4340
595 #define T_OPCODE_TST 0x4200
596 #define T_OPCODE_CMN 0x42c0
597 #define T_OPCODE_NEG 0x4240
598 #define T_OPCODE_MVN 0x43c0
599
600 #define T_OPCODE_ADD_R3 0x1800
601 #define T_OPCODE_SUB_R3 0x1a00
602 #define T_OPCODE_ADD_HI 0x4400
603 #define T_OPCODE_ADD_ST 0xb000
604 #define T_OPCODE_SUB_ST 0xb080
605 #define T_OPCODE_ADD_SP 0xa800
606 #define T_OPCODE_ADD_PC 0xa000
607 #define T_OPCODE_ADD_I8 0x3000
608 #define T_OPCODE_SUB_I8 0x3800
609 #define T_OPCODE_ADD_I3 0x1c00
610 #define T_OPCODE_SUB_I3 0x1e00
611
612 #define T_OPCODE_ASR_R  0x4100
613 #define T_OPCODE_LSL_R  0x4080
614 #define T_OPCODE_LSR_R  0x40c0
615 #define T_OPCODE_ROR_R  0x41c0
616 #define T_OPCODE_ASR_I  0x1000
617 #define T_OPCODE_LSL_I  0x0000
618 #define T_OPCODE_LSR_I  0x0800
619
620 #define T_OPCODE_MOV_I8 0x2000
621 #define T_OPCODE_CMP_I8 0x2800
622 #define T_OPCODE_CMP_LR 0x4280
623 #define T_OPCODE_MOV_HR 0x4600
624 #define T_OPCODE_CMP_HR 0x4500
625
626 #define T_OPCODE_LDR_PC 0x4800
627 #define T_OPCODE_LDR_SP 0x9800
628 #define T_OPCODE_STR_SP 0x9000
629 #define T_OPCODE_LDR_IW 0x6800
630 #define T_OPCODE_STR_IW 0x6000
631 #define T_OPCODE_LDR_IH 0x8800
632 #define T_OPCODE_STR_IH 0x8000
633 #define T_OPCODE_LDR_IB 0x7800
634 #define T_OPCODE_STR_IB 0x7000
635 #define T_OPCODE_LDR_RW 0x5800
636 #define T_OPCODE_STR_RW 0x5000
637 #define T_OPCODE_LDR_RH 0x5a00
638 #define T_OPCODE_STR_RH 0x5200
639 #define T_OPCODE_LDR_RB 0x5c00
640 #define T_OPCODE_STR_RB 0x5400
641
642 #define T_OPCODE_PUSH   0xb400
643 #define T_OPCODE_POP    0xbc00
644
645 #define T_OPCODE_BRANCH 0xe000
646
647 #define THUMB_SIZE      2       /* Size of thumb instruction.  */
648 #define THUMB_PP_PC_LR 0x0100
649 #define THUMB_LOAD_BIT 0x0800
650 #define THUMB2_LOAD_BIT 0x00100000
651
652 #define BAD_ARGS        _("bad arguments to instruction")
653 #define BAD_PC          _("r15 not allowed here")
654 #define BAD_SP          _("r13 not allowed here")
655 #define BAD_COND        _("instruction cannot be conditional")
656 #define BAD_OVERLAP     _("registers may not be the same")
657 #define BAD_HIREG       _("lo register required")
658 #define BAD_THUMB32     _("instruction not supported in Thumb16 mode")
659 #define BAD_ADDR_MODE   _("instruction does not accept this addressing mode");
660 #define BAD_BRANCH      _("branch must be last instruction in IT block")
661 #define BAD_NOT_IT      _("instruction not allowed in IT block")
662 #define BAD_FPU         _("selected FPU does not support instruction")
663 #define BAD_VMRS        _("APSR_nzcv may only be used with fpscr")
664
665 static struct hash_control *arm_ops_hsh;
666 static struct hash_control *arm_cond_hsh;
667 static struct hash_control *arm_shift_hsh;
668 static struct hash_control *arm_psr_hsh;
669 static struct hash_control *arm_v7m_psr_hsh;
670 static struct hash_control *arm_reg_hsh;
671 static struct hash_control *arm_reloc_hsh;
672 static struct hash_control *arm_barrier_opt_hsh;
673
674 /* Stuff needed to resolve the label ambiguity
675    As:
676      ...
677      label:   <insn>
678    may differ from:
679      ...
680      label:
681               <insn>
682 */
683
684 symbolS *  last_label_seen;
685 static int label_is_thumb_function_name = FALSE;
686 \f
687 /* Literal pool structure.  Held on a per-section
688    and per-sub-section basis.  */
689
690 #define MAX_LITERAL_POOL_SIZE 1024
691 typedef struct literal_pool
692 {
693   expressionS    literals [MAX_LITERAL_POOL_SIZE];
694   unsigned int   next_free_entry;
695   unsigned int   id;
696   symbolS *      symbol;
697   segT           section;
698   subsegT        sub_section;
699   struct literal_pool * next;
700 } literal_pool;
701
702 /* Pointer to a linked list of literal pools.  */
703 literal_pool * list_of_pools = NULL;
704
705 /* State variables for IT block handling.  */
706 static bfd_boolean current_it_mask = 0;
707 static int current_cc;
708
709 \f
710 /* Pure syntax.  */
711
712 /* This array holds the chars that always start a comment.  If the
713    pre-processor is disabled, these aren't very useful.  */
714 const char comment_chars[] = "@";
715
716 /* This array holds the chars that only start a comment at the beginning of
717    a line.  If the line seems to have the form '# 123 filename'
718    .line and .file directives will appear in the pre-processed output.  */
719 /* Note that input_file.c hand checks for '#' at the beginning of the
720    first line of the input file.  This is because the compiler outputs
721    #NO_APP at the beginning of its output.  */
722 /* Also note that comments like this one will always work.  */
723 const char line_comment_chars[] = "#";
724
725 const char line_separator_chars[] = ";";
726
727 /* Chars that can be used to separate mant
728    from exp in floating point numbers.  */
729 const char EXP_CHARS[] = "eE";
730
731 /* Chars that mean this number is a floating point constant.  */
732 /* As in 0f12.456  */
733 /* or    0d1.2345e12  */
734
735 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
736
737 /* Prefix characters that indicate the start of an immediate
738    value.  */
739 #define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
740
741 /* Separator character handling.  */
742
743 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
744
745 static inline int
746 skip_past_char (char ** str, char c)
747 {
748   if (**str == c)
749     {
750       (*str)++;
751       return SUCCESS;
752     }
753   else
754     return FAIL;
755 }
756 #define skip_past_comma(str) skip_past_char (str, ',')
757
758 /* Arithmetic expressions (possibly involving symbols).  */
759
760 /* Return TRUE if anything in the expression is a bignum.  */
761
762 static int
763 walk_no_bignums (symbolS * sp)
764 {
765   if (symbol_get_value_expression (sp)->X_op == O_big)
766     return 1;
767
768   if (symbol_get_value_expression (sp)->X_add_symbol)
769     {
770       return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
771               || (symbol_get_value_expression (sp)->X_op_symbol
772                   && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
773     }
774
775   return 0;
776 }
777
778 static int in_my_get_expression = 0;
779
780 /* Third argument to my_get_expression.  */
781 #define GE_NO_PREFIX 0
782 #define GE_IMM_PREFIX 1
783 #define GE_OPT_PREFIX 2
784 /* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
785    immediates, as can be used in Neon VMVN and VMOV immediate instructions.  */
786 #define GE_OPT_PREFIX_BIG 3
787
788 static int
789 my_get_expression (expressionS * ep, char ** str, int prefix_mode)
790 {
791   char * save_in;
792   segT   seg;
793
794   /* In unified syntax, all prefixes are optional.  */
795   if (unified_syntax)
796     prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
797                   : GE_OPT_PREFIX;
798
799   switch (prefix_mode)
800     {
801     case GE_NO_PREFIX: break;
802     case GE_IMM_PREFIX:
803       if (!is_immediate_prefix (**str))
804         {
805           inst.error = _("immediate expression requires a # prefix");
806           return FAIL;
807         }
808       (*str)++;
809       break;
810     case GE_OPT_PREFIX:
811     case GE_OPT_PREFIX_BIG:
812       if (is_immediate_prefix (**str))
813         (*str)++;
814       break;
815     default: abort ();
816     }
817
818   memset (ep, 0, sizeof (expressionS));
819
820   save_in = input_line_pointer;
821   input_line_pointer = *str;
822   in_my_get_expression = 1;
823   seg = expression (ep);
824   in_my_get_expression = 0;
825
826   if (ep->X_op == O_illegal)
827     {
828       /* We found a bad expression in md_operand().  */
829       *str = input_line_pointer;
830       input_line_pointer = save_in;
831       if (inst.error == NULL)
832         inst.error = _("bad expression");
833       return 1;
834     }
835
836 #ifdef OBJ_AOUT
837   if (seg != absolute_section
838       && seg != text_section
839       && seg != data_section
840       && seg != bss_section
841       && seg != undefined_section)
842     {
843       inst.error = _("bad segment");
844       *str = input_line_pointer;
845       input_line_pointer = save_in;
846       return 1;
847     }
848 #endif
849
850   /* Get rid of any bignums now, so that we don't generate an error for which
851      we can't establish a line number later on.  Big numbers are never valid
852      in instructions, which is where this routine is always called.  */
853   if (prefix_mode != GE_OPT_PREFIX_BIG
854       && (ep->X_op == O_big
855           || (ep->X_add_symbol
856               && (walk_no_bignums (ep->X_add_symbol)
857                   || (ep->X_op_symbol
858                       && walk_no_bignums (ep->X_op_symbol))))))
859     {
860       inst.error = _("invalid constant");
861       *str = input_line_pointer;
862       input_line_pointer = save_in;
863       return 1;
864     }
865
866   *str = input_line_pointer;
867   input_line_pointer = save_in;
868   return 0;
869 }
870
871 /* Turn a string in input_line_pointer into a floating point constant
872    of type TYPE, and store the appropriate bytes in *LITP.  The number
873    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
874    returned, or NULL on OK.
875
876    Note that fp constants aren't represent in the normal way on the ARM.
877    In big endian mode, things are as expected.  However, in little endian
878    mode fp constants are big-endian word-wise, and little-endian byte-wise
879    within the words.  For example, (double) 1.1 in big endian mode is
880    the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
881    the byte sequence 99 99 f1 3f 9a 99 99 99.
882
883    ??? The format of 12 byte floats is uncertain according to gcc's arm.h.  */
884
885 char *
886 md_atof (int type, char * litP, int * sizeP)
887 {
888   int prec;
889   LITTLENUM_TYPE words[MAX_LITTLENUMS];
890   char *t;
891   int i;
892
893   switch (type)
894     {
895     case 'f':
896     case 'F':
897     case 's':
898     case 'S':
899       prec = 2;
900       break;
901
902     case 'd':
903     case 'D':
904     case 'r':
905     case 'R':
906       prec = 4;
907       break;
908
909     case 'x':
910     case 'X':
911       prec = 6;
912       break;
913
914     case 'p':
915     case 'P':
916       prec = 6;
917       break;
918
919     default:
920       *sizeP = 0;
921       return _("bad call to MD_ATOF()");
922     }
923
924   t = atof_ieee (input_line_pointer, type, words);
925   if (t)
926     input_line_pointer = t;
927   *sizeP = prec * 2;
928
929   if (target_big_endian)
930     {
931       for (i = 0; i < prec; i++)
932         {
933           md_number_to_chars (litP, (valueT) words[i], 2);
934           litP += 2;
935         }
936     }
937   else
938     {
939       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
940         for (i = prec - 1; i >= 0; i--)
941           {
942             md_number_to_chars (litP, (valueT) words[i], 2);
943             litP += 2;
944           }
945       else
946         /* For a 4 byte float the order of elements in `words' is 1 0.
947            For an 8 byte float the order is 1 0 3 2.  */
948         for (i = 0; i < prec; i += 2)
949           {
950             md_number_to_chars (litP, (valueT) words[i + 1], 2);
951             md_number_to_chars (litP + 2, (valueT) words[i], 2);
952             litP += 4;
953           }
954     }
955
956   return 0;
957 }
958
959 /* We handle all bad expressions here, so that we can report the faulty
960    instruction in the error message.  */
961 void
962 md_operand (expressionS * expr)
963 {
964   if (in_my_get_expression)
965     expr->X_op = O_illegal;
966 }
967
968 /* Immediate values.  */
969
970 /* Generic immediate-value read function for use in directives.
971    Accepts anything that 'expression' can fold to a constant.
972    *val receives the number.  */
973 #ifdef OBJ_ELF
974 static int
975 immediate_for_directive (int *val)
976 {
977   expressionS exp;
978   exp.X_op = O_illegal;
979
980   if (is_immediate_prefix (*input_line_pointer))
981     {
982       input_line_pointer++;
983       expression (&exp);
984     }
985
986   if (exp.X_op != O_constant)
987     {
988       as_bad (_("expected #constant"));
989       ignore_rest_of_line ();
990       return FAIL;
991     }
992   *val = exp.X_add_number;
993   return SUCCESS;
994 }
995 #endif
996
997 /* Register parsing.  */
998
999 /* Generic register parser.  CCP points to what should be the
1000    beginning of a register name.  If it is indeed a valid register
1001    name, advance CCP over it and return the reg_entry structure;
1002    otherwise return NULL.  Does not issue diagnostics.  */
1003
1004 static struct reg_entry *
1005 arm_reg_parse_multi (char **ccp)
1006 {
1007   char *start = *ccp;
1008   char *p;
1009   struct reg_entry *reg;
1010
1011 #ifdef REGISTER_PREFIX
1012   if (*start != REGISTER_PREFIX)
1013     return NULL;
1014   start++;
1015 #endif
1016 #ifdef OPTIONAL_REGISTER_PREFIX
1017   if (*start == OPTIONAL_REGISTER_PREFIX)
1018     start++;
1019 #endif
1020
1021   p = start;
1022   if (!ISALPHA (*p) || !is_name_beginner (*p))
1023     return NULL;
1024
1025   do
1026     p++;
1027   while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1028
1029   reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1030
1031   if (!reg)
1032     return NULL;
1033
1034   *ccp = p;
1035   return reg;
1036 }
1037
1038 static int
1039 arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
1040                     enum arm_reg_type type)
1041 {
1042   /* Alternative syntaxes are accepted for a few register classes.  */
1043   switch (type)
1044     {
1045     case REG_TYPE_MVF:
1046     case REG_TYPE_MVD:
1047     case REG_TYPE_MVFX:
1048     case REG_TYPE_MVDX:
1049       /* Generic coprocessor register names are allowed for these.  */
1050       if (reg && reg->type == REG_TYPE_CN)
1051         return reg->number;
1052       break;
1053
1054     case REG_TYPE_CP:
1055       /* For backward compatibility, a bare number is valid here.  */
1056       {
1057         unsigned long processor = strtoul (start, ccp, 10);
1058         if (*ccp != start && processor <= 15)
1059           return processor;
1060       }
1061
1062     case REG_TYPE_MMXWC:
1063       /* WC includes WCG.  ??? I'm not sure this is true for all
1064          instructions that take WC registers.  */
1065       if (reg && reg->type == REG_TYPE_MMXWCG)
1066         return reg->number;
1067       break;
1068
1069     default:
1070       break;
1071     }
1072
1073   return FAIL;
1074 }
1075
1076 /* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1077    return value is the register number or FAIL.  */
1078
1079 static int
1080 arm_reg_parse (char **ccp, enum arm_reg_type type)
1081 {
1082   char *start = *ccp;
1083   struct reg_entry *reg = arm_reg_parse_multi (ccp);
1084   int ret;
1085
1086   /* Do not allow a scalar (reg+index) to parse as a register.  */
1087   if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1088     return FAIL;
1089
1090   if (reg && reg->type == type)
1091     return reg->number;
1092
1093   if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1094     return ret;
1095
1096   *ccp = start;
1097   return FAIL;
1098 }
1099
1100 /* Parse a Neon type specifier. *STR should point at the leading '.'
1101    character. Does no verification at this stage that the type fits the opcode
1102    properly. E.g.,
1103
1104      .i32.i32.s16
1105      .s32.f32
1106      .u16
1107
1108    Can all be legally parsed by this function.
1109
1110    Fills in neon_type struct pointer with parsed information, and updates STR
1111    to point after the parsed type specifier. Returns SUCCESS if this was a legal
1112    type, FAIL if not.  */
1113
1114 static int
1115 parse_neon_type (struct neon_type *type, char **str)
1116 {
1117   char *ptr = *str;
1118
1119   if (type)
1120     type->elems = 0;
1121
1122   while (type->elems < NEON_MAX_TYPE_ELS)
1123     {
1124       enum neon_el_type thistype = NT_untyped;
1125       unsigned thissize = -1u;
1126
1127       if (*ptr != '.')
1128         break;
1129
1130       ptr++;
1131
1132       /* Just a size without an explicit type.  */
1133       if (ISDIGIT (*ptr))
1134         goto parsesize;
1135
1136       switch (TOLOWER (*ptr))
1137         {
1138         case 'i': thistype = NT_integer; break;
1139         case 'f': thistype = NT_float; break;
1140         case 'p': thistype = NT_poly; break;
1141         case 's': thistype = NT_signed; break;
1142         case 'u': thistype = NT_unsigned; break;
1143         case 'd':
1144           thistype = NT_float;
1145           thissize = 64;
1146           ptr++;
1147           goto done;
1148         default:
1149           as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1150           return FAIL;
1151         }
1152
1153       ptr++;
1154
1155       /* .f is an abbreviation for .f32.  */
1156       if (thistype == NT_float && !ISDIGIT (*ptr))
1157         thissize = 32;
1158       else
1159         {
1160         parsesize:
1161           thissize = strtoul (ptr, &ptr, 10);
1162
1163           if (thissize != 8 && thissize != 16 && thissize != 32
1164               && thissize != 64)
1165             {
1166               as_bad (_("bad size %d in type specifier"), thissize);
1167               return FAIL;
1168             }
1169         }
1170
1171       done:
1172       if (type)
1173         {
1174           type->el[type->elems].type = thistype;
1175           type->el[type->elems].size = thissize;
1176           type->elems++;
1177         }
1178     }
1179
1180   /* Empty/missing type is not a successful parse.  */
1181   if (type->elems == 0)
1182     return FAIL;
1183
1184   *str = ptr;
1185
1186   return SUCCESS;
1187 }
1188
1189 /* Errors may be set multiple times during parsing or bit encoding
1190    (particularly in the Neon bits), but usually the earliest error which is set
1191    will be the most meaningful. Avoid overwriting it with later (cascading)
1192    errors by calling this function.  */
1193
1194 static void
1195 first_error (const char *err)
1196 {
1197   if (!inst.error)
1198     inst.error = err;
1199 }
1200
1201 /* Parse a single type, e.g. ".s32", leading period included.  */
1202 static int
1203 parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1204 {
1205   char *str = *ccp;
1206   struct neon_type optype;
1207
1208   if (*str == '.')
1209     {
1210       if (parse_neon_type (&optype, &str) == SUCCESS)
1211         {
1212           if (optype.elems == 1)
1213             *vectype = optype.el[0];
1214           else
1215             {
1216               first_error (_("only one type should be specified for operand"));
1217               return FAIL;
1218             }
1219         }
1220       else
1221         {
1222           first_error (_("vector type expected"));
1223           return FAIL;
1224         }
1225     }
1226   else
1227     return FAIL;
1228   
1229   *ccp = str;
1230   
1231   return SUCCESS;
1232 }
1233
1234 /* Special meanings for indices (which have a range of 0-7), which will fit into
1235    a 4-bit integer.  */
1236
1237 #define NEON_ALL_LANES          15
1238 #define NEON_INTERLEAVE_LANES   14
1239
1240 /* Parse either a register or a scalar, with an optional type. Return the
1241    register number, and optionally fill in the actual type of the register
1242    when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1243    type/index information in *TYPEINFO.  */
1244
1245 static int
1246 parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
1247                            enum arm_reg_type *rtype,
1248                            struct neon_typed_alias *typeinfo)
1249 {
1250   char *str = *ccp;
1251   struct reg_entry *reg = arm_reg_parse_multi (&str);
1252   struct neon_typed_alias atype;
1253   struct neon_type_el parsetype;
1254
1255   atype.defined = 0;
1256   atype.index = -1;
1257   atype.eltype.type = NT_invtype;
1258   atype.eltype.size = -1;
1259
1260   /* Try alternate syntax for some types of register. Note these are mutually
1261      exclusive with the Neon syntax extensions.  */
1262   if (reg == NULL)
1263     {
1264       int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1265       if (altreg != FAIL)
1266         *ccp = str;
1267       if (typeinfo)
1268         *typeinfo = atype;
1269       return altreg;
1270     }
1271
1272   /* Undo polymorphism when a set of register types may be accepted.  */
1273   if ((type == REG_TYPE_NDQ
1274        && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1275       || (type == REG_TYPE_VFSD
1276           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1277       || (type == REG_TYPE_NSDQ
1278           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
1279               || reg->type == REG_TYPE_NQ))
1280       || (type == REG_TYPE_MMXWC
1281           && (reg->type == REG_TYPE_MMXWCG)))
1282     type = reg->type;
1283
1284   if (type != reg->type)
1285     return FAIL;
1286
1287   if (reg->neon)
1288     atype = *reg->neon;
1289   
1290   if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1291     {
1292       if ((atype.defined & NTA_HASTYPE) != 0)
1293         {
1294           first_error (_("can't redefine type for operand"));
1295           return FAIL;
1296         }
1297       atype.defined |= NTA_HASTYPE;
1298       atype.eltype = parsetype;
1299     }
1300     
1301   if (skip_past_char (&str, '[') == SUCCESS)
1302     {
1303       if (type != REG_TYPE_VFD)
1304         {
1305           first_error (_("only D registers may be indexed"));
1306           return FAIL;
1307         }
1308     
1309       if ((atype.defined & NTA_HASINDEX) != 0)
1310         {
1311           first_error (_("can't change index for operand"));
1312           return FAIL;
1313         }
1314
1315       atype.defined |= NTA_HASINDEX;
1316
1317       if (skip_past_char (&str, ']') == SUCCESS)
1318         atype.index = NEON_ALL_LANES;
1319       else
1320         {
1321           expressionS exp;
1322
1323           my_get_expression (&exp, &str, GE_NO_PREFIX);
1324
1325           if (exp.X_op != O_constant)
1326             {
1327               first_error (_("constant expression required"));
1328               return FAIL;
1329             }
1330
1331           if (skip_past_char (&str, ']') == FAIL)
1332             return FAIL;
1333
1334           atype.index = exp.X_add_number;
1335         }
1336     }
1337   
1338   if (typeinfo)
1339     *typeinfo = atype;
1340   
1341   if (rtype)
1342     *rtype = type;
1343   
1344   *ccp = str;
1345   
1346   return reg->number;
1347 }
1348
1349 /* Like arm_reg_parse, but allow allow the following extra features:
1350     - If RTYPE is non-zero, return the (possibly restricted) type of the
1351       register (e.g. Neon double or quad reg when either has been requested).
1352     - If this is a Neon vector type with additional type information, fill
1353       in the struct pointed to by VECTYPE (if non-NULL).
1354    This function will fault on encountering a scalar.
1355 */
1356
1357 static int
1358 arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
1359                      enum arm_reg_type *rtype, struct neon_type_el *vectype)
1360 {
1361   struct neon_typed_alias atype;
1362   char *str = *ccp;
1363   int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1364
1365   if (reg == FAIL)
1366     return FAIL;
1367
1368   /* Do not allow a scalar (reg+index) to parse as a register.  */
1369   if ((atype.defined & NTA_HASINDEX) != 0)
1370     {
1371       first_error (_("register operand expected, but got scalar"));
1372       return FAIL;
1373     }
1374
1375   if (vectype)
1376     *vectype = atype.eltype;
1377
1378   *ccp = str;
1379
1380   return reg;
1381 }
1382
1383 #define NEON_SCALAR_REG(X)      ((X) >> 4)
1384 #define NEON_SCALAR_INDEX(X)    ((X) & 15)
1385
1386 /* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1387    have enough information to be able to do a good job bounds-checking. So, we
1388    just do easy checks here, and do further checks later.  */
1389
1390 static int
1391 parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
1392 {
1393   int reg;
1394   char *str = *ccp;
1395   struct neon_typed_alias atype;
1396   
1397   reg = parse_typed_reg_or_scalar (&str, REG_TYPE_VFD, NULL, &atype);
1398   
1399   if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
1400     return FAIL;
1401   
1402   if (atype.index == NEON_ALL_LANES)
1403     {
1404       first_error (_("scalar must have an index"));
1405       return FAIL;
1406     }
1407   else if (atype.index >= 64 / elsize)
1408     {
1409       first_error (_("scalar index out of range"));
1410       return FAIL;
1411     }
1412   
1413   if (type)
1414     *type = atype.eltype;
1415   
1416   *ccp = str;
1417   
1418   return reg * 16 + atype.index;
1419 }
1420
1421 /* Parse an ARM register list.  Returns the bitmask, or FAIL.  */
1422 static long
1423 parse_reg_list (char ** strp)
1424 {
1425   char * str = * strp;
1426   long   range = 0;
1427   int    another_range;
1428
1429   /* We come back here if we get ranges concatenated by '+' or '|'.  */
1430   do
1431     {
1432       another_range = 0;
1433
1434       if (*str == '{')
1435         {
1436           int in_range = 0;
1437           int cur_reg = -1;
1438
1439           str++;
1440           do
1441             {
1442               int reg;
1443
1444               if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
1445                 {
1446                   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
1447                   return FAIL;
1448                 }
1449
1450               if (in_range)
1451                 {
1452                   int i;
1453
1454                   if (reg <= cur_reg)
1455                     {
1456                       first_error (_("bad range in register list"));
1457                       return FAIL;
1458                     }
1459
1460                   for (i = cur_reg + 1; i < reg; i++)
1461                     {
1462                       if (range & (1 << i))
1463                         as_tsktsk
1464                           (_("Warning: duplicated register (r%d) in register list"),
1465                            i);
1466                       else
1467                         range |= 1 << i;
1468                     }
1469                   in_range = 0;
1470                 }
1471
1472               if (range & (1 << reg))
1473                 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1474                            reg);
1475               else if (reg <= cur_reg)
1476                 as_tsktsk (_("Warning: register range not in ascending order"));
1477
1478               range |= 1 << reg;
1479               cur_reg = reg;
1480             }
1481           while (skip_past_comma (&str) != FAIL
1482                  || (in_range = 1, *str++ == '-'));
1483           str--;
1484
1485           if (*str++ != '}')
1486             {
1487               first_error (_("missing `}'"));
1488               return FAIL;
1489             }
1490         }
1491       else
1492         {
1493           expressionS expr;
1494
1495           if (my_get_expression (&expr, &str, GE_NO_PREFIX))
1496             return FAIL;
1497
1498           if (expr.X_op == O_constant)
1499             {
1500               if (expr.X_add_number
1501                   != (expr.X_add_number & 0x0000ffff))
1502                 {
1503                   inst.error = _("invalid register mask");
1504                   return FAIL;
1505                 }
1506
1507               if ((range & expr.X_add_number) != 0)
1508                 {
1509                   int regno = range & expr.X_add_number;
1510
1511                   regno &= -regno;
1512                   regno = (1 << regno) - 1;
1513                   as_tsktsk
1514                     (_("Warning: duplicated register (r%d) in register list"),
1515                      regno);
1516                 }
1517
1518               range |= expr.X_add_number;
1519             }
1520           else
1521             {
1522               if (inst.reloc.type != 0)
1523                 {
1524                   inst.error = _("expression too complex");
1525                   return FAIL;
1526                 }
1527
1528               memcpy (&inst.reloc.exp, &expr, sizeof (expressionS));
1529               inst.reloc.type = BFD_RELOC_ARM_MULTI;
1530               inst.reloc.pc_rel = 0;
1531             }
1532         }
1533
1534       if (*str == '|' || *str == '+')
1535         {
1536           str++;
1537           another_range = 1;
1538         }
1539     }
1540   while (another_range);
1541
1542   *strp = str;
1543   return range;
1544 }
1545
1546 /* Types of registers in a list.  */
1547
1548 enum reg_list_els
1549 {
1550   REGLIST_VFP_S,
1551   REGLIST_VFP_D,
1552   REGLIST_NEON_D
1553 };
1554
1555 /* Parse a VFP register list.  If the string is invalid return FAIL.
1556    Otherwise return the number of registers, and set PBASE to the first
1557    register.  Parses registers of type ETYPE.
1558    If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1559      - Q registers can be used to specify pairs of D registers
1560      - { } can be omitted from around a singleton register list
1561          FIXME: This is not implemented, as it would require backtracking in
1562          some cases, e.g.:
1563            vtbl.8 d3,d4,d5
1564          This could be done (the meaning isn't really ambiguous), but doesn't
1565          fit in well with the current parsing framework.
1566      - 32 D registers may be used (also true for VFPv3).
1567    FIXME: Types are ignored in these register lists, which is probably a
1568    bug.  */
1569
1570 static int
1571 parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype)
1572 {
1573   char *str = *ccp;
1574   int base_reg;
1575   int new_base;
1576   enum arm_reg_type regtype = 0;
1577   int max_regs = 0;
1578   int count = 0;
1579   int warned = 0;
1580   unsigned long mask = 0;
1581   int i;
1582
1583   if (*str != '{')
1584     {
1585       inst.error = _("expecting {");
1586       return FAIL;
1587     }
1588
1589   str++;
1590
1591   switch (etype)
1592     {
1593     case REGLIST_VFP_S:
1594       regtype = REG_TYPE_VFS;
1595       max_regs = 32;
1596       break;
1597     
1598     case REGLIST_VFP_D:
1599       regtype = REG_TYPE_VFD;
1600       break;
1601     
1602     case REGLIST_NEON_D:
1603       regtype = REG_TYPE_NDQ;
1604       break;
1605     }
1606
1607   if (etype != REGLIST_VFP_S)
1608     {
1609       /* VFPv3 allows 32 D registers.  */
1610       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v3))
1611         {
1612           max_regs = 32;
1613           if (thumb_mode)
1614             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
1615                                     fpu_vfp_ext_v3);
1616           else
1617             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
1618                                     fpu_vfp_ext_v3);
1619         }
1620       else
1621         max_regs = 16;
1622     }
1623
1624   base_reg = max_regs;
1625
1626   do
1627     {
1628       int setmask = 1, addregs = 1;
1629
1630       new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
1631
1632       if (new_base == FAIL)
1633         {
1634           first_error (_(reg_expected_msgs[regtype]));
1635           return FAIL;
1636         }
1637  
1638       if (new_base >= max_regs)
1639         {
1640           first_error (_("register out of range in list"));
1641           return FAIL;
1642         }
1643  
1644       /* Note: a value of 2 * n is returned for the register Q<n>.  */
1645       if (regtype == REG_TYPE_NQ)
1646         {
1647           setmask = 3;
1648           addregs = 2;
1649         }
1650
1651       if (new_base < base_reg)
1652         base_reg = new_base;
1653
1654       if (mask & (setmask << new_base))
1655         {
1656           first_error (_("invalid register list"));
1657           return FAIL;
1658         }
1659
1660       if ((mask >> new_base) != 0 && ! warned)
1661         {
1662           as_tsktsk (_("register list not in ascending order"));
1663           warned = 1;
1664         }
1665
1666       mask |= setmask << new_base;
1667       count += addregs;
1668
1669       if (*str == '-') /* We have the start of a range expression */
1670         {
1671           int high_range;
1672
1673           str++;
1674
1675           if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
1676               == FAIL)
1677             {
1678               inst.error = gettext (reg_expected_msgs[regtype]);
1679               return FAIL;
1680             }
1681
1682           if (high_range >= max_regs)
1683             {
1684               first_error (_("register out of range in list"));
1685               return FAIL;
1686             }
1687
1688           if (regtype == REG_TYPE_NQ)
1689             high_range = high_range + 1;
1690
1691           if (high_range <= new_base)
1692             {
1693               inst.error = _("register range not in ascending order");
1694               return FAIL;
1695             }
1696
1697           for (new_base += addregs; new_base <= high_range; new_base += addregs)
1698             {
1699               if (mask & (setmask << new_base))
1700                 {
1701                   inst.error = _("invalid register list");
1702                   return FAIL;
1703                 }
1704
1705               mask |= setmask << new_base;
1706               count += addregs;
1707             }
1708         }
1709     }
1710   while (skip_past_comma (&str) != FAIL);
1711
1712   str++;
1713
1714   /* Sanity check -- should have raised a parse error above.  */
1715   if (count == 0 || count > max_regs)
1716     abort ();
1717
1718   *pbase = base_reg;
1719
1720   /* Final test -- the registers must be consecutive.  */
1721   mask >>= base_reg;
1722   for (i = 0; i < count; i++)
1723     {
1724       if ((mask & (1u << i)) == 0)
1725         {
1726           inst.error = _("non-contiguous register range");
1727           return FAIL;
1728         }
1729     }
1730
1731   *ccp = str;
1732
1733   return count;
1734 }
1735
1736 /* True if two alias types are the same.  */
1737
1738 static int
1739 neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
1740 {
1741   if (!a && !b)
1742     return 1;
1743     
1744   if (!a || !b)
1745     return 0;
1746
1747   if (a->defined != b->defined)
1748     return 0;
1749   
1750   if ((a->defined & NTA_HASTYPE) != 0
1751       && (a->eltype.type != b->eltype.type
1752           || a->eltype.size != b->eltype.size))
1753     return 0;
1754
1755   if ((a->defined & NTA_HASINDEX) != 0
1756       && (a->index != b->index))
1757     return 0;
1758   
1759   return 1;
1760 }
1761
1762 /* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
1763    The base register is put in *PBASE.
1764    The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
1765    the return value.
1766    The register stride (minus one) is put in bit 4 of the return value.
1767    Bits [6:5] encode the list length (minus one).
1768    The type of the list elements is put in *ELTYPE, if non-NULL.  */
1769
1770 #define NEON_LANE(X)            ((X) & 0xf)
1771 #define NEON_REG_STRIDE(X)      ((((X) >> 4) & 1) + 1)
1772 #define NEON_REGLIST_LENGTH(X)  ((((X) >> 5) & 3) + 1)
1773
1774 static int
1775 parse_neon_el_struct_list (char **str, unsigned *pbase,
1776                            struct neon_type_el *eltype)
1777 {
1778   char *ptr = *str;
1779   int base_reg = -1;
1780   int reg_incr = -1;
1781   int count = 0;
1782   int lane = -1;
1783   int leading_brace = 0;
1784   enum arm_reg_type rtype = REG_TYPE_NDQ;
1785   int addregs = 1;
1786   const char *const incr_error = "register stride must be 1 or 2";
1787   const char *const type_error = "mismatched element/structure types in list";
1788   struct neon_typed_alias firsttype;
1789   
1790   if (skip_past_char (&ptr, '{') == SUCCESS)
1791     leading_brace = 1;
1792   
1793   do
1794     {
1795       struct neon_typed_alias atype;
1796       int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
1797
1798       if (getreg == FAIL)
1799         {
1800           first_error (_(reg_expected_msgs[rtype]));
1801           return FAIL;
1802         }
1803       
1804       if (base_reg == -1)
1805         {
1806           base_reg = getreg;
1807           if (rtype == REG_TYPE_NQ)
1808             {
1809               reg_incr = 1;
1810               addregs = 2;
1811             }
1812           firsttype = atype;
1813         }
1814       else if (reg_incr == -1)
1815         {
1816           reg_incr = getreg - base_reg;
1817           if (reg_incr < 1 || reg_incr > 2)
1818             {
1819               first_error (_(incr_error));
1820               return FAIL;
1821             }
1822         }
1823       else if (getreg != base_reg + reg_incr * count)
1824         {
1825           first_error (_(incr_error));
1826           return FAIL;
1827         }
1828
1829       if (!neon_alias_types_same (&atype, &firsttype))
1830         {
1831           first_error (_(type_error));
1832           return FAIL;
1833         }
1834       
1835       /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
1836          modes.  */
1837       if (ptr[0] == '-')
1838         {
1839           struct neon_typed_alias htype;
1840           int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
1841           if (lane == -1)
1842             lane = NEON_INTERLEAVE_LANES;
1843           else if (lane != NEON_INTERLEAVE_LANES)
1844             {
1845               first_error (_(type_error));
1846               return FAIL;
1847             }
1848           if (reg_incr == -1)
1849             reg_incr = 1;
1850           else if (reg_incr != 1)
1851             {
1852               first_error (_("don't use Rn-Rm syntax with non-unit stride"));
1853               return FAIL;
1854             }
1855           ptr++;
1856           hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
1857           if (hireg == FAIL)
1858             {
1859               first_error (_(reg_expected_msgs[rtype]));
1860               return FAIL;
1861             }
1862           if (!neon_alias_types_same (&htype, &firsttype))
1863             {
1864               first_error (_(type_error));
1865               return FAIL;
1866             }
1867           count += hireg + dregs - getreg;
1868           continue;
1869         }
1870       
1871       /* If we're using Q registers, we can't use [] or [n] syntax.  */
1872       if (rtype == REG_TYPE_NQ)
1873         {
1874           count += 2;
1875           continue;
1876         }
1877       
1878       if ((atype.defined & NTA_HASINDEX) != 0)
1879         {
1880           if (lane == -1)
1881             lane = atype.index;
1882           else if (lane != atype.index)
1883             {
1884               first_error (_(type_error));
1885               return FAIL;
1886             }
1887         }
1888       else if (lane == -1)
1889         lane = NEON_INTERLEAVE_LANES;
1890       else if (lane != NEON_INTERLEAVE_LANES)
1891         {
1892           first_error (_(type_error));
1893           return FAIL;
1894         }
1895       count++;
1896     }
1897   while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
1898   
1899   /* No lane set by [x]. We must be interleaving structures.  */
1900   if (lane == -1)
1901     lane = NEON_INTERLEAVE_LANES;
1902   
1903   /* Sanity check.  */
1904   if (lane == -1 || base_reg == -1 || count < 1 || count > 4
1905       || (count > 1 && reg_incr == -1))
1906     {
1907       first_error (_("error parsing element/structure list"));
1908       return FAIL;
1909     }
1910
1911   if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
1912     {
1913       first_error (_("expected }"));
1914       return FAIL;
1915     }
1916   
1917   if (reg_incr == -1)
1918     reg_incr = 1;
1919
1920   if (eltype)
1921     *eltype = firsttype.eltype;
1922
1923   *pbase = base_reg;
1924   *str = ptr;
1925   
1926   return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
1927 }
1928
1929 /* Parse an explicit relocation suffix on an expression.  This is
1930    either nothing, or a word in parentheses.  Note that if !OBJ_ELF,
1931    arm_reloc_hsh contains no entries, so this function can only
1932    succeed if there is no () after the word.  Returns -1 on error,
1933    BFD_RELOC_UNUSED if there wasn't any suffix.  */
1934 static int
1935 parse_reloc (char **str)
1936 {
1937   struct reloc_entry *r;
1938   char *p, *q;
1939
1940   if (**str != '(')
1941     return BFD_RELOC_UNUSED;
1942
1943   p = *str + 1;
1944   q = p;
1945
1946   while (*q && *q != ')' && *q != ',')
1947     q++;
1948   if (*q != ')')
1949     return -1;
1950
1951   if ((r = hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
1952     return -1;
1953
1954   *str = q + 1;
1955   return r->reloc;
1956 }
1957
1958 /* Directives: register aliases.  */
1959
1960 static struct reg_entry *
1961 insert_reg_alias (char *str, int number, int type)
1962 {
1963   struct reg_entry *new;
1964   const char *name;
1965
1966   if ((new = hash_find (arm_reg_hsh, str)) != 0)
1967     {
1968       if (new->builtin)
1969         as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
1970
1971       /* Only warn about a redefinition if it's not defined as the
1972          same register.  */
1973       else if (new->number != number || new->type != type)
1974         as_warn (_("ignoring redefinition of register alias '%s'"), str);
1975
1976       return 0;
1977     }
1978
1979   name = xstrdup (str);
1980   new = xmalloc (sizeof (struct reg_entry));
1981
1982   new->name = name;
1983   new->number = number;
1984   new->type = type;
1985   new->builtin = FALSE;
1986   new->neon = NULL;
1987
1988   if (hash_insert (arm_reg_hsh, name, (PTR) new))
1989     abort ();
1990   
1991   return new;
1992 }
1993
1994 static void
1995 insert_neon_reg_alias (char *str, int number, int type,
1996                        struct neon_typed_alias *atype)
1997 {
1998   struct reg_entry *reg = insert_reg_alias (str, number, type);
1999   
2000   if (!reg)
2001     {
2002       first_error (_("attempt to redefine typed alias"));
2003       return;
2004     }
2005   
2006   if (atype)
2007     {
2008       reg->neon = xmalloc (sizeof (struct neon_typed_alias));
2009       *reg->neon = *atype;
2010     }
2011 }
2012
2013 /* Look for the .req directive.  This is of the form:
2014
2015         new_register_name .req existing_register_name
2016
2017    If we find one, or if it looks sufficiently like one that we want to
2018    handle any error here, return non-zero.  Otherwise return zero.  */
2019
2020 static int
2021 create_register_alias (char * newname, char *p)
2022 {
2023   struct reg_entry *old;
2024   char *oldname, *nbuf;
2025   size_t nlen;
2026
2027   /* The input scrubber ensures that whitespace after the mnemonic is
2028      collapsed to single spaces.  */
2029   oldname = p;
2030   if (strncmp (oldname, " .req ", 6) != 0)
2031     return 0;
2032
2033   oldname += 6;
2034   if (*oldname == '\0')
2035     return 0;
2036
2037   old = hash_find (arm_reg_hsh, oldname);
2038   if (!old)
2039     {
2040       as_warn (_("unknown register '%s' -- .req ignored"), oldname);
2041       return 1;
2042     }
2043
2044   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2045      the desired alias name, and p points to its end.  If not, then
2046      the desired alias name is in the global original_case_string.  */
2047 #ifdef TC_CASE_SENSITIVE
2048   nlen = p - newname;
2049 #else
2050   newname = original_case_string;
2051   nlen = strlen (newname);
2052 #endif
2053
2054   nbuf = alloca (nlen + 1);
2055   memcpy (nbuf, newname, nlen);
2056   nbuf[nlen] = '\0';
2057
2058   /* Create aliases under the new name as stated; an all-lowercase
2059      version of the new name; and an all-uppercase version of the new
2060      name.  */
2061   insert_reg_alias (nbuf, old->number, old->type);
2062
2063   for (p = nbuf; *p; p++)
2064     *p = TOUPPER (*p);
2065
2066   if (strncmp (nbuf, newname, nlen))
2067     insert_reg_alias (nbuf, old->number, old->type);
2068
2069   for (p = nbuf; *p; p++)
2070     *p = TOLOWER (*p);
2071
2072   if (strncmp (nbuf, newname, nlen))
2073     insert_reg_alias (nbuf, old->number, old->type);
2074
2075   return 1;
2076 }
2077
2078 /* Create a Neon typed/indexed register alias using directives, e.g.:
2079      X .dn d5.s32[1]
2080      Y .qn 6.s16
2081      Z .dn d7
2082      T .dn Z[0]
2083    These typed registers can be used instead of the types specified after the
2084    Neon mnemonic, so long as all operands given have types. Types can also be
2085    specified directly, e.g.:
2086      vadd d0.s32, d1.s32, d2.s32
2087 */
2088
2089 static int
2090 create_neon_reg_alias (char *newname, char *p)
2091 {
2092   enum arm_reg_type basetype;
2093   struct reg_entry *basereg;
2094   struct reg_entry mybasereg;
2095   struct neon_type ntype;
2096   struct neon_typed_alias typeinfo;
2097   char *namebuf, *nameend;
2098   int namelen;
2099   
2100   typeinfo.defined = 0;
2101   typeinfo.eltype.type = NT_invtype;
2102   typeinfo.eltype.size = -1;
2103   typeinfo.index = -1;
2104   
2105   nameend = p;
2106   
2107   if (strncmp (p, " .dn ", 5) == 0)
2108     basetype = REG_TYPE_VFD;
2109   else if (strncmp (p, " .qn ", 5) == 0)
2110     basetype = REG_TYPE_NQ;
2111   else
2112     return 0;
2113   
2114   p += 5;
2115   
2116   if (*p == '\0')
2117     return 0;
2118   
2119   basereg = arm_reg_parse_multi (&p);
2120
2121   if (basereg && basereg->type != basetype)
2122     {
2123       as_bad (_("bad type for register"));
2124       return 0;
2125     }
2126
2127   if (basereg == NULL)
2128     {
2129       expressionS exp;
2130       /* Try parsing as an integer.  */
2131       my_get_expression (&exp, &p, GE_NO_PREFIX);
2132       if (exp.X_op != O_constant)
2133         {
2134           as_bad (_("expression must be constant"));
2135           return 0;
2136         }
2137       basereg = &mybasereg;
2138       basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
2139                                                   : exp.X_add_number;
2140       basereg->neon = 0;
2141     }
2142
2143   if (basereg->neon)
2144     typeinfo = *basereg->neon;
2145
2146   if (parse_neon_type (&ntype, &p) == SUCCESS)
2147     {
2148       /* We got a type.  */
2149       if (typeinfo.defined & NTA_HASTYPE)
2150         {
2151           as_bad (_("can't redefine the type of a register alias"));
2152           return 0;
2153         }
2154       
2155       typeinfo.defined |= NTA_HASTYPE;
2156       if (ntype.elems != 1)
2157         {
2158           as_bad (_("you must specify a single type only"));
2159           return 0;
2160         }
2161       typeinfo.eltype = ntype.el[0];
2162     }
2163   
2164   if (skip_past_char (&p, '[') == SUCCESS)
2165     {
2166       expressionS exp;
2167       /* We got a scalar index.  */
2168     
2169       if (typeinfo.defined & NTA_HASINDEX)
2170         {
2171           as_bad (_("can't redefine the index of a scalar alias"));
2172           return 0;
2173         }
2174     
2175       my_get_expression (&exp, &p, GE_NO_PREFIX);
2176     
2177       if (exp.X_op != O_constant)
2178         {
2179           as_bad (_("scalar index must be constant"));
2180           return 0;
2181         }
2182       
2183       typeinfo.defined |= NTA_HASINDEX;
2184       typeinfo.index = exp.X_add_number;
2185     
2186       if (skip_past_char (&p, ']') == FAIL)
2187         {
2188           as_bad (_("expecting ]"));
2189           return 0;
2190         }
2191     }
2192
2193   namelen = nameend - newname;
2194   namebuf = alloca (namelen + 1);
2195   strncpy (namebuf, newname, namelen);
2196   namebuf[namelen] = '\0';
2197   
2198   insert_neon_reg_alias (namebuf, basereg->number, basetype,
2199                          typeinfo.defined != 0 ? &typeinfo : NULL);
2200     
2201   /* Insert name in all uppercase.  */
2202   for (p = namebuf; *p; p++)
2203     *p = TOUPPER (*p);
2204   
2205   if (strncmp (namebuf, newname, namelen))
2206     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2207                            typeinfo.defined != 0 ? &typeinfo : NULL);
2208   
2209   /* Insert name in all lowercase.  */
2210   for (p = namebuf; *p; p++)
2211     *p = TOLOWER (*p);
2212   
2213   if (strncmp (namebuf, newname, namelen))
2214     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2215                            typeinfo.defined != 0 ? &typeinfo : NULL);
2216   
2217   return 1;
2218 }
2219
2220 /* Should never be called, as .req goes between the alias and the
2221    register name, not at the beginning of the line.  */
2222 static void
2223 s_req (int a ATTRIBUTE_UNUSED)
2224 {
2225   as_bad (_("invalid syntax for .req directive"));
2226 }
2227
2228 static void
2229 s_dn (int a ATTRIBUTE_UNUSED)
2230 {
2231   as_bad (_("invalid syntax for .dn directive"));
2232 }
2233
2234 static void
2235 s_qn (int a ATTRIBUTE_UNUSED)
2236 {
2237   as_bad (_("invalid syntax for .qn directive"));
2238 }
2239
2240 /* The .unreq directive deletes an alias which was previously defined
2241    by .req.  For example:
2242
2243        my_alias .req r11
2244        .unreq my_alias    */
2245
2246 static void
2247 s_unreq (int a ATTRIBUTE_UNUSED)
2248 {
2249   char * name;
2250   char saved_char;
2251
2252   name = input_line_pointer;
2253
2254   while (*input_line_pointer != 0
2255          && *input_line_pointer != ' '
2256          && *input_line_pointer != '\n')
2257     ++input_line_pointer;
2258
2259   saved_char = *input_line_pointer;
2260   *input_line_pointer = 0;
2261
2262   if (!*name)
2263     as_bad (_("invalid syntax for .unreq directive"));
2264   else
2265     {
2266       struct reg_entry *reg = hash_find (arm_reg_hsh, name);
2267
2268       if (!reg)
2269         as_bad (_("unknown register alias '%s'"), name);
2270       else if (reg->builtin)
2271         as_warn (_("ignoring attempt to undefine built-in register '%s'"),
2272                  name);
2273       else
2274         {
2275           hash_delete (arm_reg_hsh, name);
2276           free ((char *) reg->name);
2277           if (reg->neon)
2278             free (reg->neon);
2279           free (reg);
2280         }
2281     }
2282
2283   *input_line_pointer = saved_char;
2284   demand_empty_rest_of_line ();
2285 }
2286
2287 /* Directives: Instruction set selection.  */
2288
2289 #ifdef OBJ_ELF
2290 /* This code is to handle mapping symbols as defined in the ARM ELF spec.
2291    (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2292    Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2293    and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped.  */
2294
2295 static enum mstate mapstate = MAP_UNDEFINED;
2296
2297 void
2298 mapping_state (enum mstate state)
2299 {
2300   symbolS * symbolP;
2301   const char * symname;
2302   int type;
2303
2304   if (mapstate == state)
2305     /* The mapping symbol has already been emitted.
2306        There is nothing else to do.  */
2307     return;
2308
2309   mapstate = state;
2310
2311   switch (state)
2312     {
2313     case MAP_DATA:
2314       symname = "$d";
2315       type = BSF_NO_FLAGS;
2316       break;
2317     case MAP_ARM:
2318       symname = "$a";
2319       type = BSF_NO_FLAGS;
2320       break;
2321     case MAP_THUMB:
2322       symname = "$t";
2323       type = BSF_NO_FLAGS;
2324       break;
2325     case MAP_UNDEFINED:
2326       return;
2327     default:
2328       abort ();
2329     }
2330
2331   seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2332
2333   symbolP = symbol_new (symname, now_seg, (valueT) frag_now_fix (), frag_now);
2334   symbol_table_insert (symbolP);
2335   symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2336
2337   switch (state)
2338     {
2339     case MAP_ARM:
2340       THUMB_SET_FUNC (symbolP, 0);
2341       ARM_SET_THUMB (symbolP, 0);
2342       ARM_SET_INTERWORK (symbolP, support_interwork);
2343       break;
2344
2345     case MAP_THUMB:
2346       THUMB_SET_FUNC (symbolP, 1);
2347       ARM_SET_THUMB (symbolP, 1);
2348       ARM_SET_INTERWORK (symbolP, support_interwork);
2349       break;
2350
2351     case MAP_DATA:
2352     default:
2353       return;
2354     }
2355 }
2356 #else
2357 #define mapping_state(x) /* nothing */
2358 #endif
2359
2360 /* Find the real, Thumb encoded start of a Thumb function.  */
2361
2362 static symbolS *
2363 find_real_start (symbolS * symbolP)
2364 {
2365   char *       real_start;
2366   const char * name = S_GET_NAME (symbolP);
2367   symbolS *    new_target;
2368
2369   /* This definition must agree with the one in gcc/config/arm/thumb.c.  */
2370 #define STUB_NAME ".real_start_of"
2371
2372   if (name == NULL)
2373     abort ();
2374
2375   /* The compiler may generate BL instructions to local labels because
2376      it needs to perform a branch to a far away location. These labels
2377      do not have a corresponding ".real_start_of" label.  We check
2378      both for S_IS_LOCAL and for a leading dot, to give a way to bypass
2379      the ".real_start_of" convention for nonlocal branches.  */
2380   if (S_IS_LOCAL (symbolP) || name[0] == '.')
2381     return symbolP;
2382
2383   real_start = ACONCAT ((STUB_NAME, name, NULL));
2384   new_target = symbol_find (real_start);
2385
2386   if (new_target == NULL)
2387     {
2388       as_warn ("Failed to find real start of function: %s\n", name);
2389       new_target = symbolP;
2390     }
2391
2392   return new_target;
2393 }
2394
2395 static void
2396 opcode_select (int width)
2397 {
2398   switch (width)
2399     {
2400     case 16:
2401       if (! thumb_mode)
2402         {
2403           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
2404             as_bad (_("selected processor does not support THUMB opcodes"));
2405
2406           thumb_mode = 1;
2407           /* No need to force the alignment, since we will have been
2408              coming from ARM mode, which is word-aligned.  */
2409           record_alignment (now_seg, 1);
2410         }
2411       mapping_state (MAP_THUMB);
2412       break;
2413
2414     case 32:
2415       if (thumb_mode)
2416         {
2417           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
2418             as_bad (_("selected processor does not support ARM opcodes"));
2419
2420           thumb_mode = 0;
2421
2422           if (!need_pass_2)
2423             frag_align (2, 0, 0);
2424
2425           record_alignment (now_seg, 1);
2426         }
2427       mapping_state (MAP_ARM);
2428       break;
2429
2430     default:
2431       as_bad (_("invalid instruction size selected (%d)"), width);
2432     }
2433 }
2434
2435 static void
2436 s_arm (int ignore ATTRIBUTE_UNUSED)
2437 {
2438   opcode_select (32);
2439   demand_empty_rest_of_line ();
2440 }
2441
2442 static void
2443 s_thumb (int ignore ATTRIBUTE_UNUSED)
2444 {
2445   opcode_select (16);
2446   demand_empty_rest_of_line ();
2447 }
2448
2449 static void
2450 s_code (int unused ATTRIBUTE_UNUSED)
2451 {
2452   int temp;
2453
2454   temp = get_absolute_expression ();
2455   switch (temp)
2456     {
2457     case 16:
2458     case 32:
2459       opcode_select (temp);
2460       break;
2461
2462     default:
2463       as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
2464     }
2465 }
2466
2467 static void
2468 s_force_thumb (int ignore ATTRIBUTE_UNUSED)
2469 {
2470   /* If we are not already in thumb mode go into it, EVEN if
2471      the target processor does not support thumb instructions.
2472      This is used by gcc/config/arm/lib1funcs.asm for example
2473      to compile interworking support functions even if the
2474      target processor should not support interworking.  */
2475   if (! thumb_mode)
2476     {
2477       thumb_mode = 2;
2478       record_alignment (now_seg, 1);
2479     }
2480
2481   demand_empty_rest_of_line ();
2482 }
2483
2484 static void
2485 s_thumb_func (int ignore ATTRIBUTE_UNUSED)
2486 {
2487   s_thumb (0);
2488
2489   /* The following label is the name/address of the start of a Thumb function.
2490      We need to know this for the interworking support.  */
2491   label_is_thumb_function_name = TRUE;
2492 }
2493
2494 /* Perform a .set directive, but also mark the alias as
2495    being a thumb function.  */
2496
2497 static void
2498 s_thumb_set (int equiv)
2499 {
2500   /* XXX the following is a duplicate of the code for s_set() in read.c
2501      We cannot just call that code as we need to get at the symbol that
2502      is created.  */
2503   char *    name;
2504   char      delim;
2505   char *    end_name;
2506   symbolS * symbolP;
2507
2508   /* Especial apologies for the random logic:
2509      This just grew, and could be parsed much more simply!
2510      Dean - in haste.  */
2511   name      = input_line_pointer;
2512   delim     = get_symbol_end ();
2513   end_name  = input_line_pointer;
2514   *end_name = delim;
2515
2516   if (*input_line_pointer != ',')
2517     {
2518       *end_name = 0;
2519       as_bad (_("expected comma after name \"%s\""), name);
2520       *end_name = delim;
2521       ignore_rest_of_line ();
2522       return;
2523     }
2524
2525   input_line_pointer++;
2526   *end_name = 0;
2527
2528   if (name[0] == '.' && name[1] == '\0')
2529     {
2530       /* XXX - this should not happen to .thumb_set.  */
2531       abort ();
2532     }
2533
2534   if ((symbolP = symbol_find (name)) == NULL
2535       && (symbolP = md_undefined_symbol (name)) == NULL)
2536     {
2537 #ifndef NO_LISTING
2538       /* When doing symbol listings, play games with dummy fragments living
2539          outside the normal fragment chain to record the file and line info
2540          for this symbol.  */
2541       if (listing & LISTING_SYMBOLS)
2542         {
2543           extern struct list_info_struct * listing_tail;
2544           fragS * dummy_frag = xmalloc (sizeof (fragS));
2545
2546           memset (dummy_frag, 0, sizeof (fragS));
2547           dummy_frag->fr_type = rs_fill;
2548           dummy_frag->line = listing_tail;
2549           symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2550           dummy_frag->fr_symbol = symbolP;
2551         }
2552       else
2553 #endif
2554         symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2555
2556 #ifdef OBJ_COFF
2557       /* "set" symbols are local unless otherwise specified.  */
2558       SF_SET_LOCAL (symbolP);
2559 #endif /* OBJ_COFF  */
2560     }                           /* Make a new symbol.  */
2561
2562   symbol_table_insert (symbolP);
2563
2564   * end_name = delim;
2565
2566   if (equiv
2567       && S_IS_DEFINED (symbolP)
2568       && S_GET_SEGMENT (symbolP) != reg_section)
2569     as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2570
2571   pseudo_set (symbolP);
2572
2573   demand_empty_rest_of_line ();
2574
2575   /* XXX Now we come to the Thumb specific bit of code.  */
2576
2577   THUMB_SET_FUNC (symbolP, 1);
2578   ARM_SET_THUMB (symbolP, 1);
2579 #if defined OBJ_ELF || defined OBJ_COFF
2580   ARM_SET_INTERWORK (symbolP, support_interwork);
2581 #endif
2582 }
2583
2584 /* Directives: Mode selection.  */
2585
2586 /* .syntax [unified|divided] - choose the new unified syntax
2587    (same for Arm and Thumb encoding, modulo slight differences in what
2588    can be represented) or the old divergent syntax for each mode.  */
2589 static void
2590 s_syntax (int unused ATTRIBUTE_UNUSED)
2591 {
2592   char *name, delim;
2593
2594   name = input_line_pointer;
2595   delim = get_symbol_end ();
2596
2597   if (!strcasecmp (name, "unified"))
2598     unified_syntax = TRUE;
2599   else if (!strcasecmp (name, "divided"))
2600     unified_syntax = FALSE;
2601   else
2602     {
2603       as_bad (_("unrecognized syntax mode \"%s\""), name);
2604       return;
2605     }
2606   *input_line_pointer = delim;
2607   demand_empty_rest_of_line ();
2608 }
2609
2610 /* Directives: sectioning and alignment.  */
2611
2612 /* Same as s_align_ptwo but align 0 => align 2.  */
2613
2614 static void
2615 s_align (int unused ATTRIBUTE_UNUSED)
2616 {
2617   int temp;
2618   bfd_boolean fill_p;
2619   long temp_fill;
2620   long max_alignment = 15;
2621
2622   temp = get_absolute_expression ();
2623   if (temp > max_alignment)
2624     as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
2625   else if (temp < 0)
2626     {
2627       as_bad (_("alignment negative. 0 assumed."));
2628       temp = 0;
2629     }
2630
2631   if (*input_line_pointer == ',')
2632     {
2633       input_line_pointer++;
2634       temp_fill = get_absolute_expression ();
2635       fill_p = TRUE;
2636     }
2637   else
2638     {
2639       fill_p = FALSE;
2640       temp_fill = 0;
2641     }
2642
2643   if (!temp)
2644     temp = 2;
2645
2646   /* Only make a frag if we HAVE to.  */
2647   if (temp && !need_pass_2)
2648     {
2649       if (!fill_p && subseg_text_p (now_seg))
2650         frag_align_code (temp, 0);
2651       else
2652         frag_align (temp, (int) temp_fill, 0);
2653     }
2654   demand_empty_rest_of_line ();
2655
2656   record_alignment (now_seg, temp);
2657 }
2658
2659 static void
2660 s_bss (int ignore ATTRIBUTE_UNUSED)
2661 {
2662   /* We don't support putting frags in the BSS segment, we fake it by
2663      marking in_bss, then looking at s_skip for clues.  */
2664   subseg_set (bss_section, 0);
2665   demand_empty_rest_of_line ();
2666   mapping_state (MAP_DATA);
2667 }
2668
2669 static void
2670 s_even (int ignore ATTRIBUTE_UNUSED)
2671 {
2672   /* Never make frag if expect extra pass.  */
2673   if (!need_pass_2)
2674     frag_align (1, 0, 0);
2675
2676   record_alignment (now_seg, 1);
2677
2678   demand_empty_rest_of_line ();
2679 }
2680
2681 /* Directives: Literal pools.  */
2682
2683 static literal_pool *
2684 find_literal_pool (void)
2685 {
2686   literal_pool * pool;
2687
2688   for (pool = list_of_pools; pool != NULL; pool = pool->next)
2689     {
2690       if (pool->section == now_seg
2691           && pool->sub_section == now_subseg)
2692         break;
2693     }
2694
2695   return pool;
2696 }
2697
2698 static literal_pool *
2699 find_or_make_literal_pool (void)
2700 {
2701   /* Next literal pool ID number.  */
2702   static unsigned int latest_pool_num = 1;
2703   literal_pool *      pool;
2704
2705   pool = find_literal_pool ();
2706
2707   if (pool == NULL)
2708     {
2709       /* Create a new pool.  */
2710       pool = xmalloc (sizeof (* pool));
2711       if (! pool)
2712         return NULL;
2713
2714       pool->next_free_entry = 0;
2715       pool->section         = now_seg;
2716       pool->sub_section     = now_subseg;
2717       pool->next            = list_of_pools;
2718       pool->symbol          = NULL;
2719
2720       /* Add it to the list.  */
2721       list_of_pools = pool;
2722     }
2723
2724   /* New pools, and emptied pools, will have a NULL symbol.  */
2725   if (pool->symbol == NULL)
2726     {
2727       pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
2728                                     (valueT) 0, &zero_address_frag);
2729       pool->id = latest_pool_num ++;
2730     }
2731
2732   /* Done.  */
2733   return pool;
2734 }
2735
2736 /* Add the literal in the global 'inst'
2737    structure to the relevent literal pool.  */
2738
2739 static int
2740 add_to_lit_pool (void)
2741 {
2742   literal_pool * pool;
2743   unsigned int entry;
2744
2745   pool = find_or_make_literal_pool ();
2746
2747   /* Check if this literal value is already in the pool.  */
2748   for (entry = 0; entry < pool->next_free_entry; entry ++)
2749     {
2750       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
2751           && (inst.reloc.exp.X_op == O_constant)
2752           && (pool->literals[entry].X_add_number
2753               == inst.reloc.exp.X_add_number)
2754           && (pool->literals[entry].X_unsigned
2755               == inst.reloc.exp.X_unsigned))
2756         break;
2757
2758       if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
2759           && (inst.reloc.exp.X_op == O_symbol)
2760           && (pool->literals[entry].X_add_number
2761               == inst.reloc.exp.X_add_number)
2762           && (pool->literals[entry].X_add_symbol
2763               == inst.reloc.exp.X_add_symbol)
2764           && (pool->literals[entry].X_op_symbol
2765               == inst.reloc.exp.X_op_symbol))
2766         break;
2767     }
2768
2769   /* Do we need to create a new entry?  */
2770   if (entry == pool->next_free_entry)
2771     {
2772       if (entry >= MAX_LITERAL_POOL_SIZE)
2773         {
2774           inst.error = _("literal pool overflow");
2775           return FAIL;
2776         }
2777
2778       pool->literals[entry] = inst.reloc.exp;
2779       pool->next_free_entry += 1;
2780     }
2781
2782   inst.reloc.exp.X_op         = O_symbol;
2783   inst.reloc.exp.X_add_number = ((int) entry) * 4;
2784   inst.reloc.exp.X_add_symbol = pool->symbol;
2785
2786   return SUCCESS;
2787 }
2788
2789 /* Can't use symbol_new here, so have to create a symbol and then at
2790    a later date assign it a value. Thats what these functions do.  */
2791
2792 static void
2793 symbol_locate (symbolS *    symbolP,
2794                const char * name,       /* It is copied, the caller can modify.  */
2795                segT         segment,    /* Segment identifier (SEG_<something>).  */
2796                valueT       valu,       /* Symbol value.  */
2797                fragS *      frag)       /* Associated fragment.  */
2798 {
2799   unsigned int name_length;
2800   char * preserved_copy_of_name;
2801
2802   name_length = strlen (name) + 1;   /* +1 for \0.  */
2803   obstack_grow (&notes, name, name_length);
2804   preserved_copy_of_name = obstack_finish (&notes);
2805
2806 #ifdef tc_canonicalize_symbol_name
2807   preserved_copy_of_name =
2808     tc_canonicalize_symbol_name (preserved_copy_of_name);
2809 #endif
2810
2811   S_SET_NAME (symbolP, preserved_copy_of_name);
2812
2813   S_SET_SEGMENT (symbolP, segment);
2814   S_SET_VALUE (symbolP, valu);
2815   symbol_clear_list_pointers (symbolP);
2816
2817   symbol_set_frag (symbolP, frag);
2818
2819   /* Link to end of symbol chain.  */
2820   {
2821     extern int symbol_table_frozen;
2822
2823     if (symbol_table_frozen)
2824       abort ();
2825   }
2826
2827   symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
2828
2829   obj_symbol_new_hook (symbolP);
2830
2831 #ifdef tc_symbol_new_hook
2832   tc_symbol_new_hook (symbolP);
2833 #endif
2834
2835 #ifdef DEBUG_SYMS
2836   verify_symbol_chain (symbol_rootP, symbol_lastP);
2837 #endif /* DEBUG_SYMS  */
2838 }
2839
2840
2841 static void
2842 s_ltorg (int ignored ATTRIBUTE_UNUSED)
2843 {
2844   unsigned int entry;
2845   literal_pool * pool;
2846   char sym_name[20];
2847
2848   pool = find_literal_pool ();
2849   if (pool == NULL
2850       || pool->symbol == NULL
2851       || pool->next_free_entry == 0)
2852     return;
2853
2854   mapping_state (MAP_DATA);
2855
2856   /* Align pool as you have word accesses.
2857      Only make a frag if we have to.  */
2858   if (!need_pass_2)
2859     frag_align (2, 0, 0);
2860
2861   record_alignment (now_seg, 2);
2862
2863   sprintf (sym_name, "$$lit_\002%x", pool->id);
2864
2865   symbol_locate (pool->symbol, sym_name, now_seg,
2866                  (valueT) frag_now_fix (), frag_now);
2867   symbol_table_insert (pool->symbol);
2868
2869   ARM_SET_THUMB (pool->symbol, thumb_mode);
2870
2871 #if defined OBJ_COFF || defined OBJ_ELF
2872   ARM_SET_INTERWORK (pool->symbol, support_interwork);
2873 #endif
2874
2875   for (entry = 0; entry < pool->next_free_entry; entry ++)
2876     /* First output the expression in the instruction to the pool.  */
2877     emit_expr (&(pool->literals[entry]), 4); /* .word  */
2878
2879   /* Mark the pool as empty.  */
2880   pool->next_free_entry = 0;
2881   pool->symbol = NULL;
2882 }
2883
2884 #ifdef OBJ_ELF
2885 /* Forward declarations for functions below, in the MD interface
2886    section.  */
2887 static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
2888 static valueT create_unwind_entry (int);
2889 static void start_unwind_section (const segT, int);
2890 static void add_unwind_opcode (valueT, int);
2891 static void flush_pending_unwind (void);
2892
2893 /* Directives: Data.  */
2894
2895 static void
2896 s_arm_elf_cons (int nbytes)
2897 {
2898   expressionS exp;
2899
2900 #ifdef md_flush_pending_output
2901   md_flush_pending_output ();
2902 #endif
2903
2904   if (is_it_end_of_statement ())
2905     {
2906       demand_empty_rest_of_line ();
2907       return;
2908     }
2909
2910 #ifdef md_cons_align
2911   md_cons_align (nbytes);
2912 #endif
2913
2914   mapping_state (MAP_DATA);
2915   do
2916     {
2917       int reloc;
2918       char *base = input_line_pointer;
2919
2920       expression (& exp);
2921
2922       if (exp.X_op != O_symbol)
2923         emit_expr (&exp, (unsigned int) nbytes);
2924       else
2925         {
2926           char *before_reloc = input_line_pointer;
2927           reloc = parse_reloc (&input_line_pointer);
2928           if (reloc == -1)
2929             {
2930               as_bad (_("unrecognized relocation suffix"));
2931               ignore_rest_of_line ();
2932               return;
2933             }
2934           else if (reloc == BFD_RELOC_UNUSED)
2935             emit_expr (&exp, (unsigned int) nbytes);
2936           else
2937             {
2938               reloc_howto_type *howto = bfd_reloc_type_lookup (stdoutput, reloc);
2939               int size = bfd_get_reloc_size (howto);
2940
2941               if (reloc == BFD_RELOC_ARM_PLT32)
2942                 {
2943                   as_bad (_("(plt) is only valid on branch targets"));
2944                   reloc = BFD_RELOC_UNUSED;
2945                   size = 0;
2946                 }
2947
2948               if (size > nbytes)
2949                 as_bad (_("%s relocations do not fit in %d bytes"),
2950                         howto->name, nbytes);
2951               else
2952                 {
2953                   /* We've parsed an expression stopping at O_symbol.
2954                      But there may be more expression left now that we
2955                      have parsed the relocation marker.  Parse it again.
2956                      XXX Surely there is a cleaner way to do this.  */
2957                   char *p = input_line_pointer;
2958                   int offset;
2959                   char *save_buf = alloca (input_line_pointer - base);
2960                   memcpy (save_buf, base, input_line_pointer - base);
2961                   memmove (base + (input_line_pointer - before_reloc),
2962                            base, before_reloc - base);
2963
2964                   input_line_pointer = base + (input_line_pointer-before_reloc);
2965                   expression (&exp);
2966                   memcpy (base, save_buf, p - base);
2967
2968                   offset = nbytes - size;
2969                   p = frag_more ((int) nbytes);
2970                   fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
2971                                size, &exp, 0, reloc);
2972                 }
2973             }
2974         }
2975     }
2976   while (*input_line_pointer++ == ',');
2977
2978   /* Put terminator back into stream.  */
2979   input_line_pointer --;
2980   demand_empty_rest_of_line ();
2981 }
2982
2983
2984 /* Parse a .rel31 directive.  */
2985
2986 static void
2987 s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
2988 {
2989   expressionS exp;
2990   char *p;
2991   valueT highbit;
2992
2993   highbit = 0;
2994   if (*input_line_pointer == '1')
2995     highbit = 0x80000000;
2996   else if (*input_line_pointer != '0')
2997     as_bad (_("expected 0 or 1"));
2998
2999   input_line_pointer++;
3000   if (*input_line_pointer != ',')
3001     as_bad (_("missing comma"));
3002   input_line_pointer++;
3003
3004 #ifdef md_flush_pending_output
3005   md_flush_pending_output ();
3006 #endif
3007
3008 #ifdef md_cons_align
3009   md_cons_align (4);
3010 #endif
3011
3012   mapping_state (MAP_DATA);
3013
3014   expression (&exp);
3015
3016   p = frag_more (4);
3017   md_number_to_chars (p, highbit, 4);
3018   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3019                BFD_RELOC_ARM_PREL31);
3020
3021   demand_empty_rest_of_line ();
3022 }
3023
3024 /* Directives: AEABI stack-unwind tables.  */
3025
3026 /* Parse an unwind_fnstart directive.  Simply records the current location.  */
3027
3028 static void
3029 s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3030 {
3031   demand_empty_rest_of_line ();
3032   /* Mark the start of the function.  */
3033   unwind.proc_start = expr_build_dot ();
3034
3035   /* Reset the rest of the unwind info.  */
3036   unwind.opcode_count = 0;
3037   unwind.table_entry = NULL;
3038   unwind.personality_routine = NULL;
3039   unwind.personality_index = -1;
3040   unwind.frame_size = 0;
3041   unwind.fp_offset = 0;
3042   unwind.fp_reg = 13;
3043   unwind.fp_used = 0;
3044   unwind.sp_restored = 0;
3045 }
3046
3047
3048 /* Parse a handlerdata directive.  Creates the exception handling table entry
3049    for the function.  */
3050
3051 static void
3052 s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3053 {
3054   demand_empty_rest_of_line ();
3055   if (unwind.table_entry)
3056     as_bad (_("dupicate .handlerdata directive"));
3057
3058   create_unwind_entry (1);
3059 }
3060
3061 /* Parse an unwind_fnend directive.  Generates the index table entry.  */
3062
3063 static void
3064 s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3065 {
3066   long where;
3067   char *ptr;
3068   valueT val;
3069
3070   demand_empty_rest_of_line ();
3071
3072   /* Add eh table entry.  */
3073   if (unwind.table_entry == NULL)
3074     val = create_unwind_entry (0);
3075   else
3076     val = 0;
3077
3078   /* Add index table entry.  This is two words.  */
3079   start_unwind_section (unwind.saved_seg, 1);
3080   frag_align (2, 0, 0);
3081   record_alignment (now_seg, 2);
3082
3083   ptr = frag_more (8);
3084   memset(ptr, 0, 8);
3085   where = frag_now_fix () - 8;
3086
3087   /* Self relative offset of the function start.  */
3088   fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3089            BFD_RELOC_ARM_PREL31);
3090
3091   /* Indicate dependency on EHABI-defined personality routines to the
3092      linker, if it hasn't been done already.  */
3093   if (unwind.personality_index >= 0 && unwind.personality_index < 3
3094       && !(marked_pr_dependency & (1 << unwind.personality_index)))
3095     {
3096       static const char *const name[] = {
3097         "__aeabi_unwind_cpp_pr0",
3098         "__aeabi_unwind_cpp_pr1",
3099         "__aeabi_unwind_cpp_pr2"
3100       };
3101       symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3102       fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
3103       marked_pr_dependency |= 1 << unwind.personality_index;
3104       seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
3105         = marked_pr_dependency;
3106     }
3107
3108   if (val)
3109     /* Inline exception table entry.  */
3110     md_number_to_chars (ptr + 4, val, 4);
3111   else
3112     /* Self relative offset of the table entry.  */
3113     fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3114              BFD_RELOC_ARM_PREL31);
3115
3116   /* Restore the original section.  */
3117   subseg_set (unwind.saved_seg, unwind.saved_subseg);
3118 }
3119
3120
3121 /* Parse an unwind_cantunwind directive.  */
3122
3123 static void
3124 s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3125 {
3126   demand_empty_rest_of_line ();
3127   if (unwind.personality_routine || unwind.personality_index != -1)
3128     as_bad (_("personality routine specified for cantunwind frame"));
3129
3130   unwind.personality_index = -2;
3131 }
3132
3133
3134 /* Parse a personalityindex directive.  */
3135
3136 static void
3137 s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3138 {
3139   expressionS exp;
3140
3141   if (unwind.personality_routine || unwind.personality_index != -1)
3142     as_bad (_("duplicate .personalityindex directive"));
3143
3144   expression (&exp);
3145
3146   if (exp.X_op != O_constant
3147       || exp.X_add_number < 0 || exp.X_add_number > 15)
3148     {
3149       as_bad (_("bad personality routine number"));
3150       ignore_rest_of_line ();
3151       return;
3152     }
3153
3154   unwind.personality_index = exp.X_add_number;
3155
3156   demand_empty_rest_of_line ();
3157 }
3158
3159
3160 /* Parse a personality directive.  */
3161
3162 static void
3163 s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3164 {
3165   char *name, *p, c;
3166
3167   if (unwind.personality_routine || unwind.personality_index != -1)
3168     as_bad (_("duplicate .personality directive"));
3169
3170   name = input_line_pointer;
3171   c = get_symbol_end ();
3172   p = input_line_pointer;
3173   unwind.personality_routine = symbol_find_or_make (name);
3174   *p = c;
3175   demand_empty_rest_of_line ();
3176 }
3177
3178
3179 /* Parse a directive saving core registers.  */
3180
3181 static void
3182 s_arm_unwind_save_core (void)
3183 {
3184   valueT op;
3185   long range;
3186   int n;
3187
3188   range = parse_reg_list (&input_line_pointer);
3189   if (range == FAIL)
3190     {
3191       as_bad (_("expected register list"));
3192       ignore_rest_of_line ();
3193       return;
3194     }
3195
3196   demand_empty_rest_of_line ();
3197
3198   /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3199      into .unwind_save {..., sp...}.  We aren't bothered about the value of
3200      ip because it is clobbered by calls.  */
3201   if (unwind.sp_restored && unwind.fp_reg == 12
3202       && (range & 0x3000) == 0x1000)
3203     {
3204       unwind.opcode_count--;
3205       unwind.sp_restored = 0;
3206       range = (range | 0x2000) & ~0x1000;
3207       unwind.pending_offset = 0;
3208     }
3209
3210   /* Pop r4-r15.  */
3211   if (range & 0xfff0)
3212     {
3213       /* See if we can use the short opcodes.  These pop a block of up to 8
3214          registers starting with r4, plus maybe r14.  */
3215       for (n = 0; n < 8; n++)
3216         {
3217           /* Break at the first non-saved register.      */
3218           if ((range & (1 << (n + 4))) == 0)
3219             break;
3220         }
3221       /* See if there are any other bits set.  */
3222       if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
3223         {
3224           /* Use the long form.  */
3225           op = 0x8000 | ((range >> 4) & 0xfff);
3226           add_unwind_opcode (op, 2);
3227         }
3228       else
3229         {
3230           /* Use the short form.  */
3231           if (range & 0x4000)
3232             op = 0xa8; /* Pop r14.      */
3233           else
3234             op = 0xa0; /* Do not pop r14.  */
3235           op |= (n - 1);
3236           add_unwind_opcode (op, 1);
3237         }
3238     }
3239
3240   /* Pop r0-r3.  */
3241   if (range & 0xf)
3242     {
3243       op = 0xb100 | (range & 0xf);
3244       add_unwind_opcode (op, 2);
3245     }
3246
3247   /* Record the number of bytes pushed.  */
3248   for (n = 0; n < 16; n++)
3249     {
3250       if (range & (1 << n))
3251         unwind.frame_size += 4;
3252     }
3253 }
3254
3255
3256 /* Parse a directive saving FPA registers.  */
3257
3258 static void
3259 s_arm_unwind_save_fpa (int reg)
3260 {
3261   expressionS exp;
3262   int num_regs;
3263   valueT op;
3264
3265   /* Get Number of registers to transfer.  */
3266   if (skip_past_comma (&input_line_pointer) != FAIL)
3267     expression (&exp);
3268   else
3269     exp.X_op = O_illegal;
3270
3271   if (exp.X_op != O_constant)
3272     {
3273       as_bad (_("expected , <constant>"));
3274       ignore_rest_of_line ();
3275       return;
3276     }
3277
3278   num_regs = exp.X_add_number;
3279
3280   if (num_regs < 1 || num_regs > 4)
3281     {
3282       as_bad (_("number of registers must be in the range [1:4]"));
3283       ignore_rest_of_line ();
3284       return;
3285     }
3286
3287   demand_empty_rest_of_line ();
3288
3289   if (reg == 4)
3290     {
3291       /* Short form.  */
3292       op = 0xb4 | (num_regs - 1);
3293       add_unwind_opcode (op, 1);
3294     }
3295   else
3296     {
3297       /* Long form.  */
3298       op = 0xc800 | (reg << 4) | (num_regs - 1);
3299       add_unwind_opcode (op, 2);
3300     }
3301   unwind.frame_size += num_regs * 12;
3302 }
3303
3304
3305 /* Parse a directive saving VFP registers for ARMv6 and above.  */
3306
3307 static void
3308 s_arm_unwind_save_vfp_armv6 (void)
3309 {
3310   int count;
3311   unsigned int start;
3312   valueT op;
3313   int num_vfpv3_regs = 0;
3314   int num_regs_below_16;
3315
3316   count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
3317   if (count == FAIL)
3318     {
3319       as_bad (_("expected register list"));
3320       ignore_rest_of_line ();
3321       return;
3322     }
3323
3324   demand_empty_rest_of_line ();
3325
3326   /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
3327      than FSTMX/FLDMX-style ones).  */
3328
3329   /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31.  */
3330   if (start >= 16)
3331     num_vfpv3_regs = count;
3332   else if (start + count > 16)
3333     num_vfpv3_regs = start + count - 16;
3334
3335   if (num_vfpv3_regs > 0)
3336     {
3337       int start_offset = start > 16 ? start - 16 : 0;
3338       op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
3339       add_unwind_opcode (op, 2);
3340     }
3341
3342   /* Generate opcode for registers numbered in the range 0 .. 15.  */
3343   num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
3344   assert (num_regs_below_16 + num_vfpv3_regs == count);
3345   if (num_regs_below_16 > 0)
3346     {
3347       op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
3348       add_unwind_opcode (op, 2);
3349     }
3350
3351   unwind.frame_size += count * 8;
3352 }
3353
3354
3355 /* Parse a directive saving VFP registers for pre-ARMv6.  */
3356
3357 static void
3358 s_arm_unwind_save_vfp (void)
3359 {
3360   int count;
3361   unsigned int reg;
3362   valueT op;
3363
3364   count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
3365   if (count == FAIL)
3366     {
3367       as_bad (_("expected register list"));
3368       ignore_rest_of_line ();
3369       return;
3370     }
3371
3372   demand_empty_rest_of_line ();
3373
3374   if (reg == 8)
3375     {
3376       /* Short form.  */
3377       op = 0xb8 | (count - 1);
3378       add_unwind_opcode (op, 1);
3379     }
3380   else
3381     {
3382       /* Long form.  */
3383       op = 0xb300 | (reg << 4) | (count - 1);
3384       add_unwind_opcode (op, 2);
3385     }
3386   unwind.frame_size += count * 8 + 4;
3387 }
3388
3389
3390 /* Parse a directive saving iWMMXt data registers.  */
3391
3392 static void
3393 s_arm_unwind_save_mmxwr (void)
3394 {
3395   int reg;
3396   int hi_reg;
3397   int i;
3398   unsigned mask = 0;
3399   valueT op;
3400
3401   if (*input_line_pointer == '{')
3402     input_line_pointer++;
3403
3404   do
3405     {
3406       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
3407
3408       if (reg == FAIL)
3409         {
3410           as_bad (_(reg_expected_msgs[REG_TYPE_MMXWR]));
3411           goto error;
3412         }
3413
3414       if (mask >> reg)
3415         as_tsktsk (_("register list not in ascending order"));
3416       mask |= 1 << reg;
3417
3418       if (*input_line_pointer == '-')
3419         {
3420           input_line_pointer++;
3421           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
3422           if (hi_reg == FAIL)
3423             {
3424               as_bad (_(reg_expected_msgs[REG_TYPE_MMXWR]));
3425               goto error;
3426             }
3427           else if (reg >= hi_reg)
3428             {
3429               as_bad (_("bad register range"));
3430               goto error;
3431             }
3432           for (; reg < hi_reg; reg++)
3433             mask |= 1 << reg;
3434         }
3435     }
3436   while (skip_past_comma (&input_line_pointer) != FAIL);
3437
3438   if (*input_line_pointer == '}')
3439     input_line_pointer++;
3440
3441   demand_empty_rest_of_line ();
3442
3443   /* Generate any deferred opcodes because we're going to be looking at
3444      the list.  */
3445   flush_pending_unwind ();
3446
3447   for (i = 0; i < 16; i++)
3448     {
3449       if (mask & (1 << i))
3450         unwind.frame_size += 8;
3451     }
3452
3453   /* Attempt to combine with a previous opcode.  We do this because gcc
3454      likes to output separate unwind directives for a single block of
3455      registers.  */
3456   if (unwind.opcode_count > 0)
3457     {
3458       i = unwind.opcodes[unwind.opcode_count - 1];
3459       if ((i & 0xf8) == 0xc0)
3460         {
3461           i &= 7;
3462           /* Only merge if the blocks are contiguous.  */
3463           if (i < 6)
3464             {
3465               if ((mask & 0xfe00) == (1 << 9))
3466                 {
3467                   mask |= ((1 << (i + 11)) - 1) & 0xfc00;
3468                   unwind.opcode_count--;
3469                 }
3470             }
3471           else if (i == 6 && unwind.opcode_count >= 2)
3472             {
3473               i = unwind.opcodes[unwind.opcode_count - 2];
3474               reg = i >> 4;
3475               i &= 0xf;
3476
3477               op = 0xffff << (reg - 1);
3478               if (reg > 0
3479                   && ((mask & op) == (1u << (reg - 1))))
3480                 {
3481                   op = (1 << (reg + i + 1)) - 1;
3482                   op &= ~((1 << reg) - 1);
3483                   mask |= op;
3484                   unwind.opcode_count -= 2;
3485                 }
3486             }
3487         }
3488     }
3489
3490   hi_reg = 15;
3491   /* We want to generate opcodes in the order the registers have been
3492      saved, ie. descending order.  */
3493   for (reg = 15; reg >= -1; reg--)
3494     {
3495       /* Save registers in blocks.  */
3496       if (reg < 0
3497           || !(mask & (1 << reg)))
3498         {
3499           /* We found an unsaved reg.  Generate opcodes to save the
3500              preceeding block.  */
3501           if (reg != hi_reg)
3502             {
3503               if (reg == 9)
3504                 {
3505                   /* Short form.  */
3506                   op = 0xc0 | (hi_reg - 10);
3507                   add_unwind_opcode (op, 1);
3508                 }
3509               else
3510                 {
3511                   /* Long form.  */
3512                   op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
3513                   add_unwind_opcode (op, 2);
3514                 }
3515             }
3516           hi_reg = reg - 1;
3517         }
3518     }
3519
3520   return;
3521 error:
3522   ignore_rest_of_line ();
3523 }
3524
3525 static void
3526 s_arm_unwind_save_mmxwcg (void)
3527 {
3528   int reg;
3529   int hi_reg;
3530   unsigned mask = 0;
3531   valueT op;
3532
3533   if (*input_line_pointer == '{')
3534     input_line_pointer++;
3535
3536   do
3537     {
3538       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
3539
3540       if (reg == FAIL)
3541         {
3542           as_bad (_(reg_expected_msgs[REG_TYPE_MMXWCG]));
3543           goto error;
3544         }
3545
3546       reg -= 8;
3547       if (mask >> reg)
3548         as_tsktsk (_("register list not in ascending order"));
3549       mask |= 1 << reg;
3550
3551       if (*input_line_pointer == '-')
3552         {
3553           input_line_pointer++;
3554           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
3555           if (hi_reg == FAIL)
3556             {
3557               as_bad (_(reg_expected_msgs[REG_TYPE_MMXWCG]));
3558               goto error;
3559             }
3560           else if (reg >= hi_reg)
3561             {
3562               as_bad (_("bad register range"));
3563               goto error;
3564             }
3565           for (; reg < hi_reg; reg++)
3566             mask |= 1 << reg;
3567         }
3568     }
3569   while (skip_past_comma (&input_line_pointer) != FAIL);
3570
3571   if (*input_line_pointer == '}')
3572     input_line_pointer++;
3573
3574   demand_empty_rest_of_line ();
3575
3576   /* Generate any deferred opcodes because we're going to be looking at
3577      the list.  */
3578   flush_pending_unwind ();
3579
3580   for (reg = 0; reg < 16; reg++)
3581     {
3582       if (mask & (1 << reg))
3583         unwind.frame_size += 4;
3584     }
3585   op = 0xc700 | mask;
3586   add_unwind_opcode (op, 2);
3587   return;
3588 error:
3589   ignore_rest_of_line ();
3590 }
3591
3592
3593 /* Parse an unwind_save directive.
3594    If the argument is non-zero, this is a .vsave directive.  */
3595
3596 static void
3597 s_arm_unwind_save (int arch_v6)
3598 {
3599   char *peek;
3600   struct reg_entry *reg;
3601   bfd_boolean had_brace = FALSE;
3602
3603   /* Figure out what sort of save we have.  */
3604   peek = input_line_pointer;
3605
3606   if (*peek == '{')
3607     {
3608       had_brace = TRUE;
3609       peek++;
3610     }
3611
3612   reg = arm_reg_parse_multi (&peek);
3613
3614   if (!reg)
3615     {
3616       as_bad (_("register expected"));
3617       ignore_rest_of_line ();
3618       return;
3619     }
3620
3621   switch (reg->type)
3622     {
3623     case REG_TYPE_FN:
3624       if (had_brace)
3625         {
3626           as_bad (_("FPA .unwind_save does not take a register list"));
3627           ignore_rest_of_line ();
3628           return;
3629         }
3630       s_arm_unwind_save_fpa (reg->number);
3631       return;
3632
3633     case REG_TYPE_RN:     s_arm_unwind_save_core ();   return;
3634     case REG_TYPE_VFD:
3635       if (arch_v6)
3636         s_arm_unwind_save_vfp_armv6 ();
3637       else
3638         s_arm_unwind_save_vfp ();
3639       return;
3640     case REG_TYPE_MMXWR:  s_arm_unwind_save_mmxwr ();  return;
3641     case REG_TYPE_MMXWCG: s_arm_unwind_save_mmxwcg (); return;
3642
3643     default:
3644       as_bad (_(".unwind_save does not support this kind of register"));
3645       ignore_rest_of_line ();
3646     }
3647 }
3648
3649
3650 /* Parse an unwind_movsp directive.  */
3651
3652 static void
3653 s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
3654 {
3655   int reg;
3656   valueT op;
3657   int offset;
3658
3659   reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
3660   if (reg == FAIL)
3661     {
3662       as_bad (_(reg_expected_msgs[REG_TYPE_RN]));
3663       ignore_rest_of_line ();
3664       return;
3665     }
3666
3667   /* Optional constant.  */
3668   if (skip_past_comma (&input_line_pointer) != FAIL)
3669     {
3670       if (immediate_for_directive (&offset) == FAIL)
3671         return;
3672     }
3673   else
3674     offset = 0;
3675
3676   demand_empty_rest_of_line ();
3677
3678   if (reg == REG_SP || reg == REG_PC)
3679     {
3680       as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
3681       return;
3682     }
3683
3684   if (unwind.fp_reg != REG_SP)
3685     as_bad (_("unexpected .unwind_movsp directive"));
3686
3687   /* Generate opcode to restore the value.  */
3688   op = 0x90 | reg;
3689   add_unwind_opcode (op, 1);
3690
3691   /* Record the information for later.  */
3692   unwind.fp_reg = reg;
3693   unwind.fp_offset = unwind.frame_size - offset;
3694   unwind.sp_restored = 1;
3695 }
3696
3697 /* Parse an unwind_pad directive.  */
3698
3699 static void
3700 s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
3701 {
3702   int offset;
3703
3704   if (immediate_for_directive (&offset) == FAIL)
3705     return;
3706
3707   if (offset & 3)
3708     {
3709       as_bad (_("stack increment must be multiple of 4"));
3710       ignore_rest_of_line ();
3711       return;
3712     }
3713
3714   /* Don't generate any opcodes, just record the details for later.  */
3715   unwind.frame_size += offset;
3716   unwind.pending_offset += offset;
3717
3718   demand_empty_rest_of_line ();
3719 }
3720
3721 /* Parse an unwind_setfp directive.  */
3722
3723 static void
3724 s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
3725 {
3726   int sp_reg;
3727   int fp_reg;
3728   int offset;
3729
3730   fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
3731   if (skip_past_comma (&input_line_pointer) == FAIL)
3732     sp_reg = FAIL;
3733   else
3734     sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
3735
3736   if (fp_reg == FAIL || sp_reg == FAIL)
3737     {
3738       as_bad (_("expected <reg>, <reg>"));
3739       ignore_rest_of_line ();
3740       return;
3741     }
3742
3743   /* Optional constant.  */
3744   if (skip_past_comma (&input_line_pointer) != FAIL)
3745     {
3746       if (immediate_for_directive (&offset) == FAIL)
3747         return;
3748     }
3749   else
3750     offset = 0;
3751
3752   demand_empty_rest_of_line ();
3753
3754   if (sp_reg != 13 && sp_reg != unwind.fp_reg)
3755     {
3756       as_bad (_("register must be either sp or set by a previous"
3757                 "unwind_movsp directive"));
3758       return;
3759     }
3760
3761   /* Don't generate any opcodes, just record the information for later.  */
3762   unwind.fp_reg = fp_reg;
3763   unwind.fp_used = 1;
3764   if (sp_reg == 13)
3765     unwind.fp_offset = unwind.frame_size - offset;
3766   else
3767     unwind.fp_offset -= offset;
3768 }
3769
3770 /* Parse an unwind_raw directive.  */
3771
3772 static void
3773 s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
3774 {
3775   expressionS exp;
3776   /* This is an arbitrary limit.         */
3777   unsigned char op[16];
3778   int count;
3779
3780   expression (&exp);
3781   if (exp.X_op == O_constant
3782       && skip_past_comma (&input_line_pointer) != FAIL)
3783     {
3784       unwind.frame_size += exp.X_add_number;
3785       expression (&exp);
3786     }
3787   else
3788     exp.X_op = O_illegal;
3789
3790   if (exp.X_op != O_constant)
3791     {
3792       as_bad (_("expected <offset>, <opcode>"));
3793       ignore_rest_of_line ();
3794       return;
3795     }
3796
3797   count = 0;
3798
3799   /* Parse the opcode.  */
3800   for (;;)
3801     {
3802       if (count >= 16)
3803         {
3804           as_bad (_("unwind opcode too long"));
3805           ignore_rest_of_line ();
3806         }
3807       if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
3808         {
3809           as_bad (_("invalid unwind opcode"));
3810           ignore_rest_of_line ();
3811           return;
3812         }
3813       op[count++] = exp.X_add_number;
3814
3815       /* Parse the next byte.  */
3816       if (skip_past_comma (&input_line_pointer) == FAIL)
3817         break;
3818
3819       expression (&exp);
3820     }
3821
3822   /* Add the opcode bytes in reverse order.  */
3823   while (count--)
3824     add_unwind_opcode (op[count], 1);
3825
3826   demand_empty_rest_of_line ();
3827 }
3828
3829
3830 /* Parse a .eabi_attribute directive.  */
3831
3832 static void
3833 s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
3834 {
3835   s_vendor_attribute (OBJ_ATTR_PROC);
3836 }
3837 #endif /* OBJ_ELF */
3838
3839 static void s_arm_arch (int);
3840 static void s_arm_arch_extension (int);
3841 static void s_arm_object_arch (int);
3842 static void s_arm_cpu (int);
3843 static void s_arm_fpu (int);
3844
3845 #ifdef TE_PE
3846
3847 static void
3848 pe_directive_secrel (int dummy ATTRIBUTE_UNUSED) 
3849 {
3850   expressionS exp;
3851
3852   do
3853     {
3854       expression (&exp);
3855       if (exp.X_op == O_symbol)
3856         exp.X_op = O_secrel;
3857
3858       emit_expr (&exp, 4);
3859     }
3860   while (*input_line_pointer++ == ',');
3861
3862   input_line_pointer--;
3863   demand_empty_rest_of_line ();
3864 }
3865 #endif /* TE_PE */
3866
3867 /* This table describes all the machine specific pseudo-ops the assembler
3868    has to support.  The fields are:
3869      pseudo-op name without dot
3870      function to call to execute this pseudo-op
3871      Integer arg to pass to the function.  */
3872
3873 const pseudo_typeS md_pseudo_table[] =
3874 {
3875   /* Never called because '.req' does not start a line.  */
3876   { "req",         s_req,         0 },
3877   /* Following two are likewise never called.  */
3878   { "dn",          s_dn,          0 },
3879   { "qn",          s_qn,          0 },
3880   { "unreq",       s_unreq,       0 },
3881   { "bss",         s_bss,         0 },
3882   { "align",       s_align,       0 },
3883   { "arm",         s_arm,         0 },
3884   { "thumb",       s_thumb,       0 },
3885   { "code",        s_code,        0 },
3886   { "force_thumb", s_force_thumb, 0 },
3887   { "thumb_func",  s_thumb_func,  0 },
3888   { "thumb_set",   s_thumb_set,   0 },
3889   { "even",        s_even,        0 },
3890   { "ltorg",       s_ltorg,       0 },
3891   { "pool",        s_ltorg,       0 },
3892   { "syntax",      s_syntax,      0 },
3893   { "cpu",         s_arm_cpu,     0 },
3894   { "arch",        s_arm_arch,    0 },
3895   { "arch_extension",      s_arm_arch_extension,          0 },
3896   { "object_arch", s_arm_object_arch,   0 },
3897   { "fpu",         s_arm_fpu,     0 },
3898 #ifdef OBJ_ELF
3899   { "word",        s_arm_elf_cons, 4 },
3900   { "long",        s_arm_elf_cons, 4 },
3901   { "rel31",       s_arm_rel31,   0 },
3902   { "fnstart",          s_arm_unwind_fnstart,   0 },
3903   { "fnend",            s_arm_unwind_fnend,     0 },
3904   { "cantunwind",       s_arm_unwind_cantunwind, 0 },
3905   { "personality",      s_arm_unwind_personality, 0 },
3906   { "personalityindex", s_arm_unwind_personalityindex, 0 },
3907   { "handlerdata",      s_arm_unwind_handlerdata, 0 },
3908   { "save",             s_arm_unwind_save,      0 },
3909   { "vsave",            s_arm_unwind_save,      1 },
3910   { "movsp",            s_arm_unwind_movsp,     0 },
3911   { "pad",              s_arm_unwind_pad,       0 },
3912   { "setfp",            s_arm_unwind_setfp,     0 },
3913   { "unwind_raw",       s_arm_unwind_raw,       0 },
3914   { "eabi_attribute",   s_arm_eabi_attribute,   0 },
3915 #else
3916   { "word",        cons, 4},
3917
3918   /* These are used for dwarf.  */
3919   {"2byte", cons, 2},
3920   {"4byte", cons, 4},
3921   {"8byte", cons, 8},
3922   /* These are used for dwarf2.  */
3923   { "file", (void (*) (int)) dwarf2_directive_file, 0 },
3924   { "loc",  dwarf2_directive_loc,  0 },
3925   { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
3926 #endif
3927   { "extend",      float_cons, 'x' },
3928   { "ldouble",     float_cons, 'x' },
3929   { "packed",      float_cons, 'p' },
3930 #ifdef TE_PE
3931   {"secrel32", pe_directive_secrel, 0},
3932 #endif
3933   { 0, 0, 0 }
3934 };
3935 \f
3936 /* Parser functions used exclusively in instruction operands.  */
3937
3938 /* Generic immediate-value read function for use in insn parsing.
3939    STR points to the beginning of the immediate (the leading #);
3940    VAL receives the value; if the value is outside [MIN, MAX]
3941    issue an error.  PREFIX_OPT is true if the immediate prefix is
3942    optional.  */
3943
3944 static int
3945 parse_immediate (char **str, int *val, int min, int max,
3946                  bfd_boolean prefix_opt)
3947 {
3948   expressionS exp;
3949   my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
3950   if (exp.X_op != O_constant)
3951     {
3952       inst.error = _("constant expression required");
3953       return FAIL;
3954     }
3955
3956   if (exp.X_add_number < min || exp.X_add_number > max)
3957     {
3958       inst.error = _("immediate value out of range");
3959       return FAIL;
3960     }
3961
3962   *val = exp.X_add_number;
3963   return SUCCESS;
3964 }
3965
3966 /* Less-generic immediate-value read function with the possibility of loading a
3967    big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
3968    instructions. Puts the result directly in inst.operands[i].  */
3969
3970 static int
3971 parse_big_immediate (char **str, int i)
3972 {
3973   expressionS exp;
3974   char *ptr = *str;
3975
3976   my_get_expression (&exp, &ptr, GE_OPT_PREFIX_BIG);
3977
3978   if (exp.X_op == O_constant)
3979     {
3980       inst.operands[i].imm = exp.X_add_number & 0xffffffff;
3981       /* If we're on a 64-bit host, then a 64-bit number can be returned using
3982          O_constant.  We have to be careful not to break compilation for
3983          32-bit X_add_number, though.  */
3984       if ((exp.X_add_number & ~0xffffffffl) != 0)
3985         {
3986           /* X >> 32 is illegal if sizeof (exp.X_add_number) == 4.  */
3987           inst.operands[i].reg = ((exp.X_add_number >> 16) >> 16) & 0xffffffff;
3988           inst.operands[i].regisimm = 1;
3989         }
3990     }
3991   else if (exp.X_op == O_big
3992            && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32
3993            && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number <= 64)
3994     {
3995       unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
3996       /* Bignums have their least significant bits in
3997          generic_bignum[0]. Make sure we put 32 bits in imm and
3998          32 bits in reg,  in a (hopefully) portable way.  */
3999       assert (parts != 0);
4000       inst.operands[i].imm = 0;
4001       for (j = 0; j < parts; j++, idx++)
4002         inst.operands[i].imm |= generic_bignum[idx]
4003                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4004       inst.operands[i].reg = 0;
4005       for (j = 0; j < parts; j++, idx++)
4006         inst.operands[i].reg |= generic_bignum[idx]
4007                                 << (LITTLENUM_NUMBER_OF_BITS * j);
4008       inst.operands[i].regisimm = 1;
4009     }
4010   else
4011     return FAIL;
4012   
4013   *str = ptr;
4014
4015   return SUCCESS;
4016 }
4017
4018 /* Returns the pseudo-register number of an FPA immediate constant,
4019    or FAIL if there isn't a valid constant here.  */
4020
4021 static int
4022 parse_fpa_immediate (char ** str)
4023 {
4024   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4025   char *         save_in;
4026   expressionS    exp;
4027   int            i;
4028   int            j;
4029
4030   /* First try and match exact strings, this is to guarantee
4031      that some formats will work even for cross assembly.  */
4032
4033   for (i = 0; fp_const[i]; i++)
4034     {
4035       if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
4036         {
4037           char *start = *str;
4038
4039           *str += strlen (fp_const[i]);
4040           if (is_end_of_line[(unsigned char) **str])
4041             return i + 8;
4042           *str = start;
4043         }
4044     }
4045
4046   /* Just because we didn't get a match doesn't mean that the constant
4047      isn't valid, just that it is in a format that we don't
4048      automatically recognize.  Try parsing it with the standard
4049      expression routines.  */
4050
4051   memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
4052
4053   /* Look for a raw floating point number.  */
4054   if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4055       && is_end_of_line[(unsigned char) *save_in])
4056     {
4057       for (i = 0; i < NUM_FLOAT_VALS; i++)
4058         {
4059           for (j = 0; j < MAX_LITTLENUMS; j++)
4060             {
4061               if (words[j] != fp_values[i][j])
4062                 break;
4063             }
4064
4065           if (j == MAX_LITTLENUMS)
4066             {
4067               *str = save_in;
4068               return i + 8;
4069             }
4070         }
4071     }
4072
4073   /* Try and parse a more complex expression, this will probably fail
4074      unless the code uses a floating point prefix (eg "0f").  */
4075   save_in = input_line_pointer;
4076   input_line_pointer = *str;
4077   if (expression (&exp) == absolute_section
4078       && exp.X_op == O_big
4079       && exp.X_add_number < 0)
4080     {
4081       /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4082          Ditto for 15.  */
4083       if (gen_to_words (words, 5, (long) 15) == 0)
4084         {
4085           for (i = 0; i < NUM_FLOAT_VALS; i++)
4086             {
4087               for (j = 0; j < MAX_LITTLENUMS; j++)
4088                 {
4089                   if (words[j] != fp_values[i][j])
4090                     break;
4091                 }
4092
4093               if (j == MAX_LITTLENUMS)
4094                 {
4095                   *str = input_line_pointer;
4096                   input_line_pointer = save_in;
4097                   return i + 8;
4098                 }
4099             }
4100         }
4101     }
4102
4103   *str = input_line_pointer;
4104   input_line_pointer = save_in;
4105   inst.error = _("invalid FPA immediate expression");
4106   return FAIL;
4107 }
4108
4109 /* Returns 1 if a number has "quarter-precision" float format
4110    0baBbbbbbc defgh000 00000000 00000000.  */
4111
4112 static int
4113 is_quarter_float (unsigned imm)
4114 {
4115   int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4116   return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4117 }
4118
4119 /* Parse an 8-bit "quarter-precision" floating point number of the form:
4120    0baBbbbbbc defgh000 00000000 00000000.
4121    The zero and minus-zero cases need special handling, since they can't be
4122    encoded in the "quarter-precision" float format, but can nonetheless be
4123    loaded as integer constants.  */
4124
4125 static unsigned
4126 parse_qfloat_immediate (char **ccp, int *immed)
4127 {
4128   char *str = *ccp;
4129   char *fpnum;
4130   LITTLENUM_TYPE words[MAX_LITTLENUMS];
4131   int found_fpchar = 0;
4132   
4133   skip_past_char (&str, '#');
4134   
4135   /* We must not accidentally parse an integer as a floating-point number. Make
4136      sure that the value we parse is not an integer by checking for special
4137      characters '.' or 'e'.
4138      FIXME: This is a horrible hack, but doing better is tricky because type
4139      information isn't in a very usable state at parse time.  */
4140   fpnum = str;
4141   skip_whitespace (fpnum);
4142
4143   if (strncmp (fpnum, "0x", 2) == 0)
4144     return FAIL;
4145   else
4146     {
4147       for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
4148         if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
4149           {
4150             found_fpchar = 1;
4151             break;
4152           }
4153
4154       if (!found_fpchar)
4155         return FAIL;
4156     }
4157   
4158   if ((str = atof_ieee (str, 's', words)) != NULL)
4159     {
4160       unsigned fpword = 0;
4161       int i;
4162       
4163       /* Our FP word must be 32 bits (single-precision FP).  */
4164       for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
4165         {
4166           fpword <<= LITTLENUM_NUMBER_OF_BITS;
4167           fpword |= words[i];
4168         }
4169       
4170       if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
4171         *immed = fpword;
4172       else
4173         return FAIL;
4174
4175       *ccp = str;
4176       
4177       return SUCCESS;
4178     }
4179   
4180   return FAIL;
4181 }
4182
4183 /* Shift operands.  */
4184 enum shift_kind
4185 {
4186   SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
4187 };
4188
4189 struct asm_shift_name
4190 {
4191   const char      *name;
4192   enum shift_kind  kind;
4193 };
4194
4195 /* Third argument to parse_shift.  */
4196 enum parse_shift_mode
4197 {
4198   NO_SHIFT_RESTRICT,            /* Any kind of shift is accepted.  */
4199   SHIFT_IMMEDIATE,              /* Shift operand must be an immediate.  */
4200   SHIFT_LSL_OR_ASR_IMMEDIATE,   /* Shift must be LSL or ASR immediate.  */
4201   SHIFT_ASR_IMMEDIATE,          /* Shift must be ASR immediate.  */
4202   SHIFT_LSL_IMMEDIATE,          /* Shift must be LSL immediate.  */
4203 };
4204
4205 /* Parse a <shift> specifier on an ARM data processing instruction.
4206    This has three forms:
4207
4208      (LSL|LSR|ASL|ASR|ROR) Rs
4209      (LSL|LSR|ASL|ASR|ROR) #imm
4210      RRX
4211
4212    Note that ASL is assimilated to LSL in the instruction encoding, and
4213    RRX to ROR #0 (which cannot be written as such).  */
4214
4215 static int
4216 parse_shift (char **str, int i, enum parse_shift_mode mode)
4217 {
4218   const struct asm_shift_name *shift_name;
4219   enum shift_kind shift;
4220   char *s = *str;
4221   char *p = s;
4222   int reg;
4223
4224   for (p = *str; ISALPHA (*p); p++)
4225     ;
4226
4227   if (p == *str)
4228     {
4229       inst.error = _("shift expression expected");
4230       return FAIL;
4231     }
4232
4233   shift_name = hash_find_n (arm_shift_hsh, *str, p - *str);
4234
4235   if (shift_name == NULL)
4236     {
4237       inst.error = _("shift expression expected");
4238       return FAIL;
4239     }
4240
4241   shift = shift_name->kind;
4242
4243   switch (mode)
4244     {
4245     case NO_SHIFT_RESTRICT:
4246     case SHIFT_IMMEDIATE:   break;
4247
4248     case SHIFT_LSL_OR_ASR_IMMEDIATE:
4249       if (shift != SHIFT_LSL && shift != SHIFT_ASR)
4250         {
4251           inst.error = _("'LSL' or 'ASR' required");
4252           return FAIL;
4253         }
4254       break;
4255
4256     case SHIFT_LSL_IMMEDIATE:
4257       if (shift != SHIFT_LSL)
4258         {
4259           inst.error = _("'LSL' required");
4260           return FAIL;
4261         }
4262       break;
4263
4264     case SHIFT_ASR_IMMEDIATE:
4265       if (shift != SHIFT_ASR)
4266         {
4267           inst.error = _("'ASR' required");
4268           return FAIL;
4269         }
4270       break;
4271
4272     default: abort ();
4273     }
4274
4275   if (shift != SHIFT_RRX)
4276     {
4277       /* Whitespace can appear here if the next thing is a bare digit.  */
4278       skip_whitespace (p);
4279
4280       if (mode == NO_SHIFT_RESTRICT
4281           && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
4282         {
4283           inst.operands[i].imm = reg;
4284           inst.operands[i].immisreg = 1;
4285         }
4286       else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4287         return FAIL;
4288     }
4289   inst.operands[i].shift_kind = shift;
4290   inst.operands[i].shifted = 1;
4291   *str = p;
4292   return SUCCESS;
4293 }
4294
4295 /* Parse a <shifter_operand> for an ARM data processing instruction:
4296
4297       #<immediate>
4298       #<immediate>, <rotate>
4299       <Rm>
4300       <Rm>, <shift>
4301
4302    where <shift> is defined by parse_shift above, and <rotate> is a
4303    multiple of 2 between 0 and 30.  Validation of immediate operands
4304    is deferred to md_apply_fix.  */
4305
4306 static int
4307 parse_shifter_operand (char **str, int i)
4308 {
4309   int value;
4310   expressionS expr;
4311
4312   if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
4313     {
4314       inst.operands[i].reg = value;
4315       inst.operands[i].isreg = 1;
4316
4317       /* parse_shift will override this if appropriate */
4318       inst.reloc.exp.X_op = O_constant;
4319       inst.reloc.exp.X_add_number = 0;
4320
4321       if (skip_past_comma (str) == FAIL)
4322         return SUCCESS;
4323
4324       /* Shift operation on register.  */
4325       return parse_shift (str, i, NO_SHIFT_RESTRICT);
4326     }
4327
4328   if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
4329     return FAIL;
4330
4331   if (skip_past_comma (str) == SUCCESS)
4332     {
4333       /* #x, y -- ie explicit rotation by Y.  */
4334       if (my_get_expression (&expr, str, GE_NO_PREFIX))
4335         return FAIL;
4336
4337       if (expr.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
4338         {
4339           inst.error = _("constant expression expected");
4340           return FAIL;
4341         }
4342
4343       value = expr.X_add_number;
4344       if (value < 0 || value > 30 || value % 2 != 0)
4345         {
4346           inst.error = _("invalid rotation");
4347           return FAIL;
4348         }
4349       if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
4350         {
4351           inst.error = _("invalid constant");
4352           return FAIL;
4353         }
4354
4355       /* Convert to decoded value.  md_apply_fix will put it back.  */
4356       inst.reloc.exp.X_add_number
4357         = (((inst.reloc.exp.X_add_number << (32 - value))
4358             | (inst.reloc.exp.X_add_number >> value)) & 0xffffffff);
4359     }
4360
4361   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4362   inst.reloc.pc_rel = 0;
4363   return SUCCESS;
4364 }
4365
4366 /* Group relocation information.  Each entry in the table contains the
4367    textual name of the relocation as may appear in assembler source
4368    and must end with a colon.
4369    Along with this textual name are the relocation codes to be used if
4370    the corresponding instruction is an ALU instruction (ADD or SUB only),
4371    an LDR, an LDRS, or an LDC.  */
4372
4373 struct group_reloc_table_entry
4374 {
4375   const char *name;
4376   int alu_code;
4377   int ldr_code;
4378   int ldrs_code;
4379   int ldc_code;
4380 };
4381
4382 typedef enum
4383 {
4384   /* Varieties of non-ALU group relocation.  */
4385
4386   GROUP_LDR,
4387   GROUP_LDRS,
4388   GROUP_LDC
4389 } group_reloc_type;
4390
4391 static struct group_reloc_table_entry group_reloc_table[] =
4392   { /* Program counter relative: */
4393     { "pc_g0_nc",
4394       BFD_RELOC_ARM_ALU_PC_G0_NC,       /* ALU */
4395       0,                                /* LDR */
4396       0,                                /* LDRS */
4397       0 },                              /* LDC */
4398     { "pc_g0",
4399       BFD_RELOC_ARM_ALU_PC_G0,          /* ALU */
4400       BFD_RELOC_ARM_LDR_PC_G0,          /* LDR */
4401       BFD_RELOC_ARM_LDRS_PC_G0,         /* LDRS */
4402       BFD_RELOC_ARM_LDC_PC_G0 },        /* LDC */
4403     { "pc_g1_nc",
4404       BFD_RELOC_ARM_ALU_PC_G1_NC,       /* ALU */
4405       0,                                /* LDR */
4406       0,                                /* LDRS */
4407       0 },                              /* LDC */
4408     { "pc_g1",
4409       BFD_RELOC_ARM_ALU_PC_G1,          /* ALU */
4410       BFD_RELOC_ARM_LDR_PC_G1,          /* LDR */
4411       BFD_RELOC_ARM_LDRS_PC_G1,         /* LDRS */
4412       BFD_RELOC_ARM_LDC_PC_G1 },        /* LDC */
4413     { "pc_g2",
4414       BFD_RELOC_ARM_ALU_PC_G2,          /* ALU */
4415       BFD_RELOC_ARM_LDR_PC_G2,          /* LDR */
4416       BFD_RELOC_ARM_LDRS_PC_G2,         /* LDRS */
4417       BFD_RELOC_ARM_LDC_PC_G2 },        /* LDC */
4418     /* Section base relative */
4419     { "sb_g0_nc",
4420       BFD_RELOC_ARM_ALU_SB_G0_NC,       /* ALU */
4421       0,                                /* LDR */
4422       0,                                /* LDRS */
4423       0 },                              /* LDC */
4424     { "sb_g0",
4425       BFD_RELOC_ARM_ALU_SB_G0,          /* ALU */
4426       BFD_RELOC_ARM_LDR_SB_G0,          /* LDR */
4427       BFD_RELOC_ARM_LDRS_SB_G0,         /* LDRS */
4428       BFD_RELOC_ARM_LDC_SB_G0 },        /* LDC */
4429     { "sb_g1_nc",
4430       BFD_RELOC_ARM_ALU_SB_G1_NC,       /* ALU */
4431       0,                                /* LDR */
4432       0,                                /* LDRS */
4433       0 },                              /* LDC */
4434     { "sb_g1",
4435       BFD_RELOC_ARM_ALU_SB_G1,          /* ALU */
4436       BFD_RELOC_ARM_LDR_SB_G1,          /* LDR */
4437       BFD_RELOC_ARM_LDRS_SB_G1,         /* LDRS */
4438       BFD_RELOC_ARM_LDC_SB_G1 },        /* LDC */
4439     { "sb_g2",
4440       BFD_RELOC_ARM_ALU_SB_G2,          /* ALU */
4441       BFD_RELOC_ARM_LDR_SB_G2,          /* LDR */
4442       BFD_RELOC_ARM_LDRS_SB_G2,         /* LDRS */
4443       BFD_RELOC_ARM_LDC_SB_G2 } };      /* LDC */
4444
4445 /* Given the address of a pointer pointing to the textual name of a group
4446    relocation as may appear in assembler source, attempt to find its details
4447    in group_reloc_table.  The pointer will be updated to the character after
4448    the trailing colon.  On failure, FAIL will be returned; SUCCESS
4449    otherwise.  On success, *entry will be updated to point at the relevant
4450    group_reloc_table entry. */
4451
4452 static int
4453 find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
4454 {
4455   unsigned int i;
4456   for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
4457     {
4458       int length = strlen (group_reloc_table[i].name);
4459
4460       if (strncasecmp (group_reloc_table[i].name, *str, length) == 0 &&
4461           (*str)[length] == ':')
4462         {
4463           *out = &group_reloc_table[i];
4464           *str += (length + 1);
4465           return SUCCESS;
4466         }
4467     }
4468
4469   return FAIL;
4470 }
4471
4472 /* Parse a <shifter_operand> for an ARM data processing instruction
4473    (as for parse_shifter_operand) where group relocations are allowed:
4474
4475       #<immediate>
4476       #<immediate>, <rotate>
4477       #:<group_reloc>:<expression>
4478       <Rm>
4479       <Rm>, <shift>
4480
4481    where <group_reloc> is one of the strings defined in group_reloc_table.
4482    The hashes are optional.
4483
4484    Everything else is as for parse_shifter_operand.  */
4485
4486 static parse_operand_result
4487 parse_shifter_operand_group_reloc (char **str, int i)
4488 {
4489   /* Determine if we have the sequence of characters #: or just :
4490      coming next.  If we do, then we check for a group relocation.
4491      If we don't, punt the whole lot to parse_shifter_operand.  */
4492
4493   if (((*str)[0] == '#' && (*str)[1] == ':')
4494       || (*str)[0] == ':')
4495     {
4496       struct group_reloc_table_entry *entry;
4497
4498       if ((*str)[0] == '#')
4499         (*str) += 2;
4500       else
4501         (*str)++;
4502
4503       /* Try to parse a group relocation.  Anything else is an error.  */
4504       if (find_group_reloc_table_entry (str, &entry) == FAIL)
4505         {
4506           inst.error = _("unknown group relocation");
4507           return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4508         }
4509
4510       /* We now have the group relocation table entry corresponding to
4511          the name in the assembler source.  Next, we parse the expression.  */
4512       if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
4513         return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4514
4515       /* Record the relocation type (always the ALU variant here).  */
4516       inst.reloc.type = entry->alu_code;
4517       assert (inst.reloc.type != 0);
4518
4519       return PARSE_OPERAND_SUCCESS;
4520     }
4521   else
4522     return parse_shifter_operand (str, i) == SUCCESS
4523            ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
4524
4525   /* Never reached.  */
4526 }
4527
4528 /* Parse all forms of an ARM address expression.  Information is written
4529    to inst.operands[i] and/or inst.reloc.
4530
4531    Preindexed addressing (.preind=1):
4532
4533    [Rn, #offset]       .reg=Rn .reloc.exp=offset
4534    [Rn, +/-Rm]         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
4535    [Rn, +/-Rm, shift]  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
4536                        .shift_kind=shift .reloc.exp=shift_imm
4537
4538    These three may have a trailing ! which causes .writeback to be set also.
4539
4540    Postindexed addressing (.postind=1, .writeback=1):
4541
4542    [Rn], #offset       .reg=Rn .reloc.exp=offset
4543    [Rn], +/-Rm         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
4544    [Rn], +/-Rm, shift  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
4545                        .shift_kind=shift .reloc.exp=shift_imm
4546
4547    Unindexed addressing (.preind=0, .postind=0):
4548
4549    [Rn], {option}      .reg=Rn .imm=option .immisreg=0
4550
4551    Other:
4552
4553    [Rn]{!}             shorthand for [Rn,#0]{!}
4554    =immediate          .isreg=0 .reloc.exp=immediate
4555    label               .reg=PC .reloc.pc_rel=1 .reloc.exp=label
4556
4557   It is the caller's responsibility to check for addressing modes not
4558   supported by the instruction, and to set inst.reloc.type.  */
4559
4560 static parse_operand_result
4561 parse_address_main (char **str, int i, int group_relocations,
4562                     group_reloc_type group_type)
4563 {
4564   char *p = *str;
4565   int reg;
4566
4567   if (skip_past_char (&p, '[') == FAIL)
4568     {
4569       if (skip_past_char (&p, '=') == FAIL)
4570         {
4571           /* bare address - translate to PC-relative offset */
4572           inst.reloc.pc_rel = 1;
4573           inst.operands[i].reg = REG_PC;
4574           inst.operands[i].isreg = 1;
4575           inst.operands[i].preind = 1;
4576         }
4577       /* else a load-constant pseudo op, no special treatment needed here */
4578
4579       if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
4580         return PARSE_OPERAND_FAIL;
4581
4582       *str = p;
4583       return PARSE_OPERAND_SUCCESS;
4584     }
4585
4586   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
4587     {
4588       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
4589       return PARSE_OPERAND_FAIL;
4590     }
4591   inst.operands[i].reg = reg;
4592   inst.operands[i].isreg = 1;
4593
4594   if (skip_past_comma (&p) == SUCCESS)
4595     {
4596       inst.operands[i].preind = 1;
4597
4598       if (*p == '+') p++;
4599       else if (*p == '-') p++, inst.operands[i].negative = 1;
4600
4601       if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
4602         {
4603           inst.operands[i].imm = reg;
4604           inst.operands[i].immisreg = 1;
4605
4606           if (skip_past_comma (&p) == SUCCESS)
4607             if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
4608               return PARSE_OPERAND_FAIL;
4609         }
4610       else if (skip_past_char (&p, ':') == SUCCESS)
4611         {
4612           /* FIXME: '@' should be used here, but it's filtered out by generic
4613              code before we get to see it here. This may be subject to
4614              change.  */
4615           expressionS exp;
4616           my_get_expression (&exp, &p, GE_NO_PREFIX);
4617           if (exp.X_op != O_constant)
4618             {
4619               inst.error = _("alignment must be constant");
4620               return PARSE_OPERAND_FAIL;
4621             }
4622           inst.operands[i].imm = exp.X_add_number << 8;
4623           inst.operands[i].immisalign = 1;
4624           /* Alignments are not pre-indexes.  */
4625           inst.operands[i].preind = 0;
4626         }
4627       else
4628         {
4629           if (inst.operands[i].negative)
4630             {
4631               inst.operands[i].negative = 0;
4632               p--;
4633             }
4634
4635           if (group_relocations &&
4636               ((*p == '#' && *(p + 1) == ':') || *p == ':'))
4637
4638             {
4639               struct group_reloc_table_entry *entry;
4640
4641               /* Skip over the #: or : sequence.  */
4642               if (*p == '#')
4643                 p += 2;
4644               else
4645                 p++;
4646
4647               /* Try to parse a group relocation.  Anything else is an
4648                  error.  */
4649               if (find_group_reloc_table_entry (&p, &entry) == FAIL)
4650                 {
4651                   inst.error = _("unknown group relocation");
4652                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4653                 }
4654
4655               /* We now have the group relocation table entry corresponding to
4656                  the name in the assembler source.  Next, we parse the
4657                  expression.  */
4658               if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
4659                 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4660
4661               /* Record the relocation type.  */
4662               switch (group_type)
4663                 {
4664                   case GROUP_LDR:
4665                     inst.reloc.type = entry->ldr_code;
4666                     break;
4667
4668                   case GROUP_LDRS:
4669                     inst.reloc.type = entry->ldrs_code;
4670                     break;
4671
4672                   case GROUP_LDC:
4673                     inst.reloc.type = entry->ldc_code;
4674                     break;
4675
4676                   default:
4677                     assert (0);
4678                 }
4679
4680               if (inst.reloc.type == 0)
4681                 {
4682                   inst.error = _("this group relocation is not allowed on this instruction");
4683                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4684                 }
4685             }
4686           else
4687             if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4688               return PARSE_OPERAND_FAIL;
4689         }
4690     }
4691
4692   if (skip_past_char (&p, ']') == FAIL)
4693     {
4694       inst.error = _("']' expected");
4695       return PARSE_OPERAND_FAIL;
4696     }
4697
4698   if (skip_past_char (&p, '!') == SUCCESS)
4699     inst.operands[i].writeback = 1;
4700
4701   else if (skip_past_comma (&p) == SUCCESS)
4702     {
4703       if (skip_past_char (&p, '{') == SUCCESS)
4704         {
4705           /* [Rn], {expr} - unindexed, with option */
4706           if (parse_immediate (&p, &inst.operands[i].imm,
4707                                0, 255, TRUE) == FAIL)
4708             return PARSE_OPERAND_FAIL;
4709
4710           if (skip_past_char (&p, '}') == FAIL)
4711             {
4712               inst.error = _("'}' expected at end of 'option' field");
4713               return PARSE_OPERAND_FAIL;
4714             }
4715           if (inst.operands[i].preind)
4716             {
4717               inst.error = _("cannot combine index with option");
4718               return PARSE_OPERAND_FAIL;
4719             }
4720           *str = p;
4721           return PARSE_OPERAND_SUCCESS;
4722         }
4723       else
4724         {
4725           inst.operands[i].postind = 1;
4726           inst.operands[i].writeback = 1;
4727
4728           if (inst.operands[i].preind)
4729             {
4730               inst.error = _("cannot combine pre- and post-indexing");
4731               return PARSE_OPERAND_FAIL;
4732             }
4733
4734           if (*p == '+') p++;
4735           else if (*p == '-') p++, inst.operands[i].negative = 1;
4736
4737           if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
4738             {
4739               /* We might be using the immediate for alignment already. If we
4740                  are, OR the register number into the low-order bits.  */
4741               if (inst.operands[i].immisalign)
4742                 inst.operands[i].imm |= reg;
4743               else
4744                 inst.operands[i].imm = reg;
4745               inst.operands[i].immisreg = 1;
4746
4747               if (skip_past_comma (&p) == SUCCESS)
4748                 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
4749                   return PARSE_OPERAND_FAIL;
4750             }
4751           else
4752             {
4753               if (inst.operands[i].negative)
4754                 {
4755                   inst.operands[i].negative = 0;
4756                   p--;
4757                 }
4758               if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4759                 return PARSE_OPERAND_FAIL;
4760             }
4761         }
4762     }
4763
4764   /* If at this point neither .preind nor .postind is set, we have a
4765      bare [Rn]{!}, which is shorthand for [Rn,#0]{!}.  */
4766   if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
4767     {
4768       inst.operands[i].preind = 1;
4769       inst.reloc.exp.X_op = O_constant;
4770       inst.reloc.exp.X_add_number = 0;
4771     }
4772   *str = p;
4773   return PARSE_OPERAND_SUCCESS;
4774 }
4775
4776 static int
4777 parse_address (char **str, int i)
4778 {
4779   return parse_address_main (str, i, 0, 0) == PARSE_OPERAND_SUCCESS
4780          ? SUCCESS : FAIL;
4781 }
4782
4783 static parse_operand_result
4784 parse_address_group_reloc (char **str, int i, group_reloc_type type)
4785 {
4786   return parse_address_main (str, i, 1, type);
4787 }
4788
4789 /* Parse an operand for a MOVW or MOVT instruction.  */
4790 static int
4791 parse_half (char **str)
4792 {
4793   char * p;
4794   
4795   p = *str;
4796   skip_past_char (&p, '#');
4797   if (strncasecmp (p, ":lower16:", 9) == 0) 
4798     inst.reloc.type = BFD_RELOC_ARM_MOVW;
4799   else if (strncasecmp (p, ":upper16:", 9) == 0)
4800     inst.reloc.type = BFD_RELOC_ARM_MOVT;
4801
4802   if (inst.reloc.type != BFD_RELOC_UNUSED)
4803     {
4804       p += 9;
4805       skip_whitespace(p);
4806     }
4807
4808   if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
4809     return FAIL;
4810
4811   if (inst.reloc.type == BFD_RELOC_UNUSED)
4812     {
4813       if (inst.reloc.exp.X_op != O_constant)
4814         {
4815           inst.error = _("constant expression expected");
4816           return FAIL;
4817         }
4818       if (inst.reloc.exp.X_add_number < 0
4819           || inst.reloc.exp.X_add_number > 0xffff)
4820         {
4821           inst.error = _("immediate value out of range");
4822           return FAIL;
4823         }
4824     }
4825   *str = p;
4826   return SUCCESS;
4827 }
4828
4829 /* Miscellaneous. */
4830
4831 /* Parse a PSR flag operand.  The value returned is FAIL on syntax error,
4832    or a bitmask suitable to be or-ed into the ARM msr instruction.  */
4833 static int
4834 parse_psr (char **str)
4835 {
4836   char *p;
4837   unsigned long psr_field;
4838   const struct asm_psr *psr;
4839   char *start;
4840
4841   /* CPSR's and SPSR's can now be lowercase.  This is just a convenience
4842      feature for ease of use and backwards compatibility.  */
4843   p = *str;
4844   if (strncasecmp (p, "SPSR", 4) == 0)
4845     psr_field = SPSR_BIT;
4846   else if (strncasecmp (p, "CPSR", 4) == 0)
4847     psr_field = 0;
4848   else
4849     {
4850       start = p;
4851       do
4852         p++;
4853       while (ISALNUM (*p) || *p == '_');
4854
4855       psr = hash_find_n (arm_v7m_psr_hsh, start, p - start);
4856       if (!psr)
4857         return FAIL;
4858
4859       *str = p;
4860       return psr->field;
4861     }
4862
4863   p += 4;
4864   if (*p == '_')
4865     {
4866       /* A suffix follows.  */
4867       p++;
4868       start = p;
4869
4870       do
4871         p++;
4872       while (ISALNUM (*p) || *p == '_');
4873
4874       psr = hash_find_n (arm_psr_hsh, start, p - start);
4875       if (!psr)
4876         goto error;
4877
4878       psr_field |= psr->field;
4879     }
4880   else
4881     {
4882       if (ISALNUM (*p))
4883         goto error;    /* Garbage after "[CS]PSR".  */
4884
4885       psr_field |= (PSR_c | PSR_f);
4886     }
4887   *str = p;
4888   return psr_field;
4889
4890  error:
4891   inst.error = _("flag for {c}psr instruction expected");
4892   return FAIL;
4893 }
4894
4895 /* Parse the flags argument to CPSI[ED].  Returns FAIL on error, or a
4896    value suitable for splatting into the AIF field of the instruction.  */
4897
4898 static int
4899 parse_cps_flags (char **str)
4900 {
4901   int val = 0;
4902   int saw_a_flag = 0;
4903   char *s = *str;
4904
4905   for (;;)
4906     switch (*s++)
4907       {
4908       case '\0': case ',':
4909         goto done;
4910
4911       case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
4912       case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
4913       case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
4914
4915       default:
4916         inst.error = _("unrecognized CPS flag");
4917         return FAIL;
4918       }
4919
4920  done:
4921   if (saw_a_flag == 0)
4922     {
4923       inst.error = _("missing CPS flags");
4924       return FAIL;
4925     }
4926
4927   *str = s - 1;
4928   return val;
4929 }
4930
4931 /* Parse an endian specifier ("BE" or "LE", case insensitive);
4932    returns 0 for big-endian, 1 for little-endian, FAIL for an error.  */
4933
4934 static int
4935 parse_endian_specifier (char **str)
4936 {
4937   int little_endian;
4938   char *s = *str;
4939
4940   if (strncasecmp (s, "BE", 2))
4941     little_endian = 0;
4942   else if (strncasecmp (s, "LE", 2))
4943     little_endian = 1;
4944   else
4945     {
4946       inst.error = _("valid endian specifiers are be or le");
4947       return FAIL;
4948     }
4949
4950   if (ISALNUM (s[2]) || s[2] == '_')
4951     {
4952       inst.error = _("valid endian specifiers are be or le");
4953       return FAIL;
4954     }
4955
4956   *str = s + 2;
4957   return little_endian;
4958 }
4959
4960 /* Parse a rotation specifier: ROR #0, #8, #16, #24.  *val receives a
4961    value suitable for poking into the rotate field of an sxt or sxta
4962    instruction, or FAIL on error.  */
4963
4964 static int
4965 parse_ror (char **str)
4966 {
4967   int rot;
4968   char *s = *str;
4969
4970   if (strncasecmp (s, "ROR", 3) == 0)
4971     s += 3;
4972   else
4973     {
4974       inst.error = _("missing rotation field after comma");
4975       return FAIL;
4976     }
4977
4978   if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
4979     return FAIL;
4980
4981   switch (rot)
4982     {
4983     case  0: *str = s; return 0x0;
4984     case  8: *str = s; return 0x1;
4985     case 16: *str = s; return 0x2;
4986     case 24: *str = s; return 0x3;
4987
4988     default:
4989       inst.error = _("rotation can only be 0, 8, 16, or 24");
4990       return FAIL;
4991     }
4992 }
4993
4994 /* Parse a conditional code (from conds[] below).  The value returned is in the
4995    range 0 .. 14, or FAIL.  */
4996 static int
4997 parse_cond (char **str)
4998 {
4999   char *p, *q;
5000   const struct asm_cond *c;
5001
5002   p = q = *str;
5003   while (ISALPHA (*q))
5004     q++;
5005
5006   c = hash_find_n (arm_cond_hsh, p, q - p);
5007   if (!c)
5008     {
5009       inst.error = _("condition required");
5010       return FAIL;
5011     }
5012
5013   *str = q;
5014   return c->value;
5015 }
5016
5017 /* Parse an option for a barrier instruction.  Returns the encoding for the
5018    option, or FAIL.  */
5019 static int
5020 parse_barrier (char **str)
5021 {
5022   char *p, *q;
5023   const struct asm_barrier_opt *o;
5024
5025   p = q = *str;
5026   while (ISALPHA (*q))
5027     q++;
5028
5029   o = hash_find_n (arm_barrier_opt_hsh, p, q - p);
5030   if (!o)
5031     return FAIL;
5032
5033   *str = q;
5034   return o->value;
5035 }
5036
5037 /* Parse the operands of a table branch instruction.  Similar to a memory
5038    operand.  */
5039 static int
5040 parse_tb (char **str)
5041 {
5042   char * p = *str;
5043   int reg;
5044
5045   if (skip_past_char (&p, '[') == FAIL)
5046     {
5047       inst.error = _("'[' expected");
5048       return FAIL;
5049     }
5050
5051   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5052     {
5053       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5054       return FAIL;
5055     }
5056   inst.operands[0].reg = reg;
5057
5058   if (skip_past_comma (&p) == FAIL)
5059     {
5060       inst.error = _("',' expected");
5061       return FAIL;
5062     }
5063   
5064   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5065     {
5066       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5067       return FAIL;
5068     }
5069   inst.operands[0].imm = reg;
5070
5071   if (skip_past_comma (&p) == SUCCESS)
5072     {
5073       if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
5074         return FAIL;
5075       if (inst.reloc.exp.X_add_number != 1)
5076         {
5077           inst.error = _("invalid shift");
5078           return FAIL;
5079         }
5080       inst.operands[0].shifted = 1;
5081     }
5082
5083   if (skip_past_char (&p, ']') == FAIL)
5084     {
5085       inst.error = _("']' expected");
5086       return FAIL;
5087     }
5088   *str = p;
5089   return SUCCESS;
5090 }
5091
5092 /* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
5093    information on the types the operands can take and how they are encoded.
5094    Up to four operands may be read; this function handles setting the
5095    ".present" field for each read operand itself.
5096    Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
5097    else returns FAIL.  */
5098
5099 static int
5100 parse_neon_mov (char **str, int *which_operand)
5101 {
5102   int i = *which_operand, val;
5103   enum arm_reg_type rtype;
5104   char *ptr = *str;
5105   struct neon_type_el optype;
5106   
5107   if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5108     {
5109       /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>.  */
5110       inst.operands[i].reg = val;
5111       inst.operands[i].isscalar = 1;
5112       inst.operands[i].vectype = optype;
5113       inst.operands[i++].present = 1;
5114
5115       if (skip_past_comma (&ptr) == FAIL)
5116         goto wanted_comma;
5117       
5118       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5119         goto wanted_arm;
5120       
5121       inst.operands[i].reg = val;
5122       inst.operands[i].isreg = 1;
5123       inst.operands[i].present = 1;
5124     }
5125   else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
5126            != FAIL)
5127     {
5128       /* Cases 0, 1, 2, 3, 5 (D only).  */
5129       if (skip_past_comma (&ptr) == FAIL)
5130         goto wanted_comma;
5131       
5132       inst.operands[i].reg = val;
5133       inst.operands[i].isreg = 1;
5134       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5135       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5136       inst.operands[i].isvec = 1;
5137       inst.operands[i].vectype = optype;
5138       inst.operands[i++].present = 1;
5139
5140       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5141         {
5142           /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
5143              Case 13: VMOV <Sd>, <Rm>  */
5144           inst.operands[i].reg = val;
5145           inst.operands[i].isreg = 1;
5146           inst.operands[i].present = 1;
5147
5148           if (rtype == REG_TYPE_NQ)
5149             {
5150               first_error (_("can't use Neon quad register here"));
5151               return FAIL;
5152             }
5153           else if (rtype != REG_TYPE_VFS)
5154             {
5155               i++;
5156               if (skip_past_comma (&ptr) == FAIL)
5157                 goto wanted_comma;
5158               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5159                 goto wanted_arm;
5160               inst.operands[i].reg = val;
5161               inst.operands[i].isreg = 1;
5162               inst.operands[i].present = 1;
5163             }
5164         }
5165       else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
5166           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
5167              Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
5168              Case 10: VMOV.F32 <Sd>, #<imm>
5169              Case 11: VMOV.F64 <Dd>, #<imm>  */
5170         inst.operands[i].immisfloat = 1;
5171       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
5172                                            &optype)) != FAIL)
5173         {
5174           /* Case 0: VMOV<c><q> <Qd>, <Qm>
5175              Case 1: VMOV<c><q> <Dd>, <Dm>
5176              Case 8: VMOV.F32 <Sd>, <Sm>
5177              Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm>  */
5178
5179           inst.operands[i].reg = val;
5180           inst.operands[i].isreg = 1;
5181           inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
5182           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5183           inst.operands[i].isvec = 1;
5184           inst.operands[i].vectype = optype;
5185           inst.operands[i].present = 1;
5186           
5187           if (skip_past_comma (&ptr) == SUCCESS)
5188             {
5189               /* Case 15.  */
5190               i++;
5191
5192               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5193                 goto wanted_arm;
5194
5195               inst.operands[i].reg = val;
5196               inst.operands[i].isreg = 1;
5197               inst.operands[i++].present = 1;
5198               
5199               if (skip_past_comma (&ptr) == FAIL)
5200                 goto wanted_comma;
5201               
5202               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5203                 goto wanted_arm;
5204               
5205               inst.operands[i].reg = val;
5206               inst.operands[i].isreg = 1;
5207               inst.operands[i++].present = 1;
5208             }
5209         }
5210       else if (parse_big_immediate (&ptr, i) == SUCCESS)
5211           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
5212              Case 3: VMOV<c><q>.<dt> <Dd>, #<imm>  */
5213         ;
5214       else
5215         {
5216           first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
5217           return FAIL;
5218         }
5219     }
5220   else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5221     {
5222       /* Cases 6, 7.  */
5223       inst.operands[i].reg = val;
5224       inst.operands[i].isreg = 1;
5225       inst.operands[i++].present = 1;
5226       
5227       if (skip_past_comma (&ptr) == FAIL)
5228         goto wanted_comma;
5229       
5230       if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5231         {
5232           /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]>  */
5233           inst.operands[i].reg = val;
5234           inst.operands[i].isscalar = 1;
5235           inst.operands[i].present = 1;
5236           inst.operands[i].vectype = optype;
5237         }
5238       else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5239         {
5240           /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm>  */
5241           inst.operands[i].reg = val;
5242           inst.operands[i].isreg = 1;
5243           inst.operands[i++].present = 1;
5244           
5245           if (skip_past_comma (&ptr) == FAIL)
5246             goto wanted_comma;
5247           
5248           if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
5249               == FAIL)
5250             {
5251               first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
5252               return FAIL;
5253             }
5254
5255           inst.operands[i].reg = val;
5256           inst.operands[i].isreg = 1;
5257           inst.operands[i].isvec = 1;
5258           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5259           inst.operands[i].vectype = optype;
5260           inst.operands[i].present = 1;
5261           
5262           if (rtype == REG_TYPE_VFS)
5263             {
5264               /* Case 14.  */
5265               i++;
5266               if (skip_past_comma (&ptr) == FAIL)
5267                 goto wanted_comma;
5268               if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
5269                                               &optype)) == FAIL)
5270                 {
5271                   first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
5272                   return FAIL;
5273                 }
5274               inst.operands[i].reg = val;
5275               inst.operands[i].isreg = 1;
5276               inst.operands[i].isvec = 1;
5277               inst.operands[i].issingle = 1;
5278               inst.operands[i].vectype = optype;
5279               inst.operands[i].present = 1;
5280             }
5281         }
5282       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
5283                != FAIL)
5284         {
5285           /* Case 13.  */
5286           inst.operands[i].reg = val;
5287           inst.operands[i].isreg = 1;
5288           inst.operands[i].isvec = 1;
5289           inst.operands[i].issingle = 1;
5290           inst.operands[i].vectype = optype;
5291           inst.operands[i++].present = 1;
5292         }
5293     }
5294   else
5295     {
5296       first_error (_("parse error"));
5297       return FAIL;
5298     }
5299
5300   /* Successfully parsed the operands. Update args.  */
5301   *which_operand = i;
5302   *str = ptr;
5303   return SUCCESS;
5304
5305   wanted_comma:
5306   first_error (_("expected comma"));
5307   return FAIL;
5308   
5309   wanted_arm:
5310   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
5311   return FAIL;
5312 }
5313
5314 /* Matcher codes for parse_operands.  */
5315 enum operand_parse_code
5316 {
5317   OP_stop,      /* end of line */
5318
5319   OP_RR,        /* ARM register */
5320   OP_RRnpc,     /* ARM register, not r15 */
5321   OP_RRnpcb,    /* ARM register, not r15, in square brackets */
5322   OP_RRw,       /* ARM register, not r15, optional trailing ! */
5323   OP_RCP,       /* Coprocessor number */
5324   OP_RCN,       /* Coprocessor register */
5325   OP_RF,        /* FPA register */
5326   OP_RVS,       /* VFP single precision register */
5327   OP_RVD,       /* VFP double precision register (0..15) */
5328   OP_RND,       /* Neon double precision register (0..31) */
5329   OP_RNQ,       /* Neon quad precision register */
5330   OP_RVSD,      /* VFP single or double precision register */
5331   OP_RNDQ,      /* Neon double or quad precision register */
5332   OP_RNSDQ,     /* Neon single, double or quad precision register */
5333   OP_RNSC,      /* Neon scalar D[X] */
5334   OP_RVC,       /* VFP control register */
5335   OP_RMF,       /* Maverick F register */
5336   OP_RMD,       /* Maverick D register */
5337   OP_RMFX,      /* Maverick FX register */
5338   OP_RMDX,      /* Maverick DX register */
5339   OP_RMAX,      /* Maverick AX register */
5340   OP_RMDS,      /* Maverick DSPSC register */
5341   OP_RIWR,      /* iWMMXt wR register */
5342   OP_RIWC,      /* iWMMXt wC register */
5343   OP_RIWG,      /* iWMMXt wCG register */
5344   OP_RXA,       /* XScale accumulator register */
5345
5346   OP_REGLST,    /* ARM register list */
5347   OP_VRSLST,    /* VFP single-precision register list */
5348   OP_VRDLST,    /* VFP double-precision register list */
5349   OP_VRSDLST,   /* VFP single or double-precision register list (& quad) */
5350   OP_NRDLST,    /* Neon double-precision register list (d0-d31, qN aliases) */
5351   OP_NSTRLST,   /* Neon element/structure list */
5352
5353   OP_NILO,      /* Neon immediate/logic operands 2 or 2+3. (VBIC, VORR...)  */
5354   OP_RNDQ_I0,   /* Neon D or Q reg, or immediate zero.  */
5355   OP_RVSD_I0,   /* VFP S or D reg, or immediate zero.  */
5356   OP_RR_RNSC,   /* ARM reg or Neon scalar.  */
5357   OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar.  */
5358   OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar.  */
5359   OP_RND_RNSC,  /* Neon D reg, or Neon scalar.  */
5360   OP_VMOV,      /* Neon VMOV operands.  */
5361   OP_RNDQ_IMVNb,/* Neon D or Q reg, or immediate good for VMVN.  */
5362   OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift.  */
5363   OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2.  */
5364
5365   OP_I0,        /* immediate zero */
5366   OP_I7,        /* immediate value 0 .. 7 */
5367   OP_I15,       /*                 0 .. 15 */
5368   OP_I16,       /*                 1 .. 16 */
5369   OP_I16z,      /*                 0 .. 16 */
5370   OP_I31,       /*                 0 .. 31 */
5371   OP_I31w,      /*                 0 .. 31, optional trailing ! */
5372   OP_I32,       /*                 1 .. 32 */
5373   OP_I32z,      /*                 0 .. 32 */
5374   OP_I63,       /*                 0 .. 63 */
5375   OP_I63s,      /*               -64 .. 63 */
5376   OP_I64,       /*                 1 .. 64 */
5377   OP_I64z,      /*                 0 .. 64 */
5378   OP_I255,      /*                 0 .. 255 */
5379
5380   OP_I4b,       /* immediate, prefix optional, 1 .. 4 */
5381   OP_I7b,       /*                             0 .. 7 */
5382   OP_I15b,      /*                             0 .. 15 */
5383   OP_I31b,      /*                             0 .. 31 */
5384
5385   OP_SH,        /* shifter operand */
5386   OP_SHG,       /* shifter operand with possible group relocation */
5387   OP_ADDR,      /* Memory address expression (any mode) */
5388   OP_ADDRGLDR,  /* Mem addr expr (any mode) with possible LDR group reloc */
5389   OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
5390   OP_ADDRGLDC,  /* Mem addr expr (any mode) with possible LDC group reloc */
5391   OP_EXP,       /* arbitrary expression */
5392   OP_EXPi,      /* same, with optional immediate prefix */
5393   OP_EXPr,      /* same, with optional relocation suffix */
5394   OP_HALF,      /* 0 .. 65535 or low/high reloc.  */
5395
5396   OP_CPSF,      /* CPS flags */
5397   OP_ENDI,      /* Endianness specifier */
5398   OP_PSR,       /* CPSR/SPSR mask for msr */
5399   OP_COND,      /* conditional code */
5400   OP_TB,        /* Table branch.  */
5401
5402   OP_RVC_PSR,   /* CPSR/SPSR mask for msr, or VFP control register.  */
5403   OP_APSR_RR,   /* ARM register or "APSR_nzcv".  */
5404
5405   OP_RRnpc_I0,  /* ARM register or literal 0 */
5406   OP_RR_EXr,    /* ARM register or expression with opt. reloc suff. */
5407   OP_RR_EXi,    /* ARM register or expression with imm prefix */
5408   OP_RF_IF,     /* FPA register or immediate */
5409   OP_RIWR_RIWC, /* iWMMXt R or C reg */
5410   OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
5411
5412   /* Optional operands.  */
5413   OP_oI7b,       /* immediate, prefix optional, 0 .. 7 */
5414   OP_oI31b,      /*                             0 .. 31 */
5415   OP_oI32b,      /*                             1 .. 32 */
5416   OP_oIffffb,    /*                             0 .. 65535 */
5417   OP_oI255c,     /*       curly-brace enclosed, 0 .. 255 */
5418
5419   OP_oRR,        /* ARM register */
5420   OP_oRRnpc,     /* ARM register, not the PC */
5421   OP_oRRw,       /* ARM register, not r15, optional trailing ! */
5422   OP_oRND,       /* Optional Neon double precision register */
5423   OP_oRNQ,       /* Optional Neon quad precision register */
5424   OP_oRNDQ,      /* Optional Neon double or quad precision register */
5425   OP_oRNSDQ,     /* Optional single, double or quad precision vector register */
5426   OP_oSHll,      /* LSL immediate */
5427   OP_oSHar,      /* ASR immediate */
5428   OP_oSHllar,    /* LSL or ASR immediate */
5429   OP_oROR,       /* ROR 0/8/16/24 */
5430   OP_oBARRIER,   /* Option argument for a barrier instruction.  */
5431
5432   OP_FIRST_OPTIONAL = OP_oI7b
5433 };
5434
5435 /* Generic instruction operand parser.  This does no encoding and no
5436    semantic validation; it merely squirrels values away in the inst
5437    structure.  Returns SUCCESS or FAIL depending on whether the
5438    specified grammar matched.  */
5439 static int
5440 parse_operands (char *str, const unsigned char *pattern)
5441 {
5442   unsigned const char *upat = pattern;
5443   char *backtrack_pos = 0;
5444   const char *backtrack_error = 0;
5445   int i, val, backtrack_index = 0;
5446   enum arm_reg_type rtype;
5447   parse_operand_result result;
5448
5449 #define po_char_or_fail(chr) do {               \
5450   if (skip_past_char (&str, chr) == FAIL)       \
5451     goto bad_args;                              \
5452 } while (0)
5453
5454 #define po_reg_or_fail(regtype) do {                            \
5455   val = arm_typed_reg_parse (&str, regtype, &rtype,             \
5456                              &inst.operands[i].vectype);        \
5457   if (val == FAIL)                                              \
5458     {                                                           \
5459       first_error (_(reg_expected_msgs[regtype]));              \
5460       goto failure;                                             \
5461     }                                                           \
5462   inst.operands[i].reg = val;                                   \
5463   inst.operands[i].isreg = 1;                                   \
5464   inst.operands[i].isquad = (rtype == REG_TYPE_NQ);             \
5465   inst.operands[i].issingle = (rtype == REG_TYPE_VFS);          \
5466   inst.operands[i].isvec = (rtype == REG_TYPE_VFS               \
5467                             || rtype == REG_TYPE_VFD            \
5468                             || rtype == REG_TYPE_NQ);           \
5469 } while (0)
5470
5471 #define po_reg_or_goto(regtype, label) do {                     \
5472   val = arm_typed_reg_parse (&str, regtype, &rtype,             \
5473                              &inst.operands[i].vectype);        \
5474   if (val == FAIL)                                              \
5475     goto label;                                                 \
5476                                                                 \
5477   inst.operands[i].reg = val;                                   \
5478   inst.operands[i].isreg = 1;                                   \
5479   inst.operands[i].isquad = (rtype == REG_TYPE_NQ);             \
5480   inst.operands[i].issingle = (rtype == REG_TYPE_VFS);          \
5481   inst.operands[i].isvec = (rtype == REG_TYPE_VFS               \
5482                             || rtype == REG_TYPE_VFD            \
5483                             || rtype == REG_TYPE_NQ);           \
5484 } while (0)
5485
5486 #define po_imm_or_fail(min, max, popt) do {                     \
5487   if (parse_immediate (&str, &val, min, max, popt) == FAIL)     \
5488     goto failure;                                               \
5489   inst.operands[i].imm = val;                                   \
5490 } while (0)
5491
5492 #define po_scalar_or_goto(elsz, label) do {                     \
5493   val = parse_scalar (&str, elsz, &inst.operands[i].vectype);   \
5494   if (val == FAIL)                                              \
5495     goto label;                                                 \
5496   inst.operands[i].reg = val;                                   \
5497   inst.operands[i].isscalar = 1;                                \
5498 } while (0)
5499
5500 #define po_misc_or_fail(expr) do {              \
5501   if (expr)                                     \
5502     goto failure;                               \
5503 } while (0)
5504
5505 #define po_misc_or_fail_no_backtrack(expr) do { \
5506   result = expr;                                \
5507   if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK)\
5508     backtrack_pos = 0;                          \
5509   if (result != PARSE_OPERAND_SUCCESS)          \
5510     goto failure;                               \
5511 } while (0)
5512
5513   skip_whitespace (str);
5514
5515   for (i = 0; upat[i] != OP_stop; i++)
5516     {
5517       if (upat[i] >= OP_FIRST_OPTIONAL)
5518         {
5519           /* Remember where we are in case we need to backtrack.  */
5520           assert (!backtrack_pos);
5521           backtrack_pos = str;
5522           backtrack_error = inst.error;
5523           backtrack_index = i;
5524         }
5525
5526       if (i > 0 && (i > 1 || inst.operands[0].present))
5527         po_char_or_fail (',');
5528
5529       switch (upat[i])
5530         {
5531           /* Registers */
5532         case OP_oRRnpc:
5533         case OP_RRnpc:
5534         case OP_oRR:
5535         case OP_RR:    po_reg_or_fail (REG_TYPE_RN);      break;
5536         case OP_RCP:   po_reg_or_fail (REG_TYPE_CP);      break;
5537         case OP_RCN:   po_reg_or_fail (REG_TYPE_CN);      break;
5538         case OP_RF:    po_reg_or_fail (REG_TYPE_FN);      break;
5539         case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);     break;
5540         case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);     break;
5541         case OP_oRND:
5542         case OP_RND:   po_reg_or_fail (REG_TYPE_VFD);     break;
5543         case OP_RVC:
5544           po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
5545           break;
5546           /* Also accept generic coprocessor regs for unknown registers.  */
5547           coproc_reg:
5548           po_reg_or_fail (REG_TYPE_CN);
5549           break;
5550         case OP_RMF:   po_reg_or_fail (REG_TYPE_MVF);     break;
5551         case OP_RMD:   po_reg_or_fail (REG_TYPE_MVD);     break;
5552         case OP_RMFX:  po_reg_or_fail (REG_TYPE_MVFX);    break;
5553         case OP_RMDX:  po_reg_or_fail (REG_TYPE_MVDX);    break;
5554         case OP_RMAX:  po_reg_or_fail (REG_TYPE_MVAX);    break;
5555         case OP_RMDS:  po_reg_or_fail (REG_TYPE_DSPSC);   break;
5556         case OP_RIWR:  po_reg_or_fail (REG_TYPE_MMXWR);   break;
5557         case OP_RIWC:  po_reg_or_fail (REG_TYPE_MMXWC);   break;
5558         case OP_RIWG:  po_reg_or_fail (REG_TYPE_MMXWCG);  break;
5559         case OP_RXA:   po_reg_or_fail (REG_TYPE_XSCALE);  break;
5560         case OP_oRNQ:
5561         case OP_RNQ:   po_reg_or_fail (REG_TYPE_NQ);      break;
5562         case OP_oRNDQ:
5563         case OP_RNDQ:  po_reg_or_fail (REG_TYPE_NDQ);     break;
5564         case OP_RVSD:  po_reg_or_fail (REG_TYPE_VFSD);    break;
5565         case OP_oRNSDQ:
5566         case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ);    break;
5567
5568         /* Neon scalar. Using an element size of 8 means that some invalid
5569            scalars are accepted here, so deal with those in later code.  */
5570         case OP_RNSC:  po_scalar_or_goto (8, failure);    break;
5571
5572         /* WARNING: We can expand to two operands here. This has the potential
5573            to totally confuse the backtracking mechanism! It will be OK at
5574            least as long as we don't try to use optional args as well,
5575            though.  */
5576         case OP_NILO:
5577           {
5578             po_reg_or_goto (REG_TYPE_NDQ, try_imm);
5579             inst.operands[i].present = 1;
5580             i++;
5581             skip_past_comma (&str);
5582             po_reg_or_goto (REG_TYPE_NDQ, one_reg_only);
5583             break;
5584             one_reg_only:
5585             /* Optional register operand was omitted. Unfortunately, it's in
5586                operands[i-1] and we need it to be in inst.operands[i]. Fix that
5587                here (this is a bit grotty).  */
5588             inst.operands[i] = inst.operands[i-1];
5589             inst.operands[i-1].present = 0;
5590             break;
5591             try_imm:
5592             /* There's a possibility of getting a 64-bit immediate here, so
5593                we need special handling.  */
5594             if (parse_big_immediate (&str, i) == FAIL)
5595               {
5596                 inst.error = _("immediate value is out of range");
5597                 goto failure;
5598               }
5599           }
5600           break;
5601
5602         case OP_RNDQ_I0:
5603           {
5604             po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
5605             break;
5606             try_imm0:
5607             po_imm_or_fail (0, 0, TRUE);
5608           }
5609           break;
5610
5611         case OP_RVSD_I0:
5612           po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
5613           break;
5614
5615         case OP_RR_RNSC:
5616           {
5617             po_scalar_or_goto (8, try_rr);
5618             break;
5619             try_rr:
5620             po_reg_or_fail (REG_TYPE_RN);
5621           }
5622           break;
5623
5624         case OP_RNSDQ_RNSC:
5625           {
5626             po_scalar_or_goto (8, try_nsdq);
5627             break;
5628             try_nsdq:
5629             po_reg_or_fail (REG_TYPE_NSDQ);
5630           }
5631           break;
5632
5633         case OP_RNDQ_RNSC:
5634           {
5635             po_scalar_or_goto (8, try_ndq);
5636             break;
5637             try_ndq:
5638             po_reg_or_fail (REG_TYPE_NDQ);
5639           }
5640           break;
5641
5642         case OP_RND_RNSC:
5643           {
5644             po_scalar_or_goto (8, try_vfd);
5645             break;
5646             try_vfd:
5647             po_reg_or_fail (REG_TYPE_VFD);
5648           }
5649           break;
5650
5651         case OP_VMOV:
5652           /* WARNING: parse_neon_mov can move the operand counter, i. If we're
5653              not careful then bad things might happen.  */
5654           po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
5655           break;
5656
5657         case OP_RNDQ_IMVNb:
5658           {
5659             po_reg_or_goto (REG_TYPE_NDQ, try_mvnimm);
5660             break;
5661             try_mvnimm:
5662             /* There's a possibility of getting a 64-bit immediate here, so
5663                we need special handling.  */
5664             if (parse_big_immediate (&str, i) == FAIL)
5665               {
5666                 inst.error = _("immediate value is out of range");
5667                 goto failure;
5668               }
5669           }
5670           break;
5671
5672         case OP_RNDQ_I63b:
5673           {
5674             po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
5675             break;
5676             try_shimm:
5677             po_imm_or_fail (0, 63, TRUE);
5678           }
5679           break;
5680
5681         case OP_RRnpcb:
5682           po_char_or_fail ('[');
5683           po_reg_or_fail  (REG_TYPE_RN);
5684           po_char_or_fail (']');
5685           break;
5686
5687         case OP_RRw:
5688         case OP_oRRw:
5689           po_reg_or_fail (REG_TYPE_RN);
5690           if (skip_past_char (&str, '!') == SUCCESS)
5691             inst.operands[i].writeback = 1;
5692           break;
5693
5694           /* Immediates */
5695         case OP_I7:      po_imm_or_fail (  0,      7, FALSE);   break;
5696         case OP_I15:     po_imm_or_fail (  0,     15, FALSE);   break;
5697         case OP_I16:     po_imm_or_fail (  1,     16, FALSE);   break;
5698         case OP_I16z:    po_imm_or_fail (  0,     16, FALSE);   break;
5699         case OP_I31:     po_imm_or_fail (  0,     31, FALSE);   break;
5700         case OP_I32:     po_imm_or_fail (  1,     32, FALSE);   break;
5701         case OP_I32z:    po_imm_or_fail (  0,     32, FALSE);   break;
5702         case OP_I63s:    po_imm_or_fail (-64,     63, FALSE);   break;
5703         case OP_I63:     po_imm_or_fail (  0,     63, FALSE);   break;
5704         case OP_I64:     po_imm_or_fail (  1,     64, FALSE);   break;
5705         case OP_I64z:    po_imm_or_fail (  0,     64, FALSE);   break;
5706         case OP_I255:    po_imm_or_fail (  0,    255, FALSE);   break;
5707
5708         case OP_I4b:     po_imm_or_fail (  1,      4, TRUE);    break;
5709         case OP_oI7b:
5710         case OP_I7b:     po_imm_or_fail (  0,      7, TRUE);    break;
5711         case OP_I15b:    po_imm_or_fail (  0,     15, TRUE);    break;
5712         case OP_oI31b:
5713         case OP_I31b:    po_imm_or_fail (  0,     31, TRUE);    break;
5714         case OP_oI32b:   po_imm_or_fail (  1,     32, TRUE);    break;
5715         case OP_oIffffb: po_imm_or_fail (  0, 0xffff, TRUE);    break;
5716
5717           /* Immediate variants */
5718         case OP_oI255c:
5719           po_char_or_fail ('{');
5720           po_imm_or_fail (0, 255, TRUE);
5721           po_char_or_fail ('}');
5722           break;
5723
5724         case OP_I31w:
5725           /* The expression parser chokes on a trailing !, so we have
5726              to find it first and zap it.  */
5727           {
5728             char *s = str;
5729             while (*s && *s != ',')
5730               s++;
5731             if (s[-1] == '!')
5732               {
5733                 s[-1] = '\0';
5734                 inst.operands[i].writeback = 1;
5735               }
5736             po_imm_or_fail (0, 31, TRUE);
5737             if (str == s - 1)
5738               str = s;
5739           }
5740           break;
5741
5742           /* Expressions */
5743         case OP_EXPi:   EXPi:
5744           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
5745                                               GE_OPT_PREFIX));
5746           break;
5747
5748         case OP_EXP:
5749           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
5750                                               GE_NO_PREFIX));
5751           break;
5752
5753         case OP_EXPr:   EXPr:
5754           po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
5755                                               GE_NO_PREFIX));
5756           if (inst.reloc.exp.X_op == O_symbol)
5757             {
5758               val = parse_reloc (&str);
5759               if (val == -1)
5760                 {
5761                   inst.error = _("unrecognized relocation suffix");
5762                   goto failure;
5763                 }
5764               else if (val != BFD_RELOC_UNUSED)
5765                 {
5766                   inst.operands[i].imm = val;
5767                   inst.operands[i].hasreloc = 1;
5768                 }
5769             }
5770           break;
5771
5772           /* Operand for MOVW or MOVT.  */
5773         case OP_HALF:
5774           po_misc_or_fail (parse_half (&str));
5775           break;
5776
5777           /* Register or expression */
5778         case OP_RR_EXr:   po_reg_or_goto (REG_TYPE_RN, EXPr); break;
5779         case OP_RR_EXi:   po_reg_or_goto (REG_TYPE_RN, EXPi); break;
5780
5781           /* Register or immediate */
5782         case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0);   break;
5783         I0:               po_imm_or_fail (0, 0, FALSE);       break;
5784
5785         case OP_RF_IF:    po_reg_or_goto (REG_TYPE_FN, IF);   break;
5786         IF:
5787           if (!is_immediate_prefix (*str))
5788             goto bad_args;
5789           str++;
5790           val = parse_fpa_immediate (&str);
5791           if (val == FAIL)
5792             goto failure;
5793           /* FPA immediates are encoded as registers 8-15.
5794              parse_fpa_immediate has already applied the offset.  */
5795           inst.operands[i].reg = val;
5796           inst.operands[i].isreg = 1;
5797           break;
5798
5799         case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
5800         I32z:             po_imm_or_fail (0, 32, FALSE);          break;
5801
5802           /* Two kinds of register */
5803         case OP_RIWR_RIWC:
5804           {
5805             struct reg_entry *rege = arm_reg_parse_multi (&str);
5806             if (!rege
5807                 || (rege->type != REG_TYPE_MMXWR
5808                     && rege->type != REG_TYPE_MMXWC
5809                     && rege->type != REG_TYPE_MMXWCG))
5810               {
5811                 inst.error = _("iWMMXt data or control register expected");
5812                 goto failure;
5813               }
5814             inst.operands[i].reg = rege->number;
5815             inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
5816           }
5817           break;
5818
5819         case OP_RIWC_RIWG:
5820           {
5821             struct reg_entry *rege = arm_reg_parse_multi (&str);
5822             if (!rege
5823                 || (rege->type != REG_TYPE_MMXWC
5824                     && rege->type != REG_TYPE_MMXWCG))
5825               {
5826                 inst.error = _("iWMMXt control register expected");
5827                 goto failure;
5828               }
5829             inst.operands[i].reg = rege->number;
5830             inst.operands[i].isreg = 1;
5831           }
5832           break;
5833
5834           /* Misc */
5835         case OP_CPSF:    val = parse_cps_flags (&str);          break;
5836         case OP_ENDI:    val = parse_endian_specifier (&str);   break;
5837         case OP_oROR:    val = parse_ror (&str);                break;
5838         case OP_PSR:     val = parse_psr (&str);                break;
5839         case OP_COND:    val = parse_cond (&str);               break;
5840         case OP_oBARRIER:val = parse_barrier (&str);            break;
5841
5842         case OP_RVC_PSR:
5843           po_reg_or_goto (REG_TYPE_VFC, try_psr);
5844           inst.operands[i].isvec = 1;  /* Mark VFP control reg as vector.  */
5845           break;
5846           try_psr:
5847           val = parse_psr (&str);
5848           break;
5849
5850         case OP_APSR_RR:
5851           po_reg_or_goto (REG_TYPE_RN, try_apsr);
5852           break;
5853           try_apsr:
5854           /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
5855              instruction).  */
5856           if (strncasecmp (str, "APSR_", 5) == 0)
5857             {
5858               unsigned found = 0;
5859               str += 5;
5860               while (found < 15)
5861                 switch (*str++)
5862                   {
5863                   case 'c': found = (found & 1) ? 16 : found | 1; break;
5864                   case 'n': found = (found & 2) ? 16 : found | 2; break;
5865                   case 'z': found = (found & 4) ? 16 : found | 4; break;
5866                   case 'v': found = (found & 8) ? 16 : found | 8; break;
5867                   default: found = 16;
5868                   }
5869               if (found != 15)
5870                 goto failure;
5871               inst.operands[i].isvec = 1;
5872             }
5873           else
5874             goto failure;
5875           break;
5876
5877         case OP_TB:
5878           po_misc_or_fail (parse_tb (&str));
5879           break;
5880
5881           /* Register lists */
5882         case OP_REGLST:
5883           val = parse_reg_list (&str);
5884           if (*str == '^')
5885             {
5886               inst.operands[1].writeback = 1;
5887               str++;
5888             }
5889           break;
5890
5891         case OP_VRSLST:
5892           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
5893           break;
5894
5895         case OP_VRDLST:
5896           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
5897           break;
5898
5899         case OP_VRSDLST:
5900           /* Allow Q registers too.  */
5901           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
5902                                     REGLIST_NEON_D);
5903           if (val == FAIL)
5904             {
5905               inst.error = NULL;
5906               val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
5907                                         REGLIST_VFP_S);
5908               inst.operands[i].issingle = 1;
5909             }
5910           break;
5911
5912         case OP_NRDLST:
5913           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
5914                                     REGLIST_NEON_D);
5915           break;
5916
5917         case OP_NSTRLST:
5918           val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
5919                                            &inst.operands[i].vectype);
5920           break;
5921
5922           /* Addressing modes */
5923         case OP_ADDR:
5924           po_misc_or_fail (parse_address (&str, i));
5925           break;
5926
5927         case OP_ADDRGLDR:
5928           po_misc_or_fail_no_backtrack (
5929             parse_address_group_reloc (&str, i, GROUP_LDR));
5930           break;
5931
5932         case OP_ADDRGLDRS:
5933           po_misc_or_fail_no_backtrack (
5934             parse_address_group_reloc (&str, i, GROUP_LDRS));
5935           break;
5936
5937         case OP_ADDRGLDC:
5938           po_misc_or_fail_no_backtrack (
5939             parse_address_group_reloc (&str, i, GROUP_LDC));
5940           break;
5941
5942         case OP_SH:
5943           po_misc_or_fail (parse_shifter_operand (&str, i));
5944           break;
5945
5946         case OP_SHG:
5947           po_misc_or_fail_no_backtrack (
5948             parse_shifter_operand_group_reloc (&str, i));
5949           break;
5950
5951         case OP_oSHll:
5952           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
5953           break;
5954
5955         case OP_oSHar:
5956           po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
5957           break;
5958
5959         case OP_oSHllar:
5960           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
5961           break;
5962
5963         default:
5964           as_fatal ("unhandled operand code %d", upat[i]);
5965         }
5966
5967       /* Various value-based sanity checks and shared operations.  We
5968          do not signal immediate failures for the register constraints;
5969          this allows a syntax error to take precedence.  */
5970       switch (upat[i])
5971         {
5972         case OP_oRRnpc:
5973         case OP_RRnpc:
5974         case OP_RRnpcb:
5975         case OP_RRw:
5976         case OP_oRRw:
5977         case OP_RRnpc_I0:
5978           if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
5979             inst.error = BAD_PC;
5980           break;
5981
5982         case OP_CPSF:
5983         case OP_ENDI:
5984         case OP_oROR:
5985         case OP_PSR:
5986         case OP_RVC_PSR:
5987         case OP_COND:
5988         case OP_oBARRIER:
5989         case OP_REGLST:
5990         case OP_VRSLST:
5991         case OP_VRDLST:
5992         case OP_VRSDLST:
5993         case OP_NRDLST:
5994         case OP_NSTRLST:
5995           if (val == FAIL)
5996             goto failure;
5997           inst.operands[i].imm = val;
5998           break;
5999
6000         default:
6001           break;
6002         }
6003
6004       /* If we get here, this operand was successfully parsed.  */
6005       inst.operands[i].present = 1;
6006       continue;
6007
6008     bad_args:
6009       inst.error = BAD_ARGS;
6010
6011     failure:
6012       if (!backtrack_pos)
6013         {
6014           /* The parse routine should already have set inst.error, but set a
6015              defaut here just in case.  */
6016           if (!inst.error)
6017             inst.error = _("syntax error");
6018           return FAIL;
6019         }
6020
6021       /* Do not backtrack over a trailing optional argument that
6022          absorbed some text.  We will only fail again, with the
6023          'garbage following instruction' error message, which is
6024          probably less helpful than the current one.  */
6025       if (backtrack_index == i && backtrack_pos != str
6026           && upat[i+1] == OP_stop)
6027         {
6028           if (!inst.error)
6029             inst.error = _("syntax error");
6030           return FAIL;
6031         }
6032
6033       /* Try again, skipping the optional argument at backtrack_pos.  */
6034       str = backtrack_pos;
6035       inst.error = backtrack_error;
6036       inst.operands[backtrack_index].present = 0;
6037       i = backtrack_index;
6038       backtrack_pos = 0;
6039     }
6040
6041   /* Check that we have parsed all the arguments.  */
6042   if (*str != '\0' && !inst.error)
6043     inst.error = _("garbage following instruction");
6044
6045   return inst.error ? FAIL : SUCCESS;
6046 }
6047
6048 #undef po_char_or_fail
6049 #undef po_reg_or_fail
6050 #undef po_reg_or_goto
6051 #undef po_imm_or_fail
6052 #undef po_scalar_or_fail
6053 \f
6054 /* Shorthand macro for instruction encoding functions issuing errors.  */
6055 #define constraint(expr, err) do {              \
6056   if (expr)                                     \
6057     {                                           \
6058       inst.error = err;                         \
6059       return;                                   \
6060     }                                           \
6061 } while (0)
6062
6063 /* Functions for operand encoding.  ARM, then Thumb.  */
6064
6065 #define rotate_left(v, n) (v << (n % 32) | v >> ((32 - n) % 32))
6066
6067 /* If VAL can be encoded in the immediate field of an ARM instruction,
6068    return the encoded form.  Otherwise, return FAIL.  */
6069
6070 static unsigned int
6071 encode_arm_immediate (unsigned int val)
6072 {
6073   unsigned int a, i;
6074
6075   for (i = 0; i < 32; i += 2)
6076     if ((a = rotate_left (val, i)) <= 0xff)
6077       return a | (i << 7); /* 12-bit pack: [shift-cnt,const].  */
6078
6079   return FAIL;
6080 }
6081
6082 /* If VAL can be encoded in the immediate field of a Thumb32 instruction,
6083    return the encoded form.  Otherwise, return FAIL.  */
6084 static unsigned int
6085 encode_thumb32_immediate (unsigned int val)
6086 {
6087   unsigned int a, i;
6088
6089   if (val <= 0xff)
6090     return val;
6091
6092   for (i = 1; i <= 24; i++)
6093     {
6094       a = val >> i;
6095       if ((val & ~(0xff << i)) == 0)
6096         return ((val >> i) & 0x7f) | ((32 - i) << 7);
6097     }
6098
6099   a = val & 0xff;
6100   if (val == ((a << 16) | a))
6101     return 0x100 | a;
6102   if (val == ((a << 24) | (a << 16) | (a << 8) | a))
6103     return 0x300 | a;
6104
6105   a = val & 0xff00;
6106   if (val == ((a << 16) | a))
6107     return 0x200 | (a >> 8);
6108
6109   return FAIL;
6110 }
6111 /* Encode a VFP SP or DP register number into inst.instruction.  */
6112
6113 static void
6114 encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
6115 {
6116   if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
6117       && reg > 15)
6118     {
6119       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v3))
6120         {
6121           if (thumb_mode)
6122             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
6123                                     fpu_vfp_ext_v3);
6124           else
6125             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
6126                                     fpu_vfp_ext_v3);
6127         }
6128       else
6129         {
6130           first_error (_("D register out of range for selected VFP version"));
6131           return;
6132         }
6133     }
6134
6135   switch (pos)
6136     {
6137     case VFP_REG_Sd:
6138       inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
6139       break;
6140
6141     case VFP_REG_Sn:
6142       inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
6143       break;
6144
6145     case VFP_REG_Sm:
6146       inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
6147       break;
6148
6149     case VFP_REG_Dd:
6150       inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
6151       break;
6152     
6153     case VFP_REG_Dn:
6154       inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
6155       break;
6156     
6157     case VFP_REG_Dm:
6158       inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
6159       break;
6160
6161     default:
6162       abort ();
6163     }
6164 }
6165
6166 /* Encode a <shift> in an ARM-format instruction.  The immediate,
6167    if any, is handled by md_apply_fix.   */
6168 static void
6169 encode_arm_shift (int i)
6170 {
6171   if (inst.operands[i].shift_kind == SHIFT_RRX)
6172     inst.instruction |= SHIFT_ROR << 5;
6173   else
6174     {
6175       inst.instruction |= inst.operands[i].shift_kind << 5;
6176       if (inst.operands[i].immisreg)
6177         {
6178           inst.instruction |= SHIFT_BY_REG;
6179           inst.instruction |= inst.operands[i].imm << 8;
6180         }
6181       else
6182         inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
6183     }
6184 }
6185
6186 static void
6187 encode_arm_shifter_operand (int i)
6188 {
6189   if (inst.operands[i].isreg)
6190     {
6191       inst.instruction |= inst.operands[i].reg;
6192       encode_arm_shift (i);
6193     }
6194   else
6195     inst.instruction |= INST_IMMEDIATE;
6196 }
6197
6198 /* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3.  */
6199 static void
6200 encode_arm_addr_mode_common (int i, bfd_boolean is_t)
6201 {
6202   assert (inst.operands[i].isreg);
6203   inst.instruction |= inst.operands[i].reg << 16;
6204
6205   if (inst.operands[i].preind)
6206     {
6207       if (is_t)
6208         {
6209           inst.error = _("instruction does not accept preindexed addressing");
6210           return;
6211         }
6212       inst.instruction |= PRE_INDEX;
6213       if (inst.operands[i].writeback)
6214         inst.instruction |= WRITE_BACK;
6215
6216     }
6217   else if (inst.operands[i].postind)
6218     {
6219       assert (inst.operands[i].writeback);
6220       if (is_t)
6221         inst.instruction |= WRITE_BACK;
6222     }
6223   else /* unindexed - only for coprocessor */
6224     {
6225       inst.error = _("instruction does not accept unindexed addressing");
6226       return;
6227     }
6228
6229   if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
6230       && (((inst.instruction & 0x000f0000) >> 16)
6231           == ((inst.instruction & 0x0000f000) >> 12)))
6232     as_warn ((inst.instruction & LOAD_BIT)
6233              ? _("destination register same as write-back base")
6234              : _("source register same as write-back base"));
6235 }
6236
6237 /* inst.operands[i] was set up by parse_address.  Encode it into an
6238    ARM-format mode 2 load or store instruction.  If is_t is true,
6239    reject forms that cannot be used with a T instruction (i.e. not
6240    post-indexed).  */
6241 static void
6242 encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
6243 {
6244   encode_arm_addr_mode_common (i, is_t);
6245
6246   if (inst.operands[i].immisreg)
6247     {
6248       inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
6249       inst.instruction |= inst.operands[i].imm;
6250       if (!inst.operands[i].negative)
6251         inst.instruction |= INDEX_UP;
6252       if (inst.operands[i].shifted)
6253         {
6254           if (inst.operands[i].shift_kind == SHIFT_RRX)
6255             inst.instruction |= SHIFT_ROR << 5;
6256           else
6257             {
6258               inst.instruction |= inst.operands[i].shift_kind << 5;
6259               inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
6260             }
6261         }
6262     }
6263   else /* immediate offset in inst.reloc */
6264     {
6265       if (inst.reloc.type == BFD_RELOC_UNUSED)
6266         inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
6267     }
6268 }
6269
6270 /* inst.operands[i] was set up by parse_address.  Encode it into an
6271    ARM-format mode 3 load or store instruction.  Reject forms that
6272    cannot be used with such instructions.  If is_t is true, reject
6273    forms that cannot be used with a T instruction (i.e. not
6274    post-indexed).  */
6275 static void
6276 encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
6277 {
6278   if (inst.operands[i].immisreg && inst.operands[i].shifted)
6279     {
6280       inst.error = _("instruction does not accept scaled register index");
6281       return;
6282     }
6283
6284   encode_arm_addr_mode_common (i, is_t);
6285
6286   if (inst.operands[i].immisreg)
6287     {
6288       inst.instruction |= inst.operands[i].imm;
6289       if (!inst.operands[i].negative)
6290         inst.instruction |= INDEX_UP;
6291     }
6292   else /* immediate offset in inst.reloc */
6293     {
6294       inst.instruction |= HWOFFSET_IMM;
6295       if (inst.reloc.type == BFD_RELOC_UNUSED)
6296         inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
6297     }
6298 }
6299
6300 /* inst.operands[i] was set up by parse_address.  Encode it into an
6301    ARM-format instruction.  Reject all forms which cannot be encoded
6302    into a coprocessor load/store instruction.  If wb_ok is false,
6303    reject use of writeback; if unind_ok is false, reject use of
6304    unindexed addressing.  If reloc_override is not 0, use it instead
6305    of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
6306    (in which case it is preserved).  */
6307
6308 static int
6309 encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
6310 {
6311   inst.instruction |= inst.operands[i].reg << 16;
6312
6313   assert (!(inst.operands[i].preind && inst.operands[i].postind));
6314
6315   if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
6316     {
6317       assert (!inst.operands[i].writeback);
6318       if (!unind_ok)
6319         {
6320           inst.error = _("instruction does not support unindexed addressing");
6321           return FAIL;
6322         }
6323       inst.instruction |= inst.operands[i].imm;
6324       inst.instruction |= INDEX_UP;
6325       return SUCCESS;
6326     }
6327
6328   if (inst.operands[i].preind)
6329     inst.instruction |= PRE_INDEX;
6330
6331   if (inst.operands[i].writeback)
6332     {
6333       if (inst.operands[i].reg == REG_PC)
6334         {
6335           inst.error = _("pc may not be used with write-back");
6336           return FAIL;
6337         }
6338       if (!wb_ok)
6339         {
6340           inst.error = _("instruction does not support writeback");
6341           return FAIL;
6342         }
6343       inst.instruction |= WRITE_BACK;
6344     }
6345
6346   if (reloc_override)
6347     inst.reloc.type = reloc_override;
6348   else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
6349             || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
6350            && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
6351     {
6352       if (thumb_mode)
6353         inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
6354       else
6355         inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
6356     }
6357
6358   return SUCCESS;
6359 }
6360
6361 /* inst.reloc.exp describes an "=expr" load pseudo-operation.
6362    Determine whether it can be performed with a move instruction; if
6363    it can, convert inst.instruction to that move instruction and
6364    return 1; if it can't, convert inst.instruction to a literal-pool
6365    load and return 0.  If this is not a valid thing to do in the
6366    current context, set inst.error and return 1.
6367
6368    inst.operands[i] describes the destination register.  */
6369
6370 static int
6371 move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
6372 {
6373   unsigned long tbit;
6374
6375   if (thumb_p)
6376     tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
6377   else
6378     tbit = LOAD_BIT;
6379
6380   if ((inst.instruction & tbit) == 0)
6381     {
6382       inst.error = _("invalid pseudo operation");
6383       return 1;
6384     }
6385   if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
6386     {
6387       inst.error = _("constant expression expected");
6388       return 1;
6389     }
6390   if (inst.reloc.exp.X_op == O_constant)
6391     {
6392       if (thumb_p)
6393         {
6394           if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
6395             {
6396               /* This can be done with a mov(1) instruction.  */
6397               inst.instruction  = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
6398               inst.instruction |= inst.reloc.exp.X_add_number;
6399               return 1;
6400             }
6401         }
6402       else
6403         {
6404           int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
6405           if (value != FAIL)
6406             {
6407               /* This can be done with a mov instruction.  */
6408               inst.instruction &= LITERAL_MASK;
6409               inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
6410               inst.instruction |= value & 0xfff;
6411               return 1;
6412             }
6413
6414           value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
6415           if (value != FAIL)
6416             {
6417               /* This can be done with a mvn instruction.  */
6418               inst.instruction &= LITERAL_MASK;
6419               inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
6420               inst.instruction |= value & 0xfff;
6421               return 1;
6422             }
6423         }
6424     }
6425
6426   if (add_to_lit_pool () == FAIL)
6427     {
6428       inst.error = _("literal pool insertion failed");
6429       return 1;
6430     }
6431   inst.operands[1].reg = REG_PC;
6432   inst.operands[1].isreg = 1;
6433   inst.operands[1].preind = 1;
6434   inst.reloc.pc_rel = 1;
6435   inst.reloc.type = (thumb_p
6436                      ? BFD_RELOC_ARM_THUMB_OFFSET
6437                      : (mode_3
6438                         ? BFD_RELOC_ARM_HWLITERAL
6439                         : BFD_RELOC_ARM_LITERAL));
6440   return 0;
6441 }
6442
6443 /* Functions for instruction encoding, sorted by subarchitecture.
6444    First some generics; their names are taken from the conventional
6445    bit positions for register arguments in ARM format instructions.  */
6446
6447 static void
6448 do_noargs (void)
6449 {
6450 }
6451
6452 static void
6453 do_rd (void)
6454 {
6455   inst.instruction |= inst.operands[0].reg << 12;
6456 }
6457
6458 static void
6459 do_rd_rm (void)
6460 {
6461   inst.instruction |= inst.operands[0].reg << 12;
6462   inst.instruction |= inst.operands[1].reg;
6463 }
6464
6465 static void
6466 do_rd_rn (void)
6467 {
6468   inst.instruction |= inst.operands[0].reg << 12;
6469   inst.instruction |= inst.operands[1].reg << 16;
6470 }
6471
6472 static void
6473 do_rn_rd (void)
6474 {
6475   inst.instruction |= inst.operands[0].reg << 16;
6476   inst.instruction |= inst.operands[1].reg << 12;
6477 }
6478
6479 static void
6480 do_rd_rm_rn (void)
6481 {
6482   unsigned Rn = inst.operands[2].reg;
6483   /* Enforce restrictions on SWP instruction.  */
6484   if ((inst.instruction & 0x0fbfffff) == 0x01000090)
6485     constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
6486                 _("Rn must not overlap other operands"));
6487   inst.instruction |= inst.operands[0].reg << 12;
6488   inst.instruction |= inst.operands[1].reg;
6489   inst.instruction |= Rn << 16;
6490 }
6491
6492 static void
6493 do_rd_rn_rm (void)
6494 {
6495   inst.instruction |= inst.operands[0].reg << 12;
6496   inst.instruction |= inst.operands[1].reg << 16;
6497   inst.instruction |= inst.operands[2].reg;
6498 }
6499
6500 static void
6501 do_rm_rd_rn (void)
6502 {
6503   inst.instruction |= inst.operands[0].reg;
6504   inst.instruction |= inst.operands[1].reg << 12;
6505   inst.instruction |= inst.operands[2].reg << 16;
6506 }
6507
6508 static void
6509 do_imm0 (void)
6510 {
6511   inst.instruction |= inst.operands[0].imm;
6512 }
6513
6514 static void
6515 do_rd_cpaddr (void)
6516 {
6517   inst.instruction |= inst.operands[0].reg << 12;
6518   encode_arm_cp_address (1, TRUE, TRUE, 0);
6519 }
6520
6521 /* ARM instructions, in alphabetical order by function name (except
6522    that wrapper functions appear immediately after the function they
6523    wrap).  */
6524
6525 /* This is a pseudo-op of the form "adr rd, label" to be converted
6526    into a relative address of the form "add rd, pc, #label-.-8".  */
6527
6528 static void
6529 do_adr (void)
6530 {
6531   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
6532
6533   /* Frag hacking will turn this into a sub instruction if the offset turns
6534      out to be negative.  */
6535   inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
6536   inst.reloc.pc_rel = 1;
6537   inst.reloc.exp.X_add_number -= 8;
6538 }
6539
6540 /* This is a pseudo-op of the form "adrl rd, label" to be converted
6541    into a relative address of the form:
6542    add rd, pc, #low(label-.-8)"
6543    add rd, rd, #high(label-.-8)"  */
6544
6545 static void
6546 do_adrl (void)
6547 {
6548   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
6549
6550   /* Frag hacking will turn this into a sub instruction if the offset turns
6551      out to be negative.  */
6552   inst.reloc.type              = BFD_RELOC_ARM_ADRL_IMMEDIATE;
6553   inst.reloc.pc_rel            = 1;
6554   inst.size                    = INSN_SIZE * 2;
6555   inst.reloc.exp.X_add_number -= 8;
6556 }
6557
6558 static void
6559 do_arit (void)
6560 {
6561   if (!inst.operands[1].present)
6562     inst.operands[1].reg = inst.operands[0].reg;
6563   inst.instruction |= inst.operands[0].reg << 12;
6564   inst.instruction |= inst.operands[1].reg << 16;
6565   encode_arm_shifter_operand (2);
6566 }
6567
6568 static void
6569 do_barrier (void)
6570 {
6571   if (inst.operands[0].present)
6572     {
6573       constraint ((inst.instruction & 0xf0) != 0x40
6574                   && inst.operands[0].imm != 0xf,
6575                   "bad barrier type");
6576       inst.instruction |= inst.operands[0].imm;
6577     }
6578   else
6579     inst.instruction |= 0xf;
6580 }
6581
6582 static void
6583 do_bfc (void)
6584 {
6585   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
6586   constraint (msb > 32, _("bit-field extends past end of register"));
6587   /* The instruction encoding stores the LSB and MSB,
6588      not the LSB and width.  */
6589   inst.instruction |= inst.operands[0].reg << 12;
6590   inst.instruction |= inst.operands[1].imm << 7;
6591   inst.instruction |= (msb - 1) << 16;
6592 }
6593
6594 static void
6595 do_bfi (void)
6596 {
6597   unsigned int msb;
6598
6599   /* #0 in second position is alternative syntax for bfc, which is
6600      the same instruction but with REG_PC in the Rm field.  */
6601   if (!inst.operands[1].isreg)
6602     inst.operands[1].reg = REG_PC;
6603
6604   msb = inst.operands[2].imm + inst.operands[3].imm;
6605   constraint (msb > 32, _("bit-field extends past end of register"));
6606   /* The instruction encoding stores the LSB and MSB,
6607      not the LSB and width.  */
6608   inst.instruction |= inst.operands[0].reg << 12;
6609   inst.instruction |= inst.operands[1].reg;
6610   inst.instruction |= inst.operands[2].imm << 7;
6611   inst.instruction |= (msb - 1) << 16;
6612 }
6613
6614 static void
6615 do_bfx (void)
6616 {
6617   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
6618               _("bit-field extends past end of register"));
6619   inst.instruction |= inst.operands[0].reg << 12;
6620   inst.instruction |= inst.operands[1].reg;
6621   inst.instruction |= inst.operands[2].imm << 7;
6622   inst.instruction |= (inst.operands[3].imm - 1) << 16;
6623 }
6624
6625 /* ARM V5 breakpoint instruction (argument parse)
6626      BKPT <16 bit unsigned immediate>
6627      Instruction is not conditional.
6628         The bit pattern given in insns[] has the COND_ALWAYS condition,
6629         and it is an error if the caller tried to override that.  */
6630
6631 static void
6632 do_bkpt (void)
6633 {
6634   /* Top 12 of 16 bits to bits 19:8.  */
6635   inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
6636
6637   /* Bottom 4 of 16 bits to bits 3:0.  */
6638   inst.instruction |= inst.operands[0].imm & 0xf;
6639 }
6640
6641 static void
6642 encode_branch (int default_reloc)
6643 {
6644   if (inst.operands[0].hasreloc)
6645     {
6646       constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32,
6647                   _("the only suffix valid here is '(plt)'"));
6648       inst.reloc.type   = BFD_RELOC_ARM_PLT32;
6649     }
6650   else
6651     {
6652       inst.reloc.type = default_reloc;
6653     }
6654   inst.reloc.pc_rel = 1;
6655 }
6656
6657 static void
6658 do_branch (void)
6659 {
6660 #ifdef OBJ_ELF
6661   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
6662     encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
6663   else
6664 #endif
6665     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
6666 }
6667
6668 static void
6669 do_bl (void)
6670 {
6671 #ifdef OBJ_ELF
6672   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
6673     {
6674       if (inst.cond == COND_ALWAYS)
6675         encode_branch (BFD_RELOC_ARM_PCREL_CALL);
6676       else
6677         encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
6678     }
6679   else
6680 #endif
6681     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
6682 }
6683
6684 /* ARM V5 branch-link-exchange instruction (argument parse)
6685      BLX <target_addr>          ie BLX(1)
6686      BLX{<condition>} <Rm>      ie BLX(2)
6687    Unfortunately, there are two different opcodes for this mnemonic.
6688    So, the insns[].value is not used, and the code here zaps values
6689         into inst.instruction.
6690    Also, the <target_addr> can be 25 bits, hence has its own reloc.  */
6691
6692 static void
6693 do_blx (void)
6694 {
6695   if (inst.operands[0].isreg)
6696     {
6697       /* Arg is a register; the opcode provided by insns[] is correct.
6698          It is not illegal to do "blx pc", just useless.  */
6699       if (inst.operands[0].reg == REG_PC)
6700         as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
6701
6702       inst.instruction |= inst.operands[0].reg;
6703     }
6704   else
6705     {
6706       /* Arg is an address; this instruction cannot be executed
6707          conditionally, and the opcode must be adjusted.  */
6708       constraint (inst.cond != COND_ALWAYS, BAD_COND);
6709       inst.instruction = 0xfa000000;
6710 #ifdef OBJ_ELF
6711       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
6712         encode_branch (BFD_RELOC_ARM_PCREL_CALL);
6713       else
6714 #endif
6715         encode_branch (BFD_RELOC_ARM_PCREL_BLX);
6716     }
6717 }
6718
6719 static void
6720 do_bx (void)
6721 {
6722   if (inst.operands[0].reg == REG_PC)
6723     as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
6724
6725   inst.instruction |= inst.operands[0].reg;
6726 }
6727
6728
6729 /* ARM v5TEJ.  Jump to Jazelle code.  */
6730
6731 static void
6732 do_bxj (void)
6733 {
6734   if (inst.operands[0].reg == REG_PC)
6735     as_tsktsk (_("use of r15 in bxj is not really useful"));
6736
6737   inst.instruction |= inst.operands[0].reg;
6738 }
6739
6740 /* Co-processor data operation:
6741       CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
6742       CDP2      <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}  */
6743 static void
6744 do_cdp (void)
6745 {
6746   inst.instruction |= inst.operands[0].reg << 8;
6747   inst.instruction |= inst.operands[1].imm << 20;
6748   inst.instruction |= inst.operands[2].reg << 12;
6749   inst.instruction |= inst.operands[3].reg << 16;
6750   inst.instruction |= inst.operands[4].reg;
6751   inst.instruction |= inst.operands[5].imm << 5;
6752 }
6753
6754 static void
6755 do_cmp (void)
6756 {
6757   inst.instruction |= inst.operands[0].reg << 16;
6758   encode_arm_shifter_operand (1);
6759 }
6760
6761 /* Transfer between coprocessor and ARM registers.
6762    MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
6763    MRC2
6764    MCR{cond}
6765    MCR2
6766
6767    No special properties.  */
6768
6769 static void
6770 do_co_reg (void)
6771 {
6772   inst.instruction |= inst.operands[0].reg << 8;
6773   inst.instruction |= inst.operands[1].imm << 21;
6774   inst.instruction |= inst.operands[2].reg << 12;
6775   inst.instruction |= inst.operands[3].reg << 16;
6776   inst.instruction |= inst.operands[4].reg;
6777   inst.instruction |= inst.operands[5].imm << 5;
6778 }
6779
6780 /* Transfer between coprocessor register and pair of ARM registers.
6781    MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
6782    MCRR2
6783    MRRC{cond}
6784    MRRC2
6785
6786    Two XScale instructions are special cases of these:
6787
6788      MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
6789      MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
6790
6791    Result unpredicatable if Rd or Rn is R15.  */
6792
6793 static void
6794 do_co_reg2c (void)
6795 {
6796   inst.instruction |= inst.operands[0].reg << 8;
6797   inst.instruction |= inst.operands[1].imm << 4;
6798   inst.instruction |= inst.operands[2].reg << 12;
6799   inst.instruction |= inst.operands[3].reg << 16;
6800   inst.instruction |= inst.operands[4].reg;
6801 }
6802
6803 static void
6804 do_cpsi (void)
6805 {
6806   inst.instruction |= inst.operands[0].imm << 6;
6807   if (inst.operands[1].present)
6808     {
6809       inst.instruction |= CPSI_MMOD;
6810       inst.instruction |= inst.operands[1].imm;
6811     }
6812 }
6813
6814 static void
6815 do_dbg (void)
6816 {
6817   inst.instruction |= inst.operands[0].imm;
6818 }
6819
6820 static void
6821 do_it (void)
6822 {
6823   /* There is no IT instruction in ARM mode.  We
6824      process it but do not generate code for it.  */
6825   inst.size = 0;
6826 }
6827
6828 static void
6829 do_ldmstm (void)
6830 {
6831   int base_reg = inst.operands[0].reg;
6832   int range = inst.operands[1].imm;
6833
6834   inst.instruction |= base_reg << 16;
6835   inst.instruction |= range;
6836
6837   if (inst.operands[1].writeback)
6838     inst.instruction |= LDM_TYPE_2_OR_3;
6839
6840   if (inst.operands[0].writeback)
6841     {
6842       inst.instruction |= WRITE_BACK;
6843       /* Check for unpredictable uses of writeback.  */
6844       if (inst.instruction & LOAD_BIT)
6845         {
6846           /* Not allowed in LDM type 2.  */
6847           if ((inst.instruction & LDM_TYPE_2_OR_3)
6848               && ((range & (1 << REG_PC)) == 0))
6849             as_warn (_("writeback of base register is UNPREDICTABLE"));
6850           /* Only allowed if base reg not in list for other types.  */
6851           else if (range & (1 << base_reg))
6852             as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
6853         }
6854       else /* STM.  */
6855         {
6856           /* Not allowed for type 2.  */
6857           if (inst.instruction & LDM_TYPE_2_OR_3)
6858             as_warn (_("writeback of base register is UNPREDICTABLE"));
6859           /* Only allowed if base reg not in list, or first in list.  */
6860           else if ((range & (1 << base_reg))
6861                    && (range & ((1 << base_reg) - 1)))
6862             as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
6863         }
6864     }
6865 }
6866
6867 /* ARMv5TE load-consecutive (argument parse)
6868    Mode is like LDRH.
6869
6870      LDRccD R, mode
6871      STRccD R, mode.  */
6872
6873 static void
6874 do_ldrd (void)
6875 {
6876   constraint (inst.operands[0].reg % 2 != 0,
6877               _("first destination register must be even"));
6878   constraint (inst.operands[1].present
6879               && inst.operands[1].reg != inst.operands[0].reg + 1,
6880               _("can only load two consecutive registers"));
6881   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
6882   constraint (!inst.operands[2].isreg, _("'[' expected"));
6883
6884   if (!inst.operands[1].present)
6885     inst.operands[1].reg = inst.operands[0].reg + 1;
6886   
6887   if (inst.instruction & LOAD_BIT)
6888     {
6889       /* encode_arm_addr_mode_3 will diagnose overlap between the base
6890          register and the first register written; we have to diagnose
6891          overlap between the base and the second register written here.  */
6892
6893       if (inst.operands[2].reg == inst.operands[1].reg
6894           && (inst.operands[2].writeback || inst.operands[2].postind))
6895         as_warn (_("base register written back, and overlaps "
6896                    "second destination register"));
6897
6898       /* For an index-register load, the index register must not overlap the
6899          destination (even if not write-back).  */
6900       else if (inst.operands[2].immisreg
6901                && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
6902                    || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
6903         as_warn (_("index register overlaps destination register"));
6904     }
6905
6906   inst.instruction |= inst.operands[0].reg << 12;
6907   encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
6908 }
6909
6910 static void
6911 do_ldrex (void)
6912 {
6913   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
6914               || inst.operands[1].postind || inst.operands[1].writeback
6915               || inst.operands[1].immisreg || inst.operands[1].shifted
6916               || inst.operands[1].negative
6917               /* This can arise if the programmer has written
6918                    strex rN, rM, foo
6919                  or if they have mistakenly used a register name as the last
6920                  operand,  eg:
6921                    strex rN, rM, rX
6922                  It is very difficult to distinguish between these two cases
6923                  because "rX" might actually be a label. ie the register
6924                  name has been occluded by a symbol of the same name. So we
6925                  just generate a general 'bad addressing mode' type error
6926                  message and leave it up to the programmer to discover the
6927                  true cause and fix their mistake.  */
6928               || (inst.operands[1].reg == REG_PC),
6929               BAD_ADDR_MODE);
6930
6931   constraint (inst.reloc.exp.X_op != O_constant
6932               || inst.reloc.exp.X_add_number != 0,
6933               _("offset must be zero in ARM encoding"));
6934
6935   inst.instruction |= inst.operands[0].reg << 12;
6936   inst.instruction |= inst.operands[1].reg << 16;
6937   inst.reloc.type = BFD_RELOC_UNUSED;
6938 }
6939
6940 static void
6941 do_ldrexd (void)
6942 {
6943   constraint (inst.operands[0].reg % 2 != 0,
6944               _("even register required"));
6945   constraint (inst.operands[1].present
6946               && inst.operands[1].reg != inst.operands[0].reg + 1,
6947               _("can only load two consecutive registers"));
6948   /* If op 1 were present and equal to PC, this function wouldn't
6949      have been called in the first place.  */
6950   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
6951
6952   inst.instruction |= inst.operands[0].reg << 12;
6953   inst.instruction |= inst.operands[2].reg << 16;
6954 }
6955
6956 static void
6957 do_ldst (void)
6958 {
6959   inst.instruction |= inst.operands[0].reg << 12;
6960   if (!inst.operands[1].isreg)
6961     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
6962       return;
6963   encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
6964 }
6965
6966 static void
6967 do_ldstt (void)
6968 {
6969   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
6970      reject [Rn,...].  */
6971   if (inst.operands[1].preind)
6972     {
6973       constraint (inst.reloc.exp.X_op != O_constant ||
6974                   inst.reloc.exp.X_add_number != 0,
6975                   _("this instruction requires a post-indexed address"));
6976
6977       inst.operands[1].preind = 0;
6978       inst.operands[1].postind = 1;
6979       inst.operands[1].writeback = 1;
6980     }
6981   inst.instruction |= inst.operands[0].reg << 12;
6982   encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
6983 }
6984
6985 /* Halfword and signed-byte load/store operations.  */
6986
6987 static void
6988 do_ldstv4 (void)
6989 {
6990   inst.instruction |= inst.operands[0].reg << 12;
6991   if (!inst.operands[1].isreg)
6992     if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
6993       return;
6994   encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
6995 }
6996
6997 static void
6998 do_ldsttv4 (void)
6999 {
7000   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
7001      reject [Rn,...].  */
7002   if (inst.operands[1].preind)
7003     {
7004       constraint (inst.reloc.exp.X_op != O_constant ||
7005                   inst.reloc.exp.X_add_number != 0,
7006                   _("this instruction requires a post-indexed address"));
7007
7008       inst.operands[1].preind = 0;
7009       inst.operands[1].postind = 1;
7010       inst.operands[1].writeback = 1;
7011     }
7012   inst.instruction |= inst.operands[0].reg << 12;
7013   encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
7014 }
7015
7016 /* Co-processor register load/store.
7017    Format: <LDC|STC>{cond}[L] CP#,CRd,<address>  */
7018 static void
7019 do_lstc (void)
7020 {
7021   inst.instruction |= inst.operands[0].reg << 8;
7022   inst.instruction |= inst.operands[1].reg << 12;
7023   encode_arm_cp_address (2, TRUE, TRUE, 0);
7024 }
7025
7026 static void
7027 do_mlas (void)
7028 {
7029   /* This restriction does not apply to mls (nor to mla in v6 or later).  */
7030   if (inst.operands[0].reg == inst.operands[1].reg
7031       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
7032       && !(inst.instruction & 0x00400000))
7033     as_tsktsk (_("Rd and Rm should be different in mla"));
7034
7035   inst.instruction |= inst.operands[0].reg << 16;
7036   inst.instruction |= inst.operands[1].reg;
7037   inst.instruction |= inst.operands[2].reg << 8;
7038   inst.instruction |= inst.operands[3].reg << 12;
7039 }
7040
7041 static void
7042 do_mov (void)
7043 {
7044   inst.instruction |= inst.operands[0].reg << 12;
7045   encode_arm_shifter_operand (1);
7046 }
7047
7048 /* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>.  */
7049 static void
7050 do_mov16 (void)
7051 {
7052   bfd_vma imm;
7053   bfd_boolean top;
7054
7055   top = (inst.instruction & 0x00400000) != 0;
7056   constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
7057               _(":lower16: not allowed this instruction"));
7058   constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
7059               _(":upper16: not allowed instruction"));
7060   inst.instruction |= inst.operands[0].reg << 12;
7061   if (inst.reloc.type == BFD_RELOC_UNUSED)
7062     {
7063       imm = inst.reloc.exp.X_add_number;
7064       /* The value is in two pieces: 0:11, 16:19.  */
7065       inst.instruction |= (imm & 0x00000fff);
7066       inst.instruction |= (imm & 0x0000f000) << 4;
7067     }
7068 }
7069
7070 static void do_vfp_nsyn_opcode (const char *);
7071
7072 static int
7073 do_vfp_nsyn_mrs (void)
7074 {
7075   if (inst.operands[0].isvec)
7076     {
7077       if (inst.operands[1].reg != 1)
7078         first_error (_("operand 1 must be FPSCR"));
7079       memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
7080       memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
7081       do_vfp_nsyn_opcode ("fmstat");
7082     }
7083   else if (inst.operands[1].isvec)
7084     do_vfp_nsyn_opcode ("fmrx");
7085   else
7086     return FAIL;
7087     
7088   return SUCCESS;
7089 }
7090
7091 static int
7092 do_vfp_nsyn_msr (void)
7093 {
7094   if (inst.operands[0].isvec)
7095     do_vfp_nsyn_opcode ("fmxr");
7096   else
7097     return FAIL;
7098
7099   return SUCCESS;
7100 }
7101
7102 static void
7103 do_vfp_vmrs (void)
7104 {
7105   int rt;
7106
7107   /* The destination register can be r0-r14 or APSR_nzcv */
7108   if (inst.operands[0].reg > 14)
7109     {
7110       inst.error = BAD_PC;
7111       return;
7112     }
7113
7114   /* If the destination is r13 and not in ARM mode then unprefictable */
7115   if (thumb_mode && inst.operands[0].reg == REG_SP)
7116     {
7117       inst.error = BAD_SP;
7118       return;
7119     }
7120
7121   /* If the destination is APSR_nzcv */
7122   if (inst.operands[0].isvec && inst.operands[1].reg != 1)
7123     {
7124       inst.error = BAD_VMRS;
7125       return;
7126     }
7127
7128   if (inst.operands[0].isvec)
7129     rt = 15;
7130   else
7131     rt = inst.operands[0].reg;
7132
7133   /* Or in the registers to use */
7134   inst.instruction |= rt << 12;
7135   inst.instruction |= inst.operands[1].reg << 16;
7136 }
7137
7138 static void
7139 do_vfp_vmsr (void)
7140 {
7141   /* The destination register can be r0-r14 or APSR_nzcv */
7142   if (inst.operands[1].reg > 14)
7143     {
7144       inst.error = BAD_PC;
7145       return;
7146     }
7147
7148   /* If the destination is r13 and not in ARM mode then unprefictable */
7149   if (thumb_mode && inst.operands[0].reg == REG_SP)
7150     {
7151       inst.error = BAD_SP;
7152       return;
7153     }
7154
7155   /* Or in the registers to use */
7156   inst.instruction |= inst.operands[1].reg << 12;
7157   inst.instruction |= inst.operands[0].reg << 16;
7158 }
7159
7160 static void
7161 do_mrs (void)
7162 {
7163   if (do_vfp_nsyn_mrs () == SUCCESS)
7164     return;
7165
7166   /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
7167   constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
7168               != (PSR_c|PSR_f),
7169               _("'CPSR' or 'SPSR' expected"));
7170   inst.instruction |= inst.operands[0].reg << 12;
7171   inst.instruction |= (inst.operands[1].imm & SPSR_BIT);
7172 }
7173
7174 /* Two possible forms:
7175       "{C|S}PSR_<field>, Rm",
7176       "{C|S}PSR_f, #expression".  */
7177
7178 static void
7179 do_msr (void)
7180 {
7181   if (do_vfp_nsyn_msr () == SUCCESS)
7182     return;
7183
7184   inst.instruction |= inst.operands[0].imm;
7185   if (inst.operands[1].isreg)
7186     inst.instruction |= inst.operands[1].reg;
7187   else
7188     {
7189       inst.instruction |= INST_IMMEDIATE;
7190       inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
7191       inst.reloc.pc_rel = 0;
7192     }
7193 }
7194
7195 static void
7196 do_mul (void)
7197 {
7198   if (!inst.operands[2].present)
7199     inst.operands[2].reg = inst.operands[0].reg;
7200   inst.instruction |= inst.operands[0].reg << 16;
7201   inst.instruction |= inst.operands[1].reg;
7202   inst.instruction |= inst.operands[2].reg << 8;
7203
7204   if (inst.operands[0].reg == inst.operands[1].reg
7205       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
7206     as_tsktsk (_("Rd and Rm should be different in mul"));
7207 }
7208
7209 /* Long Multiply Parser
7210    UMULL RdLo, RdHi, Rm, Rs
7211    SMULL RdLo, RdHi, Rm, Rs
7212    UMLAL RdLo, RdHi, Rm, Rs
7213    SMLAL RdLo, RdHi, Rm, Rs.  */
7214
7215 static void
7216 do_mull (void)
7217 {
7218   inst.instruction |= inst.operands[0].reg << 12;
7219   inst.instruction |= inst.operands[1].reg << 16;
7220   inst.instruction |= inst.operands[2].reg;
7221   inst.instruction |= inst.operands[3].reg << 8;
7222
7223   /* rdhi, rdlo and rm must all be different prior to ARMv6.  */
7224   if (inst.operands[0].reg == inst.operands[1].reg
7225       || ((inst.operands[0].reg == inst.operands[2].reg
7226       || inst.operands[1].reg == inst.operands[2].reg)
7227       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)))
7228     as_tsktsk (_("rdhi, rdlo and rm must all be different"));
7229 }
7230
7231 static void
7232 do_nop (void)
7233 {
7234   if (inst.operands[0].present)
7235     {
7236       /* Architectural NOP hints are CPSR sets with no bits selected.  */
7237       inst.instruction &= 0xf0000000;
7238       inst.instruction |= 0x0320f000 + inst.operands[0].imm;
7239     }
7240 }
7241
7242 /* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
7243    PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
7244    Condition defaults to COND_ALWAYS.
7245    Error if Rd, Rn or Rm are R15.  */
7246
7247 static void
7248 do_pkhbt (void)
7249 {
7250   inst.instruction |= inst.operands[0].reg << 12;
7251   inst.instruction |= inst.operands[1].reg << 16;
7252   inst.instruction |= inst.operands[2].reg;
7253   if (inst.operands[3].present)
7254     encode_arm_shift (3);
7255 }
7256
7257 /* ARM V6 PKHTB (Argument Parse).  */
7258
7259 static void
7260 do_pkhtb (void)
7261 {
7262   if (!inst.operands[3].present)
7263     {
7264       /* If the shift specifier is omitted, turn the instruction
7265          into pkhbt rd, rm, rn. */
7266       inst.instruction &= 0xfff00010;
7267       inst.instruction |= inst.operands[0].reg << 12;
7268       inst.instruction |= inst.operands[1].reg;
7269       inst.instruction |= inst.operands[2].reg << 16;
7270     }
7271   else
7272     {
7273       inst.instruction |= inst.operands[0].reg << 12;
7274       inst.instruction |= inst.operands[1].reg << 16;
7275       inst.instruction |= inst.operands[2].reg;
7276       encode_arm_shift (3);
7277     }
7278 }
7279
7280 /* ARMv5TE: Preload-Cache
7281
7282     PLD <addr_mode>
7283
7284   Syntactically, like LDR with B=1, W=0, L=1.  */
7285
7286 static void
7287 do_pld (void)
7288 {
7289   constraint (!inst.operands[0].isreg,
7290               _("'[' expected after PLD mnemonic"));
7291   constraint (inst.operands[0].postind,
7292               _("post-indexed expression used in preload instruction"));
7293   constraint (inst.operands[0].writeback,
7294               _("writeback used in preload instruction"));
7295   constraint (!inst.operands[0].preind,
7296               _("unindexed addressing used in preload instruction"));
7297   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
7298 }
7299
7300 /* ARMv7: PLI <addr_mode>  */
7301 static void
7302 do_pli (void)
7303 {
7304   constraint (!inst.operands[0].isreg,
7305               _("'[' expected after PLI mnemonic"));
7306   constraint (inst.operands[0].postind,
7307               _("post-indexed expression used in preload instruction"));
7308   constraint (inst.operands[0].writeback,
7309               _("writeback used in preload instruction"));
7310   constraint (!inst.operands[0].preind,
7311               _("unindexed addressing used in preload instruction"));
7312   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
7313   inst.instruction &= ~PRE_INDEX;
7314 }
7315
7316 static void
7317 do_push_pop (void)
7318 {
7319   inst.operands[1] = inst.operands[0];
7320   memset (&inst.operands[0], 0, sizeof inst.operands[0]);
7321   inst.operands[0].isreg = 1;
7322   inst.operands[0].writeback = 1;
7323   inst.operands[0].reg = REG_SP;
7324   do_ldmstm ();
7325 }
7326
7327 /* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
7328    word at the specified address and the following word
7329    respectively.
7330    Unconditionally executed.
7331    Error if Rn is R15.  */
7332
7333 static void
7334 do_rfe (void)
7335 {
7336   inst.instruction |= inst.operands[0].reg << 16;
7337   if (inst.operands[0].writeback)
7338     inst.instruction |= WRITE_BACK;
7339 }
7340
7341 /* ARM V6 ssat (argument parse).  */
7342
7343 static void
7344 do_ssat (void)
7345 {
7346   inst.instruction |= inst.operands[0].reg << 12;
7347   inst.instruction |= (inst.operands[1].imm - 1) << 16;
7348   inst.instruction |= inst.operands[2].reg;
7349
7350   if (inst.operands[3].present)
7351     encode_arm_shift (3);
7352 }
7353
7354 /* ARM V6 usat (argument parse).  */
7355
7356 static void
7357 do_usat (void)
7358 {
7359   inst.instruction |= inst.operands[0].reg << 12;
7360   inst.instruction |= inst.operands[1].imm << 16;
7361   inst.instruction |= inst.operands[2].reg;
7362
7363   if (inst.operands[3].present)
7364     encode_arm_shift (3);
7365 }
7366
7367 /* ARM V6 ssat16 (argument parse).  */
7368
7369 static void
7370 do_ssat16 (void)
7371 {
7372   inst.instruction |= inst.operands[0].reg << 12;
7373   inst.instruction |= ((inst.operands[1].imm - 1) << 16);
7374   inst.instruction |= inst.operands[2].reg;
7375 }
7376
7377 static void
7378 do_usat16 (void)
7379 {
7380   inst.instruction |= inst.operands[0].reg << 12;
7381   inst.instruction |= inst.operands[1].imm << 16;
7382   inst.instruction |= inst.operands[2].reg;
7383 }
7384
7385 /* ARM V6 SETEND (argument parse).  Sets the E bit in the CPSR while
7386    preserving the other bits.
7387
7388    setend <endian_specifier>, where <endian_specifier> is either
7389    BE or LE.  */
7390
7391 static void
7392 do_setend (void)
7393 {
7394   if (inst.operands[0].imm)
7395     inst.instruction |= 0x200;
7396 }
7397
7398 static void
7399 do_shift (void)
7400 {
7401   unsigned int Rm = (inst.operands[1].present
7402                      ? inst.operands[1].reg
7403                      : inst.operands[0].reg);
7404
7405   inst.instruction |= inst.operands[0].reg << 12;
7406   inst.instruction |= Rm;
7407   if (inst.operands[2].isreg)  /* Rd, {Rm,} Rs */
7408     {
7409       inst.instruction |= inst.operands[2].reg << 8;
7410       inst.instruction |= SHIFT_BY_REG;
7411     }
7412   else
7413     inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7414 }
7415
7416 static void
7417 do_smc (void)
7418 {
7419   inst.reloc.type = BFD_RELOC_ARM_SMC;
7420   inst.reloc.pc_rel = 0;
7421 }
7422
7423 static void
7424 do_swi (void)
7425 {
7426   inst.reloc.type = BFD_RELOC_ARM_SWI;
7427   inst.reloc.pc_rel = 0;
7428 }
7429
7430 /* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
7431    SMLAxy{cond} Rd,Rm,Rs,Rn
7432    SMLAWy{cond} Rd,Rm,Rs,Rn
7433    Error if any register is R15.  */
7434
7435 static void
7436 do_smla (void)
7437 {
7438   inst.instruction |= inst.operands[0].reg << 16;
7439   inst.instruction |= inst.operands[1].reg;
7440   inst.instruction |= inst.operands[2].reg << 8;
7441   inst.instruction |= inst.operands[3].reg << 12;
7442 }
7443
7444 /* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
7445    SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
7446    Error if any register is R15.
7447    Warning if Rdlo == Rdhi.  */
7448
7449 static void
7450 do_smlal (void)
7451 {
7452   inst.instruction |= inst.operands[0].reg << 12;
7453   inst.instruction |= inst.operands[1].reg << 16;
7454   inst.instruction |= inst.operands[2].reg;
7455   inst.instruction |= inst.operands[3].reg << 8;
7456
7457   if (inst.operands[0].reg == inst.operands[1].reg)
7458     as_tsktsk (_("rdhi and rdlo must be different"));
7459 }
7460
7461 /* ARM V5E (El Segundo) signed-multiply (argument parse)
7462    SMULxy{cond} Rd,Rm,Rs
7463    Error if any register is R15.  */
7464
7465 static void
7466 do_smul (void)
7467 {
7468   inst.instruction |= inst.operands[0].reg << 16;
7469   inst.instruction |= inst.operands[1].reg;
7470   inst.instruction |= inst.operands[2].reg << 8;
7471 }
7472
7473 /* ARM V6 srs (argument parse).  The variable fields in the encoding are
7474    the same for both ARM and Thumb-2.  */
7475
7476 static void
7477 do_srs (void)
7478 {
7479   int reg;
7480
7481   if (inst.operands[0].present)
7482     {
7483       reg = inst.operands[0].reg;
7484       constraint (reg != 13, _("SRS base register must be r13"));
7485     }
7486   else
7487     reg = 13;
7488
7489   inst.instruction |= reg << 16;
7490   inst.instruction |= inst.operands[1].imm;
7491   if (inst.operands[0].writeback || inst.operands[1].writeback)
7492     inst.instruction |= WRITE_BACK;
7493 }
7494
7495 /* ARM V6 strex (argument parse).  */
7496
7497 static void
7498 do_strex (void)
7499 {
7500   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
7501               || inst.operands[2].postind || inst.operands[2].writeback
7502               || inst.operands[2].immisreg || inst.operands[2].shifted
7503               || inst.operands[2].negative
7504               /* See comment in do_ldrex().  */
7505               || (inst.operands[2].reg == REG_PC),
7506               BAD_ADDR_MODE);
7507
7508   constraint (inst.operands[0].reg == inst.operands[1].reg
7509               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
7510
7511   constraint (inst.reloc.exp.X_op != O_constant
7512               || inst.reloc.exp.X_add_number != 0,
7513               _("offset must be zero in ARM encoding"));
7514
7515   inst.instruction |= inst.operands[0].reg << 12;
7516   inst.instruction |= inst.operands[1].reg;
7517   inst.instruction |= inst.operands[2].reg << 16;
7518   inst.reloc.type = BFD_RELOC_UNUSED;
7519 }
7520
7521 static void
7522 do_strexd (void)
7523 {
7524   constraint (inst.operands[1].reg % 2 != 0,
7525               _("even register required"));
7526   constraint (inst.operands[2].present
7527               && inst.operands[2].reg != inst.operands[1].reg + 1,
7528               _("can only store two consecutive registers"));
7529   /* If op 2 were present and equal to PC, this function wouldn't
7530      have been called in the first place.  */
7531   constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
7532
7533   constraint (inst.operands[0].reg == inst.operands[1].reg
7534               || inst.operands[0].reg == inst.operands[1].reg + 1
7535               || inst.operands[0].reg == inst.operands[3].reg,
7536               BAD_OVERLAP);
7537
7538   inst.instruction |= inst.operands[0].reg << 12;
7539   inst.instruction |= inst.operands[1].reg;
7540   inst.instruction |= inst.operands[3].reg << 16;
7541 }
7542
7543 /* ARM V6 SXTAH extracts a 16-bit value from a register, sign
7544    extends it to 32-bits, and adds the result to a value in another
7545    register.  You can specify a rotation by 0, 8, 16, or 24 bits
7546    before extracting the 16-bit value.
7547    SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
7548    Condition defaults to COND_ALWAYS.
7549    Error if any register uses R15.  */
7550
7551 static void
7552 do_sxtah (void)
7553 {
7554   inst.instruction |= inst.operands[0].reg << 12;
7555   inst.instruction |= inst.operands[1].reg << 16;
7556   inst.instruction |= inst.operands[2].reg;
7557   inst.instruction |= inst.operands[3].imm << 10;
7558 }
7559
7560 /* ARM V6 SXTH.
7561
7562    SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
7563    Condition defaults to COND_ALWAYS.
7564    Error if any register uses R15.  */
7565
7566 static void
7567 do_sxth (void)
7568 {
7569   inst.instruction |= inst.operands[0].reg << 12;
7570   inst.instruction |= inst.operands[1].reg;
7571   inst.instruction |= inst.operands[2].imm << 10;
7572 }
7573 \f
7574 /* VFP instructions.  In a logical order: SP variant first, monad
7575    before dyad, arithmetic then move then load/store.  */
7576
7577 static void
7578 do_vfp_sp_monadic (void)
7579 {
7580   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7581   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
7582 }
7583
7584 static void
7585 do_vfp_sp_dyadic (void)
7586 {
7587   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7588   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
7589   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
7590 }
7591
7592 static void
7593 do_vfp_sp_compare_z (void)
7594 {
7595   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7596 }
7597
7598 static void
7599 do_vfp_dp_sp_cvt (void)
7600 {
7601   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7602   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
7603 }
7604
7605 static void
7606 do_vfp_sp_dp_cvt (void)
7607 {
7608   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7609   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
7610 }
7611
7612 static void
7613 do_vfp_reg_from_sp (void)
7614 {
7615   inst.instruction |= inst.operands[0].reg << 12;
7616   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
7617 }
7618
7619 static void
7620 do_vfp_reg2_from_sp2 (void)
7621 {
7622   constraint (inst.operands[2].imm != 2,
7623               _("only two consecutive VFP SP registers allowed here"));
7624   inst.instruction |= inst.operands[0].reg << 12;
7625   inst.instruction |= inst.operands[1].reg << 16;
7626   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
7627 }
7628
7629 static void
7630 do_vfp_sp_from_reg (void)
7631 {
7632   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
7633   inst.instruction |= inst.operands[1].reg << 12;
7634 }
7635
7636 static void
7637 do_vfp_sp2_from_reg2 (void)
7638 {
7639   constraint (inst.operands[0].imm != 2,
7640               _("only two consecutive VFP SP registers allowed here"));
7641   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
7642   inst.instruction |= inst.operands[1].reg << 12;
7643   inst.instruction |= inst.operands[2].reg << 16;
7644 }
7645
7646 static void
7647 do_vfp_sp_ldst (void)
7648 {
7649   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7650   encode_arm_cp_address (1, FALSE, TRUE, 0);
7651 }
7652
7653 static void
7654 do_vfp_dp_ldst (void)
7655 {
7656   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7657   encode_arm_cp_address (1, FALSE, TRUE, 0);
7658 }
7659
7660
7661 static void
7662 vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
7663 {
7664   if (inst.operands[0].writeback)
7665     inst.instruction |= WRITE_BACK;
7666   else
7667     constraint (ldstm_type != VFP_LDSTMIA,
7668                 _("this addressing mode requires base-register writeback"));
7669   inst.instruction |= inst.operands[0].reg << 16;
7670   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
7671   inst.instruction |= inst.operands[1].imm;
7672 }
7673
7674 static void
7675 vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
7676 {
7677   int count;
7678
7679   if (inst.operands[0].writeback)
7680     inst.instruction |= WRITE_BACK;
7681   else
7682     constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
7683                 _("this addressing mode requires base-register writeback"));
7684
7685   inst.instruction |= inst.operands[0].reg << 16;
7686   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
7687
7688   count = inst.operands[1].imm << 1;
7689   if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
7690     count += 1;
7691
7692   inst.instruction |= count;
7693 }
7694
7695 static void
7696 do_vfp_sp_ldstmia (void)
7697 {
7698   vfp_sp_ldstm (VFP_LDSTMIA);
7699 }
7700
7701 static void
7702 do_vfp_sp_ldstmdb (void)
7703 {
7704   vfp_sp_ldstm (VFP_LDSTMDB);
7705 }
7706
7707 static void
7708 do_vfp_dp_ldstmia (void)
7709 {
7710   vfp_dp_ldstm (VFP_LDSTMIA);
7711 }
7712
7713 static void
7714 do_vfp_dp_ldstmdb (void)
7715 {
7716   vfp_dp_ldstm (VFP_LDSTMDB);
7717 }
7718
7719 static void
7720 do_vfp_xp_ldstmia (void)
7721 {
7722   vfp_dp_ldstm (VFP_LDSTMIAX);
7723 }
7724
7725 static void
7726 do_vfp_xp_ldstmdb (void)
7727 {
7728   vfp_dp_ldstm (VFP_LDSTMDBX);
7729 }
7730
7731 static void
7732 do_vfp_dp_rd_rm (void)
7733 {
7734   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7735   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
7736 }
7737
7738 static void
7739 do_vfp_dp_rn_rd (void)
7740 {
7741   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
7742   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
7743 }
7744
7745 static void
7746 do_vfp_dp_rd_rn (void)
7747 {
7748   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7749   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
7750 }
7751
7752 static void
7753 do_vfp_dp_rd_rn_rm (void)
7754 {
7755   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7756   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
7757   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
7758 }
7759
7760 static void
7761 do_vfp_dp_rd (void)
7762 {
7763   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7764 }
7765
7766 static void
7767 do_vfp_dp_rm_rd_rn (void)
7768 {
7769   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
7770   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
7771   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
7772 }
7773
7774 /* VFPv3 instructions.  */
7775 static void
7776 do_vfp_sp_const (void)
7777 {
7778   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7779   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
7780   inst.instruction |= (inst.operands[1].imm & 0x0f);
7781 }
7782
7783 static void
7784 do_vfp_dp_const (void)
7785 {
7786   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7787   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
7788   inst.instruction |= (inst.operands[1].imm & 0x0f);
7789 }
7790
7791 static void
7792 vfp_conv (int srcsize)
7793 {
7794   unsigned immbits = srcsize - inst.operands[1].imm;
7795   inst.instruction |= (immbits & 1) << 5;
7796   inst.instruction |= (immbits >> 1);
7797 }
7798
7799 static void
7800 do_vfp_sp_conv_16 (void)
7801 {
7802   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7803   vfp_conv (16);
7804 }
7805
7806 static void
7807 do_vfp_dp_conv_16 (void)
7808 {
7809   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7810   vfp_conv (16);
7811 }
7812
7813 static void
7814 do_vfp_sp_conv_32 (void)
7815 {
7816   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7817   vfp_conv (32);
7818 }
7819
7820 static void
7821 do_vfp_dp_conv_32 (void)
7822 {
7823   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7824   vfp_conv (32);
7825 }
7826
7827 \f
7828 /* FPA instructions.  Also in a logical order.  */
7829
7830 static void
7831 do_fpa_cmp (void)
7832 {
7833   inst.instruction |= inst.operands[0].reg << 16;
7834   inst.instruction |= inst.operands[1].reg;
7835 }
7836
7837 static void
7838 do_fpa_ldmstm (void)
7839 {
7840   inst.instruction |= inst.operands[0].reg << 12;
7841   switch (inst.operands[1].imm)
7842     {
7843     case 1: inst.instruction |= CP_T_X;          break;
7844     case 2: inst.instruction |= CP_T_Y;          break;
7845     case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
7846     case 4:                                      break;
7847     default: abort ();
7848     }
7849
7850   if (inst.instruction & (PRE_INDEX | INDEX_UP))
7851     {
7852       /* The instruction specified "ea" or "fd", so we can only accept
7853          [Rn]{!}.  The instruction does not really support stacking or
7854          unstacking, so we have to emulate these by setting appropriate
7855          bits and offsets.  */
7856       constraint (inst.reloc.exp.X_op != O_constant
7857                   || inst.reloc.exp.X_add_number != 0,
7858                   _("this instruction does not support indexing"));
7859
7860       if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
7861         inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
7862
7863       if (!(inst.instruction & INDEX_UP))
7864         inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
7865
7866       if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
7867         {
7868           inst.operands[2].preind = 0;
7869           inst.operands[2].postind = 1;
7870         }
7871     }
7872
7873   encode_arm_cp_address (2, TRUE, TRUE, 0);
7874 }
7875
7876 \f
7877 /* iWMMXt instructions: strictly in alphabetical order.  */
7878
7879 static void
7880 do_iwmmxt_tandorc (void)
7881 {
7882   constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
7883 }
7884
7885 static void
7886 do_iwmmxt_textrc (void)
7887 {
7888   inst.instruction |= inst.operands[0].reg << 12;
7889   inst.instruction |= inst.operands[1].imm;
7890 }
7891
7892 static void
7893 do_iwmmxt_textrm (void)
7894 {
7895   inst.instruction |= inst.operands[0].reg << 12;
7896   inst.instruction |= inst.operands[1].reg << 16;
7897   inst.instruction |= inst.operands[2].imm;
7898 }
7899
7900 static void
7901 do_iwmmxt_tinsr (void)
7902 {
7903   inst.instruction |= inst.operands[0].reg << 16;
7904   inst.instruction |= inst.operands[1].reg << 12;
7905   inst.instruction |= inst.operands[2].imm;
7906 }
7907
7908 static void
7909 do_iwmmxt_tmia (void)
7910 {
7911   inst.instruction |= inst.operands[0].reg << 5;
7912   inst.instruction |= inst.operands[1].reg;
7913   inst.instruction |= inst.operands[2].reg << 12;
7914 }
7915
7916 static void
7917 do_iwmmxt_waligni (void)
7918 {
7919   inst.instruction |= inst.operands[0].reg << 12;
7920   inst.instruction |= inst.operands[1].reg << 16;
7921   inst.instruction |= inst.operands[2].reg;
7922   inst.instruction |= inst.operands[3].imm << 20;
7923 }
7924
7925 static void
7926 do_iwmmxt_wmerge (void)
7927 {
7928   inst.instruction |= inst.operands[0].reg << 12;
7929   inst.instruction |= inst.operands[1].reg << 16;
7930   inst.instruction |= inst.operands[2].reg;
7931   inst.instruction |= inst.operands[3].imm << 21;
7932 }
7933
7934 static void
7935 do_iwmmxt_wmov (void)
7936 {
7937   /* WMOV rD, rN is an alias for WOR rD, rN, rN.  */
7938   inst.instruction |= inst.operands[0].reg << 12;
7939   inst.instruction |= inst.operands[1].reg << 16;
7940   inst.instruction |= inst.operands[1].reg;
7941 }
7942
7943 static void
7944 do_iwmmxt_wldstbh (void)
7945 {
7946   int reloc;
7947   inst.instruction |= inst.operands[0].reg << 12;
7948   if (thumb_mode)
7949     reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
7950   else
7951     reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
7952   encode_arm_cp_address (1, TRUE, FALSE, reloc);
7953 }
7954
7955 static void
7956 do_iwmmxt_wldstw (void)
7957 {
7958   /* RIWR_RIWC clears .isreg for a control register.  */
7959   if (!inst.operands[0].isreg)
7960     {
7961       constraint (inst.cond != COND_ALWAYS, BAD_COND);
7962       inst.instruction |= 0xf0000000;
7963     }
7964
7965   inst.instruction |= inst.operands[0].reg << 12;
7966   encode_arm_cp_address (1, TRUE, TRUE, 0);
7967 }
7968
7969 static void
7970 do_iwmmxt_wldstd (void)
7971 {
7972   inst.instruction |= inst.operands[0].reg << 12;
7973   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
7974       && inst.operands[1].immisreg)
7975     {
7976       inst.instruction &= ~0x1a000ff;
7977       inst.instruction |= (0xf << 28);
7978       if (inst.operands[1].preind)
7979         inst.instruction |= PRE_INDEX;
7980       if (!inst.operands[1].negative)
7981         inst.instruction |= INDEX_UP;
7982       if (inst.operands[1].writeback)
7983         inst.instruction |= WRITE_BACK;
7984       inst.instruction |= inst.operands[1].reg << 16;
7985       inst.instruction |= inst.reloc.exp.X_add_number << 4;
7986       inst.instruction |= inst.operands[1].imm;
7987     }
7988   else
7989     encode_arm_cp_address (1, TRUE, FALSE, 0);
7990 }
7991
7992 static void
7993 do_iwmmxt_wshufh (void)
7994 {
7995   inst.instruction |= inst.operands[0].reg << 12;
7996   inst.instruction |= inst.operands[1].reg << 16;
7997   inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
7998   inst.instruction |= (inst.operands[2].imm & 0x0f);
7999 }
8000
8001 static void
8002 do_iwmmxt_wzero (void)
8003 {
8004   /* WZERO reg is an alias for WANDN reg, reg, reg.  */
8005   inst.instruction |= inst.operands[0].reg;
8006   inst.instruction |= inst.operands[0].reg << 12;
8007   inst.instruction |= inst.operands[0].reg << 16;
8008 }
8009
8010 static void
8011 do_iwmmxt_wrwrwr_or_imm5 (void)
8012 {
8013   if (inst.operands[2].isreg)
8014     do_rd_rn_rm ();
8015   else {
8016     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
8017                 _("immediate operand requires iWMMXt2"));
8018     do_rd_rn ();
8019     if (inst.operands[2].imm == 0)
8020       {
8021         switch ((inst.instruction >> 20) & 0xf)
8022           {
8023           case 4:
8024           case 5:
8025           case 6:
8026           case 7: 
8027             /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16.  */
8028             inst.operands[2].imm = 16;
8029             inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
8030             break;
8031           case 8:
8032           case 9:
8033           case 10:
8034           case 11:
8035             /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32.  */
8036             inst.operands[2].imm = 32;
8037             inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
8038             break;
8039           case 12:
8040           case 13:
8041           case 14:
8042           case 15:
8043             {
8044               /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn.  */
8045               unsigned long wrn;
8046               wrn = (inst.instruction >> 16) & 0xf;
8047               inst.instruction &= 0xff0fff0f;
8048               inst.instruction |= wrn;
8049               /* Bail out here; the instruction is now assembled.  */
8050               return;
8051             }
8052           }
8053       }
8054     /* Map 32 -> 0, etc.  */
8055     inst.operands[2].imm &= 0x1f;
8056     inst.instruction |= (0xf << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
8057   }
8058 }
8059 \f
8060 /* Cirrus Maverick instructions.  Simple 2-, 3-, and 4-register
8061    operations first, then control, shift, and load/store.  */
8062
8063 /* Insns like "foo X,Y,Z".  */
8064
8065 static void
8066 do_mav_triple (void)
8067 {
8068   inst.instruction |= inst.operands[0].reg << 16;
8069   inst.instruction |= inst.operands[1].reg;
8070   inst.instruction |= inst.operands[2].reg << 12;
8071 }
8072
8073 /* Insns like "foo W,X,Y,Z".
8074     where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
8075
8076 static void
8077 do_mav_quad (void)
8078 {
8079   inst.instruction |= inst.operands[0].reg << 5;
8080   inst.instruction |= inst.operands[1].reg << 12;
8081   inst.instruction |= inst.operands[2].reg << 16;
8082   inst.instruction |= inst.operands[3].reg;
8083 }
8084
8085 /* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
8086 static void
8087 do_mav_dspsc (void)
8088 {
8089   inst.instruction |= inst.operands[1].reg << 12;
8090 }
8091
8092 /* Maverick shift immediate instructions.
8093    cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
8094    cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0].  */
8095
8096 static void
8097 do_mav_shift (void)
8098 {
8099   int imm = inst.operands[2].imm;
8100
8101   inst.instruction |= inst.operands[0].reg << 12;
8102   inst.instruction |= inst.operands[1].reg << 16;
8103
8104   /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
8105      Bits 5-7 of the insn should have bits 4-6 of the immediate.
8106      Bit 4 should be 0.  */
8107   imm = (imm & 0xf) | ((imm & 0x70) << 1);
8108
8109   inst.instruction |= imm;
8110 }
8111 \f
8112 /* XScale instructions.  Also sorted arithmetic before move.  */
8113
8114 /* Xscale multiply-accumulate (argument parse)
8115      MIAcc   acc0,Rm,Rs
8116      MIAPHcc acc0,Rm,Rs
8117      MIAxycc acc0,Rm,Rs.  */
8118
8119 static void
8120 do_xsc_mia (void)
8121 {
8122   inst.instruction |= inst.operands[1].reg;
8123   inst.instruction |= inst.operands[2].reg << 12;
8124 }
8125
8126 /* Xscale move-accumulator-register (argument parse)
8127
8128      MARcc   acc0,RdLo,RdHi.  */
8129
8130 static void
8131 do_xsc_mar (void)
8132 {
8133   inst.instruction |= inst.operands[1].reg << 12;
8134   inst.instruction |= inst.operands[2].reg << 16;
8135 }
8136
8137 /* Xscale move-register-accumulator (argument parse)
8138
8139      MRAcc   RdLo,RdHi,acc0.  */
8140
8141 static void
8142 do_xsc_mra (void)
8143 {
8144   constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
8145   inst.instruction |= inst.operands[0].reg << 12;
8146   inst.instruction |= inst.operands[1].reg << 16;
8147 }
8148 \f
8149 /* Encoding functions relevant only to Thumb.  */
8150
8151 /* inst.operands[i] is a shifted-register operand; encode
8152    it into inst.instruction in the format used by Thumb32.  */
8153
8154 static void
8155 encode_thumb32_shifted_operand (int i)
8156 {
8157   unsigned int value = inst.reloc.exp.X_add_number;
8158   unsigned int shift = inst.operands[i].shift_kind;
8159
8160   constraint (inst.operands[i].immisreg,
8161               _("shift by register not allowed in thumb mode"));
8162   inst.instruction |= inst.operands[i].reg;
8163   if (shift == SHIFT_RRX)
8164     inst.instruction |= SHIFT_ROR << 4;
8165   else
8166     {
8167       constraint (inst.reloc.exp.X_op != O_constant,
8168                   _("expression too complex"));
8169
8170       constraint (value > 32
8171                   || (value == 32 && (shift == SHIFT_LSL
8172                                       || shift == SHIFT_ROR)),
8173                   _("shift expression is too large"));
8174
8175       if (value == 0)
8176         shift = SHIFT_LSL;
8177       else if (value == 32)
8178         value = 0;
8179
8180       inst.instruction |= shift << 4;
8181       inst.instruction |= (value & 0x1c) << 10;
8182       inst.instruction |= (value & 0x03) << 6;
8183     }
8184 }
8185
8186
8187 /* inst.operands[i] was set up by parse_address.  Encode it into a
8188    Thumb32 format load or store instruction.  Reject forms that cannot
8189    be used with such instructions.  If is_t is true, reject forms that
8190    cannot be used with a T instruction; if is_d is true, reject forms
8191    that cannot be used with a D instruction.  */
8192
8193 static void
8194 encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
8195 {
8196   bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
8197
8198   constraint (!inst.operands[i].isreg,
8199               _("Instruction does not support =N addresses"));
8200
8201   inst.instruction |= inst.operands[i].reg << 16;
8202   if (inst.operands[i].immisreg)
8203     {
8204       constraint (is_pc, _("cannot use register index with PC-relative addressing"));
8205       constraint (is_t || is_d, _("cannot use register index with this instruction"));
8206       constraint (inst.operands[i].negative,
8207                   _("Thumb does not support negative register indexing"));
8208       constraint (inst.operands[i].postind,
8209                   _("Thumb does not support register post-indexing"));
8210       constraint (inst.operands[i].writeback,
8211                   _("Thumb does not support register indexing with writeback"));
8212       constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
8213                   _("Thumb supports only LSL in shifted register indexing"));
8214
8215       inst.instruction |= inst.operands[i].imm;
8216       if (inst.operands[i].shifted)
8217         {
8218           constraint (inst.reloc.exp.X_op != O_constant,
8219                       _("expression too complex"));
8220           constraint (inst.reloc.exp.X_add_number < 0
8221                       || inst.reloc.exp.X_add_number > 3,
8222                       _("shift out of range"));
8223           inst.instruction |= inst.reloc.exp.X_add_number << 4;
8224         }
8225       inst.reloc.type = BFD_RELOC_UNUSED;
8226     }
8227   else if (inst.operands[i].preind)
8228     {
8229       constraint (is_pc && inst.operands[i].writeback,
8230                   _("cannot use writeback with PC-relative addressing"));
8231       constraint (is_t && inst.operands[i].writeback,
8232                   _("cannot use writeback with this instruction"));
8233
8234       if (is_d)
8235         {
8236           inst.instruction |= 0x01000000;
8237           if (inst.operands[i].writeback)
8238             inst.instruction |= 0x00200000;
8239         }
8240       else
8241         {
8242           inst.instruction |= 0x00000c00;
8243           if (inst.operands[i].writeback)
8244             inst.instruction |= 0x00000100;
8245         }
8246       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
8247     }
8248   else if (inst.operands[i].postind)
8249     {
8250       assert (inst.operands[i].writeback);
8251       constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
8252       constraint (is_t, _("cannot use post-indexing with this instruction"));
8253
8254       if (is_d)
8255         inst.instruction |= 0x00200000;
8256       else
8257         inst.instruction |= 0x00000900;
8258       inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
8259     }
8260   else /* unindexed - only for coprocessor */
8261     inst.error = _("instruction does not accept unindexed addressing");
8262 }
8263
8264 /* Table of Thumb instructions which exist in both 16- and 32-bit
8265    encodings (the latter only in post-V6T2 cores).  The index is the
8266    value used in the insns table below.  When there is more than one
8267    possible 16-bit encoding for the instruction, this table always
8268    holds variant (1).
8269    Also contains several pseudo-instructions used during relaxation.  */
8270 #define T16_32_TAB                              \
8271   X(adc,   4140, eb400000),                     \
8272   X(adcs,  4140, eb500000),                     \
8273   X(add,   1c00, eb000000),                     \
8274   X(adds,  1c00, eb100000),                     \
8275   X(addi,  0000, f1000000),                     \
8276   X(addis, 0000, f1100000),                     \
8277   X(add_pc,000f, f20f0000),                     \
8278   X(add_sp,000d, f10d0000),                     \
8279   X(adr,   000f, f20f0000),                     \
8280   X(and,   4000, ea000000),                     \
8281   X(ands,  4000, ea100000),                     \
8282   X(asr,   1000, fa40f000),                     \
8283   X(asrs,  1000, fa50f000),                     \
8284   X(b,     e000, f000b000),                     \
8285   X(bcond, d000, f0008000),                     \
8286   X(bic,   4380, ea200000),                     \
8287   X(bics,  4380, ea300000),                     \
8288   X(cmn,   42c0, eb100f00),                     \
8289   X(cmp,   2800, ebb00f00),                     \
8290   X(cpsie, b660, f3af8400),                     \
8291   X(cpsid, b670, f3af8600),                     \
8292   X(cpy,   4600, ea4f0000),                     \
8293   X(dec_sp,80dd, f1ad0d00),                     \
8294   X(eor,   4040, ea800000),                     \
8295   X(eors,  4040, ea900000),                     \
8296   X(inc_sp,00dd, f10d0d00),                     \
8297   X(ldmia, c800, e8900000),                     \
8298   X(ldr,   6800, f8500000),                     \
8299   X(ldrb,  7800, f8100000),                     \
8300   X(ldrh,  8800, f8300000),                     \
8301   X(ldrsb, 5600, f9100000),                     \
8302   X(ldrsh, 5e00, f9300000),                     \
8303   X(ldr_pc,4800, f85f0000),                     \
8304   X(ldr_pc2,4800, f85f0000),                    \
8305   X(ldr_sp,9800, f85d0000),                     \
8306   X(lsl,   0000, fa00f000),                     \
8307   X(lsls,  0000, fa10f000),                     \
8308   X(lsr,   0800, fa20f000),                     \
8309   X(lsrs,  0800, fa30f000),                     \
8310   X(mov,   2000, ea4f0000),                     \
8311   X(movs,  2000, ea5f0000),                     \
8312   X(mul,   4340, fb00f000),                     \
8313   X(muls,  4340, ffffffff), /* no 32b muls */   \
8314   X(mvn,   43c0, ea6f0000),                     \
8315   X(mvns,  43c0, ea7f0000),                     \
8316   X(neg,   4240, f1c00000), /* rsb #0 */        \
8317   X(negs,  4240, f1d00000), /* rsbs #0 */       \
8318   X(orr,   4300, ea400000),                     \
8319   X(orrs,  4300, ea500000),                     \
8320   X(pop,   bc00, e8bd0000), /* ldmia sp!,... */ \
8321   X(push,  b400, e92d0000), /* stmdb sp!,... */ \
8322   X(rev,   ba00, fa90f080),                     \
8323   X(rev16, ba40, fa90f090),                     \
8324   X(revsh, bac0, fa90f0b0),                     \
8325   X(ror,   41c0, fa60f000),                     \
8326   X(rors,  41c0, fa70f000),                     \
8327   X(sbc,   4180, eb600000),                     \
8328   X(sbcs,  4180, eb700000),                     \
8329   X(stmia, c000, e8800000),                     \
8330   X(str,   6000, f8400000),                     \
8331   X(strb,  7000, f8000000),                     \
8332   X(strh,  8000, f8200000),                     \
8333   X(str_sp,9000, f84d0000),                     \
8334   X(sub,   1e00, eba00000),                     \
8335   X(subs,  1e00, ebb00000),                     \
8336   X(subi,  8000, f1a00000),                     \
8337   X(subis, 8000, f1b00000),                     \
8338   X(sxtb,  b240, fa4ff080),                     \
8339   X(sxth,  b200, fa0ff080),                     \
8340   X(tst,   4200, ea100f00),                     \
8341   X(uxtb,  b2c0, fa5ff080),                     \
8342   X(uxth,  b280, fa1ff080),                     \
8343   X(nop,   bf00, f3af8000),                     \
8344   X(yield, bf10, f3af8001),                     \
8345   X(wfe,   bf20, f3af8002),                     \
8346   X(wfi,   bf30, f3af8003),                     \
8347   X(sev,   bf40, f3af9004), /* typo, 8004? */
8348
8349 /* To catch errors in encoding functions, the codes are all offset by
8350    0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
8351    as 16-bit instructions.  */
8352 #define X(a,b,c) T_MNEM_##a
8353 enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
8354 #undef X
8355
8356 #define X(a,b,c) 0x##b
8357 static const unsigned short thumb_op16[] = { T16_32_TAB };
8358 #define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
8359 #undef X
8360
8361 #define X(a,b,c) 0x##c
8362 static const unsigned int thumb_op32[] = { T16_32_TAB };
8363 #define THUMB_OP32(n) (thumb_op32[(n) - (T16_32_OFFSET + 1)])
8364 #define THUMB_SETS_FLAGS(n) (THUMB_OP32 (n) & 0x00100000)
8365 #undef X
8366 #undef T16_32_TAB
8367
8368 /* Thumb instruction encoders, in alphabetical order.  */
8369
8370 /* ADDW or SUBW.  */
8371 static void
8372 do_t_add_sub_w (void)
8373 {
8374   int Rd, Rn;
8375
8376   Rd = inst.operands[0].reg;
8377   Rn = inst.operands[1].reg;
8378
8379   constraint (Rd == 15, _("PC not allowed as destination"));
8380   inst.instruction |= (Rn << 16) | (Rd << 8);
8381   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
8382 }
8383
8384 /* Parse an add or subtract instruction.  We get here with inst.instruction
8385    equalling any of THUMB_OPCODE_add, adds, sub, or subs.  */
8386
8387 static void
8388 do_t_add_sub (void)
8389 {
8390   int Rd, Rs, Rn;
8391
8392   Rd = inst.operands[0].reg;
8393   Rs = (inst.operands[1].present
8394         ? inst.operands[1].reg    /* Rd, Rs, foo */
8395         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
8396
8397   if (unified_syntax)
8398     {
8399       bfd_boolean flags;
8400       bfd_boolean narrow;
8401       int opcode;
8402
8403       flags = (inst.instruction == T_MNEM_adds
8404                || inst.instruction == T_MNEM_subs);
8405       if (flags)
8406         narrow = (current_it_mask == 0);
8407       else
8408         narrow = (current_it_mask != 0);
8409       if (!inst.operands[2].isreg)
8410         {
8411           int add;
8412
8413           add = (inst.instruction == T_MNEM_add
8414                  || inst.instruction == T_MNEM_adds);
8415           opcode = 0;
8416           if (inst.size_req != 4)
8417             {
8418               /* Attempt to use a narrow opcode, with relaxation if
8419                  appropriate.  */
8420               if (Rd == REG_SP && Rs == REG_SP && !flags)
8421                 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
8422               else if (Rd <= 7 && Rs == REG_SP && add && !flags)
8423                 opcode = T_MNEM_add_sp;
8424               else if (Rd <= 7 && Rs == REG_PC && add && !flags)
8425                 opcode = T_MNEM_add_pc;
8426               else if (Rd <= 7 && Rs <= 7 && narrow)
8427                 {
8428                   if (flags)
8429                     opcode = add ? T_MNEM_addis : T_MNEM_subis;
8430                   else
8431                     opcode = add ? T_MNEM_addi : T_MNEM_subi;
8432                 }
8433               if (opcode)
8434                 {
8435                   inst.instruction = THUMB_OP16(opcode);
8436                   inst.instruction |= (Rd << 4) | Rs;
8437                   inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
8438                   if (inst.size_req != 2)
8439                     inst.relax = opcode;
8440                 }
8441               else
8442                 constraint (inst.size_req == 2, BAD_HIREG);
8443             }
8444           if (inst.size_req == 4
8445               || (inst.size_req != 2 && !opcode))
8446             {
8447               if (Rd == REG_PC)
8448                 {
8449                   constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
8450                              _("only SUBS PC, LR, #const allowed"));
8451                   constraint (inst.reloc.exp.X_op != O_constant,
8452                               _("expression too complex"));
8453                   constraint (inst.reloc.exp.X_add_number < 0
8454                               || inst.reloc.exp.X_add_number > 0xff,
8455                              _("immediate value out of range"));
8456                   inst.instruction = T2_SUBS_PC_LR
8457                                      | inst.reloc.exp.X_add_number;
8458                   inst.reloc.type = BFD_RELOC_UNUSED;
8459                   return;
8460                 }
8461               else if (Rs == REG_PC)
8462                 {
8463                   /* Always use addw/subw.  */
8464                   inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
8465                   inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
8466                 }
8467               else
8468                 {
8469                   inst.instruction = THUMB_OP32 (inst.instruction);
8470                   inst.instruction = (inst.instruction & 0xe1ffffff)
8471                                      | 0x10000000;
8472                   if (flags)
8473                     inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
8474                   else
8475                     inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
8476                 }
8477               inst.instruction |= Rd << 8;
8478               inst.instruction |= Rs << 16;
8479             }
8480         }
8481       else
8482         {
8483           Rn = inst.operands[2].reg;
8484           /* See if we can do this with a 16-bit instruction.  */
8485           if (!inst.operands[2].shifted && inst.size_req != 4)
8486             {
8487               if (Rd > 7 || Rs > 7 || Rn > 7)
8488                 narrow = FALSE;
8489
8490               if (narrow)
8491                 {
8492                   inst.instruction = ((inst.instruction == T_MNEM_adds
8493                                        || inst.instruction == T_MNEM_add)
8494                                       ? T_OPCODE_ADD_R3
8495                                       : T_OPCODE_SUB_R3);
8496                   inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
8497                   return;
8498                 }
8499
8500               if (inst.instruction == T_MNEM_add)
8501                 {
8502                   if (Rd == Rs)
8503                     {
8504                       inst.instruction = T_OPCODE_ADD_HI;
8505                       inst.instruction |= (Rd & 8) << 4;
8506                       inst.instruction |= (Rd & 7);
8507                       inst.instruction |= Rn << 3;
8508                       return;
8509                     }
8510                   /* ... because addition is commutative! */
8511                   else if (Rd == Rn)
8512                     {
8513                       inst.instruction = T_OPCODE_ADD_HI;
8514                       inst.instruction |= (Rd & 8) << 4;
8515                       inst.instruction |= (Rd & 7);
8516                       inst.instruction |= Rs << 3;
8517                       return;
8518                     }
8519                 }
8520             }
8521           /* If we get here, it can't be done in 16 bits.  */
8522           constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
8523                       _("shift must be constant"));
8524           inst.instruction = THUMB_OP32 (inst.instruction);
8525           inst.instruction |= Rd << 8;
8526           inst.instruction |= Rs << 16;
8527           encode_thumb32_shifted_operand (2);
8528         }
8529     }
8530   else
8531     {
8532       constraint (inst.instruction == T_MNEM_adds
8533                   || inst.instruction == T_MNEM_subs,
8534                   BAD_THUMB32);
8535
8536       if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
8537         {
8538           constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
8539                       || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
8540                       BAD_HIREG);
8541
8542           inst.instruction = (inst.instruction == T_MNEM_add
8543                               ? 0x0000 : 0x8000);
8544           inst.instruction |= (Rd << 4) | Rs;
8545           inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
8546           return;
8547         }
8548
8549       Rn = inst.operands[2].reg;
8550       constraint (inst.operands[2].shifted, _("unshifted register required"));
8551
8552       /* We now have Rd, Rs, and Rn set to registers.  */
8553       if (Rd > 7 || Rs > 7 || Rn > 7)
8554         {
8555           /* Can't do this for SUB.      */
8556           constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
8557           inst.instruction = T_OPCODE_ADD_HI;
8558           inst.instruction |= (Rd & 8) << 4;
8559           inst.instruction |= (Rd & 7);
8560           if (Rs == Rd)
8561             inst.instruction |= Rn << 3;
8562           else if (Rn == Rd)
8563             inst.instruction |= Rs << 3;
8564           else
8565             constraint (1, _("dest must overlap one source register"));
8566         }
8567       else
8568         {
8569           inst.instruction = (inst.instruction == T_MNEM_add
8570                               ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
8571           inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
8572         }
8573     }
8574 }
8575
8576 static void
8577 do_t_adr (void)
8578 {
8579   if (unified_syntax && inst.size_req == 0 && inst.operands[0].reg <= 7)
8580     {
8581       /* Defer to section relaxation.  */
8582       inst.relax = inst.instruction;
8583       inst.instruction = THUMB_OP16 (inst.instruction);
8584       inst.instruction |= inst.operands[0].reg << 4;
8585     }
8586   else if (unified_syntax && inst.size_req != 2)
8587     {
8588       /* Generate a 32-bit opcode.  */
8589       inst.instruction = THUMB_OP32 (inst.instruction);
8590       inst.instruction |= inst.operands[0].reg << 8;
8591       inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
8592       inst.reloc.pc_rel = 1;
8593     }
8594   else
8595     {
8596       /* Generate a 16-bit opcode.  */
8597       inst.instruction = THUMB_OP16 (inst.instruction);
8598       inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
8599       inst.reloc.exp.X_add_number -= 4; /* PC relative adjust.  */
8600       inst.reloc.pc_rel = 1;
8601
8602       inst.instruction |= inst.operands[0].reg << 4;
8603     }
8604 }
8605
8606 /* Arithmetic instructions for which there is just one 16-bit
8607    instruction encoding, and it allows only two low registers.
8608    For maximal compatibility with ARM syntax, we allow three register
8609    operands even when Thumb-32 instructions are not available, as long
8610    as the first two are identical.  For instance, both "sbc r0,r1" and
8611    "sbc r0,r0,r1" are allowed.  */
8612 static void
8613 do_t_arit3 (void)
8614 {
8615   int Rd, Rs, Rn;
8616
8617   Rd = inst.operands[0].reg;
8618   Rs = (inst.operands[1].present
8619         ? inst.operands[1].reg    /* Rd, Rs, foo */
8620         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
8621   Rn = inst.operands[2].reg;
8622
8623   if (unified_syntax)
8624     {
8625       if (!inst.operands[2].isreg)
8626         {
8627           /* For an immediate, we always generate a 32-bit opcode;
8628              section relaxation will shrink it later if possible.  */
8629           inst.instruction = THUMB_OP32 (inst.instruction);
8630           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
8631           inst.instruction |= Rd << 8;
8632           inst.instruction |= Rs << 16;
8633           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
8634         }
8635       else
8636         {
8637           bfd_boolean narrow;
8638
8639           /* See if we can do this with a 16-bit instruction.  */
8640           if (THUMB_SETS_FLAGS (inst.instruction))
8641             narrow = current_it_mask == 0;
8642           else
8643             narrow = current_it_mask != 0;
8644
8645           if (Rd > 7 || Rn > 7 || Rs > 7)
8646             narrow = FALSE;
8647           if (inst.operands[2].shifted)
8648             narrow = FALSE;
8649           if (inst.size_req == 4)
8650             narrow = FALSE;
8651
8652           if (narrow
8653               && Rd == Rs)
8654             {
8655               inst.instruction = THUMB_OP16 (inst.instruction);
8656               inst.instruction |= Rd;
8657               inst.instruction |= Rn << 3;
8658               return;
8659             }
8660
8661           /* If we get here, it can't be done in 16 bits.  */
8662           constraint (inst.operands[2].shifted
8663                       && inst.operands[2].immisreg,
8664                       _("shift must be constant"));
8665           inst.instruction = THUMB_OP32 (inst.instruction);
8666           inst.instruction |= Rd << 8;
8667           inst.instruction |= Rs << 16;
8668           encode_thumb32_shifted_operand (2);
8669         }
8670     }
8671   else
8672     {
8673       /* On its face this is a lie - the instruction does set the
8674          flags.  However, the only supported mnemonic in this mode
8675          says it doesn't.  */
8676       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
8677
8678       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
8679                   _("unshifted register required"));
8680       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
8681       constraint (Rd != Rs,
8682                   _("dest and source1 must be the same register"));
8683
8684       inst.instruction = THUMB_OP16 (inst.instruction);
8685       inst.instruction |= Rd;
8686       inst.instruction |= Rn << 3;
8687     }
8688 }
8689
8690 /* Similarly, but for instructions where the arithmetic operation is
8691    commutative, so we can allow either of them to be different from
8692    the destination operand in a 16-bit instruction.  For instance, all
8693    three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
8694    accepted.  */
8695 static void
8696 do_t_arit3c (void)
8697 {
8698   int Rd, Rs, Rn;
8699
8700   Rd = inst.operands[0].reg;
8701   Rs = (inst.operands[1].present
8702         ? inst.operands[1].reg    /* Rd, Rs, foo */
8703         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
8704   Rn = inst.operands[2].reg;
8705
8706   if (unified_syntax)
8707     {
8708       if (!inst.operands[2].isreg)
8709         {
8710           /* For an immediate, we always generate a 32-bit opcode;
8711              section relaxation will shrink it later if possible.  */
8712           inst.instruction = THUMB_OP32 (inst.instruction);
8713           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
8714           inst.instruction |= Rd << 8;
8715           inst.instruction |= Rs << 16;
8716           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
8717         }
8718       else
8719         {
8720           bfd_boolean narrow;
8721
8722           /* See if we can do this with a 16-bit instruction.  */
8723           if (THUMB_SETS_FLAGS (inst.instruction))
8724             narrow = current_it_mask == 0;
8725           else
8726             narrow = current_it_mask != 0;
8727
8728           if (Rd > 7 || Rn > 7 || Rs > 7)
8729             narrow = FALSE;
8730           if (inst.operands[2].shifted)
8731             narrow = FALSE;
8732           if (inst.size_req == 4)
8733             narrow = FALSE;
8734
8735           if (narrow)
8736             {
8737               if (Rd == Rs)
8738                 {
8739                   inst.instruction = THUMB_OP16 (inst.instruction);
8740                   inst.instruction |= Rd;
8741                   inst.instruction |= Rn << 3;
8742                   return;
8743                 }
8744               if (Rd == Rn)
8745                 {
8746                   inst.instruction = THUMB_OP16 (inst.instruction);
8747                   inst.instruction |= Rd;
8748                   inst.instruction |= Rs << 3;
8749                   return;
8750                 }
8751             }
8752
8753           /* If we get here, it can't be done in 16 bits.  */
8754           constraint (inst.operands[2].shifted
8755                       && inst.operands[2].immisreg,
8756                       _("shift must be constant"));
8757           inst.instruction = THUMB_OP32 (inst.instruction);
8758           inst.instruction |= Rd << 8;
8759           inst.instruction |= Rs << 16;
8760           encode_thumb32_shifted_operand (2);
8761         }
8762     }
8763   else
8764     {
8765       /* On its face this is a lie - the instruction does set the
8766          flags.  However, the only supported mnemonic in this mode
8767          says it doesn't.  */
8768       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
8769
8770       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
8771                   _("unshifted register required"));
8772       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
8773
8774       inst.instruction = THUMB_OP16 (inst.instruction);
8775       inst.instruction |= Rd;
8776
8777       if (Rd == Rs)
8778         inst.instruction |= Rn << 3;
8779       else if (Rd == Rn)
8780         inst.instruction |= Rs << 3;
8781       else
8782         constraint (1, _("dest must overlap one source register"));
8783     }
8784 }
8785
8786 static void
8787 do_t_barrier (void)
8788 {
8789   if (inst.operands[0].present)
8790     {
8791       constraint ((inst.instruction & 0xf0) != 0x40
8792                   && inst.operands[0].imm != 0xf,
8793                   "bad barrier type");
8794       inst.instruction |= inst.operands[0].imm;
8795     }
8796   else
8797     inst.instruction |= 0xf;
8798 }
8799
8800 static void
8801 do_t_bfc (void)
8802 {
8803   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
8804   constraint (msb > 32, _("bit-field extends past end of register"));
8805   /* The instruction encoding stores the LSB and MSB,
8806      not the LSB and width.  */
8807   inst.instruction |= inst.operands[0].reg << 8;
8808   inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
8809   inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
8810   inst.instruction |= msb - 1;
8811 }
8812
8813 static void
8814 do_t_bfi (void)
8815 {
8816   unsigned int msb;
8817
8818   /* #0 in second position is alternative syntax for bfc, which is
8819      the same instruction but with REG_PC in the Rm field.  */
8820   if (!inst.operands[1].isreg)
8821     inst.operands[1].reg = REG_PC;
8822
8823   msb = inst.operands[2].imm + inst.operands[3].imm;
8824   constraint (msb > 32, _("bit-field extends past end of register"));
8825   /* The instruction encoding stores the LSB and MSB,
8826      not the LSB and width.  */
8827   inst.instruction |= inst.operands[0].reg << 8;
8828   inst.instruction |= inst.operands[1].reg << 16;
8829   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
8830   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
8831   inst.instruction |= msb - 1;
8832 }
8833
8834 static void
8835 do_t_bfx (void)
8836 {
8837   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
8838               _("bit-field extends past end of register"));
8839   inst.instruction |= inst.operands[0].reg << 8;
8840   inst.instruction |= inst.operands[1].reg << 16;
8841   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
8842   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
8843   inst.instruction |= inst.operands[3].imm - 1;
8844 }
8845
8846 /* ARM V5 Thumb BLX (argument parse)
8847         BLX <target_addr>       which is BLX(1)
8848         BLX <Rm>                which is BLX(2)
8849    Unfortunately, there are two different opcodes for this mnemonic.
8850    So, the insns[].value is not used, and the code here zaps values
8851         into inst.instruction.
8852
8853    ??? How to take advantage of the additional two bits of displacement
8854    available in Thumb32 mode?  Need new relocation?  */
8855
8856 static void
8857 do_t_blx (void)
8858 {
8859   constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH);
8860   if (inst.operands[0].isreg)
8861     /* We have a register, so this is BLX(2).  */
8862     inst.instruction |= inst.operands[0].reg << 3;
8863   else
8864     {
8865       /* No register.  This must be BLX(1).  */
8866       inst.instruction = 0xf000e800;
8867 #ifdef OBJ_ELF
8868       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
8869         inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
8870       else
8871 #endif
8872         inst.reloc.type = BFD_RELOC_THUMB_PCREL_BLX;
8873       inst.reloc.pc_rel = 1;
8874     }
8875 }
8876
8877 static void
8878 do_t_branch (void)
8879 {
8880   int opcode;
8881   int cond;
8882
8883   if (current_it_mask)
8884     {
8885       /* Conditional branches inside IT blocks are encoded as unconditional
8886          branches.  */
8887       cond = COND_ALWAYS;
8888       /* A branch must be the last instruction in an IT block.  */
8889       constraint (current_it_mask != 0x10, BAD_BRANCH);
8890     }
8891   else
8892     cond = inst.cond;
8893
8894   if (cond != COND_ALWAYS)
8895     opcode = T_MNEM_bcond;
8896   else
8897     opcode = inst.instruction;
8898
8899   if (unified_syntax && inst.size_req == 4)
8900     {
8901       inst.instruction = THUMB_OP32(opcode);
8902       if (cond == COND_ALWAYS)
8903         inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH25;
8904       else
8905         {
8906           assert (cond != 0xF);
8907           inst.instruction |= cond << 22;
8908           inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH20;
8909         }
8910     }
8911   else
8912     {
8913       inst.instruction = THUMB_OP16(opcode);
8914       if (cond == COND_ALWAYS)
8915         inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH12;
8916       else
8917         {
8918           inst.instruction |= cond << 8;
8919           inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH9;
8920         }
8921       /* Allow section relaxation.  */
8922       if (unified_syntax && inst.size_req != 2)
8923         inst.relax = opcode;
8924     }
8925
8926   inst.reloc.pc_rel = 1;
8927 }
8928
8929 static void
8930 do_t_bkpt (void)
8931 {
8932   constraint (inst.cond != COND_ALWAYS,
8933               _("instruction is always unconditional"));
8934   if (inst.operands[0].present)
8935     {
8936       constraint (inst.operands[0].imm > 255,
8937                   _("immediate value out of range"));
8938       inst.instruction |= inst.operands[0].imm;
8939     }
8940 }
8941
8942 static void
8943 do_t_branch23 (void)
8944 {
8945   constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH);
8946   inst.reloc.type   = BFD_RELOC_THUMB_PCREL_BRANCH23;
8947   inst.reloc.pc_rel = 1;
8948
8949   /* If the destination of the branch is a defined symbol which does not have
8950      the THUMB_FUNC attribute, then we must be calling a function which has
8951      the (interfacearm) attribute.  We look for the Thumb entry point to that
8952      function and change the branch to refer to that function instead.  */
8953   if (   inst.reloc.exp.X_op == O_symbol
8954       && inst.reloc.exp.X_add_symbol != NULL
8955       && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
8956       && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
8957     inst.reloc.exp.X_add_symbol =
8958       find_real_start (inst.reloc.exp.X_add_symbol);
8959 }
8960
8961 static void
8962 do_t_bx (void)
8963 {
8964   constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH);
8965   inst.instruction |= inst.operands[0].reg << 3;
8966   /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC.  The reloc
8967      should cause the alignment to be checked once it is known.  This is
8968      because BX PC only works if the instruction is word aligned.  */
8969 }
8970
8971 static void
8972 do_t_bxj (void)
8973 {
8974   constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH);
8975   if (inst.operands[0].reg == REG_PC)
8976     as_tsktsk (_("use of r15 in bxj is not really useful"));
8977
8978   inst.instruction |= inst.operands[0].reg << 16;
8979 }
8980
8981 static void
8982 do_t_clz (void)
8983 {
8984   inst.instruction |= inst.operands[0].reg << 8;
8985   inst.instruction |= inst.operands[1].reg << 16;
8986   inst.instruction |= inst.operands[1].reg;
8987 }
8988
8989 static void
8990 do_t_cps (void)
8991 {
8992   constraint (current_it_mask, BAD_NOT_IT);
8993   inst.instruction |= inst.operands[0].imm;
8994 }
8995
8996 static void
8997 do_t_cpsi (void)
8998 {
8999   constraint (current_it_mask, BAD_NOT_IT);
9000   if (unified_syntax
9001       && (inst.operands[1].present || inst.size_req == 4)
9002       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
9003     {
9004       unsigned int imod = (inst.instruction & 0x0030) >> 4;
9005       inst.instruction = 0xf3af8000;
9006       inst.instruction |= imod << 9;
9007       inst.instruction |= inst.operands[0].imm << 5;
9008       if (inst.operands[1].present)
9009         inst.instruction |= 0x100 | inst.operands[1].imm;
9010     }
9011   else
9012     {
9013       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
9014                   && (inst.operands[0].imm & 4),
9015                   _("selected processor does not support 'A' form "
9016                     "of this instruction"));
9017       constraint (inst.operands[1].present || inst.size_req == 4,
9018                   _("Thumb does not support the 2-argument "
9019                     "form of this instruction"));
9020       inst.instruction |= inst.operands[0].imm;
9021     }
9022 }
9023
9024 /* THUMB CPY instruction (argument parse).  */
9025
9026 static void
9027 do_t_cpy (void)
9028 {
9029   if (inst.size_req == 4)
9030     {
9031       inst.instruction = THUMB_OP32 (T_MNEM_mov);
9032       inst.instruction |= inst.operands[0].reg << 8;
9033       inst.instruction |= inst.operands[1].reg;
9034     }
9035   else
9036     {
9037       inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
9038       inst.instruction |= (inst.operands[0].reg & 0x7);
9039       inst.instruction |= inst.operands[1].reg << 3;
9040     }
9041 }
9042
9043 static void
9044 do_t_cbz (void)
9045 {
9046   constraint (current_it_mask, BAD_NOT_IT);
9047   constraint (inst.operands[0].reg > 7, BAD_HIREG);
9048   inst.instruction |= inst.operands[0].reg;
9049   inst.reloc.pc_rel = 1;
9050   inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
9051 }
9052
9053 static void
9054 do_t_dbg (void)
9055 {
9056   inst.instruction |= inst.operands[0].imm;
9057 }
9058
9059 static void
9060 do_t_div (void)
9061 {
9062   if (!inst.operands[1].present)
9063     inst.operands[1].reg = inst.operands[0].reg;
9064   inst.instruction |= inst.operands[0].reg << 8;
9065   inst.instruction |= inst.operands[1].reg << 16;
9066   inst.instruction |= inst.operands[2].reg;
9067 }
9068
9069 static void
9070 do_t_hint (void)
9071 {
9072   if (unified_syntax && inst.size_req == 4)
9073     inst.instruction = THUMB_OP32 (inst.instruction);
9074   else
9075     inst.instruction = THUMB_OP16 (inst.instruction);
9076 }
9077
9078 static void
9079 do_t_it (void)
9080 {
9081   unsigned int cond = inst.operands[0].imm;
9082
9083   constraint (current_it_mask, BAD_NOT_IT);
9084   current_it_mask = (inst.instruction & 0xf) | 0x10;
9085   current_cc = cond;
9086
9087   /* If the condition is a negative condition, invert the mask.  */
9088   if ((cond & 0x1) == 0x0)
9089     {
9090       unsigned int mask = inst.instruction & 0x000f;
9091
9092       if ((mask & 0x7) == 0)
9093         /* no conversion needed */;
9094       else if ((mask & 0x3) == 0)
9095         mask ^= 0x8;
9096       else if ((mask & 0x1) == 0)
9097         mask ^= 0xC;
9098       else
9099         mask ^= 0xE;
9100
9101       inst.instruction &= 0xfff0;
9102       inst.instruction |= mask;
9103     }
9104
9105   inst.instruction |= cond << 4;
9106 }
9107
9108 /* Helper function used for both push/pop and ldm/stm.  */
9109 static void
9110 encode_thumb2_ldmstm (int base, unsigned mask, bfd_boolean writeback)
9111 {
9112   bfd_boolean load;
9113
9114   load = (inst.instruction & (1 << 20)) != 0;
9115
9116   if (mask & (1 << 13))
9117     inst.error =  _("SP not allowed in register list");
9118   if (load)
9119     {
9120       if (mask & (1 << 14)
9121           && mask & (1 << 15))
9122         inst.error = _("LR and PC should not both be in register list");
9123
9124       if ((mask & (1 << base)) != 0
9125           && writeback)
9126         as_warn (_("base register should not be in register list "
9127                    "when written back"));
9128     }
9129   else
9130     {
9131       if (mask & (1 << 15))
9132         inst.error = _("PC not allowed in register list");
9133
9134       if (mask & (1 << base))
9135         as_warn (_("value stored for r%d is UNPREDICTABLE"), base);
9136     }
9137
9138   if ((mask & (mask - 1)) == 0)
9139     {
9140       /* Single register transfers implemented as str/ldr.  */
9141       if (writeback)
9142         {
9143           if (inst.instruction & (1 << 23))
9144             inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
9145           else
9146             inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
9147         }
9148       else
9149         {
9150           if (inst.instruction & (1 << 23))
9151             inst.instruction = 0x00800000; /* ia -> [base] */
9152           else
9153             inst.instruction = 0x00000c04; /* db -> [base, #-4] */
9154         }
9155
9156       inst.instruction |= 0xf8400000;
9157       if (load)
9158         inst.instruction |= 0x00100000;
9159
9160       mask = ffs(mask) - 1;
9161       mask <<= 12;
9162     }
9163   else if (writeback)
9164     inst.instruction |= WRITE_BACK;
9165
9166   inst.instruction |= mask;
9167   inst.instruction |= base << 16;
9168 }
9169
9170 static void
9171 do_t_ldmstm (void)
9172 {
9173   /* This really doesn't seem worth it.  */
9174   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
9175               _("expression too complex"));
9176   constraint (inst.operands[1].writeback,
9177               _("Thumb load/store multiple does not support {reglist}^"));
9178
9179   if (unified_syntax)
9180     {
9181       bfd_boolean narrow;
9182       unsigned mask;
9183
9184       narrow = FALSE;
9185       /* See if we can use a 16-bit instruction.  */
9186       if (inst.instruction < 0xffff /* not ldmdb/stmdb */
9187           && inst.size_req != 4
9188           && !(inst.operands[1].imm & ~0xff))
9189         {
9190           mask = 1 << inst.operands[0].reg;
9191
9192           if (inst.operands[0].reg <= 7
9193               && (inst.instruction == T_MNEM_stmia
9194                   ? inst.operands[0].writeback
9195                   : (inst.operands[0].writeback
9196                      == !(inst.operands[1].imm & mask))))
9197             {
9198               if (inst.instruction == T_MNEM_stmia
9199                   && (inst.operands[1].imm & mask)
9200                   && (inst.operands[1].imm & (mask - 1)))
9201                 as_warn (_("value stored for r%d is UNPREDICTABLE"),
9202                          inst.operands[0].reg);
9203
9204               inst.instruction = THUMB_OP16 (inst.instruction);
9205               inst.instruction |= inst.operands[0].reg << 8;
9206               inst.instruction |= inst.operands[1].imm;
9207               narrow = TRUE;
9208             }
9209           else if (inst.operands[0] .reg == REG_SP
9210                    && inst.operands[0].writeback)
9211             {
9212               inst.instruction = THUMB_OP16 (inst.instruction == T_MNEM_stmia
9213                                              ? T_MNEM_push : T_MNEM_pop);
9214               inst.instruction |= inst.operands[1].imm;
9215               narrow = TRUE;
9216             }
9217         }
9218
9219       if (!narrow)
9220         {
9221           if (inst.instruction < 0xffff)
9222             inst.instruction = THUMB_OP32 (inst.instruction);
9223
9224           encode_thumb2_ldmstm(inst.operands[0].reg, inst.operands[1].imm,
9225                                inst.operands[0].writeback);
9226         }
9227     }
9228   else
9229     {
9230       constraint (inst.operands[0].reg > 7
9231                   || (inst.operands[1].imm & ~0xff), BAD_HIREG);
9232       constraint (inst.instruction != T_MNEM_ldmia
9233                   && inst.instruction != T_MNEM_stmia,
9234                   _("Thumb-2 instruction only valid in unified syntax"));
9235       if (inst.instruction == T_MNEM_stmia)
9236         {
9237           if (!inst.operands[0].writeback)
9238             as_warn (_("this instruction will write back the base register"));
9239           if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
9240               && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
9241             as_warn (_("value stored for r%d is UNPREDICTABLE"),
9242                      inst.operands[0].reg);
9243         }
9244       else
9245         {
9246           if (!inst.operands[0].writeback
9247               && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
9248             as_warn (_("this instruction will write back the base register"));
9249           else if (inst.operands[0].writeback
9250                    && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
9251             as_warn (_("this instruction will not write back the base register"));
9252         }
9253
9254       inst.instruction = THUMB_OP16 (inst.instruction);
9255       inst.instruction |= inst.operands[0].reg << 8;
9256       inst.instruction |= inst.operands[1].imm;
9257     }
9258 }
9259
9260 static void
9261 do_t_ldrex (void)
9262 {
9263   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
9264               || inst.operands[1].postind || inst.operands[1].writeback
9265               || inst.operands[1].immisreg || inst.operands[1].shifted
9266               || inst.operands[1].negative,
9267               BAD_ADDR_MODE);
9268
9269   inst.instruction |= inst.operands[0].reg << 12;
9270   inst.instruction |= inst.operands[1].reg << 16;
9271   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
9272 }
9273
9274 static void
9275 do_t_ldrexd (void)
9276 {
9277   if (!inst.operands[1].present)
9278     {
9279       constraint (inst.operands[0].reg == REG_LR,
9280                   _("r14 not allowed as first register "
9281                     "when second register is omitted"));
9282       inst.operands[1].reg = inst.operands[0].reg + 1;
9283     }
9284   constraint (inst.operands[0].reg == inst.operands[1].reg,
9285               BAD_OVERLAP);
9286
9287   inst.instruction |= inst.operands[0].reg << 12;
9288   inst.instruction |= inst.operands[1].reg << 8;
9289   inst.instruction |= inst.operands[2].reg << 16;
9290 }
9291
9292 static void
9293 do_t_ldst (void)
9294 {
9295   unsigned long opcode;
9296   int Rn;
9297
9298   opcode = inst.instruction;
9299   if (unified_syntax)
9300     {
9301       if (!inst.operands[1].isreg)
9302         {
9303           if (opcode <= 0xffff)
9304             inst.instruction = THUMB_OP32 (opcode);
9305           if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
9306             return;
9307         }
9308       if (inst.operands[1].isreg
9309           && !inst.operands[1].writeback
9310           && !inst.operands[1].shifted && !inst.operands[1].postind
9311           && !inst.operands[1].negative && inst.operands[0].reg <= 7
9312           && opcode <= 0xffff
9313           && inst.size_req != 4)
9314         {
9315           /* Insn may have a 16-bit form.  */
9316           Rn = inst.operands[1].reg;
9317           if (inst.operands[1].immisreg)
9318             {
9319               inst.instruction = THUMB_OP16 (opcode);
9320               /* [Rn, Ri] */
9321               if (Rn <= 7 && inst.operands[1].imm <= 7)
9322                 goto op16;
9323             }
9324           else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
9325                     && opcode != T_MNEM_ldrsb)
9326                    || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
9327                    || (Rn == REG_SP && opcode == T_MNEM_str))
9328             {
9329               /* [Rn, #const] */
9330               if (Rn > 7)
9331                 {
9332                   if (Rn == REG_PC)
9333                     {
9334                       if (inst.reloc.pc_rel)
9335                         opcode = T_MNEM_ldr_pc2;
9336                       else
9337                         opcode = T_MNEM_ldr_pc;
9338                     }
9339                   else
9340                     {
9341                       if (opcode == T_MNEM_ldr)
9342                         opcode = T_MNEM_ldr_sp;
9343                       else
9344                         opcode = T_MNEM_str_sp;
9345                     }
9346                   inst.instruction = inst.operands[0].reg << 8;
9347                 }
9348               else
9349                 {
9350                   inst.instruction = inst.operands[0].reg;
9351                   inst.instruction |= inst.operands[1].reg << 3;
9352                 }
9353               inst.instruction |= THUMB_OP16 (opcode);
9354               if (inst.size_req == 2)
9355                 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
9356               else
9357                 inst.relax = opcode;
9358               return;
9359             }
9360         }
9361       /* Definitely a 32-bit variant.  */
9362       inst.instruction = THUMB_OP32 (opcode);
9363       inst.instruction |= inst.operands[0].reg << 12;
9364       encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
9365       return;
9366     }
9367
9368   constraint (inst.operands[0].reg > 7, BAD_HIREG);
9369
9370   if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
9371     {
9372       /* Only [Rn,Rm] is acceptable.  */
9373       constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
9374       constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
9375                   || inst.operands[1].postind || inst.operands[1].shifted
9376                   || inst.operands[1].negative,
9377                   _("Thumb does not support this addressing mode"));
9378       inst.instruction = THUMB_OP16 (inst.instruction);
9379       goto op16;
9380     }
9381      
9382   inst.instruction = THUMB_OP16 (inst.instruction);
9383   if (!inst.operands[1].isreg)
9384     if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
9385       return;
9386
9387   constraint (!inst.operands[1].preind
9388               || inst.operands[1].shifted
9389               || inst.operands[1].writeback,
9390               _("Thumb does not support this addressing mode"));
9391   if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
9392     {
9393       constraint (inst.instruction & 0x0600,
9394                   _("byte or halfword not valid for base register"));
9395       constraint (inst.operands[1].reg == REG_PC
9396                   && !(inst.instruction & THUMB_LOAD_BIT),
9397                   _("r15 based store not allowed"));
9398       constraint (inst.operands[1].immisreg,
9399                   _("invalid base register for register offset"));
9400
9401       if (inst.operands[1].reg == REG_PC)
9402         inst.instruction = T_OPCODE_LDR_PC;
9403       else if (inst.instruction & THUMB_LOAD_BIT)
9404         inst.instruction = T_OPCODE_LDR_SP;
9405       else
9406         inst.instruction = T_OPCODE_STR_SP;
9407
9408       inst.instruction |= inst.operands[0].reg << 8;
9409       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
9410       return;
9411     }
9412
9413   constraint (inst.operands[1].reg > 7, BAD_HIREG);
9414   if (!inst.operands[1].immisreg)
9415     {
9416       /* Immediate offset.  */
9417       inst.instruction |= inst.operands[0].reg;
9418       inst.instruction |= inst.operands[1].reg << 3;
9419       inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
9420       return;
9421     }
9422
9423   /* Register offset.  */
9424   constraint (inst.operands[1].imm > 7, BAD_HIREG);
9425   constraint (inst.operands[1].negative,
9426               _("Thumb does not support this addressing mode"));
9427
9428  op16:
9429   switch (inst.instruction)
9430     {
9431     case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
9432     case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
9433     case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
9434     case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
9435     case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
9436     case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
9437     case 0x5600 /* ldrsb */:
9438     case 0x5e00 /* ldrsh */: break;
9439     default: abort ();
9440     }
9441
9442   inst.instruction |= inst.operands[0].reg;
9443   inst.instruction |= inst.operands[1].reg << 3;
9444   inst.instruction |= inst.operands[1].imm << 6;
9445 }
9446
9447 static void
9448 do_t_ldstd (void)
9449 {
9450   if (!inst.operands[1].present)
9451     {
9452       inst.operands[1].reg = inst.operands[0].reg + 1;
9453       constraint (inst.operands[0].reg == REG_LR,
9454                   _("r14 not allowed here"));
9455     }
9456   inst.instruction |= inst.operands[0].reg << 12;
9457   inst.instruction |= inst.operands[1].reg << 8;
9458   encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
9459                             
9460 }
9461
9462 static void
9463 do_t_ldstt (void)
9464 {
9465   inst.instruction |= inst.operands[0].reg << 12;
9466   encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
9467 }
9468
9469 static void
9470 do_t_mla (void)
9471 {
9472   inst.instruction |= inst.operands[0].reg << 8;
9473   inst.instruction |= inst.operands[1].reg << 16;
9474   inst.instruction |= inst.operands[2].reg;
9475   inst.instruction |= inst.operands[3].reg << 12;
9476 }
9477
9478 static void
9479 do_t_mlal (void)
9480 {
9481   inst.instruction |= inst.operands[0].reg << 12;
9482   inst.instruction |= inst.operands[1].reg << 8;
9483   inst.instruction |= inst.operands[2].reg << 16;
9484   inst.instruction |= inst.operands[3].reg;
9485 }
9486
9487 static void
9488 do_t_mov_cmp (void)
9489 {
9490   if (unified_syntax)
9491     {
9492       int r0off = (inst.instruction == T_MNEM_mov
9493                    || inst.instruction == T_MNEM_movs) ? 8 : 16;
9494       unsigned long opcode;
9495       bfd_boolean narrow;
9496       bfd_boolean low_regs;
9497
9498       low_regs = (inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7);
9499       opcode = inst.instruction;
9500       if (current_it_mask)
9501         narrow = opcode != T_MNEM_movs;
9502       else
9503         narrow = opcode != T_MNEM_movs || low_regs;
9504       if (inst.size_req == 4
9505           || inst.operands[1].shifted)
9506         narrow = FALSE;
9507
9508       /* MOVS PC, LR is encoded as SUBS PC, LR, #0.  */
9509       if (opcode == T_MNEM_movs && inst.operands[1].isreg
9510           && !inst.operands[1].shifted
9511           && inst.operands[0].reg == REG_PC
9512           && inst.operands[1].reg == REG_LR)
9513         {
9514           inst.instruction = T2_SUBS_PC_LR;
9515           return;
9516         }
9517
9518       if (!inst.operands[1].isreg)
9519         {
9520           /* Immediate operand.  */
9521           if (current_it_mask == 0 && opcode == T_MNEM_mov)
9522             narrow = 0;
9523           if (low_regs && narrow)
9524             {
9525               inst.instruction = THUMB_OP16 (opcode);
9526               inst.instruction |= inst.operands[0].reg << 8;
9527               if (inst.size_req == 2)
9528                 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
9529               else
9530                 inst.relax = opcode;
9531             }
9532           else
9533             {
9534               inst.instruction = THUMB_OP32 (inst.instruction);
9535               inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9536               inst.instruction |= inst.operands[0].reg << r0off;
9537               inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9538             }
9539         }
9540       else if (inst.operands[1].shifted && inst.operands[1].immisreg
9541                && (inst.instruction == T_MNEM_mov
9542                    || inst.instruction == T_MNEM_movs))
9543         {
9544           /* Register shifts are encoded as separate shift instructions.  */
9545           bfd_boolean flags = (inst.instruction == T_MNEM_movs);
9546
9547           if (current_it_mask)
9548             narrow = !flags;
9549           else
9550             narrow = flags;
9551
9552           if (inst.size_req == 4)
9553             narrow = FALSE;
9554
9555           if (!low_regs || inst.operands[1].imm > 7)
9556             narrow = FALSE;
9557
9558           if (inst.operands[0].reg != inst.operands[1].reg)
9559             narrow = FALSE;
9560
9561           switch (inst.operands[1].shift_kind)
9562             {
9563             case SHIFT_LSL:
9564               opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
9565               break;
9566             case SHIFT_ASR:
9567               opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
9568               break;
9569             case SHIFT_LSR:
9570               opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
9571               break;
9572             case SHIFT_ROR:
9573               opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
9574               break;
9575             default:
9576               abort();
9577             }
9578
9579           inst.instruction = opcode;
9580           if (narrow)
9581             {
9582               inst.instruction |= inst.operands[0].reg;
9583               inst.instruction |= inst.operands[1].imm << 3;
9584             }
9585           else
9586             {
9587               if (flags)
9588                 inst.instruction |= CONDS_BIT;
9589
9590               inst.instruction |= inst.operands[0].reg << 8;
9591               inst.instruction |= inst.operands[1].reg << 16;
9592               inst.instruction |= inst.operands[1].imm;
9593             }
9594         }
9595       else if (!narrow)
9596         {
9597           /* Some mov with immediate shift have narrow variants.
9598              Register shifts are handled above.  */
9599           if (low_regs && inst.operands[1].shifted
9600               && (inst.instruction == T_MNEM_mov
9601                   || inst.instruction == T_MNEM_movs))
9602             {
9603               if (current_it_mask)
9604                 narrow = (inst.instruction == T_MNEM_mov);
9605               else
9606                 narrow = (inst.instruction == T_MNEM_movs);
9607             }
9608
9609           if (narrow)
9610             {
9611               switch (inst.operands[1].shift_kind)
9612                 {
9613                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
9614                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
9615                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
9616                 default: narrow = FALSE; break;
9617                 }
9618             }
9619
9620           if (narrow)
9621             {
9622               inst.instruction |= inst.operands[0].reg;
9623               inst.instruction |= inst.operands[1].reg << 3;
9624               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
9625             }
9626           else
9627             {
9628               inst.instruction = THUMB_OP32 (inst.instruction);
9629               inst.instruction |= inst.operands[0].reg << r0off;
9630               encode_thumb32_shifted_operand (1);
9631             }
9632         }
9633       else
9634         switch (inst.instruction)
9635           {
9636           case T_MNEM_mov:
9637             inst.instruction = T_OPCODE_MOV_HR;
9638             inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
9639             inst.instruction |= (inst.operands[0].reg & 0x7);
9640             inst.instruction |= inst.operands[1].reg << 3;
9641             break;
9642
9643           case T_MNEM_movs:
9644             /* We know we have low registers at this point.
9645                Generate ADD Rd, Rs, #0.  */
9646             inst.instruction = T_OPCODE_ADD_I3;
9647             inst.instruction |= inst.operands[0].reg;
9648             inst.instruction |= inst.operands[1].reg << 3;
9649             break;
9650
9651           case T_MNEM_cmp:
9652             if (low_regs)
9653               {
9654                 inst.instruction = T_OPCODE_CMP_LR;
9655                 inst.instruction |= inst.operands[0].reg;
9656                 inst.instruction |= inst.operands[1].reg << 3;
9657               }
9658             else
9659               {
9660                 inst.instruction = T_OPCODE_CMP_HR;
9661                 inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
9662                 inst.instruction |= (inst.operands[0].reg & 0x7);
9663                 inst.instruction |= inst.operands[1].reg << 3;
9664               }
9665             break;
9666           }
9667       return;
9668     }
9669
9670   inst.instruction = THUMB_OP16 (inst.instruction);
9671   if (inst.operands[1].isreg)
9672     {
9673       if (inst.operands[0].reg < 8 && inst.operands[1].reg < 8)
9674         {
9675           /* A move of two lowregs is encoded as ADD Rd, Rs, #0
9676              since a MOV instruction produces unpredictable results.  */
9677           if (inst.instruction == T_OPCODE_MOV_I8)
9678             inst.instruction = T_OPCODE_ADD_I3;
9679           else
9680             inst.instruction = T_OPCODE_CMP_LR;
9681
9682           inst.instruction |= inst.operands[0].reg;
9683           inst.instruction |= inst.operands[1].reg << 3;
9684         }
9685       else
9686         {
9687           if (inst.instruction == T_OPCODE_MOV_I8)
9688             inst.instruction = T_OPCODE_MOV_HR;
9689           else
9690             inst.instruction = T_OPCODE_CMP_HR;
9691           do_t_cpy ();
9692         }
9693     }
9694   else
9695     {
9696       constraint (inst.operands[0].reg > 7,
9697                   _("only lo regs allowed with immediate"));
9698       inst.instruction |= inst.operands[0].reg << 8;
9699       inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
9700     }
9701 }
9702
9703 static void
9704 do_t_mov16 (void)
9705 {
9706   bfd_vma imm;
9707   bfd_boolean top;
9708
9709   top = (inst.instruction & 0x00800000) != 0;
9710   if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
9711     {
9712       constraint (top, _(":lower16: not allowed this instruction"));
9713       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
9714     }
9715   else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
9716     {
9717       constraint (!top, _(":upper16: not allowed this instruction"));
9718       inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
9719     }
9720
9721   inst.instruction |= inst.operands[0].reg << 8;
9722   if (inst.reloc.type == BFD_RELOC_UNUSED)
9723     {
9724       imm = inst.reloc.exp.X_add_number;
9725       inst.instruction |= (imm & 0xf000) << 4;
9726       inst.instruction |= (imm & 0x0800) << 15;
9727       inst.instruction |= (imm & 0x0700) << 4;
9728       inst.instruction |= (imm & 0x00ff);
9729     }
9730 }
9731
9732 static void
9733 do_t_mvn_tst (void)
9734 {
9735   if (unified_syntax)
9736     {
9737       int r0off = (inst.instruction == T_MNEM_mvn
9738                    || inst.instruction == T_MNEM_mvns) ? 8 : 16;
9739       bfd_boolean narrow;
9740
9741       if (inst.size_req == 4
9742           || inst.instruction > 0xffff
9743           || inst.operands[1].shifted
9744           || inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
9745         narrow = FALSE;
9746       else if (inst.instruction == T_MNEM_cmn)
9747         narrow = TRUE;
9748       else if (THUMB_SETS_FLAGS (inst.instruction))
9749         narrow = (current_it_mask == 0);
9750       else
9751         narrow = (current_it_mask != 0);
9752
9753       if (!inst.operands[1].isreg)
9754         {
9755           /* For an immediate, we always generate a 32-bit opcode;
9756              section relaxation will shrink it later if possible.  */
9757           if (inst.instruction < 0xffff)
9758             inst.instruction = THUMB_OP32 (inst.instruction);
9759           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9760           inst.instruction |= inst.operands[0].reg << r0off;
9761           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9762         }
9763       else
9764         {
9765           /* See if we can do this with a 16-bit instruction.  */
9766           if (narrow)
9767             {
9768               inst.instruction = THUMB_OP16 (inst.instruction);
9769               inst.instruction |= inst.operands[0].reg;
9770               inst.instruction |= inst.operands[1].reg << 3;
9771             }
9772           else
9773             {
9774               constraint (inst.operands[1].shifted
9775                           && inst.operands[1].immisreg,
9776                           _("shift must be constant"));
9777               if (inst.instruction < 0xffff)
9778                 inst.instruction = THUMB_OP32 (inst.instruction);
9779               inst.instruction |= inst.operands[0].reg << r0off;
9780               encode_thumb32_shifted_operand (1);
9781             }
9782         }
9783     }
9784   else
9785     {
9786       constraint (inst.instruction > 0xffff
9787                   || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
9788       constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
9789                   _("unshifted register required"));
9790       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
9791                   BAD_HIREG);
9792
9793       inst.instruction = THUMB_OP16 (inst.instruction);
9794       inst.instruction |= inst.operands[0].reg;
9795       inst.instruction |= inst.operands[1].reg << 3;
9796     }
9797 }
9798
9799 static void
9800 do_t_mrs (void)
9801 {
9802   int flags;
9803
9804   if (do_vfp_nsyn_mrs () == SUCCESS)
9805     return;
9806
9807   flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
9808   if (flags == 0)
9809     {
9810       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7m),
9811                   _("selected processor does not support "
9812                     "requested special purpose register"));
9813     }
9814   else
9815     {
9816       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1),
9817                   _("selected processor does not support "
9818                     "requested special purpose register %x"));
9819       /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
9820       constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
9821                   _("'CPSR' or 'SPSR' expected"));
9822     }
9823     
9824   inst.instruction |= inst.operands[0].reg << 8;
9825   inst.instruction |= (flags & SPSR_BIT) >> 2;
9826   inst.instruction |= inst.operands[1].imm & 0xff;
9827 }
9828
9829 static void
9830 do_t_msr (void)
9831 {
9832   int flags;
9833
9834   if (do_vfp_nsyn_msr () == SUCCESS)
9835     return;
9836
9837   constraint (!inst.operands[1].isreg,
9838               _("Thumb encoding does not support an immediate here"));
9839   flags = inst.operands[0].imm;
9840   if (flags & ~0xff)
9841     {
9842       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1),
9843                   _("selected processor does not support "
9844                     "requested special purpose register"));
9845     }
9846   else
9847     {
9848       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7m),
9849                   _("selected processor does not support "
9850                     "requested special purpose register"));
9851       flags |= PSR_f;
9852     }
9853   inst.instruction |= (flags & SPSR_BIT) >> 2;
9854   inst.instruction |= (flags & ~SPSR_BIT) >> 8;
9855   inst.instruction |= (flags & 0xff);
9856   inst.instruction |= inst.operands[1].reg << 16;
9857 }
9858
9859 static void
9860 do_t_mul (void)
9861 {
9862   if (!inst.operands[2].present)
9863     inst.operands[2].reg = inst.operands[0].reg;
9864
9865   /* There is no 32-bit MULS and no 16-bit MUL. */
9866   if (unified_syntax && inst.instruction == T_MNEM_mul)
9867     {
9868       inst.instruction = THUMB_OP32 (inst.instruction);
9869       inst.instruction |= inst.operands[0].reg << 8;
9870       inst.instruction |= inst.operands[1].reg << 16;
9871       inst.instruction |= inst.operands[2].reg << 0;
9872     }
9873   else
9874     {
9875       constraint (!unified_syntax
9876                   && inst.instruction == T_MNEM_muls, BAD_THUMB32);
9877       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
9878                   BAD_HIREG);
9879
9880       inst.instruction = THUMB_OP16 (inst.instruction);
9881       inst.instruction |= inst.operands[0].reg;
9882
9883       if (inst.operands[0].reg == inst.operands[1].reg)
9884         inst.instruction |= inst.operands[2].reg << 3;
9885       else if (inst.operands[0].reg == inst.operands[2].reg)
9886         inst.instruction |= inst.operands[1].reg << 3;
9887       else
9888         constraint (1, _("dest must overlap one source register"));
9889     }
9890 }
9891
9892 static void
9893 do_t_mull (void)
9894 {
9895   inst.instruction |= inst.operands[0].reg << 12;
9896   inst.instruction |= inst.operands[1].reg << 8;
9897   inst.instruction |= inst.operands[2].reg << 16;
9898   inst.instruction |= inst.operands[3].reg;
9899
9900   if (inst.operands[0].reg == inst.operands[1].reg)
9901     as_tsktsk (_("rdhi and rdlo must be different"));
9902 }
9903
9904 static void
9905 do_t_nop (void)
9906 {
9907   if (unified_syntax)
9908     {
9909       if (inst.size_req == 4 || inst.operands[0].imm > 15)
9910         {
9911           inst.instruction = THUMB_OP32 (inst.instruction);
9912           inst.instruction |= inst.operands[0].imm;
9913         }
9914       else
9915         {
9916           inst.instruction = THUMB_OP16 (inst.instruction);
9917           inst.instruction |= inst.operands[0].imm << 4;
9918         }
9919     }
9920   else
9921     {
9922       constraint (inst.operands[0].present,
9923                   _("Thumb does not support NOP with hints"));
9924       inst.instruction = 0x46c0;
9925     }
9926 }
9927
9928 static void
9929 do_t_neg (void)
9930 {
9931   if (unified_syntax)
9932     {
9933       bfd_boolean narrow;
9934
9935       if (THUMB_SETS_FLAGS (inst.instruction))
9936         narrow = (current_it_mask == 0);
9937       else
9938         narrow = (current_it_mask != 0);
9939       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
9940         narrow = FALSE;
9941       if (inst.size_req == 4)
9942         narrow = FALSE;
9943
9944       if (!narrow)
9945         {
9946           inst.instruction = THUMB_OP32 (inst.instruction);
9947           inst.instruction |= inst.operands[0].reg << 8;
9948           inst.instruction |= inst.operands[1].reg << 16;
9949         }
9950       else
9951         {
9952           inst.instruction = THUMB_OP16 (inst.instruction);
9953           inst.instruction |= inst.operands[0].reg;
9954           inst.instruction |= inst.operands[1].reg << 3;
9955         }
9956     }
9957   else
9958     {
9959       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
9960                   BAD_HIREG);
9961       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
9962
9963       inst.instruction = THUMB_OP16 (inst.instruction);
9964       inst.instruction |= inst.operands[0].reg;
9965       inst.instruction |= inst.operands[1].reg << 3;
9966     }
9967 }
9968
9969 static void
9970 do_t_pkhbt (void)
9971 {
9972   inst.instruction |= inst.operands[0].reg << 8;
9973   inst.instruction |= inst.operands[1].reg << 16;
9974   inst.instruction |= inst.operands[2].reg;
9975   if (inst.operands[3].present)
9976     {
9977       unsigned int val = inst.reloc.exp.X_add_number;
9978       constraint (inst.reloc.exp.X_op != O_constant,
9979                   _("expression too complex"));
9980       inst.instruction |= (val & 0x1c) << 10;
9981       inst.instruction |= (val & 0x03) << 6;
9982     }
9983 }
9984
9985 static void
9986 do_t_pkhtb (void)
9987 {
9988   if (!inst.operands[3].present)
9989     inst.instruction &= ~0x00000020;
9990   do_t_pkhbt ();
9991 }
9992
9993 static void
9994 do_t_pld (void)
9995 {
9996   encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
9997 }
9998
9999 static void
10000 do_t_push_pop (void)
10001 {
10002   unsigned mask;
10003   
10004   constraint (inst.operands[0].writeback,
10005               _("push/pop do not support {reglist}^"));
10006   constraint (inst.reloc.type != BFD_RELOC_UNUSED,
10007               _("expression too complex"));
10008
10009   mask = inst.operands[0].imm;
10010   if ((mask & ~0xff) == 0)
10011     inst.instruction = THUMB_OP16 (inst.instruction) | mask;
10012   else if ((inst.instruction == T_MNEM_push
10013             && (mask & ~0xff) == 1 << REG_LR)
10014            || (inst.instruction == T_MNEM_pop
10015                && (mask & ~0xff) == 1 << REG_PC))
10016     {
10017       inst.instruction = THUMB_OP16 (inst.instruction);
10018       inst.instruction |= THUMB_PP_PC_LR;
10019       inst.instruction |= mask & 0xff;
10020     }
10021   else if (unified_syntax)
10022     {
10023       inst.instruction = THUMB_OP32 (inst.instruction);
10024       encode_thumb2_ldmstm(13, mask, TRUE);
10025     }
10026   else
10027     {
10028       inst.error = _("invalid register list to push/pop instruction");
10029       return;
10030     }
10031 }
10032
10033 static void
10034 do_t_rbit (void)
10035 {
10036   inst.instruction |= inst.operands[0].reg << 8;
10037   inst.instruction |= inst.operands[1].reg << 16;
10038 }
10039
10040 static void
10041 do_t_rd_rm (void)
10042 {
10043   inst.instruction |= inst.operands[0].reg << 8;
10044   inst.instruction |= inst.operands[1].reg;
10045 }
10046
10047 static void
10048 do_t_rev (void)
10049 {
10050   if (inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7
10051       && inst.size_req != 4)
10052     {
10053       inst.instruction = THUMB_OP16 (inst.instruction);
10054       inst.instruction |= inst.operands[0].reg;
10055       inst.instruction |= inst.operands[1].reg << 3;
10056     }
10057   else if (unified_syntax)
10058     {
10059       inst.instruction = THUMB_OP32 (inst.instruction);
10060       inst.instruction |= inst.operands[0].reg << 8;
10061       inst.instruction |= inst.operands[1].reg << 16;
10062       inst.instruction |= inst.operands[1].reg;
10063     }
10064   else
10065     inst.error = BAD_HIREG;
10066 }
10067
10068 static void
10069 do_t_rsb (void)
10070 {
10071   int Rd, Rs;
10072
10073   Rd = inst.operands[0].reg;
10074   Rs = (inst.operands[1].present
10075         ? inst.operands[1].reg    /* Rd, Rs, foo */
10076         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
10077
10078   inst.instruction |= Rd << 8;
10079   inst.instruction |= Rs << 16;
10080   if (!inst.operands[2].isreg)
10081     {
10082       bfd_boolean narrow;
10083
10084       if ((inst.instruction & 0x00100000) != 0)
10085         narrow = (current_it_mask == 0);
10086       else
10087         narrow = (current_it_mask != 0);
10088
10089       if (Rd > 7 || Rs > 7)
10090         narrow = FALSE;
10091
10092       if (inst.size_req == 4 || !unified_syntax)
10093         narrow = FALSE;
10094
10095       if (inst.reloc.exp.X_op != O_constant
10096           || inst.reloc.exp.X_add_number != 0)
10097         narrow = FALSE;
10098
10099       /* Turn rsb #0 into 16-bit neg.  We should probably do this via
10100          relaxation, but it doesn't seem worth the hassle.  */
10101       if (narrow)
10102         {
10103           inst.reloc.type = BFD_RELOC_UNUSED;
10104           inst.instruction = THUMB_OP16 (T_MNEM_negs);
10105           inst.instruction |= Rs << 3;
10106           inst.instruction |= Rd;
10107         }
10108       else
10109         {
10110           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10111           inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10112         }
10113     }
10114   else
10115     encode_thumb32_shifted_operand (2);
10116 }
10117
10118 static void
10119 do_t_setend (void)
10120 {
10121   constraint (current_it_mask, BAD_NOT_IT);
10122   if (inst.operands[0].imm)
10123     inst.instruction |= 0x8;
10124 }
10125
10126 static void
10127 do_t_shift (void)
10128 {
10129   if (!inst.operands[1].present)
10130     inst.operands[1].reg = inst.operands[0].reg;
10131
10132   if (unified_syntax)
10133     {
10134       bfd_boolean narrow;
10135       int shift_kind;
10136
10137       switch (inst.instruction)
10138         {
10139         case T_MNEM_asr:
10140         case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
10141         case T_MNEM_lsl:
10142         case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
10143         case T_MNEM_lsr:
10144         case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
10145         case T_MNEM_ror:
10146         case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
10147         default: abort ();
10148         }
10149
10150       if (THUMB_SETS_FLAGS (inst.instruction))
10151         narrow = (current_it_mask == 0);
10152       else
10153         narrow = (current_it_mask != 0);
10154       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
10155         narrow = FALSE;
10156       if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
10157         narrow = FALSE;
10158       if (inst.operands[2].isreg
10159           && (inst.operands[1].reg != inst.operands[0].reg
10160               || inst.operands[2].reg > 7))
10161         narrow = FALSE;
10162       if (inst.size_req == 4)
10163         narrow = FALSE;
10164
10165       if (!narrow)
10166         {
10167           if (inst.operands[2].isreg)
10168             {
10169               inst.instruction = THUMB_OP32 (inst.instruction);
10170               inst.instruction |= inst.operands[0].reg << 8;
10171               inst.instruction |= inst.operands[1].reg << 16;
10172               inst.instruction |= inst.operands[2].reg;
10173             }
10174           else
10175             {
10176               inst.operands[1].shifted = 1;
10177               inst.operands[1].shift_kind = shift_kind;
10178               inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
10179                                              ? T_MNEM_movs : T_MNEM_mov);
10180               inst.instruction |= inst.operands[0].reg << 8;
10181               encode_thumb32_shifted_operand (1);
10182               /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup.  */
10183               inst.reloc.type = BFD_RELOC_UNUSED;
10184             }
10185         }
10186       else
10187         {
10188           if (inst.operands[2].isreg)
10189             {
10190               switch (shift_kind)
10191                 {
10192                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
10193                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
10194                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
10195                 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
10196                 default: abort ();
10197                 }
10198           
10199               inst.instruction |= inst.operands[0].reg;
10200               inst.instruction |= inst.operands[2].reg << 3;
10201             }
10202           else
10203             {
10204               switch (shift_kind)
10205                 {
10206                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
10207                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
10208                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
10209                 default: abort ();
10210                 }
10211               inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
10212               inst.instruction |= inst.operands[0].reg;
10213               inst.instruction |= inst.operands[1].reg << 3;
10214             }
10215         }
10216     }
10217   else
10218     {
10219       constraint (inst.operands[0].reg > 7
10220                   || inst.operands[1].reg > 7, BAD_HIREG);
10221       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
10222
10223       if (inst.operands[2].isreg)  /* Rd, {Rs,} Rn */
10224         {
10225           constraint (inst.operands[2].reg > 7, BAD_HIREG);
10226           constraint (inst.operands[0].reg != inst.operands[1].reg,
10227                       _("source1 and dest must be same register"));
10228
10229           switch (inst.instruction)
10230             {
10231             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
10232             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
10233             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
10234             case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
10235             default: abort ();
10236             }
10237           
10238           inst.instruction |= inst.operands[0].reg;
10239           inst.instruction |= inst.operands[2].reg << 3;
10240         }
10241       else
10242         {
10243           switch (inst.instruction)
10244             {
10245             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
10246             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
10247             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
10248             case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
10249             default: abort ();
10250             }
10251           inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
10252           inst.instruction |= inst.operands[0].reg;
10253           inst.instruction |= inst.operands[1].reg << 3;
10254         }
10255     }
10256 }
10257
10258 static void
10259 do_t_simd (void)
10260 {
10261   inst.instruction |= inst.operands[0].reg << 8;
10262   inst.instruction |= inst.operands[1].reg << 16;
10263   inst.instruction |= inst.operands[2].reg;
10264 }
10265
10266 static void
10267 do_t_smc (void)
10268 {
10269   unsigned int value = inst.reloc.exp.X_add_number;
10270   constraint (inst.reloc.exp.X_op != O_constant,
10271               _("expression too complex"));
10272   inst.reloc.type = BFD_RELOC_UNUSED;
10273   inst.instruction |= (value & 0xf000) >> 12;
10274   inst.instruction |= (value & 0x0ff0);
10275   inst.instruction |= (value & 0x000f) << 16;
10276 }
10277
10278 static void
10279 do_t_ssat (void)
10280 {
10281   inst.instruction |= inst.operands[0].reg << 8;
10282   inst.instruction |= inst.operands[1].imm - 1;
10283   inst.instruction |= inst.operands[2].reg << 16;
10284
10285   if (inst.operands[3].present)
10286     {
10287       constraint (inst.reloc.exp.X_op != O_constant,
10288                   _("expression too complex"));
10289
10290       if (inst.reloc.exp.X_add_number != 0)
10291         {
10292           if (inst.operands[3].shift_kind == SHIFT_ASR)
10293             inst.instruction |= 0x00200000;  /* sh bit */
10294           inst.instruction |= (inst.reloc.exp.X_add_number & 0x1c) << 10;
10295           inst.instruction |= (inst.reloc.exp.X_add_number & 0x03) << 6;
10296         }
10297       inst.reloc.type = BFD_RELOC_UNUSED;
10298     }
10299 }
10300
10301 static void
10302 do_t_ssat16 (void)
10303 {
10304   inst.instruction |= inst.operands[0].reg << 8;
10305   inst.instruction |= inst.operands[1].imm - 1;
10306   inst.instruction |= inst.operands[2].reg << 16;
10307 }
10308
10309 static void
10310 do_t_strex (void)
10311 {
10312   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
10313               || inst.operands[2].postind || inst.operands[2].writeback
10314               || inst.operands[2].immisreg || inst.operands[2].shifted
10315               || inst.operands[2].negative,
10316               BAD_ADDR_MODE);
10317
10318   inst.instruction |= inst.operands[0].reg << 8;
10319   inst.instruction |= inst.operands[1].reg << 12;
10320   inst.instruction |= inst.operands[2].reg << 16;
10321   inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
10322 }
10323
10324 static void
10325 do_t_strexd (void)
10326 {
10327   if (!inst.operands[2].present)
10328     inst.operands[2].reg = inst.operands[1].reg + 1;
10329
10330   constraint (inst.operands[0].reg == inst.operands[1].reg
10331               || inst.operands[0].reg == inst.operands[2].reg
10332               || inst.operands[0].reg == inst.operands[3].reg
10333               || inst.operands[1].reg == inst.operands[2].reg,
10334               BAD_OVERLAP);
10335
10336   inst.instruction |= inst.operands[0].reg;
10337   inst.instruction |= inst.operands[1].reg << 12;
10338   inst.instruction |= inst.operands[2].reg << 8;
10339   inst.instruction |= inst.operands[3].reg << 16;
10340 }
10341
10342 static void
10343 do_t_sxtah (void)
10344 {
10345   inst.instruction |= inst.operands[0].reg << 8;
10346   inst.instruction |= inst.operands[1].reg << 16;
10347   inst.instruction |= inst.operands[2].reg;
10348   inst.instruction |= inst.operands[3].imm << 4;
10349 }
10350
10351 static void
10352 do_t_sxth (void)
10353 {
10354   if (inst.instruction <= 0xffff && inst.size_req != 4
10355       && inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7
10356       && (!inst.operands[2].present || inst.operands[2].imm == 0))
10357     {
10358       inst.instruction = THUMB_OP16 (inst.instruction);
10359       inst.instruction |= inst.operands[0].reg;
10360       inst.instruction |= inst.operands[1].reg << 3;
10361     }
10362   else if (unified_syntax)
10363     {
10364       if (inst.instruction <= 0xffff)
10365         inst.instruction = THUMB_OP32 (inst.instruction);
10366       inst.instruction |= inst.operands[0].reg << 8;
10367       inst.instruction |= inst.operands[1].reg;
10368       inst.instruction |= inst.operands[2].imm << 4;
10369     }
10370   else
10371     {
10372       constraint (inst.operands[2].present && inst.operands[2].imm != 0,
10373                   _("Thumb encoding does not support rotation"));
10374       constraint (1, BAD_HIREG);
10375     }
10376 }
10377
10378 static void
10379 do_t_swi (void)
10380 {
10381   inst.reloc.type = BFD_RELOC_ARM_SWI;
10382 }
10383
10384 static void
10385 do_t_tb (void)
10386 {
10387   int half;
10388
10389   half = (inst.instruction & 0x10) != 0;
10390   constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH);
10391   constraint (inst.operands[0].immisreg,
10392               _("instruction requires register index"));
10393   constraint (inst.operands[0].imm == 15,
10394               _("PC is not a valid index register"));
10395   constraint (!half && inst.operands[0].shifted,
10396               _("instruction does not allow shifted index"));
10397   inst.instruction |= (inst.operands[0].reg << 16) | inst.operands[0].imm;
10398 }
10399
10400 static void
10401 do_t_usat (void)
10402 {
10403   inst.instruction |= inst.operands[0].reg << 8;
10404   inst.instruction |= inst.operands[1].imm;
10405   inst.instruction |= inst.operands[2].reg << 16;
10406
10407   if (inst.operands[3].present)
10408     {
10409       constraint (inst.reloc.exp.X_op != O_constant,
10410                   _("expression too complex"));
10411       if (inst.reloc.exp.X_add_number != 0)
10412         {
10413           if (inst.operands[3].shift_kind == SHIFT_ASR)
10414             inst.instruction |= 0x00200000;  /* sh bit */
10415
10416           inst.instruction |= (inst.reloc.exp.X_add_number & 0x1c) << 10;
10417           inst.instruction |= (inst.reloc.exp.X_add_number & 0x03) << 6;
10418         }
10419       inst.reloc.type = BFD_RELOC_UNUSED;
10420     }
10421 }
10422
10423 static void
10424 do_t_usat16 (void)
10425 {
10426   inst.instruction |= inst.operands[0].reg << 8;
10427   inst.instruction |= inst.operands[1].imm;
10428   inst.instruction |= inst.operands[2].reg << 16;
10429 }
10430
10431 /* Neon instruction encoder helpers.  */
10432   
10433 /* Encodings for the different types for various Neon opcodes.  */
10434
10435 /* An "invalid" code for the following tables.  */
10436 #define N_INV -1u
10437
10438 struct neon_tab_entry
10439 {
10440   unsigned integer;
10441   unsigned float_or_poly;
10442   unsigned scalar_or_imm;
10443 };
10444   
10445 /* Map overloaded Neon opcodes to their respective encodings.  */
10446 #define NEON_ENC_TAB                                    \
10447   X(vabd,       0x0000700, 0x1200d00, N_INV),           \
10448   X(vmax,       0x0000600, 0x0000f00, N_INV),           \
10449   X(vmin,       0x0000610, 0x0200f00, N_INV),           \
10450   X(vpadd,      0x0000b10, 0x1000d00, N_INV),           \
10451   X(vpmax,      0x0000a00, 0x1000f00, N_INV),           \
10452   X(vpmin,      0x0000a10, 0x1200f00, N_INV),           \
10453   X(vadd,       0x0000800, 0x0000d00, N_INV),           \
10454   X(vsub,       0x1000800, 0x0200d00, N_INV),           \
10455   X(vceq,       0x1000810, 0x0000e00, 0x1b10100),       \
10456   X(vcge,       0x0000310, 0x1000e00, 0x1b10080),       \
10457   X(vcgt,       0x0000300, 0x1200e00, 0x1b10000),       \
10458   /* Register variants of the following two instructions are encoded as
10459      vcge / vcgt with the operands reversed. */         \
10460   X(vclt,       0x0000300, 0x1200e00, 0x1b10200),       \
10461   X(vcle,       0x0000310, 0x1000e00, 0x1b10180),       \
10462   X(vmla,       0x0000900, 0x0000d10, 0x0800040),       \
10463   X(vmls,       0x1000900, 0x0200d10, 0x0800440),       \
10464   X(vmul,       0x0000910, 0x1000d10, 0x0800840),       \
10465   X(vmull,      0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float.  */ \
10466   X(vmlal,      0x0800800, N_INV,     0x0800240),       \
10467   X(vmlsl,      0x0800a00, N_INV,     0x0800640),       \
10468   X(vqdmlal,    0x0800900, N_INV,     0x0800340),       \
10469   X(vqdmlsl,    0x0800b00, N_INV,     0x0800740),       \
10470   X(vqdmull,    0x0800d00, N_INV,     0x0800b40),       \
10471   X(vqdmulh,    0x0000b00, N_INV,     0x0800c40),       \
10472   X(vqrdmulh,   0x1000b00, N_INV,     0x0800d40),       \
10473   X(vshl,       0x0000400, N_INV,     0x0800510),       \
10474   X(vqshl,      0x0000410, N_INV,     0x0800710),       \
10475   X(vand,       0x0000110, N_INV,     0x0800030),       \
10476   X(vbic,       0x0100110, N_INV,     0x0800030),       \
10477   X(veor,       0x1000110, N_INV,     N_INV),           \
10478   X(vorn,       0x0300110, N_INV,     0x0800010),       \
10479   X(vorr,       0x0200110, N_INV,     0x0800010),       \
10480   X(vmvn,       0x1b00580, N_INV,     0x0800030),       \
10481   X(vshll,      0x1b20300, N_INV,     0x0800a10), /* max shift, immediate.  */ \
10482   X(vcvt,       0x1b30600, N_INV,     0x0800e10), /* integer, fixed-point.  */ \
10483   X(vdup,       0xe800b10, N_INV,     0x1b00c00), /* arm, scalar.  */ \
10484   X(vld1,       0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup.  */ \
10485   X(vst1,       0x0000000, 0x0800000, N_INV),           \
10486   X(vld2,       0x0200100, 0x0a00100, 0x0a00d00),       \
10487   X(vst2,       0x0000100, 0x0800100, N_INV),           \
10488   X(vld3,       0x0200200, 0x0a00200, 0x0a00e00),       \
10489   X(vst3,       0x0000200, 0x0800200, N_INV),           \
10490   X(vld4,       0x0200300, 0x0a00300, 0x0a00f00),       \
10491   X(vst4,       0x0000300, 0x0800300, N_INV),           \
10492   X(vmovn,      0x1b20200, N_INV,     N_INV),           \
10493   X(vtrn,       0x1b20080, N_INV,     N_INV),           \
10494   X(vqmovn,     0x1b20200, N_INV,     N_INV),           \
10495   X(vqmovun,    0x1b20240, N_INV,     N_INV),           \
10496   X(vnmul,      0xe200a40, 0xe200b40, N_INV),           \
10497   X(vnmla,      0xe000a40, 0xe000b40, N_INV),           \
10498   X(vnmls,      0xe100a40, 0xe100b40, N_INV),           \
10499   X(vcmp,       0xeb40a40, 0xeb40b40, N_INV),           \
10500   X(vcmpz,      0xeb50a40, 0xeb50b40, N_INV),           \
10501   X(vcmpe,      0xeb40ac0, 0xeb40bc0, N_INV),           \
10502   X(vcmpez,     0xeb50ac0, 0xeb50bc0, N_INV)
10503
10504 enum neon_opc
10505 {
10506 #define X(OPC,I,F,S) N_MNEM_##OPC
10507 NEON_ENC_TAB
10508 #undef X
10509 };
10510
10511 static const struct neon_tab_entry neon_enc_tab[] =
10512 {
10513 #define X(OPC,I,F,S) { (I), (F), (S) }
10514 NEON_ENC_TAB
10515 #undef X
10516 };
10517
10518 #define NEON_ENC_INTEGER(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
10519 #define NEON_ENC_ARMREG(X)  (neon_enc_tab[(X) & 0x0fffffff].integer)
10520 #define NEON_ENC_POLY(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
10521 #define NEON_ENC_FLOAT(X)   (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
10522 #define NEON_ENC_SCALAR(X)  (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
10523 #define NEON_ENC_IMMED(X)   (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
10524 #define NEON_ENC_INTERLV(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
10525 #define NEON_ENC_LANE(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
10526 #define NEON_ENC_DUP(X)     (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
10527 #define NEON_ENC_SINGLE(X) \
10528   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
10529 #define NEON_ENC_DOUBLE(X) \
10530   ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
10531
10532 /* Define shapes for instruction operands. The following mnemonic characters
10533    are used in this table:
10534
10535      F - VFP S<n> register
10536      D - Neon D<n> register
10537      Q - Neon Q<n> register
10538      I - Immediate
10539      S - Scalar
10540      R - ARM register
10541      L - D<n> register list
10542    
10543    This table is used to generate various data:
10544      - enumerations of the form NS_DDR to be used as arguments to
10545        neon_select_shape.
10546      - a table classifying shapes into single, double, quad, mixed.
10547      - a table used to drive neon_select_shape.
10548 */
10549
10550 #define NEON_SHAPE_DEF                  \
10551   X(3, (D, D, D), DOUBLE),              \
10552   X(3, (Q, Q, Q), QUAD),                \
10553   X(3, (D, D, I), DOUBLE),              \
10554   X(3, (Q, Q, I), QUAD),                \
10555   X(3, (D, D, S), DOUBLE),              \
10556   X(3, (Q, Q, S), QUAD),                \
10557   X(2, (D, D), DOUBLE),                 \
10558   X(2, (Q, Q), QUAD),                   \
10559   X(2, (D, S), DOUBLE),                 \
10560   X(2, (Q, S), QUAD),                   \
10561   X(2, (D, R), DOUBLE),                 \
10562   X(2, (Q, R), QUAD),                   \
10563   X(2, (D, I), DOUBLE),                 \
10564   X(2, (Q, I), QUAD),                   \
10565   X(3, (D, L, D), DOUBLE),              \
10566   X(2, (D, Q), MIXED),                  \
10567   X(2, (Q, D), MIXED),                  \
10568   X(3, (D, Q, I), MIXED),               \
10569   X(3, (Q, D, I), MIXED),               \
10570   X(3, (Q, D, D), MIXED),               \
10571   X(3, (D, Q, Q), MIXED),               \
10572   X(3, (Q, Q, D), MIXED),               \
10573   X(3, (Q, D, S), MIXED),               \
10574   X(3, (D, Q, S), MIXED),               \
10575   X(4, (D, D, D, I), DOUBLE),           \
10576   X(4, (Q, Q, Q, I), QUAD),             \
10577   X(2, (F, F), SINGLE),                 \
10578   X(3, (F, F, F), SINGLE),              \
10579   X(2, (F, I), SINGLE),                 \
10580   X(2, (F, D), MIXED),                  \
10581   X(2, (D, F), MIXED),                  \
10582   X(3, (F, F, I), MIXED),               \
10583   X(4, (R, R, F, F), SINGLE),           \
10584   X(4, (F, F, R, R), SINGLE),           \
10585   X(3, (D, R, R), DOUBLE),              \
10586   X(3, (R, R, D), DOUBLE),              \
10587   X(2, (S, R), SINGLE),                 \
10588   X(2, (R, S), SINGLE),                 \
10589   X(2, (F, R), SINGLE),                 \
10590   X(2, (R, F), SINGLE)
10591
10592 #define S2(A,B)         NS_##A##B
10593 #define S3(A,B,C)       NS_##A##B##C
10594 #define S4(A,B,C,D)     NS_##A##B##C##D
10595
10596 #define X(N, L, C) S##N L
10597
10598 enum neon_shape
10599 {
10600   NEON_SHAPE_DEF,
10601   NS_NULL
10602 };
10603
10604 #undef X
10605 #undef S2
10606 #undef S3
10607 #undef S4
10608
10609 enum neon_shape_class
10610 {
10611   SC_SINGLE,
10612   SC_DOUBLE,
10613   SC_QUAD,
10614   SC_MIXED
10615 };
10616
10617 #define X(N, L, C) SC_##C
10618
10619 static enum neon_shape_class neon_shape_class[] =
10620 {
10621   NEON_SHAPE_DEF
10622 };
10623
10624 #undef X
10625
10626 enum neon_shape_el
10627 {
10628   SE_F,
10629   SE_D,
10630   SE_Q,
10631   SE_I,
10632   SE_S,
10633   SE_R,
10634   SE_L
10635 };
10636
10637 /* Register widths of above.  */
10638 static unsigned neon_shape_el_size[] =
10639 {
10640   32,
10641   64,
10642   128,
10643   0,
10644   32,
10645   32,
10646   0
10647 };
10648
10649 struct neon_shape_info
10650 {
10651   unsigned els;
10652   enum neon_shape_el el[NEON_MAX_TYPE_ELS];
10653 };
10654
10655 #define S2(A,B)         { SE_##A, SE_##B }
10656 #define S3(A,B,C)       { SE_##A, SE_##B, SE_##C }
10657 #define S4(A,B,C,D)     { SE_##A, SE_##B, SE_##C, SE_##D }
10658
10659 #define X(N, L, C) { N, S##N L }
10660
10661 static struct neon_shape_info neon_shape_tab[] =
10662 {
10663   NEON_SHAPE_DEF
10664 };
10665
10666 #undef X
10667 #undef S2
10668 #undef S3
10669 #undef S4
10670
10671 /* Bit masks used in type checking given instructions.
10672   'N_EQK' means the type must be the same as (or based on in some way) the key
10673    type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
10674    set, various other bits can be set as well in order to modify the meaning of
10675    the type constraint.  */
10676
10677 enum neon_type_mask
10678 {
10679   N_S8   = 0x000001,
10680   N_S16  = 0x000002,
10681   N_S32  = 0x000004,
10682   N_S64  = 0x000008,
10683   N_U8   = 0x000010,
10684   N_U16  = 0x000020,
10685   N_U32  = 0x000040,
10686   N_U64  = 0x000080,
10687   N_I8   = 0x000100,
10688   N_I16  = 0x000200,
10689   N_I32  = 0x000400,
10690   N_I64  = 0x000800,
10691   N_8    = 0x001000,
10692   N_16   = 0x002000,
10693   N_32   = 0x004000,
10694   N_64   = 0x008000,
10695   N_P8   = 0x010000,
10696   N_P16  = 0x020000,
10697   N_F32  = 0x040000,
10698   N_F64  = 0x080000,
10699   N_KEY  = 0x100000, /* key element (main type specifier).  */
10700   N_EQK  = 0x200000, /* given operand has the same type & size as the key.  */
10701   N_VFP  = 0x400000, /* VFP mode: operand size must match register width.  */
10702   N_DBL  = 0x000001, /* if N_EQK, this operand is twice the size.  */
10703   N_HLF  = 0x000002, /* if N_EQK, this operand is half the size.  */
10704   N_SGN  = 0x000004, /* if N_EQK, this operand is forced to be signed.  */
10705   N_UNS  = 0x000008, /* if N_EQK, this operand is forced to be unsigned.  */
10706   N_INT  = 0x000010, /* if N_EQK, this operand is forced to be integer.  */
10707   N_FLT  = 0x000020, /* if N_EQK, this operand is forced to be float.  */
10708   N_SIZ  = 0x000040, /* if N_EQK, this operand is forced to be size-only.  */
10709   N_UTYP = 0,
10710   N_MAX_NONSPECIAL = N_F64
10711 };
10712
10713 #define N_ALLMODS  (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
10714
10715 #define N_SU_ALL   (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
10716 #define N_SU_32    (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
10717 #define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
10718 #define N_SUF_32   (N_SU_32 | N_F32)
10719 #define N_I_ALL    (N_I8 | N_I16 | N_I32 | N_I64)
10720 #define N_IF_32    (N_I8 | N_I16 | N_I32 | N_F32)
10721
10722 /* Pass this as the first type argument to neon_check_type to ignore types
10723    altogether.  */
10724 #define N_IGNORE_TYPE (N_KEY | N_EQK)
10725
10726 /* Select a "shape" for the current instruction (describing register types or
10727    sizes) from a list of alternatives. Return NS_NULL if the current instruction
10728    doesn't fit. For non-polymorphic shapes, checking is usually done as a
10729    function of operand parsing, so this function doesn't need to be called.
10730    Shapes should be listed in order of decreasing length.  */
10731
10732 static enum neon_shape
10733 neon_select_shape (enum neon_shape shape, ...)
10734 {
10735   va_list ap;
10736   enum neon_shape first_shape = shape;
10737
10738   /* Fix missing optional operands. FIXME: we don't know at this point how
10739      many arguments we should have, so this makes the assumption that we have
10740      > 1. This is true of all current Neon opcodes, I think, but may not be
10741      true in the future.  */
10742   if (!inst.operands[1].present)
10743     inst.operands[1] = inst.operands[0];
10744
10745   va_start (ap, shape);
10746   
10747   for (; shape != NS_NULL; shape = va_arg (ap, int))
10748     {
10749       unsigned j;
10750       int matches = 1;
10751
10752       for (j = 0; j < neon_shape_tab[shape].els; j++)
10753         {
10754           if (!inst.operands[j].present)
10755             {
10756               matches = 0;
10757               break;
10758             }
10759
10760           switch (neon_shape_tab[shape].el[j])
10761             {
10762             case SE_F:
10763               if (!(inst.operands[j].isreg
10764                     && inst.operands[j].isvec
10765                     && inst.operands[j].issingle
10766                     && !inst.operands[j].isquad))
10767                 matches = 0;
10768               break;
10769
10770             case SE_D:
10771               if (!(inst.operands[j].isreg
10772                     && inst.operands[j].isvec
10773                     && !inst.operands[j].isquad
10774                     && !inst.operands[j].issingle))
10775                 matches = 0;
10776               break;
10777
10778             case SE_R:
10779               if (!(inst.operands[j].isreg
10780                     && !inst.operands[j].isvec))
10781                 matches = 0;
10782               break;
10783
10784             case SE_Q:
10785               if (!(inst.operands[j].isreg
10786                     && inst.operands[j].isvec
10787                     && inst.operands[j].isquad
10788                     && !inst.operands[j].issingle))
10789                 matches = 0;
10790               break;
10791
10792             case SE_I:
10793               if (!(!inst.operands[j].isreg
10794                     && !inst.operands[j].isscalar))
10795                 matches = 0;
10796               break;
10797
10798             case SE_S:
10799               if (!(!inst.operands[j].isreg
10800                     && inst.operands[j].isscalar))
10801                 matches = 0;
10802               break;
10803
10804             case SE_L:
10805               break;
10806             }
10807         }
10808       if (matches)
10809         break;
10810     }
10811   
10812   va_end (ap);
10813
10814   if (shape == NS_NULL && first_shape != NS_NULL)
10815     first_error (_("invalid instruction shape"));
10816
10817   return shape;
10818 }
10819
10820 /* True if SHAPE is predominantly a quadword operation (most of the time, this
10821    means the Q bit should be set).  */
10822
10823 static int
10824 neon_quad (enum neon_shape shape)
10825 {
10826   return neon_shape_class[shape] == SC_QUAD;
10827 }
10828
10829 static void
10830 neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
10831                        unsigned *g_size)
10832 {
10833   /* Allow modification to be made to types which are constrained to be
10834      based on the key element, based on bits set alongside N_EQK.  */
10835   if ((typebits & N_EQK) != 0)
10836     {
10837       if ((typebits & N_HLF) != 0)
10838         *g_size /= 2;
10839       else if ((typebits & N_DBL) != 0)
10840         *g_size *= 2;
10841       if ((typebits & N_SGN) != 0)
10842         *g_type = NT_signed;
10843       else if ((typebits & N_UNS) != 0)
10844         *g_type = NT_unsigned;
10845       else if ((typebits & N_INT) != 0)
10846         *g_type = NT_integer;
10847       else if ((typebits & N_FLT) != 0)
10848         *g_type = NT_float;
10849       else if ((typebits & N_SIZ) != 0)
10850         *g_type = NT_untyped;
10851     }
10852 }
10853   
10854 /* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
10855    operand type, i.e. the single type specified in a Neon instruction when it
10856    is the only one given.  */
10857
10858 static struct neon_type_el
10859 neon_type_promote (struct neon_type_el *key, unsigned thisarg)
10860 {
10861   struct neon_type_el dest = *key;
10862   
10863   assert ((thisarg & N_EQK) != 0);
10864   
10865   neon_modify_type_size (thisarg, &dest.type, &dest.size);
10866
10867   return dest;
10868 }
10869
10870 /* Convert Neon type and size into compact bitmask representation.  */
10871
10872 static enum neon_type_mask
10873 type_chk_of_el_type (enum neon_el_type type, unsigned size)
10874 {
10875   switch (type)
10876     {
10877     case NT_untyped:
10878       switch (size)
10879         {
10880         case 8:  return N_8;
10881         case 16: return N_16;
10882         case 32: return N_32;
10883         case 64: return N_64;
10884         default: ;
10885         }
10886       break;
10887
10888     case NT_integer:
10889       switch (size)
10890         {
10891         case 8:  return N_I8;
10892         case 16: return N_I16;
10893         case 32: return N_I32;
10894         case 64: return N_I64;
10895         default: ;
10896         }
10897       break;
10898
10899     case NT_float:
10900       switch (size)
10901         {
10902         case 32: return N_F32;
10903         case 64: return N_F64;
10904         default: ;
10905         }
10906       break;
10907
10908     case NT_poly:
10909       switch (size)
10910         {
10911         case 8:  return N_P8;
10912         case 16: return N_P16;
10913         default: ;
10914         }
10915       break;
10916
10917     case NT_signed:
10918       switch (size)
10919         {
10920         case 8:  return N_S8;
10921         case 16: return N_S16;
10922         case 32: return N_S32;
10923         case 64: return N_S64;
10924         default: ;
10925         }
10926       break;
10927
10928     case NT_unsigned:
10929       switch (size)
10930         {
10931         case 8:  return N_U8;
10932         case 16: return N_U16;
10933         case 32: return N_U32;
10934         case 64: return N_U64;
10935         default: ;
10936         }
10937       break;
10938
10939     default: ;
10940     }
10941   
10942   return N_UTYP;
10943 }
10944
10945 /* Convert compact Neon bitmask type representation to a type and size. Only
10946    handles the case where a single bit is set in the mask.  */
10947
10948 static int
10949 el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
10950                      enum neon_type_mask mask)
10951 {
10952   if ((mask & N_EQK) != 0)
10953     return FAIL;
10954
10955   if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
10956     *size = 8;
10957   else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_P16)) != 0)
10958     *size = 16;
10959   else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
10960     *size = 32;
10961   else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64)) != 0)
10962     *size = 64;
10963   else
10964     return FAIL;
10965
10966   if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
10967     *type = NT_signed;
10968   else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
10969     *type = NT_unsigned;
10970   else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
10971     *type = NT_integer;
10972   else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
10973     *type = NT_untyped;
10974   else if ((mask & (N_P8 | N_P16)) != 0)
10975     *type = NT_poly;
10976   else if ((mask & (N_F32 | N_F64)) != 0)
10977     *type = NT_float;
10978   else
10979     return FAIL;
10980   
10981   return SUCCESS;
10982 }
10983
10984 /* Modify a bitmask of allowed types. This is only needed for type
10985    relaxation.  */
10986
10987 static unsigned
10988 modify_types_allowed (unsigned allowed, unsigned mods)
10989 {
10990   unsigned size;
10991   enum neon_el_type type;
10992   unsigned destmask;
10993   int i;
10994   
10995   destmask = 0;
10996   
10997   for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
10998     {
10999       if (el_type_of_type_chk (&type, &size, allowed & i) == SUCCESS)
11000         {
11001           neon_modify_type_size (mods, &type, &size);
11002           destmask |= type_chk_of_el_type (type, size);
11003         }
11004     }
11005   
11006   return destmask;
11007 }
11008
11009 /* Check type and return type classification.
11010    The manual states (paraphrase): If one datatype is given, it indicates the
11011    type given in:
11012     - the second operand, if there is one
11013     - the operand, if there is no second operand
11014     - the result, if there are no operands.
11015    This isn't quite good enough though, so we use a concept of a "key" datatype
11016    which is set on a per-instruction basis, which is the one which matters when
11017    only one data type is written.
11018    Note: this function has side-effects (e.g. filling in missing operands). All
11019    Neon instructions should call it before performing bit encoding.  */
11020
11021 static struct neon_type_el
11022 neon_check_type (unsigned els, enum neon_shape ns, ...)
11023 {
11024   va_list ap;
11025   unsigned i, pass, key_el = 0;
11026   unsigned types[NEON_MAX_TYPE_ELS];
11027   enum neon_el_type k_type = NT_invtype;
11028   unsigned k_size = -1u;
11029   struct neon_type_el badtype = {NT_invtype, -1};
11030   unsigned key_allowed = 0;
11031
11032   /* Optional registers in Neon instructions are always (not) in operand 1.
11033      Fill in the missing operand here, if it was omitted.  */
11034   if (els > 1 && !inst.operands[1].present)
11035     inst.operands[1] = inst.operands[0];
11036
11037   /* Suck up all the varargs.  */
11038   va_start (ap, ns);
11039   for (i = 0; i < els; i++)
11040     {
11041       unsigned thisarg = va_arg (ap, unsigned);
11042       if (thisarg == N_IGNORE_TYPE)
11043         {
11044           va_end (ap);
11045           return badtype;
11046         }
11047       types[i] = thisarg;
11048       if ((thisarg & N_KEY) != 0)
11049         key_el = i;
11050     }
11051   va_end (ap);
11052
11053   if (inst.vectype.elems > 0)
11054     for (i = 0; i < els; i++)
11055       if (inst.operands[i].vectype.type != NT_invtype)
11056         {
11057           first_error (_("types specified in both the mnemonic and operands"));
11058           return badtype;
11059         }
11060
11061   /* Duplicate inst.vectype elements here as necessary.
11062      FIXME: No idea if this is exactly the same as the ARM assembler,
11063      particularly when an insn takes one register and one non-register
11064      operand. */
11065   if (inst.vectype.elems == 1 && els > 1)
11066     {
11067       unsigned j;
11068       inst.vectype.elems = els;
11069       inst.vectype.el[key_el] = inst.vectype.el[0];
11070       for (j = 0; j < els; j++)
11071         if (j != key_el)
11072           inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
11073                                                   types[j]);
11074     }
11075   else if (inst.vectype.elems == 0 && els > 0)
11076     {
11077       unsigned j;
11078       /* No types were given after the mnemonic, so look for types specified
11079          after each operand. We allow some flexibility here; as long as the
11080          "key" operand has a type, we can infer the others.  */
11081       for (j = 0; j < els; j++)
11082         if (inst.operands[j].vectype.type != NT_invtype)
11083           inst.vectype.el[j] = inst.operands[j].vectype;
11084
11085       if (inst.operands[key_el].vectype.type != NT_invtype)
11086         {
11087           for (j = 0; j < els; j++)
11088             if (inst.operands[j].vectype.type == NT_invtype)
11089               inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
11090                                                       types[j]);
11091         }
11092       else
11093         {
11094           first_error (_("operand types can't be inferred"));
11095           return badtype;
11096         }
11097     }
11098   else if (inst.vectype.elems != els)
11099     {
11100       first_error (_("type specifier has the wrong number of parts"));
11101       return badtype;
11102     }
11103
11104   for (pass = 0; pass < 2; pass++)
11105     {
11106       for (i = 0; i < els; i++)
11107         {
11108           unsigned thisarg = types[i];
11109           unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
11110             ? modify_types_allowed (key_allowed, thisarg) : thisarg;
11111           enum neon_el_type g_type = inst.vectype.el[i].type;
11112           unsigned g_size = inst.vectype.el[i].size;
11113
11114           /* Decay more-specific signed & unsigned types to sign-insensitive
11115              integer types if sign-specific variants are unavailable.  */
11116           if ((g_type == NT_signed || g_type == NT_unsigned)
11117               && (types_allowed & N_SU_ALL) == 0)
11118             g_type = NT_integer;
11119
11120           /* If only untyped args are allowed, decay any more specific types to
11121              them. Some instructions only care about signs for some element
11122              sizes, so handle that properly.  */
11123           if ((g_size == 8 && (types_allowed & N_8) != 0)
11124               || (g_size == 16 && (types_allowed & N_16) != 0)
11125               || (g_size == 32 && (types_allowed & N_32) != 0)
11126               || (g_size == 64 && (types_allowed & N_64) != 0))
11127             g_type = NT_untyped;
11128
11129           if (pass == 0)
11130             {
11131               if ((thisarg & N_KEY) != 0)
11132                 {
11133                   k_type = g_type;
11134                   k_size = g_size;
11135                   key_allowed = thisarg & ~N_KEY;
11136                 }
11137             }
11138           else
11139             {
11140               if ((thisarg & N_VFP) != 0)
11141                 {
11142                   enum neon_shape_el regshape = neon_shape_tab[ns].el[i];
11143                   unsigned regwidth = neon_shape_el_size[regshape], match;
11144
11145                   /* In VFP mode, operands must match register widths. If we
11146                      have a key operand, use its width, else use the width of
11147                      the current operand.  */
11148                   if (k_size != -1u)
11149                     match = k_size;
11150                   else
11151                     match = g_size;
11152
11153                   if (regwidth != match)
11154                     {
11155                       first_error (_("operand size must match register width"));
11156                       return badtype;
11157                     }
11158                 }
11159             
11160               if ((thisarg & N_EQK) == 0)
11161                 {
11162                   unsigned given_type = type_chk_of_el_type (g_type, g_size);
11163
11164                   if ((given_type & types_allowed) == 0)
11165                     {
11166                       first_error (_("bad type in Neon instruction"));
11167                       return badtype;
11168                     }
11169                 }
11170               else
11171                 {
11172                   enum neon_el_type mod_k_type = k_type;
11173                   unsigned mod_k_size = k_size;
11174                   neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
11175                   if (g_type != mod_k_type || g_size != mod_k_size)
11176                     {
11177                       first_error (_("inconsistent types in Neon instruction"));
11178                       return badtype;
11179                     }
11180                 }
11181             }
11182         }
11183     }
11184
11185   return inst.vectype.el[key_el];
11186 }
11187
11188 /* Neon-style VFP instruction forwarding.  */
11189
11190 /* Thumb VFP instructions have 0xE in the condition field.  */
11191
11192 static void
11193 do_vfp_cond_or_thumb (void)
11194 {
11195   if (thumb_mode)
11196     inst.instruction |= 0xe0000000;
11197   else
11198     inst.instruction |= inst.cond << 28;
11199 }
11200
11201 /* Look up and encode a simple mnemonic, for use as a helper function for the
11202    Neon-style VFP syntax.  This avoids duplication of bits of the insns table,
11203    etc.  It is assumed that operand parsing has already been done, and that the
11204    operands are in the form expected by the given opcode (this isn't necessarily
11205    the same as the form in which they were parsed, hence some massaging must
11206    take place before this function is called).
11207    Checks current arch version against that in the looked-up opcode.  */
11208
11209 static void
11210 do_vfp_nsyn_opcode (const char *opname)
11211 {
11212   const struct asm_opcode *opcode;
11213   
11214   opcode = hash_find (arm_ops_hsh, opname);
11215
11216   if (!opcode)
11217     abort ();
11218
11219   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
11220                 thumb_mode ? *opcode->tvariant : *opcode->avariant),
11221               _(BAD_FPU));
11222
11223   if (thumb_mode)
11224     {
11225       inst.instruction = opcode->tvalue;
11226       opcode->tencode ();
11227     }
11228   else
11229     {
11230       inst.instruction = (inst.cond << 28) | opcode->avalue;
11231       opcode->aencode ();
11232     }
11233 }
11234
11235 static void
11236 do_vfp_nsyn_add_sub (enum neon_shape rs)
11237 {
11238   int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
11239
11240   if (rs == NS_FFF)
11241     {
11242       if (is_add)
11243         do_vfp_nsyn_opcode ("fadds");
11244       else
11245         do_vfp_nsyn_opcode ("fsubs");
11246     }
11247   else
11248     {
11249       if (is_add)
11250         do_vfp_nsyn_opcode ("faddd");
11251       else
11252         do_vfp_nsyn_opcode ("fsubd");
11253     }
11254 }
11255
11256 /* Check operand types to see if this is a VFP instruction, and if so call
11257    PFN ().  */
11258
11259 static int
11260 try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
11261 {
11262   enum neon_shape rs;
11263   struct neon_type_el et;
11264
11265   switch (args)
11266     {
11267     case 2:
11268       rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
11269       et = neon_check_type (2, rs,
11270         N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
11271       break;
11272     
11273     case 3:
11274       rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
11275       et = neon_check_type (3, rs,
11276         N_EQK | N_VFP, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
11277       break;
11278
11279     default:
11280       abort ();
11281     }
11282
11283   if (et.type != NT_invtype)
11284     {
11285       pfn (rs);
11286       return SUCCESS;
11287     }
11288   else
11289     inst.error = NULL;
11290
11291   return FAIL;
11292 }
11293
11294 static void
11295 do_vfp_nsyn_mla_mls (enum neon_shape rs)
11296 {
11297   int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
11298   
11299   if (rs == NS_FFF)
11300     {
11301       if (is_mla)
11302         do_vfp_nsyn_opcode ("fmacs");
11303       else
11304         do_vfp_nsyn_opcode ("fmscs");
11305     }
11306   else
11307     {
11308       if (is_mla)
11309         do_vfp_nsyn_opcode ("fmacd");
11310       else
11311         do_vfp_nsyn_opcode ("fmscd");
11312     }
11313 }
11314
11315 static void
11316 do_vfp_nsyn_mul (enum neon_shape rs)
11317 {
11318   if (rs == NS_FFF)
11319     do_vfp_nsyn_opcode ("fmuls");
11320   else
11321     do_vfp_nsyn_opcode ("fmuld");
11322 }
11323
11324 static void
11325 do_vfp_nsyn_abs_neg (enum neon_shape rs)
11326 {
11327   int is_neg = (inst.instruction & 0x80) != 0;
11328   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_VFP | N_KEY);
11329
11330   if (rs == NS_FF)
11331     {
11332       if (is_neg)
11333         do_vfp_nsyn_opcode ("fnegs");
11334       else
11335         do_vfp_nsyn_opcode ("fabss");
11336     }
11337   else
11338     {
11339       if (is_neg)
11340         do_vfp_nsyn_opcode ("fnegd");
11341       else
11342         do_vfp_nsyn_opcode ("fabsd");
11343     }
11344 }
11345
11346 /* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
11347    insns belong to Neon, and are handled elsewhere.  */
11348
11349 static void
11350 do_vfp_nsyn_ldm_stm (int is_dbmode)
11351 {
11352   int is_ldm = (inst.instruction & (1 << 20)) != 0;
11353   if (is_ldm)
11354     {
11355       if (is_dbmode)
11356         do_vfp_nsyn_opcode ("fldmdbs");
11357       else
11358         do_vfp_nsyn_opcode ("fldmias");
11359     }
11360   else
11361     {
11362       if (is_dbmode)
11363         do_vfp_nsyn_opcode ("fstmdbs");
11364       else
11365         do_vfp_nsyn_opcode ("fstmias");
11366     }
11367 }
11368
11369 static void
11370 do_vfp_nsyn_sqrt (void)
11371 {
11372   enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
11373   neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
11374       
11375   if (rs == NS_FF)
11376     do_vfp_nsyn_opcode ("fsqrts");
11377   else
11378     do_vfp_nsyn_opcode ("fsqrtd");
11379 }
11380
11381 static void
11382 do_vfp_nsyn_div (void)
11383 {
11384   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
11385   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
11386     N_F32 | N_F64 | N_KEY | N_VFP);
11387   
11388   if (rs == NS_FFF)
11389     do_vfp_nsyn_opcode ("fdivs");
11390   else
11391     do_vfp_nsyn_opcode ("fdivd");
11392 }
11393
11394 static void
11395 do_vfp_nsyn_nmul (void)
11396 {
11397   enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
11398   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
11399     N_F32 | N_F64 | N_KEY | N_VFP);
11400   
11401   if (rs == NS_FFF)
11402     {
11403       inst.instruction = NEON_ENC_SINGLE (inst.instruction);
11404       do_vfp_sp_dyadic ();
11405     }
11406   else
11407     {
11408       inst.instruction = NEON_ENC_DOUBLE (inst.instruction);
11409       do_vfp_dp_rd_rn_rm ();
11410     }
11411   do_vfp_cond_or_thumb ();
11412 }
11413
11414 static void
11415 do_vfp_nsyn_cmp (void)
11416 {
11417   if (inst.operands[1].isreg)
11418     {
11419       enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
11420       neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
11421       
11422       if (rs == NS_FF)
11423         {
11424           inst.instruction = NEON_ENC_SINGLE (inst.instruction);
11425           do_vfp_sp_monadic ();
11426         }
11427       else
11428         {
11429           inst.instruction = NEON_ENC_DOUBLE (inst.instruction);
11430           do_vfp_dp_rd_rm ();
11431         }
11432     }
11433   else
11434     {
11435       enum neon_shape rs = neon_select_shape (NS_FI, NS_DI, NS_NULL);
11436       neon_check_type (2, rs, N_F32 | N_F64 | N_KEY | N_VFP, N_EQK);
11437
11438       switch (inst.instruction & 0x0fffffff)
11439         {
11440         case N_MNEM_vcmp:
11441           inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
11442           break;
11443         case N_MNEM_vcmpe:
11444           inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
11445           break;
11446         default:
11447           abort ();
11448         }
11449      
11450       if (rs == NS_FI)
11451         {
11452           inst.instruction = NEON_ENC_SINGLE (inst.instruction);
11453           do_vfp_sp_compare_z ();
11454         }
11455       else
11456         {
11457           inst.instruction = NEON_ENC_DOUBLE (inst.instruction);
11458           do_vfp_dp_rd ();
11459         }
11460     }
11461   do_vfp_cond_or_thumb ();
11462 }
11463
11464 static void
11465 nsyn_insert_sp (void)
11466 {
11467   inst.operands[1] = inst.operands[0];
11468   memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
11469   inst.operands[0].reg = 13;
11470   inst.operands[0].isreg = 1;
11471   inst.operands[0].writeback = 1;
11472   inst.operands[0].present = 1;
11473 }
11474
11475 static void
11476 do_vfp_nsyn_push (void)
11477 {
11478   nsyn_insert_sp ();
11479   if (inst.operands[1].issingle)
11480     do_vfp_nsyn_opcode ("fstmdbs");
11481   else
11482     do_vfp_nsyn_opcode ("fstmdbd");
11483 }
11484
11485 static void
11486 do_vfp_nsyn_pop (void)
11487 {
11488   nsyn_insert_sp ();
11489   if (inst.operands[1].issingle)
11490     do_vfp_nsyn_opcode ("fldmias");
11491   else
11492     do_vfp_nsyn_opcode ("fldmiad");
11493 }
11494
11495 /* Fix up Neon data-processing instructions, ORing in the correct bits for
11496    ARM mode or Thumb mode and moving the encoded bit 24 to bit 28.  */
11497
11498 static unsigned
11499 neon_dp_fixup (unsigned i)
11500 {
11501   if (thumb_mode)
11502     {
11503       /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode.  */
11504       if (i & (1 << 24))
11505         i |= 1 << 28;
11506       
11507       i &= ~(1 << 24);
11508       
11509       i |= 0xef000000;
11510     }
11511   else
11512     i |= 0xf2000000;
11513   
11514   return i;
11515 }
11516
11517 /* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
11518    (0, 1, 2, 3).  */
11519
11520 static unsigned
11521 neon_logbits (unsigned x)
11522 {
11523   return ffs (x) - 4;
11524 }
11525
11526 #define LOW4(R) ((R) & 0xf)
11527 #define HI1(R) (((R) >> 4) & 1)
11528
11529 /* Encode insns with bit pattern:
11530
11531   |28/24|23|22 |21 20|19 16|15 12|11    8|7|6|5|4|3  0|
11532   |  U  |x |D  |size | Rn  | Rd  |x x x x|N|Q|M|x| Rm |
11533   
11534   SIZE is passed in bits. -1 means size field isn't changed, in case it has a
11535   different meaning for some instruction.  */
11536
11537 static void
11538 neon_three_same (int isquad, int ubit, int size)
11539 {
11540   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
11541   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
11542   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
11543   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
11544   inst.instruction |= LOW4 (inst.operands[2].reg);
11545   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
11546   inst.instruction |= (isquad != 0) << 6;
11547   inst.instruction |= (ubit != 0) << 24;
11548   if (size != -1)
11549     inst.instruction |= neon_logbits (size) << 20;
11550   
11551   inst.instruction = neon_dp_fixup (inst.instruction);
11552 }
11553
11554 /* Encode instructions of the form:
11555
11556   |28/24|23|22|21 20|19 18|17 16|15 12|11      7|6|5|4|3  0|
11557   |  U  |x |D |x  x |size |x  x | Rd  |x x x x x|Q|M|x| Rm |
11558
11559   Don't write size if SIZE == -1.  */
11560
11561 static void
11562 neon_two_same (int qbit, int ubit, int size)
11563 {
11564   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
11565   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
11566   inst.instruction |= LOW4 (inst.operands[1].reg);
11567   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
11568   inst.instruction |= (qbit != 0) << 6;
11569   inst.instruction |= (ubit != 0) << 24;
11570
11571   if (size != -1)
11572     inst.instruction |= neon_logbits (size) << 18;
11573
11574   inst.instruction = neon_dp_fixup (inst.instruction);
11575 }
11576
11577 /* Neon instruction encoders, in approximate order of appearance.  */
11578
11579 static void
11580 do_neon_dyadic_i_su (void)
11581 {
11582   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
11583   struct neon_type_el et = neon_check_type (3, rs,
11584     N_EQK, N_EQK, N_SU_32 | N_KEY);
11585   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
11586 }
11587
11588 static void
11589 do_neon_dyadic_i64_su (void)
11590 {
11591   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
11592   struct neon_type_el et = neon_check_type (3, rs,
11593     N_EQK, N_EQK, N_SU_ALL | N_KEY);
11594   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
11595 }
11596
11597 static void
11598 neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
11599                 unsigned immbits)
11600 {
11601   unsigned size = et.size >> 3;
11602   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
11603   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
11604   inst.instruction |= LOW4 (inst.operands[1].reg);
11605   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
11606   inst.instruction |= (isquad != 0) << 6;
11607   inst.instruction |= immbits << 16;
11608   inst.instruction |= (size >> 3) << 7;
11609   inst.instruction |= (size & 0x7) << 19;
11610   if (write_ubit)
11611     inst.instruction |= (uval != 0) << 24;
11612
11613   inst.instruction = neon_dp_fixup (inst.instruction);
11614 }
11615
11616 static void
11617 do_neon_shl_imm (void)
11618 {
11619   if (!inst.operands[2].isreg)
11620     {
11621       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
11622       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
11623       inst.instruction = NEON_ENC_IMMED (inst.instruction);
11624       neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm);
11625     }
11626   else
11627     {
11628       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
11629       struct neon_type_el et = neon_check_type (3, rs,
11630         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
11631       unsigned int tmp;
11632
11633       /* VSHL/VQSHL 3-register variants have syntax such as:
11634            vshl.xx Dd, Dm, Dn
11635          whereas other 3-register operations encoded by neon_three_same have
11636          syntax like:
11637            vadd.xx Dd, Dn, Dm
11638          (i.e. with Dn & Dm reversed). Swap operands[1].reg and operands[2].reg
11639          here.  */
11640       tmp = inst.operands[2].reg;
11641       inst.operands[2].reg = inst.operands[1].reg;
11642       inst.operands[1].reg = tmp;
11643       inst.instruction = NEON_ENC_INTEGER (inst.instruction);
11644       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
11645     }
11646 }
11647
11648 static void
11649 do_neon_qshl_imm (void)
11650 {
11651   if (!inst.operands[2].isreg)
11652     {
11653       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
11654       struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
11655
11656       inst.instruction = NEON_ENC_IMMED (inst.instruction);
11657       neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
11658                       inst.operands[2].imm);
11659     }
11660   else
11661     {
11662       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
11663       struct neon_type_el et = neon_check_type (3, rs,
11664         N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
11665       unsigned int tmp;
11666
11667       /* See note in do_neon_shl_imm.  */
11668       tmp = inst.operands[2].reg;
11669       inst.operands[2].reg = inst.operands[1].reg;
11670       inst.operands[1].reg = tmp;
11671       inst.instruction = NEON_ENC_INTEGER (inst.instruction);
11672       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
11673     }
11674 }
11675
11676 static void
11677 do_neon_rshl (void)
11678 {
11679   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
11680   struct neon_type_el et = neon_check_type (3, rs,
11681     N_EQK, N_EQK, N_SU_ALL | N_KEY);
11682   unsigned int tmp;
11683
11684   tmp = inst.operands[2].reg;
11685   inst.operands[2].reg = inst.operands[1].reg;
11686   inst.operands[1].reg = tmp;
11687   neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
11688 }
11689
11690 static int
11691 neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
11692 {
11693   /* Handle .I8 pseudo-instructions.  */
11694   if (size == 8)
11695     {
11696       /* Unfortunately, this will make everything apart from zero out-of-range.
11697          FIXME is this the intended semantics? There doesn't seem much point in
11698          accepting .I8 if so.  */
11699       immediate |= immediate << 8;
11700       size = 16;
11701     }
11702
11703   if (size >= 32)
11704     {
11705       if (immediate == (immediate & 0x000000ff))
11706         {
11707           *immbits = immediate;
11708           return 0x1;
11709         }
11710       else if (immediate == (immediate & 0x0000ff00))
11711         {
11712           *immbits = immediate >> 8;
11713           return 0x3;
11714         }
11715       else if (immediate == (immediate & 0x00ff0000))
11716         {
11717           *immbits = immediate >> 16;
11718           return 0x5;
11719         }
11720       else if (immediate == (immediate & 0xff000000))
11721         {
11722           *immbits = immediate >> 24;
11723           return 0x7;
11724         }
11725       if ((immediate & 0xffff) != (immediate >> 16))
11726         goto bad_immediate;
11727       immediate &= 0xffff;
11728     }
11729
11730   if (immediate == (immediate & 0x000000ff))
11731     {
11732       *immbits = immediate;
11733       return 0x9;
11734     }
11735   else if (immediate == (immediate & 0x0000ff00))
11736     {
11737       *immbits = immediate >> 8;
11738       return 0xb;
11739     }
11740
11741   bad_immediate:
11742   first_error (_("immediate value out of range"));
11743   return FAIL;
11744 }
11745
11746 /* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
11747    A, B, C, D.  */
11748
11749 static int
11750 neon_bits_same_in_bytes (unsigned imm)
11751 {
11752   return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
11753          && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
11754          && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
11755          && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
11756 }
11757
11758 /* For immediate of above form, return 0bABCD.  */
11759
11760 static unsigned
11761 neon_squash_bits (unsigned imm)
11762 {
11763   return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
11764          | ((imm & 0x01000000) >> 21);
11765 }
11766
11767 /* Compress quarter-float representation to 0b...000 abcdefgh.  */
11768
11769 static unsigned
11770 neon_qfloat_bits (unsigned imm)
11771 {
11772   return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
11773 }
11774
11775 /* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
11776    the instruction. *OP is passed as the initial value of the op field, and
11777    may be set to a different value depending on the constant (i.e.
11778    "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
11779    MVN).  If the immediate looks like a repeated parttern then also
11780    try smaller element sizes.  */
11781
11782 static int
11783 neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
11784                          unsigned *immbits, int *op, int size,
11785                          enum neon_el_type type)
11786 {
11787   /* Only permit float immediates (including 0.0/-0.0) if the operand type is
11788      float.  */
11789   if (type == NT_float && !float_p)
11790     return FAIL;
11791
11792   if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
11793     {
11794       if (size != 32 || *op == 1)
11795         return FAIL;
11796       *immbits = neon_qfloat_bits (immlo);
11797       return 0xf;
11798     }
11799
11800   if (size == 64)
11801     {
11802       if (neon_bits_same_in_bytes (immhi)
11803           && neon_bits_same_in_bytes (immlo))
11804         {
11805           if (*op == 1)
11806             return FAIL;
11807           *immbits = (neon_squash_bits (immhi) << 4)
11808                      | neon_squash_bits (immlo);
11809           *op = 1;
11810           return 0xe;
11811         }
11812
11813       if (immhi != immlo)
11814         return FAIL;
11815     }
11816
11817   if (size >= 32)
11818     {
11819       if (immlo == (immlo & 0x000000ff))
11820         {
11821           *immbits = immlo;
11822           return 0x0;
11823         }
11824       else if (immlo == (immlo & 0x0000ff00))
11825         {
11826           *immbits = immlo >> 8;
11827           return 0x2;
11828         }
11829       else if (immlo == (immlo & 0x00ff0000))
11830         {
11831           *immbits = immlo >> 16;
11832           return 0x4;
11833         }
11834       else if (immlo == (immlo & 0xff000000))
11835         {
11836           *immbits = immlo >> 24;
11837           return 0x6;
11838         }
11839       else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
11840         {
11841           *immbits = (immlo >> 8) & 0xff;
11842           return 0xc;
11843         }
11844       else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
11845         {
11846           *immbits = (immlo >> 16) & 0xff;
11847           return 0xd;
11848         }
11849
11850       if ((immlo & 0xffff) != (immlo >> 16))
11851         return FAIL;
11852       immlo &= 0xffff;
11853     }
11854
11855   if (size >= 16)
11856     {
11857       if (immlo == (immlo & 0x000000ff))
11858         {
11859           *immbits = immlo;
11860           return 0x8;
11861         }
11862       else if (immlo == (immlo & 0x0000ff00))
11863         {
11864           *immbits = immlo >> 8;
11865           return 0xa;
11866         }
11867
11868       if ((immlo & 0xff) != (immlo >> 8))
11869         return FAIL;
11870       immlo &= 0xff;
11871     }
11872
11873   if (immlo == (immlo & 0x000000ff))
11874     {
11875       /* Don't allow MVN with 8-bit immediate.  */
11876       if (*op == 1)
11877         return FAIL;
11878       *immbits = immlo;
11879       return 0xe;
11880     }
11881
11882   return FAIL;
11883 }
11884
11885 /* Write immediate bits [7:0] to the following locations:
11886
11887   |28/24|23     19|18 16|15                    4|3     0|
11888   |  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|
11889
11890   This function is used by VMOV/VMVN/VORR/VBIC.  */
11891
11892 static void
11893 neon_write_immbits (unsigned immbits)
11894 {
11895   inst.instruction |= immbits & 0xf;
11896   inst.instruction |= ((immbits >> 4) & 0x7) << 16;
11897   inst.instruction |= ((immbits >> 7) & 0x1) << 24;
11898 }
11899
11900 /* Invert low-order SIZE bits of XHI:XLO.  */
11901
11902 static void
11903 neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
11904 {
11905   unsigned immlo = xlo ? *xlo : 0;
11906   unsigned immhi = xhi ? *xhi : 0;
11907
11908   switch (size)
11909     {
11910     case 8:
11911       immlo = (~immlo) & 0xff;
11912       break;
11913
11914     case 16:
11915       immlo = (~immlo) & 0xffff;
11916       break;
11917
11918     case 64:
11919       immhi = (~immhi) & 0xffffffff;
11920       /* fall through.  */
11921
11922     case 32:
11923       immlo = (~immlo) & 0xffffffff;
11924       break;
11925
11926     default:
11927       abort ();
11928     }
11929
11930   if (xlo)
11931     *xlo = immlo;
11932
11933   if (xhi)
11934     *xhi = immhi;
11935 }
11936
11937 static void
11938 do_neon_logic (void)
11939 {
11940   if (inst.operands[2].present && inst.operands[2].isreg)
11941     {
11942       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
11943       neon_check_type (3, rs, N_IGNORE_TYPE);
11944       /* U bit and size field were set as part of the bitmask.  */
11945       inst.instruction = NEON_ENC_INTEGER (inst.instruction);
11946       neon_three_same (neon_quad (rs), 0, -1);
11947     }
11948   else
11949     {
11950       enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
11951       struct neon_type_el et = neon_check_type (2, rs,
11952         N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
11953       enum neon_opc opcode = inst.instruction & 0x0fffffff;
11954       unsigned immbits;
11955       int cmode;
11956       
11957       if (et.type == NT_invtype)
11958         return;
11959       
11960       inst.instruction = NEON_ENC_IMMED (inst.instruction);
11961
11962       immbits = inst.operands[1].imm;
11963       if (et.size == 64)
11964         {
11965           /* .i64 is a pseudo-op, so the immediate must be a repeating
11966              pattern.  */
11967           if (immbits != (inst.operands[1].regisimm ?
11968                           inst.operands[1].reg : 0))
11969             {
11970               /* Set immbits to an invalid constant.  */
11971               immbits = 0xdeadbeef;
11972             }
11973         }
11974
11975       switch (opcode)
11976         {
11977         case N_MNEM_vbic:
11978           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
11979           break;
11980         
11981         case N_MNEM_vorr:
11982           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
11983           break;
11984         
11985         case N_MNEM_vand:
11986           /* Pseudo-instruction for VBIC.  */
11987           neon_invert_size (&immbits, 0, et.size);
11988           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
11989           break;
11990         
11991         case N_MNEM_vorn:
11992           /* Pseudo-instruction for VORR.  */
11993           neon_invert_size (&immbits, 0, et.size);
11994           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
11995           break;
11996         
11997         default:
11998           abort ();
11999         }
12000
12001       if (cmode == FAIL)
12002         return;
12003
12004       inst.instruction |= neon_quad (rs) << 6;
12005       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12006       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12007       inst.instruction |= cmode << 8;
12008       neon_write_immbits (immbits);
12009       
12010       inst.instruction = neon_dp_fixup (inst.instruction);
12011     }
12012 }
12013
12014 static void
12015 do_neon_bitfield (void)
12016 {
12017   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12018   neon_check_type (3, rs, N_IGNORE_TYPE);
12019   neon_three_same (neon_quad (rs), 0, -1);
12020 }
12021
12022 static void
12023 neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
12024                   unsigned destbits)
12025 {
12026   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12027   struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
12028                                             types | N_KEY);
12029   if (et.type == NT_float)
12030     {
12031       inst.instruction = NEON_ENC_FLOAT (inst.instruction);
12032       neon_three_same (neon_quad (rs), 0, -1);
12033     }
12034   else
12035     {
12036       inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12037       neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
12038     }
12039 }
12040
12041 static void
12042 do_neon_dyadic_if_su (void)
12043 {
12044   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
12045 }
12046
12047 static void
12048 do_neon_dyadic_if_su_d (void)
12049 {
12050   /* This version only allow D registers, but that constraint is enforced during
12051      operand parsing so we don't need to do anything extra here.  */
12052   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
12053 }
12054
12055 static void
12056 do_neon_dyadic_if_i_d (void)
12057 {
12058   /* The "untyped" case can't happen. Do this to stop the "U" bit being
12059      affected if we specify unsigned args.  */
12060   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
12061 }
12062
12063 enum vfp_or_neon_is_neon_bits
12064 {
12065   NEON_CHECK_CC = 1,
12066   NEON_CHECK_ARCH = 2
12067 };
12068
12069 /* Call this function if an instruction which may have belonged to the VFP or
12070    Neon instruction sets, but turned out to be a Neon instruction (due to the
12071    operand types involved, etc.). We have to check and/or fix-up a couple of
12072    things:
12073
12074      - Make sure the user hasn't attempted to make a Neon instruction
12075        conditional.
12076      - Alter the value in the condition code field if necessary.
12077      - Make sure that the arch supports Neon instructions.
12078
12079    Which of these operations take place depends on bits from enum
12080    vfp_or_neon_is_neon_bits.
12081
12082    WARNING: This function has side effects! If NEON_CHECK_CC is used and the
12083    current instruction's condition is COND_ALWAYS, the condition field is
12084    changed to inst.uncond_value. This is necessary because instructions shared
12085    between VFP and Neon may be conditional for the VFP variants only, and the
12086    unconditional Neon version must have, e.g., 0xF in the condition field.  */
12087
12088 static int
12089 vfp_or_neon_is_neon (unsigned check)
12090 {
12091   /* Conditions are always legal in Thumb mode (IT blocks).  */
12092   if (!thumb_mode && (check & NEON_CHECK_CC))
12093     {
12094       if (inst.cond != COND_ALWAYS)
12095         {
12096           first_error (_(BAD_COND));
12097           return FAIL;
12098         }
12099       if (inst.uncond_value != -1)
12100         inst.instruction |= inst.uncond_value << 28;
12101     }
12102   
12103   if ((check & NEON_CHECK_ARCH)
12104       && !ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1))
12105     {
12106       first_error (_(BAD_FPU));
12107       return FAIL;
12108     }
12109   
12110   return SUCCESS;
12111 }
12112
12113 static void
12114 do_neon_addsub_if_i (void)
12115 {
12116   if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
12117     return;
12118
12119   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
12120     return;
12121
12122   /* The "untyped" case can't happen. Do this to stop the "U" bit being
12123      affected if we specify unsigned args.  */
12124   neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
12125 }
12126
12127 /* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
12128    result to be:
12129      V<op> A,B     (A is operand 0, B is operand 2)
12130    to mean:
12131      V<op> A,B,A
12132    not:
12133      V<op> A,B,B
12134    so handle that case specially.  */
12135
12136 static void
12137 neon_exchange_operands (void)
12138 {
12139   void *scratch = alloca (sizeof (inst.operands[0]));
12140   if (inst.operands[1].present)
12141     {
12142       /* Swap operands[1] and operands[2].  */
12143       memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
12144       inst.operands[1] = inst.operands[2];
12145       memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
12146     }
12147   else
12148     {
12149       inst.operands[1] = inst.operands[2];
12150       inst.operands[2] = inst.operands[0];
12151     }
12152 }
12153
12154 static void
12155 neon_compare (unsigned regtypes, unsigned immtypes, int invert)
12156 {
12157   if (inst.operands[2].isreg)
12158     {
12159       if (invert)
12160         neon_exchange_operands ();
12161       neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
12162     }
12163   else
12164     {
12165       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
12166       struct neon_type_el et = neon_check_type (2, rs,
12167         N_EQK | N_SIZ, immtypes | N_KEY);
12168
12169       inst.instruction = NEON_ENC_IMMED (inst.instruction);
12170       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12171       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12172       inst.instruction |= LOW4 (inst.operands[1].reg);
12173       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12174       inst.instruction |= neon_quad (rs) << 6;
12175       inst.instruction |= (et.type == NT_float) << 10;
12176       inst.instruction |= neon_logbits (et.size) << 18;
12177       
12178       inst.instruction = neon_dp_fixup (inst.instruction);
12179     }
12180 }
12181
12182 static void
12183 do_neon_cmp (void)
12184 {
12185   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, FALSE);
12186 }
12187
12188 static void
12189 do_neon_cmp_inv (void)
12190 {
12191   neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, TRUE);
12192 }
12193
12194 static void
12195 do_neon_ceq (void)
12196 {
12197   neon_compare (N_IF_32, N_IF_32, FALSE);
12198 }
12199
12200 /* For multiply instructions, we have the possibility of 16-bit or 32-bit
12201    scalars, which are encoded in 5 bits, M : Rm.
12202    For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
12203    M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
12204    index in M.  */
12205
12206 static unsigned
12207 neon_scalar_for_mul (unsigned scalar, unsigned elsize)
12208 {
12209   unsigned regno = NEON_SCALAR_REG (scalar);
12210   unsigned elno = NEON_SCALAR_INDEX (scalar);
12211
12212   switch (elsize)
12213     {
12214     case 16:
12215       if (regno > 7 || elno > 3)
12216         goto bad_scalar;
12217       return regno | (elno << 3);
12218     
12219     case 32:
12220       if (regno > 15 || elno > 1)
12221         goto bad_scalar;
12222       return regno | (elno << 4);
12223
12224     default:
12225     bad_scalar:
12226       first_error (_("scalar out of range for multiply instruction"));
12227     }
12228
12229   return 0;
12230 }
12231
12232 /* Encode multiply / multiply-accumulate scalar instructions.  */
12233
12234 static void
12235 neon_mul_mac (struct neon_type_el et, int ubit)
12236 {
12237   unsigned scalar;
12238
12239   /* Give a more helpful error message if we have an invalid type.  */
12240   if (et.type == NT_invtype)
12241     return;
12242   
12243   scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
12244   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12245   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12246   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
12247   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
12248   inst.instruction |= LOW4 (scalar);
12249   inst.instruction |= HI1 (scalar) << 5;
12250   inst.instruction |= (et.type == NT_float) << 8;
12251   inst.instruction |= neon_logbits (et.size) << 20;
12252   inst.instruction |= (ubit != 0) << 24;
12253
12254   inst.instruction = neon_dp_fixup (inst.instruction);
12255 }
12256
12257 static void
12258 do_neon_mac_maybe_scalar (void)
12259 {
12260   if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
12261     return;
12262
12263   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
12264     return;
12265
12266   if (inst.operands[2].isscalar)
12267     {
12268       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
12269       struct neon_type_el et = neon_check_type (3, rs,
12270         N_EQK, N_EQK, N_I16 | N_I32 | N_F32 | N_KEY);
12271       inst.instruction = NEON_ENC_SCALAR (inst.instruction);
12272       neon_mul_mac (et, neon_quad (rs));
12273     }
12274   else
12275     {
12276       /* The "untyped" case can't happen.  Do this to stop the "U" bit being
12277          affected if we specify unsigned args.  */
12278       neon_dyadic_misc (NT_untyped, N_IF_32, 0);
12279     }
12280 }
12281
12282 static void
12283 do_neon_tst (void)
12284 {
12285   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12286   struct neon_type_el et = neon_check_type (3, rs,
12287     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
12288   neon_three_same (neon_quad (rs), 0, et.size);
12289 }
12290
12291 /* VMUL with 3 registers allows the P8 type. The scalar version supports the
12292    same types as the MAC equivalents. The polynomial type for this instruction
12293    is encoded the same as the integer type.  */
12294
12295 static void
12296 do_neon_mul (void)
12297 {
12298   if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
12299     return;
12300
12301   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
12302     return;
12303
12304   if (inst.operands[2].isscalar)
12305     do_neon_mac_maybe_scalar ();
12306   else
12307     neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F32 | N_P8, 0);
12308 }
12309
12310 static void
12311 do_neon_qdmulh (void)
12312 {
12313   if (inst.operands[2].isscalar)
12314     {
12315       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
12316       struct neon_type_el et = neon_check_type (3, rs,
12317         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
12318       inst.instruction = NEON_ENC_SCALAR (inst.instruction);
12319       neon_mul_mac (et, neon_quad (rs));
12320     }
12321   else
12322     {
12323       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12324       struct neon_type_el et = neon_check_type (3, rs,
12325         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
12326       inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12327       /* The U bit (rounding) comes from bit mask.  */
12328       neon_three_same (neon_quad (rs), 0, et.size);
12329     }
12330 }
12331
12332 static void
12333 do_neon_fcmp_absolute (void)
12334 {
12335   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12336   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
12337   /* Size field comes from bit mask.  */
12338   neon_three_same (neon_quad (rs), 1, -1);
12339 }
12340
12341 static void
12342 do_neon_fcmp_absolute_inv (void)
12343 {
12344   neon_exchange_operands ();
12345   do_neon_fcmp_absolute ();
12346 }
12347
12348 static void
12349 do_neon_step (void)
12350 {
12351   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
12352   neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
12353   neon_three_same (neon_quad (rs), 0, -1);
12354 }
12355
12356 static void
12357 do_neon_abs_neg (void)
12358 {
12359   enum neon_shape rs;
12360   struct neon_type_el et;
12361   
12362   if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
12363     return;
12364
12365   if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
12366     return;
12367
12368   rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
12369   et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_F32 | N_KEY);
12370   
12371   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12372   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12373   inst.instruction |= LOW4 (inst.operands[1].reg);
12374   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12375   inst.instruction |= neon_quad (rs) << 6;
12376   inst.instruction |= (et.type == NT_float) << 10;
12377   inst.instruction |= neon_logbits (et.size) << 18;
12378   
12379   inst.instruction = neon_dp_fixup (inst.instruction);
12380 }
12381
12382 static void
12383 do_neon_sli (void)
12384 {
12385   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
12386   struct neon_type_el et = neon_check_type (2, rs,
12387     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
12388   int imm = inst.operands[2].imm;
12389   constraint (imm < 0 || (unsigned)imm >= et.size,
12390               _("immediate out of range for insert"));
12391   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
12392 }
12393
12394 static void
12395 do_neon_sri (void)
12396 {
12397   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
12398   struct neon_type_el et = neon_check_type (2, rs,
12399     N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
12400   int imm = inst.operands[2].imm;
12401   constraint (imm < 1 || (unsigned)imm > et.size,
12402               _("immediate out of range for insert"));
12403   neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
12404 }
12405
12406 static void
12407 do_neon_qshlu_imm (void)
12408 {
12409   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
12410   struct neon_type_el et = neon_check_type (2, rs,
12411     N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
12412   int imm = inst.operands[2].imm;
12413   constraint (imm < 0 || (unsigned)imm >= et.size,
12414               _("immediate out of range for shift"));
12415   /* Only encodes the 'U present' variant of the instruction.
12416      In this case, signed types have OP (bit 8) set to 0.
12417      Unsigned types have OP set to 1.  */
12418   inst.instruction |= (et.type == NT_unsigned) << 8;
12419   /* The rest of the bits are the same as other immediate shifts.  */
12420   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
12421 }
12422
12423 static void
12424 do_neon_qmovn (void)
12425 {
12426   struct neon_type_el et = neon_check_type (2, NS_DQ,
12427     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
12428   /* Saturating move where operands can be signed or unsigned, and the
12429      destination has the same signedness.  */
12430   inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12431   if (et.type == NT_unsigned)
12432     inst.instruction |= 0xc0;
12433   else
12434     inst.instruction |= 0x80;
12435   neon_two_same (0, 1, et.size / 2);
12436 }
12437
12438 static void
12439 do_neon_qmovun (void)
12440 {
12441   struct neon_type_el et = neon_check_type (2, NS_DQ,
12442     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
12443   /* Saturating move with unsigned results. Operands must be signed.  */
12444   inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12445   neon_two_same (0, 1, et.size / 2);
12446 }
12447
12448 static void
12449 do_neon_rshift_sat_narrow (void)
12450 {
12451   /* FIXME: Types for narrowing. If operands are signed, results can be signed
12452      or unsigned. If operands are unsigned, results must also be unsigned.  */
12453   struct neon_type_el et = neon_check_type (2, NS_DQI,
12454     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
12455   int imm = inst.operands[2].imm;
12456   /* This gets the bounds check, size encoding and immediate bits calculation
12457      right.  */
12458   et.size /= 2;
12459   
12460   /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
12461      VQMOVN.I<size> <Dd>, <Qm>.  */
12462   if (imm == 0)
12463     {
12464       inst.operands[2].present = 0;
12465       inst.instruction = N_MNEM_vqmovn;
12466       do_neon_qmovn ();
12467       return;
12468     }
12469   
12470   constraint (imm < 1 || (unsigned)imm > et.size,
12471               _("immediate out of range"));
12472   neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
12473 }
12474
12475 static void
12476 do_neon_rshift_sat_narrow_u (void)
12477 {
12478   /* FIXME: Types for narrowing. If operands are signed, results can be signed
12479      or unsigned. If operands are unsigned, results must also be unsigned.  */
12480   struct neon_type_el et = neon_check_type (2, NS_DQI,
12481     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
12482   int imm = inst.operands[2].imm;
12483   /* This gets the bounds check, size encoding and immediate bits calculation
12484      right.  */
12485   et.size /= 2;
12486
12487   /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
12488      VQMOVUN.I<size> <Dd>, <Qm>.  */
12489   if (imm == 0)
12490     {
12491       inst.operands[2].present = 0;
12492       inst.instruction = N_MNEM_vqmovun;
12493       do_neon_qmovun ();
12494       return;
12495     }
12496
12497   constraint (imm < 1 || (unsigned)imm > et.size,
12498               _("immediate out of range"));
12499   /* FIXME: The manual is kind of unclear about what value U should have in
12500      VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
12501      must be 1.  */
12502   neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
12503 }
12504
12505 static void
12506 do_neon_movn (void)
12507 {
12508   struct neon_type_el et = neon_check_type (2, NS_DQ,
12509     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
12510   inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12511   neon_two_same (0, 1, et.size / 2);
12512 }
12513
12514 static void
12515 do_neon_rshift_narrow (void)
12516 {
12517   struct neon_type_el et = neon_check_type (2, NS_DQI,
12518     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
12519   int imm = inst.operands[2].imm;
12520   /* This gets the bounds check, size encoding and immediate bits calculation
12521      right.  */
12522   et.size /= 2;
12523   
12524   /* If immediate is zero then we are a pseudo-instruction for
12525      VMOVN.I<size> <Dd>, <Qm>  */
12526   if (imm == 0)
12527     {
12528       inst.operands[2].present = 0;
12529       inst.instruction = N_MNEM_vmovn;
12530       do_neon_movn ();
12531       return;
12532     }
12533   
12534   constraint (imm < 1 || (unsigned)imm > et.size,
12535               _("immediate out of range for narrowing operation"));
12536   neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
12537 }
12538
12539 static void
12540 do_neon_shll (void)
12541 {
12542   /* FIXME: Type checking when lengthening.  */
12543   struct neon_type_el et = neon_check_type (2, NS_QDI,
12544     N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
12545   unsigned imm = inst.operands[2].imm;
12546
12547   if (imm == et.size)
12548     {
12549       /* Maximum shift variant.  */
12550       inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12551       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12552       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12553       inst.instruction |= LOW4 (inst.operands[1].reg);
12554       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12555       inst.instruction |= neon_logbits (et.size) << 18;
12556       
12557       inst.instruction = neon_dp_fixup (inst.instruction);
12558     }
12559   else
12560     {
12561       /* A more-specific type check for non-max versions.  */
12562       et = neon_check_type (2, NS_QDI,
12563         N_EQK | N_DBL, N_SU_32 | N_KEY);
12564       inst.instruction = NEON_ENC_IMMED (inst.instruction);
12565       neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
12566     }
12567 }
12568
12569 /* Check the various types for the VCVT instruction, and return which version
12570    the current instruction is.  */
12571
12572 static int
12573 neon_cvt_flavour (enum neon_shape rs)
12574 {
12575 #define CVT_VAR(C,X,Y)                                                  \
12576   et = neon_check_type (2, rs, whole_reg | (X), whole_reg | (Y));       \
12577   if (et.type != NT_invtype)                                            \
12578     {                                                                   \
12579       inst.error = NULL;                                                \
12580       return (C);                                                       \
12581     }
12582   struct neon_type_el et;
12583   unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
12584                         || rs == NS_FF) ? N_VFP : 0;
12585   /* The instruction versions which take an immediate take one register
12586      argument, which is extended to the width of the full register. Thus the
12587      "source" and "destination" registers must have the same width.  Hack that
12588      here by making the size equal to the key (wider, in this case) operand.  */
12589   unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
12590   
12591   CVT_VAR (0, N_S32, N_F32);
12592   CVT_VAR (1, N_U32, N_F32);
12593   CVT_VAR (2, N_F32, N_S32);
12594   CVT_VAR (3, N_F32, N_U32);
12595   
12596   whole_reg = N_VFP;
12597   
12598   /* VFP instructions.  */
12599   CVT_VAR (4, N_F32, N_F64);
12600   CVT_VAR (5, N_F64, N_F32);
12601   CVT_VAR (6, N_S32, N_F64 | key);
12602   CVT_VAR (7, N_U32, N_F64 | key);
12603   CVT_VAR (8, N_F64 | key, N_S32);
12604   CVT_VAR (9, N_F64 | key, N_U32);
12605   /* VFP instructions with bitshift.  */
12606   CVT_VAR (10, N_F32 | key, N_S16);
12607   CVT_VAR (11, N_F32 | key, N_U16);
12608   CVT_VAR (12, N_F64 | key, N_S16);
12609   CVT_VAR (13, N_F64 | key, N_U16);
12610   CVT_VAR (14, N_S16, N_F32 | key);
12611   CVT_VAR (15, N_U16, N_F32 | key);
12612   CVT_VAR (16, N_S16, N_F64 | key);
12613   CVT_VAR (17, N_U16, N_F64 | key);
12614   
12615   return -1;
12616 #undef CVT_VAR
12617 }
12618
12619 /* Neon-syntax VFP conversions.  */
12620
12621 static void
12622 do_vfp_nsyn_cvt (enum neon_shape rs, int flavour)
12623 {
12624   const char *opname = 0;
12625   
12626   if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI)
12627     {
12628       /* Conversions with immediate bitshift.  */
12629       const char *enc[] =
12630         {
12631           "ftosls",
12632           "ftouls",
12633           "fsltos",
12634           "fultos",
12635           NULL,
12636           NULL,
12637           "ftosld",
12638           "ftould",
12639           "fsltod",
12640           "fultod",
12641           "fshtos",
12642           "fuhtos",
12643           "fshtod",
12644           "fuhtod",
12645           "ftoshs",
12646           "ftouhs",
12647           "ftoshd",
12648           "ftouhd"
12649         };
12650
12651       if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
12652         {
12653           opname = enc[flavour];
12654           constraint (inst.operands[0].reg != inst.operands[1].reg,
12655                       _("operands 0 and 1 must be the same register"));
12656           inst.operands[1] = inst.operands[2];
12657           memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
12658         }
12659     }
12660   else
12661     {
12662       /* Conversions without bitshift.  */
12663       const char *enc[] =
12664         {
12665           "ftosizs",
12666           "ftouizs",
12667           "fsitos",
12668           "fuitos",
12669           "fcvtsd",
12670           "fcvtds",
12671           "ftosizd",
12672           "ftouizd",
12673           "fsitod",
12674           "fuitod"
12675         };
12676
12677       if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
12678         opname = enc[flavour];
12679     }
12680
12681   if (opname)
12682     do_vfp_nsyn_opcode (opname);
12683 }
12684
12685 static void
12686 do_vfp_nsyn_cvtz (void)
12687 {
12688   enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_NULL);
12689   int flavour = neon_cvt_flavour (rs);
12690   const char *enc[] =
12691     {
12692       "ftosizs",
12693       "ftouizs",
12694       NULL,
12695       NULL,
12696       NULL,
12697       NULL,
12698       "ftosizd",
12699       "ftouizd"
12700     };
12701
12702   if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
12703     do_vfp_nsyn_opcode (enc[flavour]);
12704 }
12705
12706 static void
12707 do_neon_cvt (void)
12708 {
12709   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
12710     NS_FD, NS_DF, NS_FF, NS_NULL);
12711   int flavour = neon_cvt_flavour (rs);
12712
12713   /* VFP rather than Neon conversions.  */
12714   if (flavour >= 4)
12715     {
12716       do_vfp_nsyn_cvt (rs, flavour);
12717       return;
12718     }
12719
12720   switch (rs)
12721     {
12722     case NS_DDI:
12723     case NS_QQI:
12724       {
12725         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
12726           return;
12727
12728         /* Fixed-point conversion with #0 immediate is encoded as an
12729            integer conversion.  */
12730         if (inst.operands[2].present && inst.operands[2].imm == 0)
12731           goto int_encode;
12732         unsigned immbits = 32 - inst.operands[2].imm;
12733         unsigned enctab[] = { 0x0000100, 0x1000100, 0x0, 0x1000000 };
12734         inst.instruction = NEON_ENC_IMMED (inst.instruction);
12735         if (flavour != -1)
12736           inst.instruction |= enctab[flavour];
12737         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12738         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12739         inst.instruction |= LOW4 (inst.operands[1].reg);
12740         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12741         inst.instruction |= neon_quad (rs) << 6;
12742         inst.instruction |= 1 << 21;
12743         inst.instruction |= immbits << 16;
12744
12745         inst.instruction = neon_dp_fixup (inst.instruction);
12746       }
12747       break;
12748
12749     case NS_DD:
12750     case NS_QQ:
12751     int_encode:
12752       {
12753         unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080 };
12754
12755         inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12756
12757         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
12758           return;
12759
12760         if (flavour != -1)
12761           inst.instruction |= enctab[flavour];
12762
12763         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12764         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12765         inst.instruction |= LOW4 (inst.operands[1].reg);
12766         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12767         inst.instruction |= neon_quad (rs) << 6;
12768         inst.instruction |= 2 << 18;
12769
12770         inst.instruction = neon_dp_fixup (inst.instruction);
12771       }
12772     break;
12773
12774     default:
12775       /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32).  */
12776       do_vfp_nsyn_cvt (rs, flavour);
12777     }
12778 }
12779
12780 static void
12781 neon_move_immediate (void)
12782 {
12783   enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
12784   struct neon_type_el et = neon_check_type (2, rs,
12785     N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
12786   unsigned immlo, immhi = 0, immbits;
12787   int op, cmode, float_p;
12788
12789   constraint (et.type == NT_invtype,
12790               _("operand size must be specified for immediate VMOV"));
12791
12792   /* We start out as an MVN instruction if OP = 1, MOV otherwise.  */
12793   op = (inst.instruction & (1 << 5)) != 0;
12794
12795   immlo = inst.operands[1].imm;
12796   if (inst.operands[1].regisimm)
12797     immhi = inst.operands[1].reg;
12798
12799   constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
12800               _("immediate has bits set outside the operand size"));
12801
12802   float_p = inst.operands[1].immisfloat;
12803
12804   if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
12805                                         et.size, et.type)) == FAIL)
12806     {
12807       /* Invert relevant bits only.  */
12808       neon_invert_size (&immlo, &immhi, et.size);
12809       /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
12810          with one or the other; those cases are caught by
12811          neon_cmode_for_move_imm.  */
12812       op = !op;
12813       if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
12814                                             &op, et.size, et.type)) == FAIL)
12815         {
12816           first_error (_("immediate out of range"));
12817           return;
12818         }
12819     }
12820
12821   inst.instruction &= ~(1 << 5);
12822   inst.instruction |= op << 5;
12823
12824   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12825   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12826   inst.instruction |= neon_quad (rs) << 6;
12827   inst.instruction |= cmode << 8;
12828
12829   neon_write_immbits (immbits);
12830 }
12831
12832 static void
12833 do_neon_mvn (void)
12834 {
12835   if (inst.operands[1].isreg)
12836     {
12837       enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
12838       
12839       inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12840       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12841       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12842       inst.instruction |= LOW4 (inst.operands[1].reg);
12843       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12844       inst.instruction |= neon_quad (rs) << 6;
12845     }
12846   else
12847     {
12848       inst.instruction = NEON_ENC_IMMED (inst.instruction);
12849       neon_move_immediate ();
12850     }
12851
12852   inst.instruction = neon_dp_fixup (inst.instruction);
12853 }
12854
12855 /* Encode instructions of form:
12856
12857   |28/24|23|22|21 20|19 16|15 12|11    8|7|6|5|4|3  0|
12858   |  U  |x |D |size | Rn  | Rd  |x x x x|N|x|M|x| Rm |
12859
12860 */
12861
12862 static void
12863 neon_mixed_length (struct neon_type_el et, unsigned size)
12864 {
12865   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12866   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12867   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
12868   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
12869   inst.instruction |= LOW4 (inst.operands[2].reg);
12870   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
12871   inst.instruction |= (et.type == NT_unsigned) << 24;
12872   inst.instruction |= neon_logbits (size) << 20;
12873   
12874   inst.instruction = neon_dp_fixup (inst.instruction);
12875 }
12876
12877 static void
12878 do_neon_dyadic_long (void)
12879 {
12880   /* FIXME: Type checking for lengthening op.  */
12881   struct neon_type_el et = neon_check_type (3, NS_QDD,
12882     N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
12883   neon_mixed_length (et, et.size);
12884 }
12885
12886 static void
12887 do_neon_abal (void)
12888 {
12889   struct neon_type_el et = neon_check_type (3, NS_QDD,
12890     N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
12891   neon_mixed_length (et, et.size);
12892 }
12893
12894 static void
12895 neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
12896 {
12897   if (inst.operands[2].isscalar)
12898     {
12899       struct neon_type_el et = neon_check_type (3, NS_QDS,
12900         N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
12901       inst.instruction = NEON_ENC_SCALAR (inst.instruction);
12902       neon_mul_mac (et, et.type == NT_unsigned);
12903     }
12904   else
12905     {
12906       struct neon_type_el et = neon_check_type (3, NS_QDD,
12907         N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
12908       inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12909       neon_mixed_length (et, et.size);
12910     }
12911 }
12912
12913 static void
12914 do_neon_mac_maybe_scalar_long (void)
12915 {
12916   neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
12917 }
12918
12919 static void
12920 do_neon_dyadic_wide (void)
12921 {
12922   struct neon_type_el et = neon_check_type (3, NS_QQD,
12923     N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
12924   neon_mixed_length (et, et.size);
12925 }
12926
12927 static void
12928 do_neon_dyadic_narrow (void)
12929 {
12930   struct neon_type_el et = neon_check_type (3, NS_QDD,
12931     N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
12932   /* Operand sign is unimportant, and the U bit is part of the opcode,
12933      so force the operand type to integer.  */
12934   et.type = NT_integer;
12935   neon_mixed_length (et, et.size / 2);
12936 }
12937
12938 static void
12939 do_neon_mul_sat_scalar_long (void)
12940 {
12941   neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
12942 }
12943
12944 static void
12945 do_neon_vmull (void)
12946 {
12947   if (inst.operands[2].isscalar)
12948     do_neon_mac_maybe_scalar_long ();
12949   else
12950     {
12951       struct neon_type_el et = neon_check_type (3, NS_QDD,
12952         N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_KEY);
12953       if (et.type == NT_poly)
12954         inst.instruction = NEON_ENC_POLY (inst.instruction);
12955       else
12956         inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12957       /* For polynomial encoding, size field must be 0b00 and the U bit must be
12958          zero. Should be OK as-is.  */
12959       neon_mixed_length (et, et.size);
12960     }
12961 }
12962
12963 static void
12964 do_neon_ext (void)
12965 {
12966   enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
12967   struct neon_type_el et = neon_check_type (3, rs,
12968     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
12969   unsigned imm = (inst.operands[3].imm * et.size) / 8;
12970   constraint (imm >= (neon_quad (rs) ? 16 : 8), _("shift out of range"));
12971   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12972   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12973   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
12974   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
12975   inst.instruction |= LOW4 (inst.operands[2].reg);
12976   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
12977   inst.instruction |= neon_quad (rs) << 6;
12978   inst.instruction |= imm << 8;
12979   
12980   inst.instruction = neon_dp_fixup (inst.instruction);
12981 }
12982
12983 static void
12984 do_neon_rev (void)
12985 {
12986   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
12987   struct neon_type_el et = neon_check_type (2, rs,
12988     N_EQK, N_8 | N_16 | N_32 | N_KEY);
12989   unsigned op = (inst.instruction >> 7) & 3;
12990   /* N (width of reversed regions) is encoded as part of the bitmask. We
12991      extract it here to check the elements to be reversed are smaller.
12992      Otherwise we'd get a reserved instruction.  */
12993   unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
12994   assert (elsize != 0);
12995   constraint (et.size >= elsize,
12996               _("elements must be smaller than reversal region"));
12997   neon_two_same (neon_quad (rs), 1, et.size);
12998 }
12999
13000 static void
13001 do_neon_dup (void)
13002 {
13003   if (inst.operands[1].isscalar)
13004     {
13005       enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
13006       struct neon_type_el et = neon_check_type (2, rs,
13007         N_EQK, N_8 | N_16 | N_32 | N_KEY);
13008       unsigned sizebits = et.size >> 3;
13009       unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
13010       int logsize = neon_logbits (et.size);
13011       unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
13012
13013       if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
13014         return;
13015
13016       inst.instruction = NEON_ENC_SCALAR (inst.instruction);
13017       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13018       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13019       inst.instruction |= LOW4 (dm);
13020       inst.instruction |= HI1 (dm) << 5;
13021       inst.instruction |= neon_quad (rs) << 6;
13022       inst.instruction |= x << 17;
13023       inst.instruction |= sizebits << 16;
13024       
13025       inst.instruction = neon_dp_fixup (inst.instruction);
13026     }
13027   else
13028     {
13029       enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
13030       struct neon_type_el et = neon_check_type (2, rs,
13031         N_8 | N_16 | N_32 | N_KEY, N_EQK);
13032       /* Duplicate ARM register to lanes of vector.  */
13033       inst.instruction = NEON_ENC_ARMREG (inst.instruction);
13034       switch (et.size)
13035         {
13036         case 8:  inst.instruction |= 0x400000; break;
13037         case 16: inst.instruction |= 0x000020; break;
13038         case 32: inst.instruction |= 0x000000; break;
13039         default: break;
13040         }
13041       inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
13042       inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
13043       inst.instruction |= HI1 (inst.operands[0].reg) << 7;
13044       inst.instruction |= neon_quad (rs) << 21;
13045       /* The encoding for this instruction is identical for the ARM and Thumb
13046          variants, except for the condition field.  */
13047       do_vfp_cond_or_thumb ();
13048     }
13049 }
13050
13051 /* VMOV has particularly many variations. It can be one of:
13052      0. VMOV<c><q> <Qd>, <Qm>
13053      1. VMOV<c><q> <Dd>, <Dm>
13054    (Register operations, which are VORR with Rm = Rn.)
13055      2. VMOV<c><q>.<dt> <Qd>, #<imm>
13056      3. VMOV<c><q>.<dt> <Dd>, #<imm>
13057    (Immediate loads.)
13058      4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
13059    (ARM register to scalar.)
13060      5. VMOV<c><q> <Dm>, <Rd>, <Rn>
13061    (Two ARM registers to vector.)
13062      6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
13063    (Scalar to ARM register.)
13064      7. VMOV<c><q> <Rd>, <Rn>, <Dm>
13065    (Vector to two ARM registers.)
13066      8. VMOV.F32 <Sd>, <Sm>
13067      9. VMOV.F64 <Dd>, <Dm>
13068    (VFP register moves.)
13069     10. VMOV.F32 <Sd>, #imm
13070     11. VMOV.F64 <Dd>, #imm
13071    (VFP float immediate load.)
13072     12. VMOV <Rd>, <Sm>
13073    (VFP single to ARM reg.)
13074     13. VMOV <Sd>, <Rm>
13075    (ARM reg to VFP single.)
13076     14. VMOV <Rd>, <Re>, <Sn>, <Sm>
13077    (Two ARM regs to two VFP singles.)
13078     15. VMOV <Sd>, <Se>, <Rn>, <Rm>
13079    (Two VFP singles to two ARM regs.)
13080   
13081    These cases can be disambiguated using neon_select_shape, except cases 1/9
13082    and 3/11 which depend on the operand type too.
13083    
13084    All the encoded bits are hardcoded by this function.
13085    
13086    Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
13087    Cases 5, 7 may be used with VFPv2 and above.
13088    
13089    FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
13090    can specify a type where it doesn't make sense to, and is ignored).
13091 */
13092
13093 static void
13094 do_neon_mov (void)
13095 {
13096   enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
13097     NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR, NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
13098     NS_NULL);
13099   struct neon_type_el et;
13100   const char *ldconst = 0;
13101
13102   switch (rs)
13103     {
13104     case NS_DD:  /* case 1/9.  */
13105       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
13106       /* It is not an error here if no type is given.  */
13107       inst.error = NULL;
13108       if (et.type == NT_float && et.size == 64)
13109         {
13110           do_vfp_nsyn_opcode ("fcpyd");
13111           break;
13112         }
13113       /* fall through.  */
13114
13115     case NS_QQ:  /* case 0/1.  */
13116       {
13117         if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13118           return;
13119         /* The architecture manual I have doesn't explicitly state which
13120            value the U bit should have for register->register moves, but
13121            the equivalent VORR instruction has U = 0, so do that.  */
13122         inst.instruction = 0x0200110;
13123         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13124         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13125         inst.instruction |= LOW4 (inst.operands[1].reg);
13126         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13127         inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13128         inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13129         inst.instruction |= neon_quad (rs) << 6;
13130
13131         inst.instruction = neon_dp_fixup (inst.instruction);
13132       }
13133       break;
13134         
13135     case NS_DI:  /* case 3/11.  */
13136       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
13137       inst.error = NULL;
13138       if (et.type == NT_float && et.size == 64)
13139         {
13140           /* case 11 (fconstd).  */
13141           ldconst = "fconstd";
13142           goto encode_fconstd;
13143         }
13144       /* fall through.  */
13145
13146     case NS_QI:  /* case 2/3.  */
13147       if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13148         return;
13149       inst.instruction = 0x0800010;
13150       neon_move_immediate ();
13151       inst.instruction = neon_dp_fixup (inst.instruction);
13152       break;
13153     
13154     case NS_SR:  /* case 4.  */
13155       {
13156         unsigned bcdebits = 0;
13157         struct neon_type_el et = neon_check_type (2, NS_NULL,
13158           N_8 | N_16 | N_32 | N_KEY, N_EQK);
13159         int logsize = neon_logbits (et.size);
13160         unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
13161         unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
13162
13163         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
13164                     _(BAD_FPU));
13165         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
13166                     && et.size != 32, _(BAD_FPU));
13167         constraint (et.type == NT_invtype, _("bad type for scalar"));
13168         constraint (x >= 64 / et.size, _("scalar index out of range"));
13169
13170         switch (et.size)
13171           {
13172           case 8:  bcdebits = 0x8; break;
13173           case 16: bcdebits = 0x1; break;
13174           case 32: bcdebits = 0x0; break;
13175           default: ;
13176           }
13177
13178         bcdebits |= x << logsize;
13179
13180         inst.instruction = 0xe000b10;
13181         do_vfp_cond_or_thumb ();
13182         inst.instruction |= LOW4 (dn) << 16;
13183         inst.instruction |= HI1 (dn) << 7;
13184         inst.instruction |= inst.operands[1].reg << 12;
13185         inst.instruction |= (bcdebits & 3) << 5;
13186         inst.instruction |= (bcdebits >> 2) << 21;
13187       }
13188       break;
13189     
13190     case NS_DRR:  /* case 5 (fmdrr).  */
13191       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
13192                   _(BAD_FPU));
13193
13194       inst.instruction = 0xc400b10;
13195       do_vfp_cond_or_thumb ();
13196       inst.instruction |= LOW4 (inst.operands[0].reg);
13197       inst.instruction |= HI1 (inst.operands[0].reg) << 5;
13198       inst.instruction |= inst.operands[1].reg << 12;
13199       inst.instruction |= inst.operands[2].reg << 16;
13200       break;
13201     
13202     case NS_RS:  /* case 6.  */
13203       {
13204         struct neon_type_el et = neon_check_type (2, NS_NULL,
13205           N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
13206         unsigned logsize = neon_logbits (et.size);
13207         unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
13208         unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
13209         unsigned abcdebits = 0;
13210
13211         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
13212                     _(BAD_FPU));
13213         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
13214                     && et.size != 32, _(BAD_FPU));
13215         constraint (et.type == NT_invtype, _("bad type for scalar"));
13216         constraint (x >= 64 / et.size, _("scalar index out of range"));
13217
13218         switch (et.size)
13219           {
13220           case 8:  abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
13221           case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
13222           case 32: abcdebits = 0x00; break;
13223           default: ;
13224           }
13225
13226         abcdebits |= x << logsize;
13227         inst.instruction = 0xe100b10;
13228         do_vfp_cond_or_thumb ();
13229         inst.instruction |= LOW4 (dn) << 16;
13230         inst.instruction |= HI1 (dn) << 7;
13231         inst.instruction |= inst.operands[0].reg << 12;
13232         inst.instruction |= (abcdebits & 3) << 5;
13233         inst.instruction |= (abcdebits >> 2) << 21;
13234       }
13235       break;
13236     
13237     case NS_RRD:  /* case 7 (fmrrd).  */
13238       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
13239                   _(BAD_FPU));
13240
13241       inst.instruction = 0xc500b10;
13242       do_vfp_cond_or_thumb ();
13243       inst.instruction |= inst.operands[0].reg << 12;
13244       inst.instruction |= inst.operands[1].reg << 16;
13245       inst.instruction |= LOW4 (inst.operands[2].reg);
13246       inst.instruction |= HI1 (inst.operands[2].reg) << 5;
13247       break;
13248     
13249     case NS_FF:  /* case 8 (fcpys).  */
13250       do_vfp_nsyn_opcode ("fcpys");
13251       break;
13252     
13253     case NS_FI:  /* case 10 (fconsts).  */
13254       ldconst = "fconsts";
13255       encode_fconstd:
13256       if (is_quarter_float (inst.operands[1].imm))
13257         {
13258           inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
13259           do_vfp_nsyn_opcode (ldconst);
13260         }
13261       else
13262         first_error (_("immediate out of range"));
13263       break;
13264     
13265     case NS_RF:  /* case 12 (fmrs).  */
13266       do_vfp_nsyn_opcode ("fmrs");
13267       break;
13268     
13269     case NS_FR:  /* case 13 (fmsr).  */
13270       do_vfp_nsyn_opcode ("fmsr");
13271       break;
13272     
13273     /* The encoders for the fmrrs and fmsrr instructions expect three operands
13274        (one of which is a list), but we have parsed four.  Do some fiddling to
13275        make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
13276        expect.  */
13277     case NS_RRFF:  /* case 14 (fmrrs).  */
13278       constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
13279                   _("VFP registers must be adjacent"));
13280       inst.operands[2].imm = 2;
13281       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
13282       do_vfp_nsyn_opcode ("fmrrs");
13283       break;
13284     
13285     case NS_FFRR:  /* case 15 (fmsrr).  */
13286       constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
13287                   _("VFP registers must be adjacent"));
13288       inst.operands[1] = inst.operands[2];
13289       inst.operands[2] = inst.operands[3];
13290       inst.operands[0].imm = 2;
13291       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
13292       do_vfp_nsyn_opcode ("fmsrr");
13293       break;
13294     
13295     default:
13296       abort ();
13297     }
13298 }
13299
13300 static void
13301 do_neon_rshift_round_imm (void)
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_SU_ALL | N_KEY);
13305   int imm = inst.operands[2].imm;
13306
13307   /* imm == 0 case is encoded as VMOV for V{R}SHR.  */
13308   if (imm == 0)
13309     {
13310       inst.operands[2].present = 0;
13311       do_neon_mov ();
13312       return;
13313     }
13314
13315   constraint (imm < 1 || (unsigned)imm > et.size,
13316               _("immediate out of range for shift"));
13317   neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
13318                   et.size - imm);
13319 }
13320
13321 static void
13322 do_neon_movl (void)
13323 {
13324   struct neon_type_el et = neon_check_type (2, NS_QD,
13325     N_EQK | N_DBL, N_SU_32 | N_KEY);
13326   unsigned sizebits = et.size >> 3;
13327   inst.instruction |= sizebits << 19;
13328   neon_two_same (0, et.type == NT_unsigned, -1);
13329 }
13330
13331 static void
13332 do_neon_trn (void)
13333 {
13334   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13335   struct neon_type_el et = neon_check_type (2, rs,
13336     N_EQK, N_8 | N_16 | N_32 | N_KEY);
13337   inst.instruction = NEON_ENC_INTEGER (inst.instruction);
13338   neon_two_same (neon_quad (rs), 1, et.size);
13339 }
13340
13341 static void
13342 do_neon_zip_uzp (void)
13343 {
13344   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13345   struct neon_type_el et = neon_check_type (2, rs,
13346     N_EQK, N_8 | N_16 | N_32 | N_KEY);
13347   if (rs == NS_DD && et.size == 32)
13348     {
13349       /* Special case: encode as VTRN.32 <Dd>, <Dm>.  */
13350       inst.instruction = N_MNEM_vtrn;
13351       do_neon_trn ();
13352       return;
13353     }
13354   neon_two_same (neon_quad (rs), 1, et.size);
13355 }
13356
13357 static void
13358 do_neon_sat_abs_neg (void)
13359 {
13360   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13361   struct neon_type_el et = neon_check_type (2, rs,
13362     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
13363   neon_two_same (neon_quad (rs), 1, et.size);
13364 }
13365
13366 static void
13367 do_neon_pair_long (void)
13368 {
13369   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13370   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
13371   /* Unsigned is encoded in OP field (bit 7) for these instruction.  */
13372   inst.instruction |= (et.type == NT_unsigned) << 7;
13373   neon_two_same (neon_quad (rs), 1, et.size);
13374 }
13375
13376 static void
13377 do_neon_recip_est (void)
13378 {
13379   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13380   struct neon_type_el et = neon_check_type (2, rs,
13381     N_EQK | N_FLT, N_F32 | N_U32 | N_KEY);
13382   inst.instruction |= (et.type == NT_float) << 8;
13383   neon_two_same (neon_quad (rs), 1, et.size);
13384 }
13385
13386 static void
13387 do_neon_cls (void)
13388 {
13389   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13390   struct neon_type_el et = neon_check_type (2, rs,
13391     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
13392   neon_two_same (neon_quad (rs), 1, et.size);
13393 }
13394
13395 static void
13396 do_neon_clz (void)
13397 {
13398   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13399   struct neon_type_el et = neon_check_type (2, rs,
13400     N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
13401   neon_two_same (neon_quad (rs), 1, et.size);
13402 }
13403
13404 static void
13405 do_neon_cnt (void)
13406 {
13407   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13408   struct neon_type_el et = neon_check_type (2, rs,
13409     N_EQK | N_INT, N_8 | N_KEY);
13410   neon_two_same (neon_quad (rs), 1, et.size);
13411 }
13412
13413 static void
13414 do_neon_swp (void)
13415 {
13416   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13417   neon_two_same (neon_quad (rs), 1, -1);
13418 }
13419
13420 static void
13421 do_neon_tbl_tbx (void)
13422 {
13423   unsigned listlenbits;
13424   neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
13425   
13426   if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
13427     {
13428       first_error (_("bad list length for table lookup"));
13429       return;
13430     }
13431   
13432   listlenbits = inst.operands[1].imm - 1;
13433   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13434   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13435   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13436   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13437   inst.instruction |= LOW4 (inst.operands[2].reg);
13438   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
13439   inst.instruction |= listlenbits << 8;
13440   
13441   inst.instruction = neon_dp_fixup (inst.instruction);
13442 }
13443
13444 static void
13445 do_neon_ldm_stm (void)
13446 {
13447   /* P, U and L bits are part of bitmask.  */
13448   int is_dbmode = (inst.instruction & (1 << 24)) != 0;
13449   unsigned offsetbits = inst.operands[1].imm * 2;
13450
13451   if (inst.operands[1].issingle)
13452     {
13453       do_vfp_nsyn_ldm_stm (is_dbmode);
13454       return;
13455     }
13456
13457   constraint (is_dbmode && !inst.operands[0].writeback,
13458               _("writeback (!) must be used for VLDMDB and VSTMDB"));
13459
13460   constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
13461               _("register list must contain at least 1 and at most 16 "
13462                 "registers"));
13463
13464   inst.instruction |= inst.operands[0].reg << 16;
13465   inst.instruction |= inst.operands[0].writeback << 21;
13466   inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
13467   inst.instruction |= HI1 (inst.operands[1].reg) << 22;
13468
13469   inst.instruction |= offsetbits;
13470   
13471   do_vfp_cond_or_thumb ();
13472 }
13473
13474 static void
13475 do_neon_ldr_str (void)
13476 {
13477   int is_ldr = (inst.instruction & (1 << 20)) != 0;
13478   
13479   if (inst.operands[0].issingle)
13480     {
13481       if (is_ldr)
13482         do_vfp_nsyn_opcode ("flds");
13483       else
13484         do_vfp_nsyn_opcode ("fsts");
13485     }
13486   else
13487     {
13488       if (is_ldr)
13489         do_vfp_nsyn_opcode ("fldd");
13490       else
13491         do_vfp_nsyn_opcode ("fstd");
13492     }
13493 }
13494
13495 /* "interleave" version also handles non-interleaving register VLD1/VST1
13496    instructions.  */
13497
13498 static void
13499 do_neon_ld_st_interleave (void)
13500 {
13501   struct neon_type_el et = neon_check_type (1, NS_NULL,
13502                                             N_8 | N_16 | N_32 | N_64);
13503   unsigned alignbits = 0;
13504   unsigned idx;
13505   /* The bits in this table go:
13506      0: register stride of one (0) or two (1)
13507      1,2: register list length, minus one (1, 2, 3, 4).
13508      3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
13509      We use -1 for invalid entries.  */
13510   const int typetable[] =
13511     {
13512       0x7,  -1, 0xa,  -1, 0x6,  -1, 0x2,  -1, /* VLD1 / VST1.  */
13513        -1,  -1, 0x8, 0x9,  -1,  -1, 0x3,  -1, /* VLD2 / VST2.  */
13514        -1,  -1,  -1,  -1, 0x4, 0x5,  -1,  -1, /* VLD3 / VST3.  */
13515        -1,  -1,  -1,  -1,  -1,  -1, 0x0, 0x1  /* VLD4 / VST4.  */
13516     };
13517   int typebits;
13518
13519   if (et.type == NT_invtype)
13520     return;
13521
13522   if (inst.operands[1].immisalign)
13523     switch (inst.operands[1].imm >> 8)
13524       {
13525       case 64: alignbits = 1; break;
13526       case 128:
13527         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) == 3)
13528           goto bad_alignment;
13529         alignbits = 2;
13530         break;
13531       case 256:
13532         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) == 3)
13533           goto bad_alignment;
13534         alignbits = 3;
13535         break;
13536       default:
13537       bad_alignment:
13538         first_error (_("bad alignment"));
13539         return;
13540       }
13541
13542   inst.instruction |= alignbits << 4;
13543   inst.instruction |= neon_logbits (et.size) << 6;
13544
13545   /* Bits [4:6] of the immediate in a list specifier encode register stride
13546      (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
13547      VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
13548      up the right value for "type" in a table based on this value and the given
13549      list style, then stick it back.  */
13550   idx = ((inst.operands[0].imm >> 4) & 7)
13551         | (((inst.instruction >> 8) & 3) << 3);
13552
13553   typebits = typetable[idx];
13554   
13555   constraint (typebits == -1, _("bad list type for instruction"));
13556
13557   inst.instruction &= ~0xf00;
13558   inst.instruction |= typebits << 8;
13559 }
13560
13561 /* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
13562    *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
13563    otherwise. The variable arguments are a list of pairs of legal (size, align)
13564    values, terminated with -1.  */
13565
13566 static int
13567 neon_alignment_bit (int size, int align, int *do_align, ...)
13568 {
13569   va_list ap;
13570   int result = FAIL, thissize, thisalign;
13571     
13572   if (!inst.operands[1].immisalign)
13573     {
13574       *do_align = 0;
13575       return SUCCESS;
13576     }
13577       
13578   va_start (ap, do_align);
13579
13580   do
13581     {
13582       thissize = va_arg (ap, int);
13583       if (thissize == -1)
13584         break;
13585       thisalign = va_arg (ap, int);
13586
13587       if (size == thissize && align == thisalign)
13588         result = SUCCESS;
13589     }
13590   while (result != SUCCESS);
13591
13592   va_end (ap);
13593
13594   if (result == SUCCESS)
13595     *do_align = 1;
13596   else
13597     first_error (_("unsupported alignment for instruction"));
13598     
13599   return result;
13600 }
13601
13602 static void
13603 do_neon_ld_st_lane (void)
13604 {
13605   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
13606   int align_good, do_align = 0;
13607   int logsize = neon_logbits (et.size);
13608   int align = inst.operands[1].imm >> 8;
13609   int n = (inst.instruction >> 8) & 3;
13610   int max_el = 64 / et.size;
13611   
13612   if (et.type == NT_invtype)
13613     return;
13614   
13615   constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
13616               _("bad list length"));
13617   constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
13618               _("scalar index out of range"));
13619   constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
13620               && et.size == 8,
13621               _("stride of 2 unavailable when element size is 8"));
13622   
13623   switch (n)
13624     {
13625     case 0:  /* VLD1 / VST1.  */
13626       align_good = neon_alignment_bit (et.size, align, &do_align, 16, 16,
13627                                        32, 32, -1);
13628       if (align_good == FAIL)
13629         return;
13630       if (do_align)
13631         {
13632           unsigned alignbits = 0;
13633           switch (et.size)
13634             {
13635             case 16: alignbits = 0x1; break;
13636             case 32: alignbits = 0x3; break;
13637             default: ;
13638             }
13639           inst.instruction |= alignbits << 4;
13640         }
13641       break;
13642
13643     case 1:  /* VLD2 / VST2.  */
13644       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 16, 16, 32,
13645                                        32, 64, -1);
13646       if (align_good == FAIL)
13647         return;
13648       if (do_align)
13649         inst.instruction |= 1 << 4;
13650       break;
13651
13652     case 2:  /* VLD3 / VST3.  */
13653       constraint (inst.operands[1].immisalign,
13654                   _("can't use alignment with this instruction"));
13655       break;
13656
13657     case 3:  /* VLD4 / VST4.  */
13658       align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
13659                                        16, 64, 32, 64, 32, 128, -1);
13660       if (align_good == FAIL)
13661         return;
13662       if (do_align)
13663         {
13664           unsigned alignbits = 0;
13665           switch (et.size)
13666             {
13667             case 8:  alignbits = 0x1; break;
13668             case 16: alignbits = 0x1; break;
13669             case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
13670             default: ;
13671             }
13672           inst.instruction |= alignbits << 4;
13673         }
13674       break;
13675
13676     default: ;
13677     }
13678
13679   /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32.  */
13680   if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
13681     inst.instruction |= 1 << (4 + logsize);
13682       
13683   inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
13684   inst.instruction |= logsize << 10;
13685 }
13686
13687 /* Encode single n-element structure to all lanes VLD<n> instructions.  */
13688
13689 static void
13690 do_neon_ld_dup (void)
13691 {
13692   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
13693   int align_good, do_align = 0;
13694
13695   if (et.type == NT_invtype)
13696     return;
13697
13698   switch ((inst.instruction >> 8) & 3)
13699     {
13700     case 0:  /* VLD1.  */
13701       assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
13702       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
13703                                        &do_align, 16, 16, 32, 32, -1);
13704       if (align_good == FAIL)
13705         return;
13706       switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
13707         {
13708         case 1: break;
13709         case 2: inst.instruction |= 1 << 5; break;
13710         default: first_error (_("bad list length")); return;
13711         }
13712       inst.instruction |= neon_logbits (et.size) << 6;
13713       break;
13714
13715     case 1:  /* VLD2.  */
13716       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
13717                                        &do_align, 8, 16, 16, 32, 32, 64, -1);
13718       if (align_good == FAIL)
13719         return;
13720       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
13721                   _("bad list length"));
13722       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
13723         inst.instruction |= 1 << 5;
13724       inst.instruction |= neon_logbits (et.size) << 6;
13725       break;
13726
13727     case 2:  /* VLD3.  */
13728       constraint (inst.operands[1].immisalign,
13729                   _("can't use alignment with this instruction"));
13730       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
13731                   _("bad list length"));
13732       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
13733         inst.instruction |= 1 << 5;
13734       inst.instruction |= neon_logbits (et.size) << 6;
13735       break;
13736
13737     case 3:  /* VLD4.  */
13738       {
13739         int align = inst.operands[1].imm >> 8;
13740         align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
13741                                          16, 64, 32, 64, 32, 128, -1);
13742         if (align_good == FAIL)
13743           return;
13744         constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
13745                     _("bad list length"));
13746         if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
13747           inst.instruction |= 1 << 5;
13748         if (et.size == 32 && align == 128)
13749           inst.instruction |= 0x3 << 6;
13750         else
13751           inst.instruction |= neon_logbits (et.size) << 6;
13752       }
13753       break;
13754
13755     default: ;
13756     }
13757
13758   inst.instruction |= do_align << 4;
13759 }
13760
13761 /* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
13762    apart from bits [11:4].  */
13763
13764 static void
13765 do_neon_ldx_stx (void)
13766 {
13767   switch (NEON_LANE (inst.operands[0].imm))
13768     {
13769     case NEON_INTERLEAVE_LANES:
13770       inst.instruction = NEON_ENC_INTERLV (inst.instruction);
13771       do_neon_ld_st_interleave ();
13772       break;
13773     
13774     case NEON_ALL_LANES:
13775       inst.instruction = NEON_ENC_DUP (inst.instruction);
13776       do_neon_ld_dup ();
13777       break;
13778     
13779     default:
13780       inst.instruction = NEON_ENC_LANE (inst.instruction);
13781       do_neon_ld_st_lane ();
13782     }
13783
13784   /* L bit comes from bit mask.  */
13785   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13786   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13787   inst.instruction |= inst.operands[1].reg << 16;
13788   
13789   if (inst.operands[1].postind)
13790     {
13791       int postreg = inst.operands[1].imm & 0xf;
13792       constraint (!inst.operands[1].immisreg,
13793                   _("post-index must be a register"));
13794       constraint (postreg == 0xd || postreg == 0xf,
13795                   _("bad register for post-index"));
13796       inst.instruction |= postreg;
13797     }
13798   else if (inst.operands[1].writeback)
13799     {
13800       inst.instruction |= 0xd;
13801     }
13802   else
13803     inst.instruction |= 0xf; 
13804   
13805   if (thumb_mode)
13806     inst.instruction |= 0xf9000000;
13807   else
13808     inst.instruction |= 0xf4000000;
13809 }
13810
13811 \f
13812 /* Overall per-instruction processing.  */
13813
13814 /* We need to be able to fix up arbitrary expressions in some statements.
13815    This is so that we can handle symbols that are an arbitrary distance from
13816    the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
13817    which returns part of an address in a form which will be valid for
13818    a data instruction.  We do this by pushing the expression into a symbol
13819    in the expr_section, and creating a fix for that.  */
13820
13821 static void
13822 fix_new_arm (fragS *       frag,
13823              int           where,
13824              short int     size,
13825              expressionS * exp,
13826              int           pc_rel,
13827              int           reloc)
13828 {
13829   fixS *           new_fix;
13830
13831   switch (exp->X_op)
13832     {
13833     case O_constant:
13834     case O_symbol:
13835     case O_add:
13836     case O_subtract:
13837       new_fix = fix_new_exp (frag, where, size, exp, pc_rel, reloc);
13838       break;
13839
13840     default:
13841       new_fix = fix_new (frag, where, size, make_expr_symbol (exp), 0,
13842                          pc_rel, reloc);
13843       break;
13844     }
13845
13846   /* Mark whether the fix is to a THUMB instruction, or an ARM
13847      instruction.  */
13848   new_fix->tc_fix_data = thumb_mode;
13849 }
13850
13851 /* Create a frg for an instruction requiring relaxation.  */
13852 static void
13853 output_relax_insn (void)
13854 {
13855   char * to;
13856   symbolS *sym;
13857   int offset;
13858
13859   /* The size of the instruction is unknown, so tie the debug info to the
13860      start of the instruction.  */
13861   dwarf2_emit_insn (0);
13862
13863   switch (inst.reloc.exp.X_op)
13864     {
13865     case O_symbol:
13866       sym = inst.reloc.exp.X_add_symbol;
13867       offset = inst.reloc.exp.X_add_number;
13868       break;
13869     case O_constant:
13870       sym = NULL;
13871       offset = inst.reloc.exp.X_add_number;
13872       break;
13873     default:
13874       sym = make_expr_symbol (&inst.reloc.exp);
13875       offset = 0;
13876       break;
13877   }
13878   to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
13879                  inst.relax, sym, offset, NULL/*offset, opcode*/);
13880   md_number_to_chars (to, inst.instruction, THUMB_SIZE);
13881 }
13882
13883 /* Write a 32-bit thumb instruction to buf.  */
13884 static void
13885 put_thumb32_insn (char * buf, unsigned long insn)
13886 {
13887   md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
13888   md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
13889 }
13890
13891 static void
13892 output_inst (const char * str)
13893 {
13894   char * to = NULL;
13895
13896   if (inst.error)
13897     {
13898       as_bad ("%s -- `%s'", inst.error, str);
13899       return;
13900     }
13901   if (inst.relax) {
13902       output_relax_insn();
13903       return;
13904   }
13905   if (inst.size == 0)
13906     return;
13907
13908   to = frag_more (inst.size);
13909
13910   if (thumb_mode && (inst.size > THUMB_SIZE))
13911     {
13912       assert (inst.size == (2 * THUMB_SIZE));
13913       put_thumb32_insn (to, inst.instruction);
13914     }
13915   else if (inst.size > INSN_SIZE)
13916     {
13917       assert (inst.size == (2 * INSN_SIZE));
13918       md_number_to_chars (to, inst.instruction, INSN_SIZE);
13919       md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
13920     }
13921   else
13922     md_number_to_chars (to, inst.instruction, inst.size);
13923
13924   if (inst.reloc.type != BFD_RELOC_UNUSED)
13925     fix_new_arm (frag_now, to - frag_now->fr_literal,
13926                  inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
13927                  inst.reloc.type);
13928
13929   dwarf2_emit_insn (inst.size);
13930 }
13931
13932 /* Tag values used in struct asm_opcode's tag field.  */
13933 enum opcode_tag
13934 {
13935   OT_unconditional,     /* Instruction cannot be conditionalized.
13936                            The ARM condition field is still 0xE.  */
13937   OT_unconditionalF,    /* Instruction cannot be conditionalized
13938                            and carries 0xF in its ARM condition field.  */
13939   OT_csuffix,           /* Instruction takes a conditional suffix.  */
13940   OT_csuffixF,          /* Some forms of the instruction take a conditional
13941                            suffix, others place 0xF where the condition field
13942                            would be.  */
13943   OT_cinfix3,           /* Instruction takes a conditional infix,
13944                            beginning at character index 3.  (In
13945                            unified mode, it becomes a suffix.)  */
13946   OT_cinfix3_deprecated, /* The same as OT_cinfix3.  This is used for
13947                             tsts, cmps, cmns, and teqs. */
13948   OT_cinfix3_legacy,    /* Legacy instruction takes a conditional infix at
13949                            character index 3, even in unified mode.  Used for
13950                            legacy instructions where suffix and infix forms
13951                            may be ambiguous.  */
13952   OT_csuf_or_in3,       /* Instruction takes either a conditional
13953                            suffix or an infix at character index 3.  */
13954   OT_odd_infix_unc,     /* This is the unconditional variant of an
13955                            instruction that takes a conditional infix
13956                            at an unusual position.  In unified mode,
13957                            this variant will accept a suffix.  */
13958   OT_odd_infix_0        /* Values greater than or equal to OT_odd_infix_0
13959                            are the conditional variants of instructions that
13960                            take conditional infixes in unusual positions.
13961                            The infix appears at character index
13962                            (tag - OT_odd_infix_0).  These are not accepted
13963                            in unified mode.  */
13964 };
13965
13966 /* Subroutine of md_assemble, responsible for looking up the primary
13967    opcode from the mnemonic the user wrote.  STR points to the
13968    beginning of the mnemonic.
13969
13970    This is not simply a hash table lookup, because of conditional
13971    variants.  Most instructions have conditional variants, which are
13972    expressed with a _conditional affix_ to the mnemonic.  If we were
13973    to encode each conditional variant as a literal string in the opcode
13974    table, it would have approximately 20,000 entries.
13975
13976    Most mnemonics take this affix as a suffix, and in unified syntax,
13977    'most' is upgraded to 'all'.  However, in the divided syntax, some
13978    instructions take the affix as an infix, notably the s-variants of
13979    the arithmetic instructions.  Of those instructions, all but six
13980    have the infix appear after the third character of the mnemonic.
13981
13982    Accordingly, the algorithm for looking up primary opcodes given
13983    an identifier is:
13984
13985    1. Look up the identifier in the opcode table.
13986       If we find a match, go to step U.
13987
13988    2. Look up the last two characters of the identifier in the
13989       conditions table.  If we find a match, look up the first N-2
13990       characters of the identifier in the opcode table.  If we
13991       find a match, go to step CE.
13992
13993    3. Look up the fourth and fifth characters of the identifier in
13994       the conditions table.  If we find a match, extract those
13995       characters from the identifier, and look up the remaining
13996       characters in the opcode table.  If we find a match, go
13997       to step CM.
13998
13999    4. Fail.
14000
14001    U. Examine the tag field of the opcode structure, in case this is
14002       one of the six instructions with its conditional infix in an
14003       unusual place.  If it is, the tag tells us where to find the
14004       infix; look it up in the conditions table and set inst.cond
14005       accordingly.  Otherwise, this is an unconditional instruction.
14006       Again set inst.cond accordingly.  Return the opcode structure.
14007
14008   CE. Examine the tag field to make sure this is an instruction that
14009       should receive a conditional suffix.  If it is not, fail.
14010       Otherwise, set inst.cond from the suffix we already looked up,
14011       and return the opcode structure.
14012
14013   CM. Examine the tag field to make sure this is an instruction that
14014       should receive a conditional infix after the third character.
14015       If it is not, fail.  Otherwise, undo the edits to the current
14016       line of input and proceed as for case CE.  */
14017
14018 static const struct asm_opcode *
14019 opcode_lookup (char **str)
14020 {
14021   char *end, *base;
14022   char *affix;
14023   const struct asm_opcode *opcode;
14024   const struct asm_cond *cond;
14025   char save[2];
14026   bfd_boolean neon_supported;
14027   
14028   neon_supported = ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1);
14029
14030   /* Scan up to the end of the mnemonic, which must end in white space,
14031      '.' (in unified mode, or for Neon instructions), or end of string.  */
14032   for (base = end = *str; *end != '\0'; end++)
14033     if (*end == ' ' || ((unified_syntax || neon_supported) && *end == '.'))
14034       break;
14035
14036   if (end == base)
14037     return 0;
14038
14039   /* Handle a possible width suffix and/or Neon type suffix.  */
14040   if (end[0] == '.')
14041     {
14042       int offset = 2;
14043       
14044       /* The .w and .n suffixes are only valid if the unified syntax is in
14045          use.  */
14046       if (unified_syntax && end[1] == 'w')
14047         inst.size_req = 4;
14048       else if (unified_syntax && end[1] == 'n')
14049         inst.size_req = 2;
14050       else
14051         offset = 0;
14052
14053       inst.vectype.elems = 0;
14054
14055       *str = end + offset;
14056
14057       if (end[offset] == '.')      
14058         {
14059           /* See if we have a Neon type suffix (possible in either unified or
14060              non-unified ARM syntax mode).  */
14061           if (parse_neon_type (&inst.vectype, str) == FAIL)
14062             return 0;
14063         }
14064       else if (end[offset] != '\0' && end[offset] != ' ')
14065         return 0;
14066     }
14067   else
14068     *str = end;
14069
14070   /* Look for unaffixed or special-case affixed mnemonic.  */
14071   opcode = hash_find_n (arm_ops_hsh, base, end - base);
14072   if (opcode)
14073     {
14074       /* step U */
14075       if (opcode->tag < OT_odd_infix_0)
14076         {
14077           inst.cond = COND_ALWAYS;
14078           return opcode;
14079         }
14080
14081       if (unified_syntax)
14082         as_warn (_("conditional infixes are deprecated in unified syntax"));
14083       affix = base + (opcode->tag - OT_odd_infix_0);
14084       cond = hash_find_n (arm_cond_hsh, affix, 2);
14085       assert (cond);
14086
14087       inst.cond = cond->value;
14088       return opcode;
14089     }
14090
14091   /* Cannot have a conditional suffix on a mnemonic of less than two
14092      characters.  */
14093   if (end - base < 3)
14094     return 0;
14095
14096   /* Look for suffixed mnemonic.  */
14097   affix = end - 2;
14098   cond = hash_find_n (arm_cond_hsh, affix, 2);
14099   opcode = hash_find_n (arm_ops_hsh, base, affix - base);
14100   if (opcode && cond)
14101     {
14102       /* step CE */
14103       switch (opcode->tag)
14104         {
14105         case OT_cinfix3_legacy:
14106           /* Ignore conditional suffixes matched on infix only mnemonics.  */
14107           break;
14108
14109         case OT_cinfix3:
14110         case OT_cinfix3_deprecated:
14111         case OT_odd_infix_unc:
14112           if (!unified_syntax)
14113             return 0;
14114           /* else fall through */
14115
14116         case OT_csuffix:
14117         case OT_csuffixF:
14118         case OT_csuf_or_in3:
14119           inst.cond = cond->value;
14120           return opcode;
14121
14122         case OT_unconditional:
14123         case OT_unconditionalF:
14124           if (thumb_mode)
14125             {
14126               inst.cond = cond->value;
14127             }
14128           else
14129             {
14130               /* delayed diagnostic */
14131               inst.error = BAD_COND;
14132               inst.cond = COND_ALWAYS;
14133             }
14134           return opcode;
14135
14136         default:
14137           return 0;
14138         }
14139     }
14140
14141   /* Cannot have a usual-position infix on a mnemonic of less than
14142      six characters (five would be a suffix).  */
14143   if (end - base < 6)
14144     return 0;
14145
14146   /* Look for infixed mnemonic in the usual position.  */
14147   affix = base + 3;
14148   cond = hash_find_n (arm_cond_hsh, affix, 2);
14149   if (!cond)
14150     return 0;
14151
14152   memcpy (save, affix, 2);
14153   memmove (affix, affix + 2, (end - affix) - 2);
14154   opcode = hash_find_n (arm_ops_hsh, base, (end - base) - 2);
14155   memmove (affix + 2, affix, (end - affix) - 2);
14156   memcpy (affix, save, 2);
14157
14158   if (opcode
14159       && (opcode->tag == OT_cinfix3
14160           || opcode->tag == OT_cinfix3_deprecated
14161           || opcode->tag == OT_csuf_or_in3
14162           || opcode->tag == OT_cinfix3_legacy))
14163     {
14164       /* step CM */
14165       if (unified_syntax
14166           && (opcode->tag == OT_cinfix3
14167               || opcode->tag == OT_cinfix3_deprecated))
14168         as_warn (_("conditional infixes are deprecated in unified syntax"));
14169
14170       inst.cond = cond->value;
14171       return opcode;
14172     }
14173
14174   return 0;
14175 }
14176
14177 void
14178 md_assemble (char *str)
14179 {
14180   char *p = str;
14181   const struct asm_opcode * opcode;
14182
14183   /* Align the previous label if needed.  */
14184   if (last_label_seen != NULL)
14185     {
14186       symbol_set_frag (last_label_seen, frag_now);
14187       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
14188       S_SET_SEGMENT (last_label_seen, now_seg);
14189     }
14190
14191   memset (&inst, '\0', sizeof (inst));
14192   inst.reloc.type = BFD_RELOC_UNUSED;
14193
14194   opcode = opcode_lookup (&p);
14195   if (!opcode)
14196     {
14197       /* It wasn't an instruction, but it might be a register alias of
14198          the form alias .req reg, or a Neon .dn/.qn directive.  */
14199       if (!create_register_alias (str, p)
14200           && !create_neon_reg_alias (str, p))
14201         as_bad (_("bad instruction `%s'"), str);
14202
14203       return;
14204     }
14205
14206   if (opcode->tag == OT_cinfix3_deprecated)
14207     as_warn (_("s suffix on comparison instruction is deprecated"));
14208
14209   /* The value which unconditional instructions should have in place of the
14210      condition field.  */
14211   inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
14212
14213   if (thumb_mode)
14214     {
14215       arm_feature_set variant;
14216
14217       variant = cpu_variant;
14218       /* Only allow coprocessor instructions on Thumb-2 capable devices.  */
14219       if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
14220         ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
14221       /* Check that this instruction is supported for this CPU.  */
14222       if (!opcode->tvariant
14223           || (thumb_mode == 1
14224               && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
14225         {
14226           as_bad (_("selected processor does not support `%s'"), str);
14227           return;
14228         }
14229       if (inst.cond != COND_ALWAYS && !unified_syntax
14230           && opcode->tencode != do_t_branch)
14231         {
14232           as_bad (_("Thumb does not support conditional execution"));
14233           return;
14234         }
14235
14236       if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2) && !inst.size_req)
14237         {
14238           /* Implicit require narrow instructions on Thumb-1.  This avoids
14239              relaxation accidentally introducing Thumb-2 instructions.  */
14240           if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23)
14241             inst.size_req = 2;
14242         }
14243
14244       /* Check conditional suffixes.  */
14245       if (current_it_mask)
14246         {
14247           int cond;
14248           cond = current_cc ^ ((current_it_mask >> 4) & 1) ^ 1;
14249           current_it_mask <<= 1;
14250           current_it_mask &= 0x1f;
14251           /* The BKPT instruction is unconditional even in an IT block.  */
14252           if (!inst.error
14253               && cond != inst.cond && opcode->tencode != do_t_bkpt)
14254             {
14255               as_bad (_("incorrect condition in IT block"));
14256               return;
14257             }
14258         }
14259       else if (inst.cond != COND_ALWAYS && opcode->tencode != do_t_branch)
14260         {
14261           as_bad (_("thumb conditional instrunction not in IT block"));
14262           return;
14263         }
14264
14265       mapping_state (MAP_THUMB);
14266       inst.instruction = opcode->tvalue;
14267
14268       if (!parse_operands (p, opcode->operands))
14269         opcode->tencode ();
14270
14271       /* Clear current_it_mask at the end of an IT block.  */
14272       if (current_it_mask == 0x10)
14273         current_it_mask = 0;
14274
14275       if (!(inst.error || inst.relax))
14276         {
14277           assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
14278           inst.size = (inst.instruction > 0xffff ? 4 : 2);
14279           if (inst.size_req && inst.size_req != inst.size)
14280             {
14281               as_bad (_("cannot honor width suffix -- `%s'"), str);
14282               return;
14283             }
14284         }
14285
14286       /* Something has gone badly wrong if we try to relax a fixed size
14287          instruction.  */
14288       assert (inst.size_req == 0 || !inst.relax);
14289
14290       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
14291                               *opcode->tvariant);
14292       /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
14293          set those bits when Thumb-2 32-bit instructions are seen.  ie.
14294          anything other than bl/blx.
14295          This is overly pessimistic for relaxable instructions.  */
14296       if ((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
14297           || inst.relax)
14298         ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
14299                                 arm_ext_v6t2);
14300     }
14301   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
14302     {
14303       /* Check that this instruction is supported for this CPU.  */
14304       if (!opcode->avariant ||
14305           !ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant))
14306         {
14307           as_bad (_("selected processor does not support `%s'"), str);
14308           return;
14309         }
14310       if (inst.size_req)
14311         {
14312           as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
14313           return;
14314         }
14315
14316       mapping_state (MAP_ARM);
14317       inst.instruction = opcode->avalue;
14318       if (opcode->tag == OT_unconditionalF)
14319         inst.instruction |= 0xF << 28;
14320       else
14321         inst.instruction |= inst.cond << 28;
14322       inst.size = INSN_SIZE;
14323       if (!parse_operands (p, opcode->operands))
14324         opcode->aencode ();
14325       /* Arm mode bx is marked as both v4T and v5 because it's still required
14326          on a hypothetical non-thumb v5 core.  */
14327       if (ARM_CPU_HAS_FEATURE (*opcode->avariant, arm_ext_v4t)
14328           || ARM_CPU_HAS_FEATURE (*opcode->avariant, arm_ext_v5))
14329         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
14330       else
14331         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
14332                                 *opcode->avariant);
14333     }
14334   else
14335     {
14336       as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
14337                 "-- `%s'"), str);
14338       return;
14339     }
14340   output_inst (str);
14341 }
14342
14343 /* Various frobbings of labels and their addresses.  */
14344
14345 void
14346 arm_start_line_hook (void)
14347 {
14348   last_label_seen = NULL;
14349 }
14350
14351 void
14352 arm_frob_label (symbolS * sym)
14353 {
14354   last_label_seen = sym;
14355
14356   ARM_SET_THUMB (sym, thumb_mode);
14357
14358 #if defined OBJ_COFF || defined OBJ_ELF
14359   ARM_SET_INTERWORK (sym, support_interwork);
14360 #endif
14361
14362   /* Note - do not allow local symbols (.Lxxx) to be labeled
14363      as Thumb functions.  This is because these labels, whilst
14364      they exist inside Thumb code, are not the entry points for
14365      possible ARM->Thumb calls.  Also, these labels can be used
14366      as part of a computed goto or switch statement.  eg gcc
14367      can generate code that looks like this:
14368
14369                 ldr  r2, [pc, .Laaa]
14370                 lsl  r3, r3, #2
14371                 ldr  r2, [r3, r2]
14372                 mov  pc, r2
14373
14374        .Lbbb:  .word .Lxxx
14375        .Lccc:  .word .Lyyy
14376        ..etc...
14377        .Laaa:   .word Lbbb
14378
14379      The first instruction loads the address of the jump table.
14380      The second instruction converts a table index into a byte offset.
14381      The third instruction gets the jump address out of the table.
14382      The fourth instruction performs the jump.
14383
14384      If the address stored at .Laaa is that of a symbol which has the
14385      Thumb_Func bit set, then the linker will arrange for this address
14386      to have the bottom bit set, which in turn would mean that the
14387      address computation performed by the third instruction would end
14388      up with the bottom bit set.  Since the ARM is capable of unaligned
14389      word loads, the instruction would then load the incorrect address
14390      out of the jump table, and chaos would ensue.  */
14391   if (label_is_thumb_function_name
14392       && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
14393       && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
14394     {
14395       /* When the address of a Thumb function is taken the bottom
14396          bit of that address should be set.  This will allow
14397          interworking between Arm and Thumb functions to work
14398          correctly.  */
14399
14400       THUMB_SET_FUNC (sym, 1);
14401
14402       label_is_thumb_function_name = FALSE;
14403     }
14404
14405   dwarf2_emit_label (sym);
14406 }
14407
14408 int
14409 arm_data_in_code (void)
14410 {
14411   if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
14412     {
14413       *input_line_pointer = '/';
14414       input_line_pointer += 5;
14415       *input_line_pointer = 0;
14416       return 1;
14417     }
14418
14419   return 0;
14420 }
14421
14422 char *
14423 arm_canonicalize_symbol_name (char * name)
14424 {
14425   int len;
14426
14427   if (thumb_mode && (len = strlen (name)) > 5
14428       && streq (name + len - 5, "/data"))
14429     *(name + len - 5) = 0;
14430
14431   return name;
14432 }
14433 \f
14434 /* Table of all register names defined by default.  The user can
14435    define additional names with .req.  Note that all register names
14436    should appear in both upper and lowercase variants.  Some registers
14437    also have mixed-case names.  */
14438
14439 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
14440 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
14441 #define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
14442 #define REGSET(p,t) \
14443   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
14444   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
14445   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
14446   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
14447 #define REGSETH(p,t) \
14448   REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
14449   REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
14450   REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
14451   REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
14452 #define REGSET2(p,t) \
14453   REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
14454   REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
14455   REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
14456   REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
14457
14458 static const struct reg_entry reg_names[] =
14459 {
14460   /* ARM integer registers.  */
14461   REGSET(r, RN), REGSET(R, RN),
14462
14463   /* ATPCS synonyms.  */
14464   REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
14465   REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
14466   REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
14467
14468   REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
14469   REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
14470   REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
14471
14472   /* Well-known aliases.  */
14473   REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
14474   REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
14475
14476   REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
14477   REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
14478
14479   /* Coprocessor numbers.  */
14480   REGSET(p, CP), REGSET(P, CP),
14481
14482   /* Coprocessor register numbers.  The "cr" variants are for backward
14483      compatibility.  */
14484   REGSET(c,  CN), REGSET(C, CN),
14485   REGSET(cr, CN), REGSET(CR, CN),
14486
14487   /* FPA registers.  */
14488   REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
14489   REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
14490
14491   REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
14492   REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
14493
14494   /* VFP SP registers.  */
14495   REGSET(s,VFS),  REGSET(S,VFS),
14496   REGSETH(s,VFS), REGSETH(S,VFS),
14497
14498   /* VFP DP Registers.  */
14499   REGSET(d,VFD),  REGSET(D,VFD),
14500   /* Extra Neon DP registers.  */
14501   REGSETH(d,VFD), REGSETH(D,VFD),
14502
14503   /* Neon QP registers.  */
14504   REGSET2(q,NQ),  REGSET2(Q,NQ),
14505
14506   /* VFP control registers.  */
14507   REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
14508   REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
14509   REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
14510   REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
14511   REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
14512   REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
14513
14514   /* Maverick DSP coprocessor registers.  */
14515   REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
14516   REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
14517
14518   REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
14519   REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
14520   REGDEF(dspsc,0,DSPSC),
14521
14522   REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
14523   REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
14524   REGDEF(DSPSC,0,DSPSC),
14525
14526   /* iWMMXt data registers - p0, c0-15.  */
14527   REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
14528
14529   /* iWMMXt control registers - p1, c0-3.  */
14530   REGDEF(wcid,  0,MMXWC),  REGDEF(wCID,  0,MMXWC),  REGDEF(WCID,  0,MMXWC),
14531   REGDEF(wcon,  1,MMXWC),  REGDEF(wCon,  1,MMXWC),  REGDEF(WCON,  1,MMXWC),
14532   REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
14533   REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
14534
14535   /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
14536   REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
14537   REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
14538   REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
14539   REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
14540
14541   /* XScale accumulator registers.  */
14542   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
14543 };
14544 #undef REGDEF
14545 #undef REGNUM
14546 #undef REGSET
14547
14548 /* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
14549    within psr_required_here.  */
14550 static const struct asm_psr psrs[] =
14551 {
14552   /* Backward compatibility notation.  Note that "all" is no longer
14553      truly all possible PSR bits.  */
14554   {"all",  PSR_c | PSR_f},
14555   {"flg",  PSR_f},
14556   {"ctl",  PSR_c},
14557
14558   /* Individual flags.  */
14559   {"f",    PSR_f},
14560   {"c",    PSR_c},
14561   {"x",    PSR_x},
14562   {"s",    PSR_s},
14563   /* Combinations of flags.  */
14564   {"fs",   PSR_f | PSR_s},
14565   {"fx",   PSR_f | PSR_x},
14566   {"fc",   PSR_f | PSR_c},
14567   {"sf",   PSR_s | PSR_f},
14568   {"sx",   PSR_s | PSR_x},
14569   {"sc",   PSR_s | PSR_c},
14570   {"xf",   PSR_x | PSR_f},
14571   {"xs",   PSR_x | PSR_s},
14572   {"xc",   PSR_x | PSR_c},
14573   {"cf",   PSR_c | PSR_f},
14574   {"cs",   PSR_c | PSR_s},
14575   {"cx",   PSR_c | PSR_x},
14576   {"fsx",  PSR_f | PSR_s | PSR_x},
14577   {"fsc",  PSR_f | PSR_s | PSR_c},
14578   {"fxs",  PSR_f | PSR_x | PSR_s},
14579   {"fxc",  PSR_f | PSR_x | PSR_c},
14580   {"fcs",  PSR_f | PSR_c | PSR_s},
14581   {"fcx",  PSR_f | PSR_c | PSR_x},
14582   {"sfx",  PSR_s | PSR_f | PSR_x},
14583   {"sfc",  PSR_s | PSR_f | PSR_c},
14584   {"sxf",  PSR_s | PSR_x | PSR_f},
14585   {"sxc",  PSR_s | PSR_x | PSR_c},
14586   {"scf",  PSR_s | PSR_c | PSR_f},
14587   {"scx",  PSR_s | PSR_c | PSR_x},
14588   {"xfs",  PSR_x | PSR_f | PSR_s},
14589   {"xfc",  PSR_x | PSR_f | PSR_c},
14590   {"xsf",  PSR_x | PSR_s | PSR_f},
14591   {"xsc",  PSR_x | PSR_s | PSR_c},
14592   {"xcf",  PSR_x | PSR_c | PSR_f},
14593   {"xcs",  PSR_x | PSR_c | PSR_s},
14594   {"cfs",  PSR_c | PSR_f | PSR_s},
14595   {"cfx",  PSR_c | PSR_f | PSR_x},
14596   {"csf",  PSR_c | PSR_s | PSR_f},
14597   {"csx",  PSR_c | PSR_s | PSR_x},
14598   {"cxf",  PSR_c | PSR_x | PSR_f},
14599   {"cxs",  PSR_c | PSR_x | PSR_s},
14600   {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
14601   {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
14602   {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
14603   {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
14604   {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
14605   {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
14606   {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
14607   {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
14608   {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
14609   {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
14610   {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
14611   {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
14612   {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
14613   {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
14614   {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
14615   {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
14616   {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
14617   {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
14618   {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
14619   {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
14620   {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
14621   {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
14622   {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
14623   {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
14624 };
14625
14626 /* Table of V7M psr names.  */
14627 static const struct asm_psr v7m_psrs[] =
14628 {
14629   {"apsr",        0 }, {"APSR",         0 },
14630   {"iapsr",       1 }, {"IAPSR",        1 },
14631   {"eapsr",       2 }, {"EAPSR",        2 },
14632   {"psr",         3 }, {"PSR",          3 },
14633   {"xpsr",        3 }, {"XPSR",         3 }, {"xPSR",     3 },
14634   {"ipsr",        5 }, {"IPSR",         5 },
14635   {"epsr",        6 }, {"EPSR",         6 },
14636   {"iepsr",       7 }, {"IEPSR",        7 },
14637   {"msp",         8 }, {"MSP",          8 },
14638   {"psp",         9 }, {"PSP",          9 },
14639   {"primask",     16}, {"PRIMASK",      16},
14640   {"basepri",     17}, {"BASEPRI",      17},
14641   {"basepri_max", 18}, {"BASEPRI_MAX",  18},
14642   {"faultmask",   19}, {"FAULTMASK",    19},
14643   {"control",     20}, {"CONTROL",      20}
14644 };
14645
14646 /* Table of all shift-in-operand names.  */
14647 static const struct asm_shift_name shift_names [] =
14648 {
14649   { "asl", SHIFT_LSL },  { "ASL", SHIFT_LSL },
14650   { "lsl", SHIFT_LSL },  { "LSL", SHIFT_LSL },
14651   { "lsr", SHIFT_LSR },  { "LSR", SHIFT_LSR },
14652   { "asr", SHIFT_ASR },  { "ASR", SHIFT_ASR },
14653   { "ror", SHIFT_ROR },  { "ROR", SHIFT_ROR },
14654   { "rrx", SHIFT_RRX },  { "RRX", SHIFT_RRX }
14655 };
14656
14657 /* Table of all explicit relocation names.  */
14658 #ifdef OBJ_ELF
14659 static struct reloc_entry reloc_names[] =
14660 {
14661   { "got",     BFD_RELOC_ARM_GOT32   },  { "GOT",     BFD_RELOC_ARM_GOT32   },
14662   { "gotoff",  BFD_RELOC_ARM_GOTOFF  },  { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
14663   { "plt",     BFD_RELOC_ARM_PLT32   },  { "PLT",     BFD_RELOC_ARM_PLT32   },
14664   { "target1", BFD_RELOC_ARM_TARGET1 },  { "TARGET1", BFD_RELOC_ARM_TARGET1 },
14665   { "target2", BFD_RELOC_ARM_TARGET2 },  { "TARGET2", BFD_RELOC_ARM_TARGET2 },
14666   { "sbrel",   BFD_RELOC_ARM_SBREL32 },  { "SBREL",   BFD_RELOC_ARM_SBREL32 },
14667   { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
14668   { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
14669   { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
14670   { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
14671   { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32}
14672 };
14673 #endif
14674
14675 /* Table of all conditional affixes.  0xF is not defined as a condition code.  */
14676 static const struct asm_cond conds[] =
14677 {
14678   {"eq", 0x0},
14679   {"ne", 0x1},
14680   {"cs", 0x2}, {"hs", 0x2},
14681   {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
14682   {"mi", 0x4},
14683   {"pl", 0x5},
14684   {"vs", 0x6},
14685   {"vc", 0x7},
14686   {"hi", 0x8},
14687   {"ls", 0x9},
14688   {"ge", 0xa},
14689   {"lt", 0xb},
14690   {"gt", 0xc},
14691   {"le", 0xd},
14692   {"al", 0xe}
14693 };
14694
14695 static struct asm_barrier_opt barrier_opt_names[] =
14696 {
14697   { "sy",   0xf },
14698   { "un",   0x7 },
14699   { "st",   0xe },
14700   { "unst", 0x6 }
14701 };
14702
14703 /* Table of ARM-format instructions.    */
14704
14705 /* Macros for gluing together operand strings.  N.B. In all cases
14706    other than OPS0, the trailing OP_stop comes from default
14707    zero-initialization of the unspecified elements of the array.  */
14708 #define OPS0()            { OP_stop, }
14709 #define OPS1(a)           { OP_##a, }
14710 #define OPS2(a,b)         { OP_##a,OP_##b, }
14711 #define OPS3(a,b,c)       { OP_##a,OP_##b,OP_##c, }
14712 #define OPS4(a,b,c,d)     { OP_##a,OP_##b,OP_##c,OP_##d, }
14713 #define OPS5(a,b,c,d,e)   { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
14714 #define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
14715
14716 /* These macros abstract out the exact format of the mnemonic table and
14717    save some repeated characters.  */
14718
14719 /* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
14720 #define TxCE(mnem, op, top, nops, ops, ae, te) \
14721   { #mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
14722     THUMB_VARIANT, do_##ae, do_##te }
14723
14724 /* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
14725    a T_MNEM_xyz enumerator.  */
14726 #define TCE(mnem, aop, top, nops, ops, ae, te) \
14727        TxCE(mnem, aop, 0x##top, nops, ops, ae, te)
14728 #define tCE(mnem, aop, top, nops, ops, ae, te) \
14729        TxCE(mnem, aop, T_MNEM_##top, nops, ops, ae, te)
14730
14731 /* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
14732    infix after the third character.  */
14733 #define TxC3(mnem, op, top, nops, ops, ae, te) \
14734   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
14735     THUMB_VARIANT, do_##ae, do_##te }
14736 #define TxC3w(mnem, op, top, nops, ops, ae, te) \
14737   { #mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
14738     THUMB_VARIANT, do_##ae, do_##te }
14739 #define TC3(mnem, aop, top, nops, ops, ae, te) \
14740        TxC3(mnem, aop, 0x##top, nops, ops, ae, te)
14741 #define TC3w(mnem, aop, top, nops, ops, ae, te) \
14742        TxC3w(mnem, aop, 0x##top, nops, ops, ae, te)
14743 #define tC3(mnem, aop, top, nops, ops, ae, te) \
14744        TxC3(mnem, aop, T_MNEM_##top, nops, ops, ae, te)
14745 #define tC3w(mnem, aop, top, nops, ops, ae, te) \
14746        TxC3w(mnem, aop, T_MNEM_##top, nops, ops, ae, te)
14747
14748 /* Mnemonic with a conditional infix in an unusual place.  Each and every variant has to
14749    appear in the condition table.  */
14750 #define TxCM_(m1, m2, m3, op, top, nops, ops, ae, te)   \
14751   { #m1 #m2 #m3, OPS##nops ops, sizeof(#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof(#m1) - 1, \
14752     0x##op, top, ARM_VARIANT, THUMB_VARIANT, do_##ae, do_##te }
14753
14754 #define TxCM(m1, m2, op, top, nops, ops, ae, te)        \
14755   TxCM_(m1,   , m2, op, top, nops, ops, ae, te),        \
14756   TxCM_(m1, eq, m2, op, top, nops, ops, ae, te),        \
14757   TxCM_(m1, ne, m2, op, top, nops, ops, ae, te),        \
14758   TxCM_(m1, cs, m2, op, top, nops, ops, ae, te),        \
14759   TxCM_(m1, hs, m2, op, top, nops, ops, ae, te),        \
14760   TxCM_(m1, cc, m2, op, top, nops, ops, ae, te),        \
14761   TxCM_(m1, ul, m2, op, top, nops, ops, ae, te),        \
14762   TxCM_(m1, lo, m2, op, top, nops, ops, ae, te),        \
14763   TxCM_(m1, mi, m2, op, top, nops, ops, ae, te),        \
14764   TxCM_(m1, pl, m2, op, top, nops, ops, ae, te),        \
14765   TxCM_(m1, vs, m2, op, top, nops, ops, ae, te),        \
14766   TxCM_(m1, vc, m2, op, top, nops, ops, ae, te),        \
14767   TxCM_(m1, hi, m2, op, top, nops, ops, ae, te),        \
14768   TxCM_(m1, ls, m2, op, top, nops, ops, ae, te),        \
14769   TxCM_(m1, ge, m2, op, top, nops, ops, ae, te),        \
14770   TxCM_(m1, lt, m2, op, top, nops, ops, ae, te),        \
14771   TxCM_(m1, gt, m2, op, top, nops, ops, ae, te),        \
14772   TxCM_(m1, le, m2, op, top, nops, ops, ae, te),        \
14773   TxCM_(m1, al, m2, op, top, nops, ops, ae, te)
14774
14775 #define TCM(m1,m2, aop, top, nops, ops, ae, te)         \
14776        TxCM(m1,m2, aop, 0x##top, nops, ops, ae, te)
14777 #define tCM(m1,m2, aop, top, nops, ops, ae, te)                 \
14778        TxCM(m1,m2, aop, T_MNEM_##top, nops, ops, ae, te)
14779
14780 /* Mnemonic that cannot be conditionalized.  The ARM condition-code
14781    field is still 0xE.  Many of the Thumb variants can be executed
14782    conditionally, so this is checked separately.  */
14783 #define TUE(mnem, op, top, nops, ops, ae, te)                           \
14784   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
14785     THUMB_VARIANT, do_##ae, do_##te }
14786
14787 /* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
14788    condition code field.  */
14789 #define TUF(mnem, op, top, nops, ops, ae, te)                           \
14790   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
14791     THUMB_VARIANT, do_##ae, do_##te }
14792
14793 /* ARM-only variants of all the above.  */
14794 #define CE(mnem,  op, nops, ops, ae)    \
14795   { #mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
14796
14797 #define C3(mnem, op, nops, ops, ae)     \
14798   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
14799
14800 /* Legacy mnemonics that always have conditional infix after the third
14801    character.  */
14802 #define CL(mnem, op, nops, ops, ae)     \
14803   { #mnem, OPS##nops ops, OT_cinfix3_legacy, \
14804     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
14805
14806 /* Coprocessor instructions.  Isomorphic between Arm and Thumb-2.  */
14807 #define cCE(mnem,  op, nops, ops, ae)   \
14808   { #mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
14809
14810 /* Legacy coprocessor instructions where conditional infix and conditional
14811    suffix are ambiguous.  For consistency this includes all FPA instructions,
14812    not just the potentially ambiguous ones.  */
14813 #define cCL(mnem, op, nops, ops, ae)    \
14814   { #mnem, OPS##nops ops, OT_cinfix3_legacy, \
14815     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
14816
14817 /* Coprocessor, takes either a suffix or a position-3 infix
14818    (for an FPA corner case). */
14819 #define C3E(mnem, op, nops, ops, ae) \
14820   { #mnem, OPS##nops ops, OT_csuf_or_in3, \
14821     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
14822
14823 #define xCM_(m1, m2, m3, op, nops, ops, ae)     \
14824   { #m1 #m2 #m3, OPS##nops ops, \
14825     sizeof(#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof(#m1) - 1, \
14826     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
14827
14828 #define CM(m1, m2, op, nops, ops, ae)   \
14829   xCM_(m1,   , m2, op, nops, ops, ae),  \
14830   xCM_(m1, eq, m2, op, nops, ops, ae),  \
14831   xCM_(m1, ne, m2, op, nops, ops, ae),  \
14832   xCM_(m1, cs, m2, op, nops, ops, ae),  \
14833   xCM_(m1, hs, m2, op, nops, ops, ae),  \
14834   xCM_(m1, cc, m2, op, nops, ops, ae),  \
14835   xCM_(m1, ul, m2, op, nops, ops, ae),  \
14836   xCM_(m1, lo, m2, op, nops, ops, ae),  \
14837   xCM_(m1, mi, m2, op, nops, ops, ae),  \
14838   xCM_(m1, pl, m2, op, nops, ops, ae),  \
14839   xCM_(m1, vs, m2, op, nops, ops, ae),  \
14840   xCM_(m1, vc, m2, op, nops, ops, ae),  \
14841   xCM_(m1, hi, m2, op, nops, ops, ae),  \
14842   xCM_(m1, ls, m2, op, nops, ops, ae),  \
14843   xCM_(m1, ge, m2, op, nops, ops, ae),  \
14844   xCM_(m1, lt, m2, op, nops, ops, ae),  \
14845   xCM_(m1, gt, m2, op, nops, ops, ae),  \
14846   xCM_(m1, le, m2, op, nops, ops, ae),  \
14847   xCM_(m1, al, m2, op, nops, ops, ae)
14848
14849 #define UE(mnem, op, nops, ops, ae)     \
14850   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
14851
14852 #define UF(mnem, op, nops, ops, ae)     \
14853   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
14854
14855 /* Neon data-processing. ARM versions are unconditional with cond=0xf.
14856    The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
14857    use the same encoding function for each.  */
14858 #define NUF(mnem, op, nops, ops, enc)                                   \
14859   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op,            \
14860     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
14861
14862 /* Neon data processing, version which indirects through neon_enc_tab for
14863    the various overloaded versions of opcodes.  */
14864 #define nUF(mnem, op, nops, ops, enc)                                   \
14865   { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM_##op, N_MNEM_##op,  \
14866     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
14867
14868 /* Neon insn with conditional suffix for the ARM version, non-overloaded
14869    version.  */
14870 #define NCE_tag(mnem, op, nops, ops, enc, tag)                          \
14871   { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT,             \
14872     THUMB_VARIANT, do_##enc, do_##enc }
14873
14874 #define NCE(mnem, op, nops, ops, enc)                                   \
14875   NCE_tag(mnem, op, nops, ops, enc, OT_csuffix)
14876
14877 #define NCEF(mnem, op, nops, ops, enc)                                  \
14878   NCE_tag(mnem, op, nops, ops, enc, OT_csuffixF)
14879
14880 /* Neon insn with conditional suffix for the ARM version, overloaded types.  */
14881 #define nCE_tag(mnem, op, nops, ops, enc, tag)                          \
14882   { #mnem, OPS##nops ops, tag, N_MNEM_##op, N_MNEM_##op,                \
14883     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
14884
14885 #define nCE(mnem, op, nops, ops, enc)                                   \
14886   nCE_tag(mnem, op, nops, ops, enc, OT_csuffix)
14887
14888 #define nCEF(mnem, op, nops, ops, enc)                                  \
14889   nCE_tag(mnem, op, nops, ops, enc, OT_csuffixF)
14890
14891 #define do_0 0
14892
14893 /* Thumb-only, unconditional.  */
14894 #define UT(mnem,  op, nops, ops, te) TUE(mnem,  0, op, nops, ops, 0, te)
14895
14896 static const struct asm_opcode insns[] =
14897 {
14898 #define ARM_VARIANT &arm_ext_v1 /* Core ARM Instructions.  */
14899 #define THUMB_VARIANT &arm_ext_v4t
14900  tCE(and,       0000000, and,      3, (RR, oRR, SH), arit, t_arit3c),
14901  tC3(ands,      0100000, ands,     3, (RR, oRR, SH), arit, t_arit3c),
14902  tCE(eor,       0200000, eor,      3, (RR, oRR, SH), arit, t_arit3c),
14903  tC3(eors,      0300000, eors,     3, (RR, oRR, SH), arit, t_arit3c),
14904  tCE(sub,       0400000, sub,      3, (RR, oRR, SH), arit, t_add_sub),
14905  tC3(subs,      0500000, subs,     3, (RR, oRR, SH), arit, t_add_sub),
14906  tCE(add,       0800000, add,      3, (RR, oRR, SHG), arit, t_add_sub),
14907  tC3(adds,      0900000, adds,     3, (RR, oRR, SHG), arit, t_add_sub),
14908  tCE(adc,       0a00000, adc,      3, (RR, oRR, SH), arit, t_arit3c),
14909  tC3(adcs,      0b00000, adcs,     3, (RR, oRR, SH), arit, t_arit3c),
14910  tCE(sbc,       0c00000, sbc,      3, (RR, oRR, SH), arit, t_arit3),
14911  tC3(sbcs,      0d00000, sbcs,     3, (RR, oRR, SH), arit, t_arit3),
14912  tCE(orr,       1800000, orr,      3, (RR, oRR, SH), arit, t_arit3c),
14913  tC3(orrs,      1900000, orrs,     3, (RR, oRR, SH), arit, t_arit3c),
14914  tCE(bic,       1c00000, bic,      3, (RR, oRR, SH), arit, t_arit3),
14915  tC3(bics,      1d00000, bics,     3, (RR, oRR, SH), arit, t_arit3),
14916
14917  /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
14918     for setting PSR flag bits.  They are obsolete in V6 and do not
14919     have Thumb equivalents. */
14920  tCE(tst,       1100000, tst,      2, (RR, SH),      cmp,  t_mvn_tst),
14921  tC3w(tsts,     1100000, tst,      2, (RR, SH),      cmp,  t_mvn_tst),
14922   CL(tstp,      110f000,           2, (RR, SH),      cmp),
14923  tCE(cmp,       1500000, cmp,      2, (RR, SH),      cmp,  t_mov_cmp),
14924  tC3w(cmps,     1500000, cmp,      2, (RR, SH),      cmp,  t_mov_cmp),
14925   CL(cmpp,      150f000,           2, (RR, SH),      cmp),
14926  tCE(cmn,       1700000, cmn,      2, (RR, SH),      cmp,  t_mvn_tst),
14927  tC3w(cmns,     1700000, cmn,      2, (RR, SH),      cmp,  t_mvn_tst),
14928   CL(cmnp,      170f000,           2, (RR, SH),      cmp),
14929
14930  tCE(mov,       1a00000, mov,      2, (RR, SH),      mov,  t_mov_cmp),
14931  tC3(movs,      1b00000, movs,     2, (RR, SH),      mov,  t_mov_cmp),
14932  tCE(mvn,       1e00000, mvn,      2, (RR, SH),      mov,  t_mvn_tst),
14933  tC3(mvns,      1f00000, mvns,     2, (RR, SH),      mov,  t_mvn_tst),
14934
14935  tCE(ldr,       4100000, ldr,      2, (RR, ADDRGLDR),ldst, t_ldst),
14936  tC3(ldrb,      4500000, ldrb,     2, (RR, ADDRGLDR),ldst, t_ldst),
14937  tCE(str,       4000000, str,      2, (RR, ADDRGLDR),ldst, t_ldst),
14938  tC3(strb,      4400000, strb,     2, (RR, ADDRGLDR),ldst, t_ldst),
14939
14940  tCE(stm,       8800000, stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
14941  tC3(stmia,     8800000, stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
14942  tC3(stmea,     8800000, stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
14943  tCE(ldm,       8900000, ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
14944  tC3(ldmia,     8900000, ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
14945  tC3(ldmfd,     8900000, ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
14946
14947  TCE(swi,       f000000, df00,     1, (EXPi),        swi, t_swi),
14948  TCE(svc,       f000000, df00,     1, (EXPi),        swi, t_swi),
14949  tCE(b,         a000000, b,        1, (EXPr),        branch, t_branch),
14950  TCE(bl,        b000000, f000f800, 1, (EXPr),        bl, t_branch23),
14951
14952   /* Pseudo ops.  */
14953  tCE(adr,       28f0000, adr,      2, (RR, EXP),     adr,  t_adr),
14954   C3(adrl,      28f0000,           2, (RR, EXP),     adrl),
14955  tCE(nop,       1a00000, nop,      1, (oI255c),      nop,  t_nop),
14956
14957   /* Thumb-compatibility pseudo ops.  */
14958  tCE(lsl,       1a00000, lsl,      3, (RR, oRR, SH), shift, t_shift),
14959  tC3(lsls,      1b00000, lsls,     3, (RR, oRR, SH), shift, t_shift),
14960  tCE(lsr,       1a00020, lsr,      3, (RR, oRR, SH), shift, t_shift),
14961  tC3(lsrs,      1b00020, lsrs,     3, (RR, oRR, SH), shift, t_shift),
14962  tCE(asr,       1a00040, asr,      3, (RR, oRR, SH), shift, t_shift),
14963  tC3(asrs,      1b00040, asrs,     3, (RR, oRR, SH), shift, t_shift),
14964  tCE(ror,       1a00060, ror,      3, (RR, oRR, SH), shift, t_shift),
14965  tC3(rors,      1b00060, rors,     3, (RR, oRR, SH), shift, t_shift),
14966  tCE(neg,       2600000, neg,      2, (RR, RR),      rd_rn, t_neg),
14967  tC3(negs,      2700000, negs,     2, (RR, RR),      rd_rn, t_neg),
14968  tCE(push,      92d0000, push,     1, (REGLST),      push_pop, t_push_pop),
14969  tCE(pop,       8bd0000, pop,      1, (REGLST),      push_pop, t_push_pop),
14970
14971  /* These may simplify to neg.  */
14972  TCE(rsb,       0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
14973  TC3(rsbs,      0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
14974
14975  TCE(rrx,      1a00060, ea4f0030, 2, (RR, RR),      rd_rm, t_rd_rm),
14976  TCE(rrxs,     1b00060, ea5f0030, 2, (RR, RR),      rd_rm, t_rd_rm),
14977
14978 #undef THUMB_VARIANT
14979 #define THUMB_VARIANT &arm_ext_v6
14980  TCE(cpy,       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
14981
14982  /* V1 instructions with no Thumb analogue prior to V6T2.  */
14983 #undef THUMB_VARIANT
14984 #define THUMB_VARIANT &arm_ext_v6t2
14985  TCE(teq,       1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
14986  TC3w(teqs,     1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
14987   CL(teqp,      130f000,           2, (RR, SH),      cmp),
14988
14989  TC3(ldrt,      4300000, f8500e00, 2, (RR, ADDR),    ldstt, t_ldstt),
14990  TC3(ldrbt,     4700000, f8100e00, 2, (RR, ADDR),    ldstt, t_ldstt),
14991  TC3(strt,      4200000, f8400e00, 2, (RR, ADDR),    ldstt, t_ldstt),
14992  TC3(strbt,     4600000, f8000e00, 2, (RR, ADDR),    ldstt, t_ldstt),
14993
14994  TC3(stmdb,     9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
14995  TC3(stmfd,     9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
14996
14997  TC3(ldmdb,     9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
14998  TC3(ldmea,     9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
14999
15000  /* V1 instructions with no Thumb analogue at all.  */
15001   CE(rsc,       0e00000,           3, (RR, oRR, SH), arit),
15002   C3(rscs,      0f00000,           3, (RR, oRR, SH), arit),
15003
15004   C3(stmib,     9800000,           2, (RRw, REGLST), ldmstm),
15005   C3(stmfa,     9800000,           2, (RRw, REGLST), ldmstm),
15006   C3(stmda,     8000000,           2, (RRw, REGLST), ldmstm),
15007   C3(stmed,     8000000,           2, (RRw, REGLST), ldmstm),
15008   C3(ldmib,     9900000,           2, (RRw, REGLST), ldmstm),
15009   C3(ldmed,     9900000,           2, (RRw, REGLST), ldmstm),
15010   C3(ldmda,     8100000,           2, (RRw, REGLST), ldmstm),
15011   C3(ldmfa,     8100000,           2, (RRw, REGLST), ldmstm),
15012
15013 #undef ARM_VARIANT
15014 #define ARM_VARIANT &arm_ext_v2 /* ARM 2 - multiplies.  */
15015 #undef THUMB_VARIANT
15016 #define THUMB_VARIANT &arm_ext_v4t
15017  tCE(mul,       0000090, mul,      3, (RRnpc, RRnpc, oRR), mul, t_mul),
15018  tC3(muls,      0100090, muls,     3, (RRnpc, RRnpc, oRR), mul, t_mul),
15019
15020 #undef THUMB_VARIANT
15021 #define THUMB_VARIANT &arm_ext_v6t2
15022  TCE(mla,       0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
15023   C3(mlas,      0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
15024
15025   /* Generic coprocessor instructions.  */
15026  TCE(cdp,       e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
15027  TCE(ldc,       c100000, ec100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
15028  TC3(ldcl,      c500000, ec500000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
15029  TCE(stc,       c000000, ec000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
15030  TC3(stcl,      c400000, ec400000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
15031  TCE(mcr,       e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
15032  TCE(mrc,       e100010, ee100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
15033
15034 #undef ARM_VARIANT
15035 #define ARM_VARIANT &arm_ext_v2s /* ARM 3 - swp instructions.  */
15036   CE(swp,       1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
15037   C3(swpb,      1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
15038
15039 #undef ARM_VARIANT
15040 #define ARM_VARIANT &arm_ext_v3 /* ARM 6 Status register instructions.  */
15041  TCE(mrs,       10f0000, f3ef8000, 2, (APSR_RR, RVC_PSR), mrs, t_mrs),
15042  TCE(msr,       120f000, f3808000, 2, (RVC_PSR, RR_EXi), msr, t_msr),
15043
15044 #undef ARM_VARIANT
15045 #define ARM_VARIANT &arm_ext_v3m         /* ARM 7M long multiplies.  */
15046  TCE(smull,     0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
15047   CM(smull,s,   0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
15048  TCE(umull,     0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
15049   CM(umull,s,   0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
15050  TCE(smlal,     0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
15051   CM(smlal,s,   0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
15052  TCE(umlal,     0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
15053   CM(umlal,s,   0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
15054
15055 #undef ARM_VARIANT
15056 #define ARM_VARIANT &arm_ext_v4 /* ARM Architecture 4.  */
15057 #undef THUMB_VARIANT
15058 #define THUMB_VARIANT &arm_ext_v4t
15059  tC3(ldrh,      01000b0, ldrh,     2, (RR, ADDRGLDRS), ldstv4, t_ldst),
15060  tC3(strh,      00000b0, strh,     2, (RR, ADDRGLDRS), ldstv4, t_ldst),
15061  tC3(ldrsh,     01000f0, ldrsh,    2, (RR, ADDRGLDRS), ldstv4, t_ldst),
15062  tC3(ldrsb,     01000d0, ldrsb,    2, (RR, ADDRGLDRS), ldstv4, t_ldst),
15063  tCM(ld,sh,     01000f0, ldrsh,    2, (RR, ADDRGLDRS), ldstv4, t_ldst),
15064  tCM(ld,sb,     01000d0, ldrsb,    2, (RR, ADDRGLDRS), ldstv4, t_ldst),
15065
15066 #undef ARM_VARIANT
15067 #define ARM_VARIANT &arm_ext_v4t_5
15068   /* ARM Architecture 4T.  */
15069   /* Note: bx (and blx) are required on V5, even if the processor does
15070      not support Thumb.  */
15071  TCE(bx,        12fff10, 4700, 1, (RR), bx, t_bx),
15072
15073 #undef ARM_VARIANT
15074 #define ARM_VARIANT &arm_ext_v5 /*  ARM Architecture 5T.         */
15075 #undef THUMB_VARIANT
15076 #define THUMB_VARIANT &arm_ext_v5t
15077   /* Note: blx has 2 variants; the .value coded here is for
15078      BLX(2).  Only this variant has conditional execution.  */
15079  TCE(blx,       12fff30, 4780, 1, (RR_EXr),                         blx,  t_blx),
15080  TUE(bkpt,      1200070, be00, 1, (oIffffb),                        bkpt, t_bkpt),
15081
15082 #undef THUMB_VARIANT
15083 #define THUMB_VARIANT &arm_ext_v6t2
15084  TCE(clz,       16f0f10, fab0f080, 2, (RRnpc, RRnpc),                   rd_rm,  t_clz),
15085  TUF(ldc2,      c100000, fc100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
15086  TUF(ldc2l,     c500000, fc500000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
15087  TUF(stc2,      c000000, fc000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
15088  TUF(stc2l,     c400000, fc400000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
15089  TUF(cdp2,      e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
15090  TUF(mcr2,      e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
15091  TUF(mrc2,      e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
15092
15093 #undef ARM_VARIANT
15094 #define ARM_VARIANT &arm_ext_v5exp /*  ARM Architecture 5TExP.  */
15095  TCE(smlabb,    1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
15096  TCE(smlatb,    10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
15097  TCE(smlabt,    10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
15098  TCE(smlatt,    10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
15099
15100  TCE(smlawb,    1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
15101  TCE(smlawt,    12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
15102
15103  TCE(smlalbb,   1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
15104  TCE(smlaltb,   14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
15105  TCE(smlalbt,   14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
15106  TCE(smlaltt,   14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
15107
15108  TCE(smulbb,    1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
15109  TCE(smultb,    16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
15110  TCE(smulbt,    16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
15111  TCE(smultt,    16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
15112
15113  TCE(smulwb,    12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
15114  TCE(smulwt,    12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
15115
15116  TCE(qadd,      1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, rd_rm_rn),
15117  TCE(qdadd,     1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, rd_rm_rn),
15118  TCE(qsub,      1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, rd_rm_rn),
15119  TCE(qdsub,     1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, rd_rm_rn),
15120
15121 #undef ARM_VARIANT
15122 #define ARM_VARIANT &arm_ext_v5e /*  ARM Architecture 5TE.  */
15123  TUF(pld,       450f000, f810f000, 1, (ADDR),                pld,  t_pld),
15124  TC3(ldrd,      00000d0, e8500000, 3, (RRnpc, oRRnpc, ADDRGLDRS), ldrd, t_ldstd),
15125  TC3(strd,      00000f0, e8400000, 3, (RRnpc, oRRnpc, ADDRGLDRS), ldrd, t_ldstd),
15126
15127  TCE(mcrr,      c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
15128  TCE(mrrc,      c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
15129
15130 #undef ARM_VARIANT
15131 #define ARM_VARIANT &arm_ext_v5j /*  ARM Architecture 5TEJ.  */
15132  TCE(bxj,       12fff20, f3c08f00, 1, (RR),                       bxj, t_bxj),
15133
15134 #undef ARM_VARIANT
15135 #define ARM_VARIANT &arm_ext_v6 /*  ARM V6.  */
15136 #undef THUMB_VARIANT
15137 #define THUMB_VARIANT &arm_ext_v6
15138  TUF(cpsie,     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
15139  TUF(cpsid,     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
15140  tCE(rev,       6bf0f30, rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
15141  tCE(rev16,     6bf0fb0, rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
15142  tCE(revsh,     6ff0fb0, revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
15143  tCE(sxth,      6bf0070, sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
15144  tCE(uxth,      6ff0070, uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
15145  tCE(sxtb,      6af0070, sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
15146  tCE(uxtb,      6ef0070, uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
15147  TUF(setend,    1010000, b650,     1, (ENDI),                     setend, t_setend),
15148
15149 #undef THUMB_VARIANT
15150 #define THUMB_VARIANT &arm_ext_v6t2
15151  TCE(ldrex,     1900f9f, e8500f00, 2, (RRnpc, ADDR),              ldrex, t_ldrex),
15152  TCE(strex,     1800f90, e8400000, 3, (RRnpc, RRnpc, ADDR),        strex,  t_strex),
15153  TUF(mcrr2,     c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
15154  TUF(mrrc2,     c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
15155
15156  TCE(ssat,      6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
15157  TCE(usat,      6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
15158
15159 /*  ARM V6 not included in V7M (eg. integer SIMD).  */
15160 #undef THUMB_VARIANT
15161 #define THUMB_VARIANT &arm_ext_v6_notm
15162  TUF(cps,       1020000, f3af8100, 1, (I31b),                     imm0, t_cps),
15163  TCE(pkhbt,     6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
15164  TCE(pkhtb,     6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
15165  TCE(qadd16,    6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15166  TCE(qadd8,     6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15167  TCE(qaddsubx,  6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15168  TCE(qsub16,    6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15169  TCE(qsub8,     6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15170  TCE(qsubaddx,  6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15171  TCE(sadd16,    6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15172  TCE(sadd8,     6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15173  TCE(saddsubx,  6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15174  TCE(shadd16,   6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15175  TCE(shadd8,    6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15176  TCE(shaddsubx, 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15177  TCE(shsub16,   6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15178  TCE(shsub8,    6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15179  TCE(shsubaddx, 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15180  TCE(ssub16,    6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15181  TCE(ssub8,     6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15182  TCE(ssubaddx,  6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15183  TCE(uadd16,    6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15184  TCE(uadd8,     6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15185  TCE(uaddsubx,  6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15186  TCE(uhadd16,   6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15187  TCE(uhadd8,    6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15188  TCE(uhaddsubx, 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15189  TCE(uhsub16,   6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15190  TCE(uhsub8,    6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15191  TCE(uhsubaddx, 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15192  TCE(uqadd16,   6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15193  TCE(uqadd8,    6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15194  TCE(uqaddsubx, 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15195  TCE(uqsub16,   6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15196  TCE(uqsub8,    6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15197  TCE(uqsubaddx, 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15198  TCE(usub16,    6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15199  TCE(usub8,     6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15200  TCE(usubaddx,  6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15201  TUF(rfeia,     8900a00, e990c000, 1, (RRw),                       rfe, rfe),
15202   UF(rfeib,     9900a00,           1, (RRw),                       rfe),
15203   UF(rfeda,     8100a00,           1, (RRw),                       rfe),
15204  TUF(rfedb,     9100a00, e810c000, 1, (RRw),                       rfe, rfe),
15205  TUF(rfefd,     8900a00, e990c000, 1, (RRw),                       rfe, rfe),
15206   UF(rfefa,     9900a00,           1, (RRw),                       rfe),
15207   UF(rfeea,     8100a00,           1, (RRw),                       rfe),
15208  TUF(rfeed,     9100a00, e810c000, 1, (RRw),                       rfe, rfe),
15209  TCE(sxtah,     6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
15210  TCE(sxtab16,   6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
15211  TCE(sxtab,     6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
15212  TCE(sxtb16,    68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
15213  TCE(uxtah,     6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
15214  TCE(uxtab16,   6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
15215  TCE(uxtab,     6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
15216  TCE(uxtb16,    6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
15217  TCE(sel,       6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
15218  TCE(smlad,     7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
15219  TCE(smladx,    7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
15220  TCE(smlald,    7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
15221  TCE(smlaldx,   7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
15222  TCE(smlsd,     7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
15223  TCE(smlsdx,    7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
15224  TCE(smlsld,    7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
15225  TCE(smlsldx,   7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
15226  TCE(smmla,     7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
15227  TCE(smmlar,    7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
15228  TCE(smmls,     75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
15229  TCE(smmlsr,    75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
15230  TCE(smmul,     750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
15231  TCE(smmulr,    750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
15232  TCE(smuad,     700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
15233  TCE(smuadx,    700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
15234  TCE(smusd,     700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
15235  TCE(smusdx,    700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
15236  TUF(srsia,     8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
15237   UF(srsib,     9c00500,           2, (oRRw, I31w),                srs),
15238   UF(srsda,     8400500,           2, (oRRw, I31w),                srs),
15239  TUF(srsdb,     9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
15240  TCE(ssat16,    6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),         ssat16, t_ssat16),
15241  TCE(umaal,     0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
15242  TCE(usad8,     780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),       smul,   t_simd),
15243  TCE(usada8,    7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
15244  TCE(usat16,    6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),         usat16, t_usat16),
15245
15246 #undef ARM_VARIANT
15247 #define ARM_VARIANT &arm_ext_v6k
15248 #undef THUMB_VARIANT
15249 #define THUMB_VARIANT &arm_ext_v6k
15250  tCE(yield,     320f001, yield,    0, (), noargs, t_hint),
15251  tCE(wfe,       320f002, wfe,      0, (), noargs, t_hint),
15252  tCE(wfi,       320f003, wfi,      0, (), noargs, t_hint),
15253  tCE(sev,       320f004, sev,      0, (), noargs, t_hint),
15254
15255 #undef THUMB_VARIANT
15256 #define THUMB_VARIANT &arm_ext_v6_notm
15257  TCE(ldrexd,    1b00f9f, e8d0007f, 3, (RRnpc, oRRnpc, RRnpcb),        ldrexd, t_ldrexd),
15258  TCE(strexd,    1a00f90, e8c00070, 4, (RRnpc, RRnpc, oRRnpc, RRnpcb), strexd, t_strexd),
15259
15260 #undef THUMB_VARIANT
15261 #define THUMB_VARIANT &arm_ext_v6t2
15262  TCE(ldrexb,    1d00f9f, e8d00f4f, 2, (RRnpc, RRnpcb),                rd_rn,  rd_rn),
15263  TCE(ldrexh,    1f00f9f, e8d00f5f, 2, (RRnpc, RRnpcb),                rd_rn,  rd_rn),
15264  TCE(strexb,    1c00f90, e8c00f40, 3, (RRnpc, RRnpc, ADDR),           strex,  rm_rd_rn),
15265  TCE(strexh,    1e00f90, e8c00f50, 3, (RRnpc, RRnpc, ADDR),           strex,  rm_rd_rn),
15266  TUF(clrex,     57ff01f, f3bf8f2f, 0, (),                             noargs, noargs),
15267
15268 #undef ARM_VARIANT
15269 #define ARM_VARIANT &arm_ext_v6z
15270  TCE(smc,       1600070, f7f08000, 1, (EXPi), smc, t_smc),
15271
15272 #undef ARM_VARIANT
15273 #define ARM_VARIANT &arm_ext_v6t2
15274  TCE(bfc,       7c0001f, f36f0000, 3, (RRnpc, I31, I32),           bfc, t_bfc),
15275  TCE(bfi,       7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
15276  TCE(sbfx,      7a00050, f3400000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
15277  TCE(ubfx,      7e00050, f3c00000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
15278
15279  TCE(mls,       0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
15280  TCE(movw,      3000000, f2400000, 2, (RRnpc, HALF),                mov16, t_mov16),
15281  TCE(movt,      3400000, f2c00000, 2, (RRnpc, HALF),                mov16, t_mov16),
15282  TCE(rbit,      6ff0f30, fa90f0a0, 2, (RR, RR),                     rd_rm, t_rbit),
15283
15284  TC3(ldrht,     03000b0, f8300e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
15285  TC3(ldrsht,    03000f0, f9300e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
15286  TC3(ldrsbt,    03000d0, f9100e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
15287  TC3(strht,     02000b0, f8200e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
15288
15289   UT(cbnz,      b900,    2, (RR, EXP), t_cbz),
15290   UT(cbz,       b100,    2, (RR, EXP), t_cbz),
15291  /* ARM does not really have an IT instruction, so always allow it.  */
15292 #undef ARM_VARIANT
15293 #define ARM_VARIANT &arm_ext_v1
15294  TUE(it,        0, bf08, 1, (COND),    it, t_it),
15295  TUE(itt,       0, bf0c, 1, (COND),    it, t_it),
15296  TUE(ite,       0, bf04, 1, (COND),    it, t_it),
15297  TUE(ittt,      0, bf0e, 1, (COND),    it, t_it),
15298  TUE(itet,      0, bf06, 1, (COND),    it, t_it),
15299  TUE(itte,      0, bf0a, 1, (COND),    it, t_it),
15300  TUE(itee,      0, bf02, 1, (COND),    it, t_it),
15301  TUE(itttt,     0, bf0f, 1, (COND),    it, t_it),
15302  TUE(itett,     0, bf07, 1, (COND),    it, t_it),
15303  TUE(ittet,     0, bf0b, 1, (COND),    it, t_it),
15304  TUE(iteet,     0, bf03, 1, (COND),    it, t_it),
15305  TUE(ittte,     0, bf0d, 1, (COND),    it, t_it),
15306  TUE(itete,     0, bf05, 1, (COND),    it, t_it),
15307  TUE(ittee,     0, bf09, 1, (COND),    it, t_it),
15308  TUE(iteee,     0, bf01, 1, (COND),    it, t_it),
15309
15310  /* Thumb2 only instructions.  */
15311 #undef ARM_VARIANT
15312 #define ARM_VARIANT NULL
15313
15314  TCE(addw,      0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
15315  TCE(subw,      0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
15316  TCE(tbb,       0, e8d0f000, 1, (TB), 0, t_tb),
15317  TCE(tbh,       0, e8d0f010, 1, (TB), 0, t_tb),
15318
15319  /* Thumb-2 hardware division instructions (R and M profiles only).  */
15320 #undef THUMB_VARIANT
15321 #define THUMB_VARIANT &arm_ext_div
15322  TCE(sdiv,      0, fb90f0f0, 3, (RR, oRR, RR), 0, t_div),
15323  TCE(udiv,      0, fbb0f0f0, 3, (RR, oRR, RR), 0, t_div),
15324
15325  /* ARM V7 instructions.  */
15326 #undef ARM_VARIANT
15327 #define ARM_VARIANT &arm_ext_v7
15328 #undef THUMB_VARIANT
15329 #define THUMB_VARIANT &arm_ext_v7
15330  TUF(pli,       450f000, f910f000, 1, (ADDR),     pli,      t_pld),
15331  TCE(dbg,       320f0f0, f3af80f0, 1, (I15),      dbg,      t_dbg),
15332  TUF(dmb,       57ff050, f3bf8f50, 1, (oBARRIER), barrier,  t_barrier),
15333  TUF(dsb,       57ff040, f3bf8f40, 1, (oBARRIER), barrier,  t_barrier),
15334  TUF(isb,       57ff060, f3bf8f60, 1, (oBARRIER), barrier,  t_barrier),
15335
15336 #undef ARM_VARIANT
15337 #define ARM_VARIANT &fpu_fpa_ext_v1  /* Core FPA instruction set (V1).  */
15338  cCE(wfs,       e200110, 1, (RR),            rd),
15339  cCE(rfs,       e300110, 1, (RR),            rd),
15340  cCE(wfc,       e400110, 1, (RR),            rd),
15341  cCE(rfc,       e500110, 1, (RR),            rd),
15342
15343  cCL(ldfs,      c100100, 2, (RF, ADDRGLDC),  rd_cpaddr),
15344  cCL(ldfd,      c108100, 2, (RF, ADDRGLDC),  rd_cpaddr),
15345  cCL(ldfe,      c500100, 2, (RF, ADDRGLDC),  rd_cpaddr),
15346  cCL(ldfp,      c508100, 2, (RF, ADDRGLDC),  rd_cpaddr),
15347
15348  cCL(stfs,      c000100, 2, (RF, ADDRGLDC),  rd_cpaddr),
15349  cCL(stfd,      c008100, 2, (RF, ADDRGLDC),  rd_cpaddr),
15350  cCL(stfe,      c400100, 2, (RF, ADDRGLDC),  rd_cpaddr),
15351  cCL(stfp,      c408100, 2, (RF, ADDRGLDC),  rd_cpaddr),
15352
15353  cCL(mvfs,      e008100, 2, (RF, RF_IF),     rd_rm),
15354  cCL(mvfsp,     e008120, 2, (RF, RF_IF),     rd_rm),
15355  cCL(mvfsm,     e008140, 2, (RF, RF_IF),     rd_rm),
15356  cCL(mvfsz,     e008160, 2, (RF, RF_IF),     rd_rm),
15357  cCL(mvfd,      e008180, 2, (RF, RF_IF),     rd_rm),
15358  cCL(mvfdp,     e0081a0, 2, (RF, RF_IF),     rd_rm),
15359  cCL(mvfdm,     e0081c0, 2, (RF, RF_IF),     rd_rm),
15360  cCL(mvfdz,     e0081e0, 2, (RF, RF_IF),     rd_rm),
15361  cCL(mvfe,      e088100, 2, (RF, RF_IF),     rd_rm),
15362  cCL(mvfep,     e088120, 2, (RF, RF_IF),     rd_rm),
15363  cCL(mvfem,     e088140, 2, (RF, RF_IF),     rd_rm),
15364  cCL(mvfez,     e088160, 2, (RF, RF_IF),     rd_rm),
15365
15366  cCL(mnfs,      e108100, 2, (RF, RF_IF),     rd_rm),
15367  cCL(mnfsp,     e108120, 2, (RF, RF_IF),     rd_rm),
15368  cCL(mnfsm,     e108140, 2, (RF, RF_IF),     rd_rm),
15369  cCL(mnfsz,     e108160, 2, (RF, RF_IF),     rd_rm),
15370  cCL(mnfd,      e108180, 2, (RF, RF_IF),     rd_rm),
15371  cCL(mnfdp,     e1081a0, 2, (RF, RF_IF),     rd_rm),
15372  cCL(mnfdm,     e1081c0, 2, (RF, RF_IF),     rd_rm),
15373  cCL(mnfdz,     e1081e0, 2, (RF, RF_IF),     rd_rm),
15374  cCL(mnfe,      e188100, 2, (RF, RF_IF),     rd_rm),
15375  cCL(mnfep,     e188120, 2, (RF, RF_IF),     rd_rm),
15376  cCL(mnfem,     e188140, 2, (RF, RF_IF),     rd_rm),
15377  cCL(mnfez,     e188160, 2, (RF, RF_IF),     rd_rm),
15378
15379  cCL(abss,      e208100, 2, (RF, RF_IF),     rd_rm),
15380  cCL(abssp,     e208120, 2, (RF, RF_IF),     rd_rm),
15381  cCL(abssm,     e208140, 2, (RF, RF_IF),     rd_rm),
15382  cCL(abssz,     e208160, 2, (RF, RF_IF),     rd_rm),
15383  cCL(absd,      e208180, 2, (RF, RF_IF),     rd_rm),
15384  cCL(absdp,     e2081a0, 2, (RF, RF_IF),     rd_rm),
15385  cCL(absdm,     e2081c0, 2, (RF, RF_IF),     rd_rm),
15386  cCL(absdz,     e2081e0, 2, (RF, RF_IF),     rd_rm),
15387  cCL(abse,      e288100, 2, (RF, RF_IF),     rd_rm),
15388  cCL(absep,     e288120, 2, (RF, RF_IF),     rd_rm),
15389  cCL(absem,     e288140, 2, (RF, RF_IF),     rd_rm),
15390  cCL(absez,     e288160, 2, (RF, RF_IF),     rd_rm),
15391
15392  cCL(rnds,      e308100, 2, (RF, RF_IF),     rd_rm),
15393  cCL(rndsp,     e308120, 2, (RF, RF_IF),     rd_rm),
15394  cCL(rndsm,     e308140, 2, (RF, RF_IF),     rd_rm),
15395  cCL(rndsz,     e308160, 2, (RF, RF_IF),     rd_rm),
15396  cCL(rndd,      e308180, 2, (RF, RF_IF),     rd_rm),
15397  cCL(rnddp,     e3081a0, 2, (RF, RF_IF),     rd_rm),
15398  cCL(rnddm,     e3081c0, 2, (RF, RF_IF),     rd_rm),
15399  cCL(rnddz,     e3081e0, 2, (RF, RF_IF),     rd_rm),
15400  cCL(rnde,      e388100, 2, (RF, RF_IF),     rd_rm),
15401  cCL(rndep,     e388120, 2, (RF, RF_IF),     rd_rm),
15402  cCL(rndem,     e388140, 2, (RF, RF_IF),     rd_rm),
15403  cCL(rndez,     e388160, 2, (RF, RF_IF),     rd_rm),
15404
15405  cCL(sqts,      e408100, 2, (RF, RF_IF),     rd_rm),
15406  cCL(sqtsp,     e408120, 2, (RF, RF_IF),     rd_rm),
15407  cCL(sqtsm,     e408140, 2, (RF, RF_IF),     rd_rm),
15408  cCL(sqtsz,     e408160, 2, (RF, RF_IF),     rd_rm),
15409  cCL(sqtd,      e408180, 2, (RF, RF_IF),     rd_rm),
15410  cCL(sqtdp,     e4081a0, 2, (RF, RF_IF),     rd_rm),
15411  cCL(sqtdm,     e4081c0, 2, (RF, RF_IF),     rd_rm),
15412  cCL(sqtdz,     e4081e0, 2, (RF, RF_IF),     rd_rm),
15413  cCL(sqte,      e488100, 2, (RF, RF_IF),     rd_rm),
15414  cCL(sqtep,     e488120, 2, (RF, RF_IF),     rd_rm),
15415  cCL(sqtem,     e488140, 2, (RF, RF_IF),     rd_rm),
15416  cCL(sqtez,     e488160, 2, (RF, RF_IF),     rd_rm),
15417
15418  cCL(logs,      e508100, 2, (RF, RF_IF),     rd_rm),
15419  cCL(logsp,     e508120, 2, (RF, RF_IF),     rd_rm),
15420  cCL(logsm,     e508140, 2, (RF, RF_IF),     rd_rm),
15421  cCL(logsz,     e508160, 2, (RF, RF_IF),     rd_rm),
15422  cCL(logd,      e508180, 2, (RF, RF_IF),     rd_rm),
15423  cCL(logdp,     e5081a0, 2, (RF, RF_IF),     rd_rm),
15424  cCL(logdm,     e5081c0, 2, (RF, RF_IF),     rd_rm),
15425  cCL(logdz,     e5081e0, 2, (RF, RF_IF),     rd_rm),
15426  cCL(loge,      e588100, 2, (RF, RF_IF),     rd_rm),
15427  cCL(logep,     e588120, 2, (RF, RF_IF),     rd_rm),
15428  cCL(logem,     e588140, 2, (RF, RF_IF),     rd_rm),
15429  cCL(logez,     e588160, 2, (RF, RF_IF),     rd_rm),
15430
15431  cCL(lgns,      e608100, 2, (RF, RF_IF),     rd_rm),
15432  cCL(lgnsp,     e608120, 2, (RF, RF_IF),     rd_rm),
15433  cCL(lgnsm,     e608140, 2, (RF, RF_IF),     rd_rm),
15434  cCL(lgnsz,     e608160, 2, (RF, RF_IF),     rd_rm),
15435  cCL(lgnd,      e608180, 2, (RF, RF_IF),     rd_rm),
15436  cCL(lgndp,     e6081a0, 2, (RF, RF_IF),     rd_rm),
15437  cCL(lgndm,     e6081c0, 2, (RF, RF_IF),     rd_rm),
15438  cCL(lgndz,     e6081e0, 2, (RF, RF_IF),     rd_rm),
15439  cCL(lgne,      e688100, 2, (RF, RF_IF),     rd_rm),
15440  cCL(lgnep,     e688120, 2, (RF, RF_IF),     rd_rm),
15441  cCL(lgnem,     e688140, 2, (RF, RF_IF),     rd_rm),
15442  cCL(lgnez,     e688160, 2, (RF, RF_IF),     rd_rm),
15443
15444  cCL(exps,      e708100, 2, (RF, RF_IF),     rd_rm),
15445  cCL(expsp,     e708120, 2, (RF, RF_IF),     rd_rm),
15446  cCL(expsm,     e708140, 2, (RF, RF_IF),     rd_rm),
15447  cCL(expsz,     e708160, 2, (RF, RF_IF),     rd_rm),
15448  cCL(expd,      e708180, 2, (RF, RF_IF),     rd_rm),
15449  cCL(expdp,     e7081a0, 2, (RF, RF_IF),     rd_rm),
15450  cCL(expdm,     e7081c0, 2, (RF, RF_IF),     rd_rm),
15451  cCL(expdz,     e7081e0, 2, (RF, RF_IF),     rd_rm),
15452  cCL(expe,      e788100, 2, (RF, RF_IF),     rd_rm),
15453  cCL(expep,     e788120, 2, (RF, RF_IF),     rd_rm),
15454  cCL(expem,     e788140, 2, (RF, RF_IF),     rd_rm),
15455  cCL(expdz,     e788160, 2, (RF, RF_IF),     rd_rm),
15456
15457  cCL(sins,      e808100, 2, (RF, RF_IF),     rd_rm),
15458  cCL(sinsp,     e808120, 2, (RF, RF_IF),     rd_rm),
15459  cCL(sinsm,     e808140, 2, (RF, RF_IF),     rd_rm),
15460  cCL(sinsz,     e808160, 2, (RF, RF_IF),     rd_rm),
15461  cCL(sind,      e808180, 2, (RF, RF_IF),     rd_rm),
15462  cCL(sindp,     e8081a0, 2, (RF, RF_IF),     rd_rm),
15463  cCL(sindm,     e8081c0, 2, (RF, RF_IF),     rd_rm),
15464  cCL(sindz,     e8081e0, 2, (RF, RF_IF),     rd_rm),
15465  cCL(sine,      e888100, 2, (RF, RF_IF),     rd_rm),
15466  cCL(sinep,     e888120, 2, (RF, RF_IF),     rd_rm),
15467  cCL(sinem,     e888140, 2, (RF, RF_IF),     rd_rm),
15468  cCL(sinez,     e888160, 2, (RF, RF_IF),     rd_rm),
15469
15470  cCL(coss,      e908100, 2, (RF, RF_IF),     rd_rm),
15471  cCL(cossp,     e908120, 2, (RF, RF_IF),     rd_rm),
15472  cCL(cossm,     e908140, 2, (RF, RF_IF),     rd_rm),
15473  cCL(cossz,     e908160, 2, (RF, RF_IF),     rd_rm),
15474  cCL(cosd,      e908180, 2, (RF, RF_IF),     rd_rm),
15475  cCL(cosdp,     e9081a0, 2, (RF, RF_IF),     rd_rm),
15476  cCL(cosdm,     e9081c0, 2, (RF, RF_IF),     rd_rm),
15477  cCL(cosdz,     e9081e0, 2, (RF, RF_IF),     rd_rm),
15478  cCL(cose,      e988100, 2, (RF, RF_IF),     rd_rm),
15479  cCL(cosep,     e988120, 2, (RF, RF_IF),     rd_rm),
15480  cCL(cosem,     e988140, 2, (RF, RF_IF),     rd_rm),
15481  cCL(cosez,     e988160, 2, (RF, RF_IF),     rd_rm),
15482
15483  cCL(tans,      ea08100, 2, (RF, RF_IF),     rd_rm),
15484  cCL(tansp,     ea08120, 2, (RF, RF_IF),     rd_rm),
15485  cCL(tansm,     ea08140, 2, (RF, RF_IF),     rd_rm),
15486  cCL(tansz,     ea08160, 2, (RF, RF_IF),     rd_rm),
15487  cCL(tand,      ea08180, 2, (RF, RF_IF),     rd_rm),
15488  cCL(tandp,     ea081a0, 2, (RF, RF_IF),     rd_rm),
15489  cCL(tandm,     ea081c0, 2, (RF, RF_IF),     rd_rm),
15490  cCL(tandz,     ea081e0, 2, (RF, RF_IF),     rd_rm),
15491  cCL(tane,      ea88100, 2, (RF, RF_IF),     rd_rm),
15492  cCL(tanep,     ea88120, 2, (RF, RF_IF),     rd_rm),
15493  cCL(tanem,     ea88140, 2, (RF, RF_IF),     rd_rm),
15494  cCL(tanez,     ea88160, 2, (RF, RF_IF),     rd_rm),
15495
15496  cCL(asns,      eb08100, 2, (RF, RF_IF),     rd_rm),
15497  cCL(asnsp,     eb08120, 2, (RF, RF_IF),     rd_rm),
15498  cCL(asnsm,     eb08140, 2, (RF, RF_IF),     rd_rm),
15499  cCL(asnsz,     eb08160, 2, (RF, RF_IF),     rd_rm),
15500  cCL(asnd,      eb08180, 2, (RF, RF_IF),     rd_rm),
15501  cCL(asndp,     eb081a0, 2, (RF, RF_IF),     rd_rm),
15502  cCL(asndm,     eb081c0, 2, (RF, RF_IF),     rd_rm),
15503  cCL(asndz,     eb081e0, 2, (RF, RF_IF),     rd_rm),
15504  cCL(asne,      eb88100, 2, (RF, RF_IF),     rd_rm),
15505  cCL(asnep,     eb88120, 2, (RF, RF_IF),     rd_rm),
15506  cCL(asnem,     eb88140, 2, (RF, RF_IF),     rd_rm),
15507  cCL(asnez,     eb88160, 2, (RF, RF_IF),     rd_rm),
15508
15509  cCL(acss,      ec08100, 2, (RF, RF_IF),     rd_rm),
15510  cCL(acssp,     ec08120, 2, (RF, RF_IF),     rd_rm),
15511  cCL(acssm,     ec08140, 2, (RF, RF_IF),     rd_rm),
15512  cCL(acssz,     ec08160, 2, (RF, RF_IF),     rd_rm),
15513  cCL(acsd,      ec08180, 2, (RF, RF_IF),     rd_rm),
15514  cCL(acsdp,     ec081a0, 2, (RF, RF_IF),     rd_rm),
15515  cCL(acsdm,     ec081c0, 2, (RF, RF_IF),     rd_rm),
15516  cCL(acsdz,     ec081e0, 2, (RF, RF_IF),     rd_rm),
15517  cCL(acse,      ec88100, 2, (RF, RF_IF),     rd_rm),
15518  cCL(acsep,     ec88120, 2, (RF, RF_IF),     rd_rm),
15519  cCL(acsem,     ec88140, 2, (RF, RF_IF),     rd_rm),
15520  cCL(acsez,     ec88160, 2, (RF, RF_IF),     rd_rm),
15521
15522  cCL(atns,      ed08100, 2, (RF, RF_IF),     rd_rm),
15523  cCL(atnsp,     ed08120, 2, (RF, RF_IF),     rd_rm),
15524  cCL(atnsm,     ed08140, 2, (RF, RF_IF),     rd_rm),
15525  cCL(atnsz,     ed08160, 2, (RF, RF_IF),     rd_rm),
15526  cCL(atnd,      ed08180, 2, (RF, RF_IF),     rd_rm),
15527  cCL(atndp,     ed081a0, 2, (RF, RF_IF),     rd_rm),
15528  cCL(atndm,     ed081c0, 2, (RF, RF_IF),     rd_rm),
15529  cCL(atndz,     ed081e0, 2, (RF, RF_IF),     rd_rm),
15530  cCL(atne,      ed88100, 2, (RF, RF_IF),     rd_rm),
15531  cCL(atnep,     ed88120, 2, (RF, RF_IF),     rd_rm),
15532  cCL(atnem,     ed88140, 2, (RF, RF_IF),     rd_rm),
15533  cCL(atnez,     ed88160, 2, (RF, RF_IF),     rd_rm),
15534
15535  cCL(urds,      ee08100, 2, (RF, RF_IF),     rd_rm),
15536  cCL(urdsp,     ee08120, 2, (RF, RF_IF),     rd_rm),
15537  cCL(urdsm,     ee08140, 2, (RF, RF_IF),     rd_rm),
15538  cCL(urdsz,     ee08160, 2, (RF, RF_IF),     rd_rm),
15539  cCL(urdd,      ee08180, 2, (RF, RF_IF),     rd_rm),
15540  cCL(urddp,     ee081a0, 2, (RF, RF_IF),     rd_rm),
15541  cCL(urddm,     ee081c0, 2, (RF, RF_IF),     rd_rm),
15542  cCL(urddz,     ee081e0, 2, (RF, RF_IF),     rd_rm),
15543  cCL(urde,      ee88100, 2, (RF, RF_IF),     rd_rm),
15544  cCL(urdep,     ee88120, 2, (RF, RF_IF),     rd_rm),
15545  cCL(urdem,     ee88140, 2, (RF, RF_IF),     rd_rm),
15546  cCL(urdez,     ee88160, 2, (RF, RF_IF),     rd_rm),
15547
15548  cCL(nrms,      ef08100, 2, (RF, RF_IF),     rd_rm),
15549  cCL(nrmsp,     ef08120, 2, (RF, RF_IF),     rd_rm),
15550  cCL(nrmsm,     ef08140, 2, (RF, RF_IF),     rd_rm),
15551  cCL(nrmsz,     ef08160, 2, (RF, RF_IF),     rd_rm),
15552  cCL(nrmd,      ef08180, 2, (RF, RF_IF),     rd_rm),
15553  cCL(nrmdp,     ef081a0, 2, (RF, RF_IF),     rd_rm),
15554  cCL(nrmdm,     ef081c0, 2, (RF, RF_IF),     rd_rm),
15555  cCL(nrmdz,     ef081e0, 2, (RF, RF_IF),     rd_rm),
15556  cCL(nrme,      ef88100, 2, (RF, RF_IF),     rd_rm),
15557  cCL(nrmep,     ef88120, 2, (RF, RF_IF),     rd_rm),
15558  cCL(nrmem,     ef88140, 2, (RF, RF_IF),     rd_rm),
15559  cCL(nrmez,     ef88160, 2, (RF, RF_IF),     rd_rm),
15560
15561  cCL(adfs,      e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
15562  cCL(adfsp,     e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
15563  cCL(adfsm,     e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
15564  cCL(adfsz,     e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
15565  cCL(adfd,      e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
15566  cCL(adfdp,     e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15567  cCL(adfdm,     e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15568  cCL(adfdz,     e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15569  cCL(adfe,      e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
15570  cCL(adfep,     e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
15571  cCL(adfem,     e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
15572  cCL(adfez,     e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
15573
15574  cCL(sufs,      e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
15575  cCL(sufsp,     e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
15576  cCL(sufsm,     e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
15577  cCL(sufsz,     e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
15578  cCL(sufd,      e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
15579  cCL(sufdp,     e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15580  cCL(sufdm,     e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15581  cCL(sufdz,     e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15582  cCL(sufe,      e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
15583  cCL(sufep,     e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
15584  cCL(sufem,     e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
15585  cCL(sufez,     e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
15586
15587  cCL(rsfs,      e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
15588  cCL(rsfsp,     e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
15589  cCL(rsfsm,     e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
15590  cCL(rsfsz,     e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
15591  cCL(rsfd,      e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
15592  cCL(rsfdp,     e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15593  cCL(rsfdm,     e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15594  cCL(rsfdz,     e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15595  cCL(rsfe,      e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
15596  cCL(rsfep,     e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
15597  cCL(rsfem,     e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
15598  cCL(rsfez,     e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
15599
15600  cCL(mufs,      e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
15601  cCL(mufsp,     e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
15602  cCL(mufsm,     e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
15603  cCL(mufsz,     e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
15604  cCL(mufd,      e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
15605  cCL(mufdp,     e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15606  cCL(mufdm,     e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15607  cCL(mufdz,     e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15608  cCL(mufe,      e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
15609  cCL(mufep,     e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
15610  cCL(mufem,     e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
15611  cCL(mufez,     e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
15612
15613  cCL(dvfs,      e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
15614  cCL(dvfsp,     e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
15615  cCL(dvfsm,     e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
15616  cCL(dvfsz,     e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
15617  cCL(dvfd,      e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
15618  cCL(dvfdp,     e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15619  cCL(dvfdm,     e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15620  cCL(dvfdz,     e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15621  cCL(dvfe,      e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
15622  cCL(dvfep,     e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
15623  cCL(dvfem,     e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
15624  cCL(dvfez,     e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
15625
15626  cCL(rdfs,      e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
15627  cCL(rdfsp,     e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
15628  cCL(rdfsm,     e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
15629  cCL(rdfsz,     e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
15630  cCL(rdfd,      e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
15631  cCL(rdfdp,     e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15632  cCL(rdfdm,     e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15633  cCL(rdfdz,     e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15634  cCL(rdfe,      e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
15635  cCL(rdfep,     e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
15636  cCL(rdfem,     e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
15637  cCL(rdfez,     e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
15638
15639  cCL(pows,      e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
15640  cCL(powsp,     e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
15641  cCL(powsm,     e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
15642  cCL(powsz,     e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
15643  cCL(powd,      e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
15644  cCL(powdp,     e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15645  cCL(powdm,     e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15646  cCL(powdz,     e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15647  cCL(powe,      e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
15648  cCL(powep,     e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
15649  cCL(powem,     e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
15650  cCL(powez,     e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
15651
15652  cCL(rpws,      e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
15653  cCL(rpwsp,     e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
15654  cCL(rpwsm,     e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
15655  cCL(rpwsz,     e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
15656  cCL(rpwd,      e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
15657  cCL(rpwdp,     e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15658  cCL(rpwdm,     e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15659  cCL(rpwdz,     e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15660  cCL(rpwe,      e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
15661  cCL(rpwep,     e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
15662  cCL(rpwem,     e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
15663  cCL(rpwez,     e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
15664
15665  cCL(rmfs,      e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
15666  cCL(rmfsp,     e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
15667  cCL(rmfsm,     e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
15668  cCL(rmfsz,     e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
15669  cCL(rmfd,      e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
15670  cCL(rmfdp,     e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15671  cCL(rmfdm,     e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15672  cCL(rmfdz,     e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15673  cCL(rmfe,      e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
15674  cCL(rmfep,     e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
15675  cCL(rmfem,     e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
15676  cCL(rmfez,     e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
15677
15678  cCL(fmls,      e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
15679  cCL(fmlsp,     e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
15680  cCL(fmlsm,     e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
15681  cCL(fmlsz,     e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
15682  cCL(fmld,      e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
15683  cCL(fmldp,     e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15684  cCL(fmldm,     e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15685  cCL(fmldz,     e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15686  cCL(fmle,      e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
15687  cCL(fmlep,     e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
15688  cCL(fmlem,     e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
15689  cCL(fmlez,     e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
15690
15691  cCL(fdvs,      ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
15692  cCL(fdvsp,     ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
15693  cCL(fdvsm,     ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
15694  cCL(fdvsz,     ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
15695  cCL(fdvd,      ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
15696  cCL(fdvdp,     ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15697  cCL(fdvdm,     ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15698  cCL(fdvdz,     ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15699  cCL(fdve,      ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
15700  cCL(fdvep,     ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
15701  cCL(fdvem,     ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
15702  cCL(fdvez,     ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
15703
15704  cCL(frds,      eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
15705  cCL(frdsp,     eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
15706  cCL(frdsm,     eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
15707  cCL(frdsz,     eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
15708  cCL(frdd,      eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
15709  cCL(frddp,     eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15710  cCL(frddm,     eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15711  cCL(frddz,     eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15712  cCL(frde,      eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
15713  cCL(frdep,     eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
15714  cCL(frdem,     eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
15715  cCL(frdez,     eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
15716
15717  cCL(pols,      ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
15718  cCL(polsp,     ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
15719  cCL(polsm,     ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
15720  cCL(polsz,     ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
15721  cCL(pold,      ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
15722  cCL(poldp,     ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15723  cCL(poldm,     ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15724  cCL(poldz,     ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15725  cCL(pole,      ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
15726  cCL(polep,     ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
15727  cCL(polem,     ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
15728  cCL(polez,     ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
15729
15730  cCE(cmf,       e90f110, 2, (RF, RF_IF),     fpa_cmp),
15731  C3E(cmfe,      ed0f110, 2, (RF, RF_IF),     fpa_cmp),
15732  cCE(cnf,       eb0f110, 2, (RF, RF_IF),     fpa_cmp),
15733  C3E(cnfe,      ef0f110, 2, (RF, RF_IF),     fpa_cmp),
15734
15735  cCL(flts,      e000110, 2, (RF, RR),        rn_rd),
15736  cCL(fltsp,     e000130, 2, (RF, RR),        rn_rd),
15737  cCL(fltsm,     e000150, 2, (RF, RR),        rn_rd),
15738  cCL(fltsz,     e000170, 2, (RF, RR),        rn_rd),
15739  cCL(fltd,      e000190, 2, (RF, RR),        rn_rd),
15740  cCL(fltdp,     e0001b0, 2, (RF, RR),        rn_rd),
15741  cCL(fltdm,     e0001d0, 2, (RF, RR),        rn_rd),
15742  cCL(fltdz,     e0001f0, 2, (RF, RR),        rn_rd),
15743  cCL(flte,      e080110, 2, (RF, RR),        rn_rd),
15744  cCL(fltep,     e080130, 2, (RF, RR),        rn_rd),
15745  cCL(fltem,     e080150, 2, (RF, RR),        rn_rd),
15746  cCL(fltez,     e080170, 2, (RF, RR),        rn_rd),
15747
15748   /* The implementation of the FIX instruction is broken on some
15749      assemblers, in that it accepts a precision specifier as well as a
15750      rounding specifier, despite the fact that this is meaningless.
15751      To be more compatible, we accept it as well, though of course it
15752      does not set any bits.  */
15753  cCE(fix,       e100110, 2, (RR, RF),        rd_rm),
15754  cCL(fixp,      e100130, 2, (RR, RF),        rd_rm),
15755  cCL(fixm,      e100150, 2, (RR, RF),        rd_rm),
15756  cCL(fixz,      e100170, 2, (RR, RF),        rd_rm),
15757  cCL(fixsp,     e100130, 2, (RR, RF),        rd_rm),
15758  cCL(fixsm,     e100150, 2, (RR, RF),        rd_rm),
15759  cCL(fixsz,     e100170, 2, (RR, RF),        rd_rm),
15760  cCL(fixdp,     e100130, 2, (RR, RF),        rd_rm),
15761  cCL(fixdm,     e100150, 2, (RR, RF),        rd_rm),
15762  cCL(fixdz,     e100170, 2, (RR, RF),        rd_rm),
15763  cCL(fixep,     e100130, 2, (RR, RF),        rd_rm),
15764  cCL(fixem,     e100150, 2, (RR, RF),        rd_rm),
15765  cCL(fixez,     e100170, 2, (RR, RF),        rd_rm),
15766
15767   /* Instructions that were new with the real FPA, call them V2.  */
15768 #undef ARM_VARIANT
15769 #define ARM_VARIANT &fpu_fpa_ext_v2
15770  cCE(lfm,       c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
15771  cCL(lfmfd,     c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
15772  cCL(lfmea,     d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
15773  cCE(sfm,       c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
15774  cCL(sfmfd,     d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
15775  cCL(sfmea,     c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
15776
15777 #undef ARM_VARIANT
15778 #define ARM_VARIANT &fpu_vfp_ext_v1xd  /* VFP V1xD (single precision).  */
15779   /* Moves and type conversions.  */
15780  cCE(fcpys,     eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
15781  cCE(fmrs,      e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
15782  cCE(fmsr,      e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
15783  cCE(fmstat,    ef1fa10, 0, (),               noargs),
15784  cCE(fsitos,    eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
15785  cCE(fuitos,    eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
15786  cCE(ftosis,    ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
15787  cCE(ftosizs,   ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
15788  cCE(ftouis,    ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
15789  cCE(ftouizs,   ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
15790  cCE(fmrx,      ef00a10, 2, (RR, RVC),        rd_rn),
15791  cCE(fmxr,      ee00a10, 2, (RVC, RR),        rn_rd),
15792  cCE(vmrs,      ef00a10, 2, (APSR_RR, RVC),   vfp_vmrs),
15793  cCE(vmsr,      ee00a10, 2, (RVC, RR),        vfp_vmsr),
15794
15795   /* Memory operations.  */
15796  cCE(flds,      d100a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
15797  cCE(fsts,      d000a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
15798  cCE(fldmias,   c900a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
15799  cCE(fldmfds,   c900a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
15800  cCE(fldmdbs,   d300a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
15801  cCE(fldmeas,   d300a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
15802  cCE(fldmiax,   c900b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
15803  cCE(fldmfdx,   c900b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
15804  cCE(fldmdbx,   d300b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
15805  cCE(fldmeax,   d300b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
15806  cCE(fstmias,   c800a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
15807  cCE(fstmeas,   c800a00, 2, (RRw, VRSLST),    vfp_sp_ldstmia),
15808  cCE(fstmdbs,   d200a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
15809  cCE(fstmfds,   d200a00, 2, (RRw, VRSLST),    vfp_sp_ldstmdb),
15810  cCE(fstmiax,   c800b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
15811  cCE(fstmeax,   c800b00, 2, (RRw, VRDLST),    vfp_xp_ldstmia),
15812  cCE(fstmdbx,   d200b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
15813  cCE(fstmfdx,   d200b00, 2, (RRw, VRDLST),    vfp_xp_ldstmdb),
15814
15815   /* Monadic operations.  */
15816  cCE(fabss,     eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
15817  cCE(fnegs,     eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
15818  cCE(fsqrts,    eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
15819
15820   /* Dyadic operations.  */
15821  cCE(fadds,     e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
15822  cCE(fsubs,     e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
15823  cCE(fmuls,     e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
15824  cCE(fdivs,     e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
15825  cCE(fmacs,     e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
15826  cCE(fmscs,     e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
15827  cCE(fnmuls,    e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
15828  cCE(fnmacs,    e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
15829  cCE(fnmscs,    e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
15830
15831   /* Comparisons.  */
15832  cCE(fcmps,     eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
15833  cCE(fcmpzs,    eb50a40, 1, (RVS),            vfp_sp_compare_z),
15834  cCE(fcmpes,    eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
15835  cCE(fcmpezs,   eb50ac0, 1, (RVS),            vfp_sp_compare_z),
15836
15837 #undef ARM_VARIANT
15838 #define ARM_VARIANT &fpu_vfp_ext_v1 /* VFP V1 (Double precision).  */
15839   /* Moves and type conversions.  */
15840  cCE(fcpyd,     eb00b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
15841  cCE(fcvtds,    eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
15842  cCE(fcvtsd,    eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
15843  cCE(fmdhr,     e200b10, 2, (RVD, RR),        vfp_dp_rn_rd),
15844  cCE(fmdlr,     e000b10, 2, (RVD, RR),        vfp_dp_rn_rd),
15845  cCE(fmrdh,     e300b10, 2, (RR, RVD),        vfp_dp_rd_rn),
15846  cCE(fmrdl,     e100b10, 2, (RR, RVD),        vfp_dp_rd_rn),
15847  cCE(fsitod,    eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
15848  cCE(fuitod,    eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
15849  cCE(ftosid,    ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
15850  cCE(ftosizd,   ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
15851  cCE(ftouid,    ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
15852  cCE(ftouizd,   ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
15853
15854   /* Memory operations.  */
15855  cCE(fldd,      d100b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
15856  cCE(fstd,      d000b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
15857  cCE(fldmiad,   c900b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
15858  cCE(fldmfdd,   c900b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
15859  cCE(fldmdbd,   d300b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
15860  cCE(fldmead,   d300b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
15861  cCE(fstmiad,   c800b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
15862  cCE(fstmead,   c800b00, 2, (RRw, VRDLST),    vfp_dp_ldstmia),
15863  cCE(fstmdbd,   d200b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
15864  cCE(fstmfdd,   d200b00, 2, (RRw, VRDLST),    vfp_dp_ldstmdb),
15865
15866   /* Monadic operations.  */
15867  cCE(fabsd,     eb00bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
15868  cCE(fnegd,     eb10b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
15869  cCE(fsqrtd,    eb10bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
15870
15871   /* Dyadic operations.  */
15872  cCE(faddd,     e300b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
15873  cCE(fsubd,     e300b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
15874  cCE(fmuld,     e200b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
15875  cCE(fdivd,     e800b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
15876  cCE(fmacd,     e000b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
15877  cCE(fmscd,     e100b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
15878  cCE(fnmuld,    e200b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
15879  cCE(fnmacd,    e000b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
15880  cCE(fnmscd,    e100b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
15881
15882   /* Comparisons.  */
15883  cCE(fcmpd,     eb40b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
15884  cCE(fcmpzd,    eb50b40, 1, (RVD),            vfp_dp_rd),
15885  cCE(fcmped,    eb40bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
15886  cCE(fcmpezd,   eb50bc0, 1, (RVD),            vfp_dp_rd),
15887
15888 #undef ARM_VARIANT
15889 #define ARM_VARIANT &fpu_vfp_ext_v2
15890  cCE(fmsrr,     c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
15891  cCE(fmrrs,     c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
15892  cCE(fmdrr,     c400b10, 3, (RVD, RR, RR),    vfp_dp_rm_rd_rn),
15893  cCE(fmrrd,     c500b10, 3, (RR, RR, RVD),    vfp_dp_rd_rn_rm),
15894
15895 /* Instructions which may belong to either the Neon or VFP instruction sets.
15896    Individual encoder functions perform additional architecture checks.  */
15897 #undef ARM_VARIANT
15898 #define ARM_VARIANT &fpu_vfp_ext_v1xd
15899 #undef THUMB_VARIANT
15900 #define THUMB_VARIANT &fpu_vfp_ext_v1xd
15901   /* These mnemonics are unique to VFP.  */
15902  NCE(vsqrt,     0,       2, (RVSD, RVSD),       vfp_nsyn_sqrt),
15903  NCE(vdiv,      0,       3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
15904  nCE(vnmul,     vnmul,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
15905  nCE(vnmla,     vnmla,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
15906  nCE(vnmls,     vnmls,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
15907  nCE(vcmp,      vcmp,    2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
15908  nCE(vcmpe,     vcmpe,   2, (RVSD, RVSD_I0),    vfp_nsyn_cmp),
15909  NCE(vpush,     0,       1, (VRSDLST),          vfp_nsyn_push),
15910  NCE(vpop,      0,       1, (VRSDLST),          vfp_nsyn_pop),
15911  NCE(vcvtz,     0,       2, (RVSD, RVSD),       vfp_nsyn_cvtz),
15912
15913   /* Mnemonics shared by Neon and VFP.  */
15914  nCEF(vmul,     vmul,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
15915  nCEF(vmla,     vmla,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
15916  nCEF(vmls,     vmls,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
15917
15918  nCEF(vadd,     vadd,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
15919  nCEF(vsub,     vsub,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
15920
15921  NCEF(vabs,     1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
15922  NCEF(vneg,     1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
15923
15924  NCE(vldm,      c900b00, 2, (RRw, VRSDLST), neon_ldm_stm),
15925  NCE(vldmia,    c900b00, 2, (RRw, VRSDLST), neon_ldm_stm),
15926  NCE(vldmdb,    d100b00, 2, (RRw, VRSDLST), neon_ldm_stm),
15927  NCE(vstm,      c800b00, 2, (RRw, VRSDLST), neon_ldm_stm),
15928  NCE(vstmia,    c800b00, 2, (RRw, VRSDLST), neon_ldm_stm),
15929  NCE(vstmdb,    d000b00, 2, (RRw, VRSDLST), neon_ldm_stm),
15930  NCE(vldr,      d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
15931  NCE(vstr,      d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
15932
15933  nCEF(vcvt,     vcvt,    3, (RNSDQ, RNSDQ, oI32b), neon_cvt),
15934
15935   /* NOTE: All VMOV encoding is special-cased!  */
15936  NCE(vmov,      0,       1, (VMOV), neon_mov),
15937  NCE(vmovq,     0,       1, (VMOV), neon_mov),
15938
15939 #undef THUMB_VARIANT
15940 #define THUMB_VARIANT &fpu_neon_ext_v1
15941 #undef ARM_VARIANT
15942 #define ARM_VARIANT &fpu_neon_ext_v1
15943   /* Data processing with three registers of the same length.  */
15944   /* integer ops, valid types S8 S16 S32 U8 U16 U32.  */
15945  NUF(vaba,      0000710, 3, (RNDQ, RNDQ,  RNDQ), neon_dyadic_i_su),
15946  NUF(vabaq,     0000710, 3, (RNQ,  RNQ,   RNQ),  neon_dyadic_i_su),
15947  NUF(vhadd,     0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
15948  NUF(vhaddq,    0000000, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
15949  NUF(vrhadd,    0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
15950  NUF(vrhaddq,   0000100, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
15951  NUF(vhsub,     0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
15952  NUF(vhsubq,    0000200, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
15953   /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64.  */
15954  NUF(vqadd,     0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
15955  NUF(vqaddq,    0000010, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
15956  NUF(vqsub,     0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
15957  NUF(vqsubq,    0000210, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
15958  NUF(vrshl,     0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
15959  NUF(vrshlq,    0000500, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
15960  NUF(vqrshl,    0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
15961  NUF(vqrshlq,   0000510, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
15962   /* If not immediate, fall back to neon_dyadic_i64_su.
15963      shl_imm should accept I8 I16 I32 I64,
15964      qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64.  */
15965  nUF(vshl,      vshl,    3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
15966  nUF(vshlq,     vshl,    3, (RNQ,  oRNQ,  RNDQ_I63b), neon_shl_imm),
15967  nUF(vqshl,     vqshl,   3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
15968  nUF(vqshlq,    vqshl,   3, (RNQ,  oRNQ,  RNDQ_I63b), neon_qshl_imm),
15969   /* Logic ops, types optional & ignored.  */
15970  nUF(vand,      vand,    2, (RNDQ, NILO),        neon_logic),
15971  nUF(vandq,     vand,    2, (RNQ,  NILO),        neon_logic),
15972  nUF(vbic,      vbic,    2, (RNDQ, NILO),        neon_logic),
15973  nUF(vbicq,     vbic,    2, (RNQ,  NILO),        neon_logic),
15974  nUF(vorr,      vorr,    2, (RNDQ, NILO),        neon_logic),
15975  nUF(vorrq,     vorr,    2, (RNQ,  NILO),        neon_logic),
15976  nUF(vorn,      vorn,    2, (RNDQ, NILO),        neon_logic),
15977  nUF(vornq,     vorn,    2, (RNQ,  NILO),        neon_logic),
15978  nUF(veor,      veor,    3, (RNDQ, oRNDQ, RNDQ), neon_logic),
15979  nUF(veorq,     veor,    3, (RNQ,  oRNQ,  RNQ),  neon_logic),
15980   /* Bitfield ops, untyped.  */
15981  NUF(vbsl,      1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
15982  NUF(vbslq,     1100110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
15983  NUF(vbit,      1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
15984  NUF(vbitq,     1200110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
15985  NUF(vbif,      1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
15986  NUF(vbifq,     1300110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
15987   /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32.  */
15988  nUF(vabd,      vabd,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
15989  nUF(vabdq,     vabd,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
15990  nUF(vmax,      vmax,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
15991  nUF(vmaxq,     vmax,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
15992  nUF(vmin,      vmin,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
15993  nUF(vminq,     vmin,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
15994   /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
15995      back to neon_dyadic_if_su.  */
15996  nUF(vcge,      vcge,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
15997  nUF(vcgeq,     vcge,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
15998  nUF(vcgt,      vcgt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
15999  nUF(vcgtq,     vcgt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
16000  nUF(vclt,      vclt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
16001  nUF(vcltq,     vclt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
16002  nUF(vcle,      vcle,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
16003  nUF(vcleq,     vcle,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
16004   /* Comparison. Type I8 I16 I32 F32.  */
16005  nUF(vceq,      vceq,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
16006  nUF(vceqq,     vceq,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_ceq),
16007   /* As above, D registers only.  */
16008  nUF(vpmax,     vpmax,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
16009  nUF(vpmin,     vpmin,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
16010   /* Int and float variants, signedness unimportant.  */
16011  nUF(vmlaq,     vmla,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
16012  nUF(vmlsq,     vmls,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
16013  nUF(vpadd,     vpadd,   3, (RND,  oRND,  RND),       neon_dyadic_if_i_d),
16014   /* Add/sub take types I8 I16 I32 I64 F32.  */
16015  nUF(vaddq,     vadd,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
16016  nUF(vsubq,     vsub,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
16017   /* vtst takes sizes 8, 16, 32.  */
16018  NUF(vtst,      0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
16019  NUF(vtstq,     0000810, 3, (RNQ,  oRNQ,  RNQ),  neon_tst),
16020   /* VMUL takes I8 I16 I32 F32 P8.  */
16021  nUF(vmulq,     vmul,     3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mul),
16022   /* VQD{R}MULH takes S16 S32.  */
16023  nUF(vqdmulh,   vqdmulh,  3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
16024  nUF(vqdmulhq,  vqdmulh,  3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
16025  nUF(vqrdmulh,  vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
16026  nUF(vqrdmulhq, vqrdmulh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
16027  NUF(vacge,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
16028  NUF(vacgeq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
16029  NUF(vacgt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
16030  NUF(vacgtq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
16031  NUF(vaclt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
16032  NUF(vacltq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
16033  NUF(vacle,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
16034  NUF(vacleq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
16035  NUF(vrecps,    0000f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
16036  NUF(vrecpsq,   0000f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
16037  NUF(vrsqrts,   0200f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
16038  NUF(vrsqrtsq,  0200f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
16039
16040   /* Two address, int/float. Types S8 S16 S32 F32.  */
16041  NUF(vabsq,     1b10300, 2, (RNQ,  RNQ),      neon_abs_neg),
16042  NUF(vnegq,     1b10380, 2, (RNQ,  RNQ),      neon_abs_neg),
16043
16044   /* Data processing with two registers and a shift amount.  */
16045   /* Right shifts, and variants with rounding.
16046      Types accepted S8 S16 S32 S64 U8 U16 U32 U64.  */
16047  NUF(vshr,      0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
16048  NUF(vshrq,     0800010, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
16049  NUF(vrshr,     0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
16050  NUF(vrshrq,    0800210, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
16051  NUF(vsra,      0800110, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
16052  NUF(vsraq,     0800110, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
16053  NUF(vrsra,     0800310, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
16054  NUF(vrsraq,    0800310, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
16055   /* Shift and insert. Sizes accepted 8 16 32 64.  */
16056  NUF(vsli,      1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
16057  NUF(vsliq,     1800510, 3, (RNQ,  oRNQ,  I63), neon_sli),
16058  NUF(vsri,      1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
16059  NUF(vsriq,     1800410, 3, (RNQ,  oRNQ,  I64), neon_sri),
16060   /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64.  */
16061  NUF(vqshlu,    1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
16062  NUF(vqshluq,   1800610, 3, (RNQ,  oRNQ,  I63), neon_qshlu_imm),
16063   /* Right shift immediate, saturating & narrowing, with rounding variants.
16064      Types accepted S16 S32 S64 U16 U32 U64.  */
16065  NUF(vqshrn,    0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
16066  NUF(vqrshrn,   0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
16067   /* As above, unsigned. Types accepted S16 S32 S64.  */
16068  NUF(vqshrun,   0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
16069  NUF(vqrshrun,  0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
16070   /* Right shift narrowing. Types accepted I16 I32 I64.  */
16071  NUF(vshrn,     0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
16072  NUF(vrshrn,    0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
16073   /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant.  */
16074  nUF(vshll,     vshll,   3, (RNQ, RND, I32),  neon_shll),
16075   /* CVT with optional immediate for fixed-point variant.  */
16076  nUF(vcvtq,     vcvt,    3, (RNQ, RNQ, oI32b), neon_cvt),
16077
16078  nUF(vmvn,      vmvn,    2, (RNDQ, RNDQ_IMVNb), neon_mvn),
16079  nUF(vmvnq,     vmvn,    2, (RNQ,  RNDQ_IMVNb), neon_mvn),
16080
16081   /* Data processing, three registers of different lengths.  */
16082   /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32.  */
16083  NUF(vabal,     0800500, 3, (RNQ, RND, RND),  neon_abal),
16084  NUF(vabdl,     0800700, 3, (RNQ, RND, RND),  neon_dyadic_long),
16085  NUF(vaddl,     0800000, 3, (RNQ, RND, RND),  neon_dyadic_long),
16086  NUF(vsubl,     0800200, 3, (RNQ, RND, RND),  neon_dyadic_long),
16087   /* If not scalar, fall back to neon_dyadic_long.
16088      Vector types as above, scalar types S16 S32 U16 U32.  */
16089  nUF(vmlal,     vmlal,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
16090  nUF(vmlsl,     vmlsl,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
16091   /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32.  */
16092  NUF(vaddw,     0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
16093  NUF(vsubw,     0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
16094   /* Dyadic, narrowing insns. Types I16 I32 I64.  */
16095  NUF(vaddhn,    0800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
16096  NUF(vraddhn,   1800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
16097  NUF(vsubhn,    0800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
16098  NUF(vrsubhn,   1800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
16099   /* Saturating doubling multiplies. Types S16 S32.  */
16100  nUF(vqdmlal,   vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
16101  nUF(vqdmlsl,   vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
16102  nUF(vqdmull,   vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
16103   /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
16104      S16 S32 U16 U32.  */
16105  nUF(vmull,     vmull,   3, (RNQ, RND, RND_RNSC), neon_vmull),
16106
16107   /* Extract. Size 8.  */
16108  NUF(vext,      0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
16109  NUF(vextq,     0b00000, 4, (RNQ,  oRNQ,  RNQ,  I15), neon_ext),
16110
16111   /* Two registers, miscellaneous.  */
16112   /* Reverse. Sizes 8 16 32 (must be < size in opcode).  */
16113  NUF(vrev64,    1b00000, 2, (RNDQ, RNDQ),     neon_rev),
16114  NUF(vrev64q,   1b00000, 2, (RNQ,  RNQ),      neon_rev),
16115  NUF(vrev32,    1b00080, 2, (RNDQ, RNDQ),     neon_rev),
16116  NUF(vrev32q,   1b00080, 2, (RNQ,  RNQ),      neon_rev),
16117  NUF(vrev16,    1b00100, 2, (RNDQ, RNDQ),     neon_rev),
16118  NUF(vrev16q,   1b00100, 2, (RNQ,  RNQ),      neon_rev),
16119   /* Vector replicate. Sizes 8 16 32.  */
16120  nCE(vdup,      vdup,    2, (RNDQ, RR_RNSC),  neon_dup),
16121  nCE(vdupq,     vdup,    2, (RNQ,  RR_RNSC),  neon_dup),
16122   /* VMOVL. Types S8 S16 S32 U8 U16 U32.  */
16123  NUF(vmovl,     0800a10, 2, (RNQ, RND),       neon_movl),
16124   /* VMOVN. Types I16 I32 I64.  */
16125  nUF(vmovn,     vmovn,   2, (RND, RNQ),       neon_movn),
16126   /* VQMOVN. Types S16 S32 S64 U16 U32 U64.  */
16127  nUF(vqmovn,    vqmovn,  2, (RND, RNQ),       neon_qmovn),
16128   /* VQMOVUN. Types S16 S32 S64.  */
16129  nUF(vqmovun,   vqmovun, 2, (RND, RNQ),       neon_qmovun),
16130   /* VZIP / VUZP. Sizes 8 16 32.  */
16131  NUF(vzip,      1b20180, 2, (RNDQ, RNDQ),     neon_zip_uzp),
16132  NUF(vzipq,     1b20180, 2, (RNQ,  RNQ),      neon_zip_uzp),
16133  NUF(vuzp,      1b20100, 2, (RNDQ, RNDQ),     neon_zip_uzp),
16134  NUF(vuzpq,     1b20100, 2, (RNQ,  RNQ),      neon_zip_uzp),
16135   /* VQABS / VQNEG. Types S8 S16 S32.  */
16136  NUF(vqabs,     1b00700, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
16137  NUF(vqabsq,    1b00700, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
16138  NUF(vqneg,     1b00780, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
16139  NUF(vqnegq,    1b00780, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
16140   /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32.  */
16141  NUF(vpadal,    1b00600, 2, (RNDQ, RNDQ),     neon_pair_long),
16142  NUF(vpadalq,   1b00600, 2, (RNQ,  RNQ),      neon_pair_long),
16143  NUF(vpaddl,    1b00200, 2, (RNDQ, RNDQ),     neon_pair_long),
16144  NUF(vpaddlq,   1b00200, 2, (RNQ,  RNQ),      neon_pair_long),
16145   /* Reciprocal estimates. Types U32 F32.  */
16146  NUF(vrecpe,    1b30400, 2, (RNDQ, RNDQ),     neon_recip_est),
16147  NUF(vrecpeq,   1b30400, 2, (RNQ,  RNQ),      neon_recip_est),
16148  NUF(vrsqrte,   1b30480, 2, (RNDQ, RNDQ),     neon_recip_est),
16149  NUF(vrsqrteq,  1b30480, 2, (RNQ,  RNQ),      neon_recip_est),
16150   /* VCLS. Types S8 S16 S32.  */
16151  NUF(vcls,      1b00400, 2, (RNDQ, RNDQ),     neon_cls),
16152  NUF(vclsq,     1b00400, 2, (RNQ,  RNQ),      neon_cls),
16153   /* VCLZ. Types I8 I16 I32.  */
16154  NUF(vclz,      1b00480, 2, (RNDQ, RNDQ),     neon_clz),
16155  NUF(vclzq,     1b00480, 2, (RNQ,  RNQ),      neon_clz),
16156   /* VCNT. Size 8.  */
16157  NUF(vcnt,      1b00500, 2, (RNDQ, RNDQ),     neon_cnt),
16158  NUF(vcntq,     1b00500, 2, (RNQ,  RNQ),      neon_cnt),
16159   /* Two address, untyped.  */
16160  NUF(vswp,      1b20000, 2, (RNDQ, RNDQ),     neon_swp),
16161  NUF(vswpq,     1b20000, 2, (RNQ,  RNQ),      neon_swp),
16162   /* VTRN. Sizes 8 16 32.  */
16163  nUF(vtrn,      vtrn,    2, (RNDQ, RNDQ),     neon_trn),
16164  nUF(vtrnq,     vtrn,    2, (RNQ,  RNQ),      neon_trn),
16165
16166   /* Table lookup. Size 8.  */
16167  NUF(vtbl,      1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
16168  NUF(vtbx,      1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
16169
16170 #undef THUMB_VARIANT
16171 #define THUMB_VARIANT &fpu_vfp_v3_or_neon_ext
16172 #undef ARM_VARIANT
16173 #define ARM_VARIANT &fpu_vfp_v3_or_neon_ext
16174   /* Neon element/structure load/store.  */
16175  nUF(vld1,      vld1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
16176  nUF(vst1,      vst1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
16177  nUF(vld2,      vld2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
16178  nUF(vst2,      vst2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
16179  nUF(vld3,      vld3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
16180  nUF(vst3,      vst3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
16181  nUF(vld4,      vld4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
16182  nUF(vst4,      vst4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
16183
16184 #undef THUMB_VARIANT
16185 #define THUMB_VARIANT &fpu_vfp_ext_v3
16186 #undef ARM_VARIANT
16187 #define ARM_VARIANT &fpu_vfp_ext_v3
16188  cCE(fconsts,   eb00a00, 2, (RVS, I255),      vfp_sp_const),
16189  cCE(fconstd,   eb00b00, 2, (RVD, I255),      vfp_dp_const),
16190  cCE(fshtos,    eba0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
16191  cCE(fshtod,    eba0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
16192  cCE(fsltos,    eba0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
16193  cCE(fsltod,    eba0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
16194  cCE(fuhtos,    ebb0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
16195  cCE(fuhtod,    ebb0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
16196  cCE(fultos,    ebb0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
16197  cCE(fultod,    ebb0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
16198  cCE(ftoshs,    ebe0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
16199  cCE(ftoshd,    ebe0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
16200  cCE(ftosls,    ebe0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
16201  cCE(ftosld,    ebe0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
16202  cCE(ftouhs,    ebf0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
16203  cCE(ftouhd,    ebf0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
16204  cCE(ftouls,    ebf0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
16205  cCE(ftould,    ebf0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
16206
16207 #undef THUMB_VARIANT
16208 #undef ARM_VARIANT
16209 #define ARM_VARIANT &arm_cext_xscale /* Intel XScale extensions.         */
16210  cCE(mia,       e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
16211  cCE(miaph,     e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
16212  cCE(miabb,     e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
16213  cCE(miabt,     e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
16214  cCE(miatb,     e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
16215  cCE(miatt,     e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
16216  cCE(mar,       c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
16217  cCE(mra,       c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
16218
16219 #undef ARM_VARIANT
16220 #define ARM_VARIANT &arm_cext_iwmmxt /* Intel Wireless MMX technology.  */
16221  cCE(tandcb,    e13f130, 1, (RR),                   iwmmxt_tandorc),
16222  cCE(tandch,    e53f130, 1, (RR),                   iwmmxt_tandorc),
16223  cCE(tandcw,    e93f130, 1, (RR),                   iwmmxt_tandorc),
16224  cCE(tbcstb,    e400010, 2, (RIWR, RR),             rn_rd),
16225  cCE(tbcsth,    e400050, 2, (RIWR, RR),             rn_rd),
16226  cCE(tbcstw,    e400090, 2, (RIWR, RR),             rn_rd),
16227  cCE(textrcb,   e130170, 2, (RR, I7),               iwmmxt_textrc),
16228  cCE(textrch,   e530170, 2, (RR, I7),               iwmmxt_textrc),
16229  cCE(textrcw,   e930170, 2, (RR, I7),               iwmmxt_textrc),
16230  cCE(textrmub,  e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
16231  cCE(textrmuh,  e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
16232  cCE(textrmuw,  e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
16233  cCE(textrmsb,  e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
16234  cCE(textrmsh,  e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
16235  cCE(textrmsw,  e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
16236  cCE(tinsrb,    e600010, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
16237  cCE(tinsrh,    e600050, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
16238  cCE(tinsrw,    e600090, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
16239  cCE(tmcr,      e000110, 2, (RIWC_RIWG, RR),        rn_rd),
16240  cCE(tmcrr,     c400000, 3, (RIWR, RR, RR),         rm_rd_rn),
16241  cCE(tmia,      e200010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
16242  cCE(tmiaph,    e280010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
16243  cCE(tmiabb,    e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
16244  cCE(tmiabt,    e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
16245  cCE(tmiatb,    e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
16246  cCE(tmiatt,    e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
16247  cCE(tmovmskb,  e100030, 2, (RR, RIWR),             rd_rn),
16248  cCE(tmovmskh,  e500030, 2, (RR, RIWR),             rd_rn),
16249  cCE(tmovmskw,  e900030, 2, (RR, RIWR),             rd_rn),
16250  cCE(tmrc,      e100110, 2, (RR, RIWC_RIWG),        rd_rn),
16251  cCE(tmrrc,     c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
16252  cCE(torcb,     e13f150, 1, (RR),                   iwmmxt_tandorc),
16253  cCE(torch,     e53f150, 1, (RR),                   iwmmxt_tandorc),
16254  cCE(torcw,     e93f150, 1, (RR),                   iwmmxt_tandorc),
16255  cCE(waccb,     e0001c0, 2, (RIWR, RIWR),           rd_rn),
16256  cCE(wacch,     e4001c0, 2, (RIWR, RIWR),           rd_rn),
16257  cCE(waccw,     e8001c0, 2, (RIWR, RIWR),           rd_rn),
16258  cCE(waddbss,   e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16259  cCE(waddb,     e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16260  cCE(waddbus,   e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16261  cCE(waddhss,   e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16262  cCE(waddh,     e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16263  cCE(waddhus,   e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16264  cCE(waddwss,   eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16265  cCE(waddw,     e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16266  cCE(waddwus,   e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16267  cCE(waligni,   e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
16268  cCE(walignr0,  e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16269  cCE(walignr1,  e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16270  cCE(walignr2,  ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16271  cCE(walignr3,  eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16272  cCE(wand,      e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16273  cCE(wandn,     e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16274  cCE(wavg2b,    e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16275  cCE(wavg2br,   e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16276  cCE(wavg2h,    ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16277  cCE(wavg2hr,   ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16278  cCE(wcmpeqb,   e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16279  cCE(wcmpeqh,   e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16280  cCE(wcmpeqw,   e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16281  cCE(wcmpgtub,  e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16282  cCE(wcmpgtuh,  e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16283  cCE(wcmpgtuw,  e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16284  cCE(wcmpgtsb,  e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16285  cCE(wcmpgtsh,  e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16286  cCE(wcmpgtsw,  eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16287  cCE(wldrb,     c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
16288  cCE(wldrh,     c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
16289  cCE(wldrw,     c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
16290  cCE(wldrd,     c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
16291  cCE(wmacs,     e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16292  cCE(wmacsz,    e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16293  cCE(wmacu,     e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16294  cCE(wmacuz,    e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16295  cCE(wmadds,    ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16296  cCE(wmaddu,    e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16297  cCE(wmaxsb,    e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16298  cCE(wmaxsh,    e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16299  cCE(wmaxsw,    ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16300  cCE(wmaxub,    e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16301  cCE(wmaxuh,    e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16302  cCE(wmaxuw,    e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16303  cCE(wminsb,    e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16304  cCE(wminsh,    e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16305  cCE(wminsw,    eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16306  cCE(wminub,    e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16307  cCE(wminuh,    e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16308  cCE(wminuw,    e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16309  cCE(wmov,      e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
16310  cCE(wmulsm,    e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16311  cCE(wmulsl,    e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16312  cCE(wmulum,    e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16313  cCE(wmulul,    e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16314  cCE(wor,       e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16315  cCE(wpackhss,  e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16316  cCE(wpackhus,  e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16317  cCE(wpackwss,  eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16318  cCE(wpackwus,  e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16319  cCE(wpackdss,  ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16320  cCE(wpackdus,  ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16321  cCE(wrorh,     e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
16322  cCE(wrorhg,    e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
16323  cCE(wrorw,     eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
16324  cCE(wrorwg,    eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
16325  cCE(wrord,     ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
16326  cCE(wrordg,    ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
16327  cCE(wsadb,     e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16328  cCE(wsadbz,    e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16329  cCE(wsadh,     e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16330  cCE(wsadhz,    e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16331  cCE(wshufh,    e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
16332  cCE(wsllh,     e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
16333  cCE(wsllhg,    e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
16334  cCE(wsllw,     e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
16335  cCE(wsllwg,    e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
16336  cCE(wslld,     ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
16337  cCE(wslldg,    ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
16338  cCE(wsrah,     e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
16339  cCE(wsrahg,    e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
16340  cCE(wsraw,     e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
16341  cCE(wsrawg,    e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
16342  cCE(wsrad,     ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
16343  cCE(wsradg,    ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
16344  cCE(wsrlh,     e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
16345  cCE(wsrlhg,    e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
16346  cCE(wsrlw,     ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
16347  cCE(wsrlwg,    ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
16348  cCE(wsrld,     ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
16349  cCE(wsrldg,    ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
16350  cCE(wstrb,     c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
16351  cCE(wstrh,     c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
16352  cCE(wstrw,     c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
16353  cCE(wstrd,     c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
16354  cCE(wsubbss,   e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16355  cCE(wsubb,     e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16356  cCE(wsubbus,   e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16357  cCE(wsubhss,   e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16358  cCE(wsubh,     e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16359  cCE(wsubhus,   e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16360  cCE(wsubwss,   eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16361  cCE(wsubw,     e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16362  cCE(wsubwus,   e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16363  cCE(wunpckehub,e0000c0, 2, (RIWR, RIWR),           rd_rn),
16364  cCE(wunpckehuh,e4000c0, 2, (RIWR, RIWR),           rd_rn),
16365  cCE(wunpckehuw,e8000c0, 2, (RIWR, RIWR),           rd_rn),
16366  cCE(wunpckehsb,e2000c0, 2, (RIWR, RIWR),           rd_rn),
16367  cCE(wunpckehsh,e6000c0, 2, (RIWR, RIWR),           rd_rn),
16368  cCE(wunpckehsw,ea000c0, 2, (RIWR, RIWR),           rd_rn),
16369  cCE(wunpckihb, e1000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16370  cCE(wunpckihh, e5000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16371  cCE(wunpckihw, e9000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16372  cCE(wunpckelub,e0000e0, 2, (RIWR, RIWR),           rd_rn),
16373  cCE(wunpckeluh,e4000e0, 2, (RIWR, RIWR),           rd_rn),
16374  cCE(wunpckeluw,e8000e0, 2, (RIWR, RIWR),           rd_rn),
16375  cCE(wunpckelsb,e2000e0, 2, (RIWR, RIWR),           rd_rn),
16376  cCE(wunpckelsh,e6000e0, 2, (RIWR, RIWR),           rd_rn),
16377  cCE(wunpckelsw,ea000e0, 2, (RIWR, RIWR),           rd_rn),
16378  cCE(wunpckilb, e1000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16379  cCE(wunpckilh, e5000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16380  cCE(wunpckilw, e9000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16381  cCE(wxor,      e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16382  cCE(wzero,     e300000, 1, (RIWR),                 iwmmxt_wzero),
16383
16384 #undef ARM_VARIANT
16385 #define ARM_VARIANT &arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2.  */
16386  cCE(torvscb,   e13f190, 1, (RR),                   iwmmxt_tandorc),
16387  cCE(torvsch,   e53f190, 1, (RR),                   iwmmxt_tandorc),
16388  cCE(torvscw,   e93f190, 1, (RR),                   iwmmxt_tandorc),
16389  cCE(wabsb,     e2001c0, 2, (RIWR, RIWR),           rd_rn),
16390  cCE(wabsh,     e6001c0, 2, (RIWR, RIWR),           rd_rn),
16391  cCE(wabsw,     ea001c0, 2, (RIWR, RIWR),           rd_rn),
16392  cCE(wabsdiffb, e1001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16393  cCE(wabsdiffh, e5001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16394  cCE(wabsdiffw, e9001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16395  cCE(waddbhusl, e2001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16396  cCE(waddbhusm, e6001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16397  cCE(waddhc,    e600180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16398  cCE(waddwc,    ea00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16399  cCE(waddsubhx, ea001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16400  cCE(wavg4,     e400000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16401  cCE(wavg4r,    e500000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16402  cCE(wmaddsn,   ee00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16403  cCE(wmaddsx,   eb00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16404  cCE(wmaddun,   ec00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16405  cCE(wmaddux,   e900100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16406  cCE(wmerge,    e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
16407  cCE(wmiabb,    e0000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16408  cCE(wmiabt,    e1000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16409  cCE(wmiatb,    e2000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16410  cCE(wmiatt,    e3000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16411  cCE(wmiabbn,   e4000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16412  cCE(wmiabtn,   e5000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16413  cCE(wmiatbn,   e6000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16414  cCE(wmiattn,   e7000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16415  cCE(wmiawbb,   e800120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16416  cCE(wmiawbt,   e900120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16417  cCE(wmiawtb,   ea00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16418  cCE(wmiawtt,   eb00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16419  cCE(wmiawbbn,  ec00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16420  cCE(wmiawbtn,  ed00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16421  cCE(wmiawtbn,  ee00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16422  cCE(wmiawttn,  ef00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16423  cCE(wmulsmr,   ef00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16424  cCE(wmulumr,   ed00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16425  cCE(wmulwumr,  ec000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16426  cCE(wmulwsmr,  ee000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16427  cCE(wmulwum,   ed000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16428  cCE(wmulwsm,   ef000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16429  cCE(wmulwl,    eb000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16430  cCE(wqmiabb,   e8000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16431  cCE(wqmiabt,   e9000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16432  cCE(wqmiatb,   ea000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16433  cCE(wqmiatt,   eb000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16434  cCE(wqmiabbn,  ec000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16435  cCE(wqmiabtn,  ed000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16436  cCE(wqmiatbn,  ee000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16437  cCE(wqmiattn,  ef000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16438  cCE(wqmulm,    e100080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16439  cCE(wqmulmr,   e300080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16440  cCE(wqmulwm,   ec000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16441  cCE(wqmulwmr,  ee000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16442  cCE(wsubaddhx, ed001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
16443
16444 #undef ARM_VARIANT
16445 #define ARM_VARIANT &arm_cext_maverick /* Cirrus Maverick instructions. */
16446  cCE(cfldrs,    c100400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
16447  cCE(cfldrd,    c500400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
16448  cCE(cfldr32,   c100500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
16449  cCE(cfldr64,   c500500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
16450  cCE(cfstrs,    c000400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
16451  cCE(cfstrd,    c400400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
16452  cCE(cfstr32,   c000500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
16453  cCE(cfstr64,   c400500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
16454  cCE(cfmvsr,    e000450, 2, (RMF, RR),                rn_rd),
16455  cCE(cfmvrs,    e100450, 2, (RR, RMF),                rd_rn),
16456  cCE(cfmvdlr,   e000410, 2, (RMD, RR),                rn_rd),
16457  cCE(cfmvrdl,   e100410, 2, (RR, RMD),                rd_rn),
16458  cCE(cfmvdhr,   e000430, 2, (RMD, RR),                rn_rd),
16459  cCE(cfmvrdh,   e100430, 2, (RR, RMD),                rd_rn),
16460  cCE(cfmv64lr,  e000510, 2, (RMDX, RR),               rn_rd),
16461  cCE(cfmvr64l,  e100510, 2, (RR, RMDX),               rd_rn),
16462  cCE(cfmv64hr,  e000530, 2, (RMDX, RR),               rn_rd),
16463  cCE(cfmvr64h,  e100530, 2, (RR, RMDX),               rd_rn),
16464  cCE(cfmval32,  e200440, 2, (RMAX, RMFX),             rd_rn),
16465  cCE(cfmv32al,  e100440, 2, (RMFX, RMAX),             rd_rn),
16466  cCE(cfmvam32,  e200460, 2, (RMAX, RMFX),             rd_rn),
16467  cCE(cfmv32am,  e100460, 2, (RMFX, RMAX),             rd_rn),
16468  cCE(cfmvah32,  e200480, 2, (RMAX, RMFX),             rd_rn),
16469  cCE(cfmv32ah,  e100480, 2, (RMFX, RMAX),             rd_rn),
16470  cCE(cfmva32,   e2004a0, 2, (RMAX, RMFX),             rd_rn),
16471  cCE(cfmv32a,   e1004a0, 2, (RMFX, RMAX),             rd_rn),
16472  cCE(cfmva64,   e2004c0, 2, (RMAX, RMDX),             rd_rn),
16473  cCE(cfmv64a,   e1004c0, 2, (RMDX, RMAX),             rd_rn),
16474  cCE(cfmvsc32,  e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
16475  cCE(cfmv32sc,  e1004e0, 2, (RMDX, RMDS),             rd),
16476  cCE(cfcpys,    e000400, 2, (RMF, RMF),               rd_rn),
16477  cCE(cfcpyd,    e000420, 2, (RMD, RMD),               rd_rn),
16478  cCE(cfcvtsd,   e000460, 2, (RMD, RMF),               rd_rn),
16479  cCE(cfcvtds,   e000440, 2, (RMF, RMD),               rd_rn),
16480  cCE(cfcvt32s,  e000480, 2, (RMF, RMFX),              rd_rn),
16481  cCE(cfcvt32d,  e0004a0, 2, (RMD, RMFX),              rd_rn),
16482  cCE(cfcvt64s,  e0004c0, 2, (RMF, RMDX),              rd_rn),
16483  cCE(cfcvt64d,  e0004e0, 2, (RMD, RMDX),              rd_rn),
16484  cCE(cfcvts32,  e100580, 2, (RMFX, RMF),              rd_rn),
16485  cCE(cfcvtd32,  e1005a0, 2, (RMFX, RMD),              rd_rn),
16486  cCE(cftruncs32,e1005c0, 2, (RMFX, RMF),              rd_rn),
16487  cCE(cftruncd32,e1005e0, 2, (RMFX, RMD),              rd_rn),
16488  cCE(cfrshl32,  e000550, 3, (RMFX, RMFX, RR),         mav_triple),
16489  cCE(cfrshl64,  e000570, 3, (RMDX, RMDX, RR),         mav_triple),
16490  cCE(cfsh32,    e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
16491  cCE(cfsh64,    e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
16492  cCE(cfcmps,    e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
16493  cCE(cfcmpd,    e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
16494  cCE(cfcmp32,   e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
16495  cCE(cfcmp64,   e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
16496  cCE(cfabss,    e300400, 2, (RMF, RMF),               rd_rn),
16497  cCE(cfabsd,    e300420, 2, (RMD, RMD),               rd_rn),
16498  cCE(cfnegs,    e300440, 2, (RMF, RMF),               rd_rn),
16499  cCE(cfnegd,    e300460, 2, (RMD, RMD),               rd_rn),
16500  cCE(cfadds,    e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
16501  cCE(cfaddd,    e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
16502  cCE(cfsubs,    e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
16503  cCE(cfsubd,    e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
16504  cCE(cfmuls,    e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
16505  cCE(cfmuld,    e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
16506  cCE(cfabs32,   e300500, 2, (RMFX, RMFX),             rd_rn),
16507  cCE(cfabs64,   e300520, 2, (RMDX, RMDX),             rd_rn),
16508  cCE(cfneg32,   e300540, 2, (RMFX, RMFX),             rd_rn),
16509  cCE(cfneg64,   e300560, 2, (RMDX, RMDX),             rd_rn),
16510  cCE(cfadd32,   e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
16511  cCE(cfadd64,   e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
16512  cCE(cfsub32,   e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
16513  cCE(cfsub64,   e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
16514  cCE(cfmul32,   e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
16515  cCE(cfmul64,   e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
16516  cCE(cfmac32,   e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
16517  cCE(cfmsc32,   e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
16518  cCE(cfmadd32,  e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
16519  cCE(cfmsub32,  e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
16520  cCE(cfmadda32, e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
16521  cCE(cfmsuba32, e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
16522 };
16523 #undef ARM_VARIANT
16524 #undef THUMB_VARIANT
16525 #undef TCE
16526 #undef TCM
16527 #undef TUE
16528 #undef TUF
16529 #undef TCC
16530 #undef cCE
16531 #undef cCL
16532 #undef C3E
16533 #undef CE
16534 #undef CM
16535 #undef UE
16536 #undef UF
16537 #undef UT
16538 #undef NUF
16539 #undef nUF
16540 #undef NCE
16541 #undef nCE
16542 #undef OPS0
16543 #undef OPS1
16544 #undef OPS2
16545 #undef OPS3
16546 #undef OPS4
16547 #undef OPS5
16548 #undef OPS6
16549 #undef do_0
16550 \f
16551 /* MD interface: bits in the object file.  */
16552
16553 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
16554    for use in the a.out file, and stores them in the array pointed to by buf.
16555    This knows about the endian-ness of the target machine and does
16556    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
16557    2 (short) and 4 (long)  Floating numbers are put out as a series of
16558    LITTLENUMS (shorts, here at least).  */
16559
16560 void
16561 md_number_to_chars (char * buf, valueT val, int n)
16562 {
16563   if (target_big_endian)
16564     number_to_chars_bigendian (buf, val, n);
16565   else
16566     number_to_chars_littleendian (buf, val, n);
16567 }
16568
16569 static valueT
16570 md_chars_to_number (char * buf, int n)
16571 {
16572   valueT result = 0;
16573   unsigned char * where = (unsigned char *) buf;
16574
16575   if (target_big_endian)
16576     {
16577       while (n--)
16578         {
16579           result <<= 8;
16580           result |= (*where++ & 255);
16581         }
16582     }
16583   else
16584     {
16585       while (n--)
16586         {
16587           result <<= 8;
16588           result |= (where[n] & 255);
16589         }
16590     }
16591
16592   return result;
16593 }
16594
16595 /* MD interface: Sections.  */
16596
16597 /* Estimate the size of a frag before relaxing.  Assume everything fits in
16598    2 bytes.  */
16599
16600 int
16601 md_estimate_size_before_relax (fragS * fragp,
16602                                segT    segtype ATTRIBUTE_UNUSED)
16603 {
16604   fragp->fr_var = 2;
16605   return 2;
16606 }
16607
16608 /* Convert a machine dependent frag.  */
16609
16610 void
16611 md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
16612 {
16613   unsigned long insn;
16614   unsigned long old_op;
16615   char *buf;
16616   expressionS exp;
16617   fixS *fixp;
16618   int reloc_type;
16619   int pc_rel;
16620   int opcode;
16621
16622   buf = fragp->fr_literal + fragp->fr_fix;
16623
16624   old_op = bfd_get_16(abfd, buf);
16625   if (fragp->fr_symbol) {
16626       exp.X_op = O_symbol;
16627       exp.X_add_symbol = fragp->fr_symbol;
16628   } else {
16629       exp.X_op = O_constant;
16630   }
16631   exp.X_add_number = fragp->fr_offset;
16632   opcode = fragp->fr_subtype;
16633   switch (opcode)
16634     {
16635     case T_MNEM_ldr_pc:
16636     case T_MNEM_ldr_pc2:
16637     case T_MNEM_ldr_sp:
16638     case T_MNEM_str_sp:
16639     case T_MNEM_ldr:
16640     case T_MNEM_ldrb:
16641     case T_MNEM_ldrh:
16642     case T_MNEM_str:
16643     case T_MNEM_strb:
16644     case T_MNEM_strh:
16645       if (fragp->fr_var == 4)
16646         {
16647           insn = THUMB_OP32(opcode);
16648           if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
16649             {
16650               insn |= (old_op & 0x700) << 4;
16651             }
16652           else
16653             {
16654               insn |= (old_op & 7) << 12;
16655               insn |= (old_op & 0x38) << 13;
16656             }
16657           insn |= 0x00000c00;
16658           put_thumb32_insn (buf, insn);
16659           reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
16660         }
16661       else
16662         {
16663           reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
16664         }
16665       pc_rel = (opcode == T_MNEM_ldr_pc2);
16666       break;
16667     case T_MNEM_adr:
16668       if (fragp->fr_var == 4)
16669         {
16670           insn = THUMB_OP32 (opcode);
16671           insn |= (old_op & 0xf0) << 4;
16672           put_thumb32_insn (buf, insn);
16673           reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
16674         }
16675       else
16676         {
16677           reloc_type = BFD_RELOC_ARM_THUMB_ADD;
16678           exp.X_add_number -= 4;
16679         }
16680       pc_rel = 1;
16681       break;
16682     case T_MNEM_mov:
16683     case T_MNEM_movs:
16684     case T_MNEM_cmp:
16685     case T_MNEM_cmn:
16686       if (fragp->fr_var == 4)
16687         {
16688           int r0off = (opcode == T_MNEM_mov
16689                        || opcode == T_MNEM_movs) ? 0 : 8;
16690           insn = THUMB_OP32 (opcode);
16691           insn = (insn & 0xe1ffffff) | 0x10000000;
16692           insn |= (old_op & 0x700) << r0off;
16693           put_thumb32_insn (buf, insn);
16694           reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
16695         }
16696       else
16697         {
16698           reloc_type = BFD_RELOC_ARM_THUMB_IMM;
16699         }
16700       pc_rel = 0;
16701       break;
16702     case T_MNEM_b:
16703       if (fragp->fr_var == 4)
16704         {
16705           insn = THUMB_OP32(opcode);
16706           put_thumb32_insn (buf, insn);
16707           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
16708         }
16709       else
16710         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
16711       pc_rel = 1;
16712       break;
16713     case T_MNEM_bcond:
16714       if (fragp->fr_var == 4)
16715         {
16716           insn = THUMB_OP32(opcode);
16717           insn |= (old_op & 0xf00) << 14;
16718           put_thumb32_insn (buf, insn);
16719           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
16720         }
16721       else
16722         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
16723       pc_rel = 1;
16724       break;
16725     case T_MNEM_add_sp:
16726     case T_MNEM_add_pc:
16727     case T_MNEM_inc_sp:
16728     case T_MNEM_dec_sp:
16729       if (fragp->fr_var == 4)
16730         {
16731           /* ??? Choose between add and addw.  */
16732           insn = THUMB_OP32 (opcode);
16733           insn |= (old_op & 0xf0) << 4;
16734           put_thumb32_insn (buf, insn);
16735           if (opcode == T_MNEM_add_pc)
16736             reloc_type = BFD_RELOC_ARM_T32_IMM12;
16737           else
16738             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
16739         }
16740       else
16741         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
16742       pc_rel = 0;
16743       break;
16744
16745     case T_MNEM_addi:
16746     case T_MNEM_addis:
16747     case T_MNEM_subi:
16748     case T_MNEM_subis:
16749       if (fragp->fr_var == 4)
16750         {
16751           insn = THUMB_OP32 (opcode);
16752           insn |= (old_op & 0xf0) << 4;
16753           insn |= (old_op & 0xf) << 16;
16754           put_thumb32_insn (buf, insn);
16755           if (insn & (1 << 20))
16756             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
16757           else
16758             reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
16759         }
16760       else
16761         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
16762       pc_rel = 0;
16763       break;
16764     default:
16765       abort();
16766     }
16767   fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
16768                       reloc_type);
16769   fixp->fx_file = fragp->fr_file;
16770   fixp->fx_line = fragp->fr_line;
16771   fragp->fr_fix += fragp->fr_var;
16772 }
16773
16774 /* Return the size of a relaxable immediate operand instruction.
16775    SHIFT and SIZE specify the form of the allowable immediate.  */
16776 static int
16777 relax_immediate (fragS *fragp, int size, int shift)
16778 {
16779   offsetT offset;
16780   offsetT mask;
16781   offsetT low;
16782
16783   /* ??? Should be able to do better than this.  */
16784   if (fragp->fr_symbol)
16785     return 4;
16786
16787   low = (1 << shift) - 1;
16788   mask = (1 << (shift + size)) - (1 << shift);
16789   offset = fragp->fr_offset;
16790   /* Force misaligned offsets to 32-bit variant.  */
16791   if (offset & low)
16792     return 4;
16793   if (offset & ~mask)
16794     return 4;
16795   return 2;
16796 }
16797
16798 /* Get the address of a symbol during relaxation.  */
16799 static addressT
16800 relaxed_symbol_addr(fragS *fragp, long stretch)
16801 {
16802   fragS *sym_frag;
16803   addressT addr;
16804   symbolS *sym;
16805
16806   sym = fragp->fr_symbol;
16807   sym_frag = symbol_get_frag (sym);
16808   know (S_GET_SEGMENT (sym) != absolute_section
16809         || sym_frag == &zero_address_frag);
16810   addr = S_GET_VALUE (sym) + fragp->fr_offset;
16811
16812   /* If frag has yet to be reached on this pass, assume it will
16813      move by STRETCH just as we did.  If this is not so, it will
16814      be because some frag between grows, and that will force
16815      another pass.  */
16816
16817   if (stretch != 0
16818       && sym_frag->relax_marker != fragp->relax_marker)
16819     addr += stretch;
16820
16821   return addr;
16822 }
16823
16824 /* Return the size of a relaxable adr pseudo-instruction or PC-relative
16825    load.  */
16826 static int
16827 relax_adr (fragS *fragp, asection *sec, long stretch)
16828 {
16829   addressT addr;
16830   offsetT val;
16831
16832   /* Assume worst case for symbols not known to be in the same section.  */
16833   if (!S_IS_DEFINED(fragp->fr_symbol)
16834       || sec != S_GET_SEGMENT (fragp->fr_symbol))
16835     return 4;
16836
16837   val = relaxed_symbol_addr(fragp, stretch);
16838   addr = fragp->fr_address + fragp->fr_fix;
16839   addr = (addr + 4) & ~3;
16840   /* Force misaligned targets to 32-bit variant.  */
16841   if (val & 3)
16842     return 4;
16843   val -= addr;
16844   if (val < 0 || val > 1020)
16845     return 4;
16846   return 2;
16847 }
16848
16849 /* Return the size of a relaxable add/sub immediate instruction.  */
16850 static int
16851 relax_addsub (fragS *fragp, asection *sec)
16852 {
16853   char *buf;
16854   int op;
16855
16856   buf = fragp->fr_literal + fragp->fr_fix;
16857   op = bfd_get_16(sec->owner, buf);
16858   if ((op & 0xf) == ((op >> 4) & 0xf))
16859     return relax_immediate (fragp, 8, 0);
16860   else
16861     return relax_immediate (fragp, 3, 0);
16862 }
16863
16864
16865 /* Return the size of a relaxable branch instruction.  BITS is the
16866    size of the offset field in the narrow instruction.  */
16867
16868 static int
16869 relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
16870 {
16871   addressT addr;
16872   offsetT val;
16873   offsetT limit;
16874
16875   /* Assume worst case for symbols not known to be in the same section.  */
16876   if (!S_IS_DEFINED(fragp->fr_symbol)
16877       || sec != S_GET_SEGMENT (fragp->fr_symbol))
16878     return 4;
16879
16880   val = relaxed_symbol_addr(fragp, stretch);
16881   addr = fragp->fr_address + fragp->fr_fix + 4;
16882   val -= addr;
16883
16884   /* Offset is a signed value *2 */
16885   limit = 1 << bits;
16886   if (val >= limit || val < -limit)
16887     return 4;
16888   return 2;
16889 }
16890
16891
16892 /* Relax a machine dependent frag.  This returns the amount by which
16893    the current size of the frag should change.  */
16894
16895 int
16896 arm_relax_frag (asection *sec, fragS *fragp, long stretch)
16897 {
16898   int oldsize;
16899   int newsize;
16900
16901   oldsize = fragp->fr_var;
16902   switch (fragp->fr_subtype)
16903     {
16904     case T_MNEM_ldr_pc2:
16905       newsize = relax_adr(fragp, sec, stretch);
16906       break;
16907     case T_MNEM_ldr_pc:
16908     case T_MNEM_ldr_sp:
16909     case T_MNEM_str_sp:
16910       newsize = relax_immediate(fragp, 8, 2);
16911       break;
16912     case T_MNEM_ldr:
16913     case T_MNEM_str:
16914       newsize = relax_immediate(fragp, 5, 2);
16915       break;
16916     case T_MNEM_ldrh:
16917     case T_MNEM_strh:
16918       newsize = relax_immediate(fragp, 5, 1);
16919       break;
16920     case T_MNEM_ldrb:
16921     case T_MNEM_strb:
16922       newsize = relax_immediate(fragp, 5, 0);
16923       break;
16924     case T_MNEM_adr:
16925       newsize = relax_adr(fragp, sec, stretch);
16926       break;
16927     case T_MNEM_mov:
16928     case T_MNEM_movs:
16929     case T_MNEM_cmp:
16930     case T_MNEM_cmn:
16931       newsize = relax_immediate(fragp, 8, 0);
16932       break;
16933     case T_MNEM_b:
16934       newsize = relax_branch(fragp, sec, 11, stretch);
16935       break;
16936     case T_MNEM_bcond:
16937       newsize = relax_branch(fragp, sec, 8, stretch);
16938       break;
16939     case T_MNEM_add_sp:
16940     case T_MNEM_add_pc:
16941       newsize = relax_immediate (fragp, 8, 2);
16942       break;
16943     case T_MNEM_inc_sp:
16944     case T_MNEM_dec_sp:
16945       newsize = relax_immediate (fragp, 7, 2);
16946       break;
16947     case T_MNEM_addi:
16948     case T_MNEM_addis:
16949     case T_MNEM_subi:
16950     case T_MNEM_subis:
16951       newsize = relax_addsub (fragp, sec);
16952       break;
16953     default:
16954       abort();
16955     }
16956
16957   fragp->fr_var = newsize;
16958   /* Freeze wide instructions that are at or before the same location as
16959      in the previous pass.  This avoids infinite loops.
16960      Don't freeze them unconditionally because targets may be artificialy
16961      misaligned by the expansion of preceeding frags.  */
16962   if (stretch <= 0 && newsize > 2)
16963     {
16964       md_convert_frag (sec->owner, sec, fragp);
16965       frag_wane(fragp);
16966     }
16967
16968   return newsize - oldsize;
16969 }
16970
16971 /* Round up a section size to the appropriate boundary.  */
16972
16973 valueT
16974 md_section_align (segT   segment ATTRIBUTE_UNUSED,
16975                   valueT size)
16976 {
16977 #if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
16978   if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
16979     {
16980       /* For a.out, force the section size to be aligned.  If we don't do
16981          this, BFD will align it for us, but it will not write out the
16982          final bytes of the section.  This may be a bug in BFD, but it is
16983          easier to fix it here since that is how the other a.out targets
16984          work.  */
16985       int align;
16986
16987       align = bfd_get_section_alignment (stdoutput, segment);
16988       size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
16989     }
16990 #endif
16991
16992   return size;
16993 }
16994
16995 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
16996    of an rs_align_code fragment.  */
16997
16998 void
16999 arm_handle_align (fragS * fragP)
17000 {
17001   static char const arm_noop[4] = { 0x00, 0x00, 0xa0, 0xe1 };
17002   static char const thumb_noop[2] = { 0xc0, 0x46 };
17003   static char const arm_bigend_noop[4] = { 0xe1, 0xa0, 0x00, 0x00 };
17004   static char const thumb_bigend_noop[2] = { 0x46, 0xc0 };
17005
17006   int bytes, fix, noop_size;
17007   char * p;
17008   const char * noop;
17009
17010   if (fragP->fr_type != rs_align_code)
17011     return;
17012
17013   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
17014   p = fragP->fr_literal + fragP->fr_fix;
17015   fix = 0;
17016
17017   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
17018     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
17019
17020   if (fragP->tc_frag_data)
17021     {
17022       if (target_big_endian)
17023         noop = thumb_bigend_noop;
17024       else
17025         noop = thumb_noop;
17026       noop_size = sizeof (thumb_noop);
17027     }
17028   else
17029     {
17030       if (target_big_endian)
17031         noop = arm_bigend_noop;
17032       else
17033         noop = arm_noop;
17034       noop_size = sizeof (arm_noop);
17035     }
17036
17037   if (bytes & (noop_size - 1))
17038     {
17039       fix = bytes & (noop_size - 1);
17040       memset (p, 0, fix);
17041       p += fix;
17042       bytes -= fix;
17043     }
17044
17045   while (bytes >= noop_size)
17046     {
17047       memcpy (p, noop, noop_size);
17048       p += noop_size;
17049       bytes -= noop_size;
17050       fix += noop_size;
17051     }
17052
17053   fragP->fr_fix += fix;
17054   fragP->fr_var = noop_size;
17055 }
17056
17057 /* Called from md_do_align.  Used to create an alignment
17058    frag in a code section.  */
17059
17060 void
17061 arm_frag_align_code (int n, int max)
17062 {
17063   char * p;
17064
17065   /* We assume that there will never be a requirement
17066      to support alignments greater than 32 bytes.  */
17067   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
17068     as_fatal (_("alignments greater than 32 bytes not supported in .text sections."));
17069
17070   p = frag_var (rs_align_code,
17071                 MAX_MEM_FOR_RS_ALIGN_CODE,
17072                 1,
17073                 (relax_substateT) max,
17074                 (symbolS *) NULL,
17075                 (offsetT) n,
17076                 (char *) NULL);
17077   *p = 0;
17078 }
17079
17080 /* Perform target specific initialisation of a frag.  */
17081
17082 void
17083 arm_init_frag (fragS * fragP)
17084 {
17085   /* Record whether this frag is in an ARM or a THUMB area.  */
17086   fragP->tc_frag_data = thumb_mode;
17087 }
17088
17089 #ifdef OBJ_ELF
17090 /* When we change sections we need to issue a new mapping symbol.  */
17091
17092 void
17093 arm_elf_change_section (void)
17094 {
17095   flagword flags;
17096   segment_info_type *seginfo;
17097
17098   /* Link an unlinked unwind index table section to the .text section.  */
17099   if (elf_section_type (now_seg) == SHT_ARM_EXIDX
17100       && elf_linked_to_section (now_seg) == NULL)
17101     elf_linked_to_section (now_seg) = text_section;
17102
17103   if (!SEG_NORMAL (now_seg))
17104     return;
17105
17106   flags = bfd_get_section_flags (stdoutput, now_seg);
17107
17108   /* We can ignore sections that only contain debug info.  */
17109   if ((flags & SEC_ALLOC) == 0)
17110     return;
17111
17112   seginfo = seg_info (now_seg);
17113   mapstate = seginfo->tc_segment_info_data.mapstate;
17114   marked_pr_dependency = seginfo->tc_segment_info_data.marked_pr_dependency;
17115 }
17116
17117 int
17118 arm_elf_section_type (const char * str, size_t len)
17119 {
17120   if (len == 5 && strncmp (str, "exidx", 5) == 0)
17121     return SHT_ARM_EXIDX;
17122
17123   return -1;
17124 }
17125 \f
17126 /* Code to deal with unwinding tables.  */
17127
17128 static void add_unwind_adjustsp (offsetT);
17129
17130 /* Cenerate and deferred unwind frame offset.  */
17131
17132 static void
17133 flush_pending_unwind (void)
17134 {
17135   offsetT offset;
17136
17137   offset = unwind.pending_offset;
17138   unwind.pending_offset = 0;
17139   if (offset != 0)
17140     add_unwind_adjustsp (offset);
17141 }
17142
17143 /* Add an opcode to this list for this function.  Two-byte opcodes should
17144    be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
17145    order.  */
17146
17147 static void
17148 add_unwind_opcode (valueT op, int length)
17149 {
17150   /* Add any deferred stack adjustment.  */
17151   if (unwind.pending_offset)
17152     flush_pending_unwind ();
17153
17154   unwind.sp_restored = 0;
17155
17156   if (unwind.opcode_count + length > unwind.opcode_alloc)
17157     {
17158       unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
17159       if (unwind.opcodes)
17160         unwind.opcodes = xrealloc (unwind.opcodes,
17161                                    unwind.opcode_alloc);
17162       else
17163         unwind.opcodes = xmalloc (unwind.opcode_alloc);
17164     }
17165   while (length > 0)
17166     {
17167       length--;
17168       unwind.opcodes[unwind.opcode_count] = op & 0xff;
17169       op >>= 8;
17170       unwind.opcode_count++;
17171     }
17172 }
17173
17174 /* Add unwind opcodes to adjust the stack pointer.  */
17175
17176 static void
17177 add_unwind_adjustsp (offsetT offset)
17178 {
17179   valueT op;
17180
17181   if (offset > 0x200)
17182     {
17183       /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
17184       char bytes[5];
17185       int n;
17186       valueT o;
17187
17188       /* Long form: 0xb2, uleb128.  */
17189       /* This might not fit in a word so add the individual bytes,
17190          remembering the list is built in reverse order.  */
17191       o = (valueT) ((offset - 0x204) >> 2);
17192       if (o == 0)
17193         add_unwind_opcode (0, 1);
17194
17195       /* Calculate the uleb128 encoding of the offset.  */
17196       n = 0;
17197       while (o)
17198         {
17199           bytes[n] = o & 0x7f;
17200           o >>= 7;
17201           if (o)
17202             bytes[n] |= 0x80;
17203           n++;
17204         }
17205       /* Add the insn.  */
17206       for (; n; n--)
17207         add_unwind_opcode (bytes[n - 1], 1);
17208       add_unwind_opcode (0xb2, 1);
17209     }
17210   else if (offset > 0x100)
17211     {
17212       /* Two short opcodes.  */
17213       add_unwind_opcode (0x3f, 1);
17214       op = (offset - 0x104) >> 2;
17215       add_unwind_opcode (op, 1);
17216     }
17217   else if (offset > 0)
17218     {
17219       /* Short opcode.  */
17220       op = (offset - 4) >> 2;
17221       add_unwind_opcode (op, 1);
17222     }
17223   else if (offset < 0)
17224     {
17225       offset = -offset;
17226       while (offset > 0x100)
17227         {
17228           add_unwind_opcode (0x7f, 1);
17229           offset -= 0x100;
17230         }
17231       op = ((offset - 4) >> 2) | 0x40;
17232       add_unwind_opcode (op, 1);
17233     }
17234 }
17235
17236 /* Finish the list of unwind opcodes for this function.  */
17237 static void
17238 finish_unwind_opcodes (void)
17239 {
17240   valueT op;
17241
17242   if (unwind.fp_used)
17243     {
17244       /* Adjust sp as necessary.  */
17245       unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
17246       flush_pending_unwind ();
17247
17248       /* After restoring sp from the frame pointer.  */
17249       op = 0x90 | unwind.fp_reg;
17250       add_unwind_opcode (op, 1);
17251     }
17252   else
17253     flush_pending_unwind ();
17254 }
17255
17256
17257 /* Start an exception table entry.  If idx is nonzero this is an index table
17258    entry.  */
17259
17260 static void
17261 start_unwind_section (const segT text_seg, int idx)
17262 {
17263   const char * text_name;
17264   const char * prefix;
17265   const char * prefix_once;
17266   const char * group_name;
17267   size_t prefix_len;
17268   size_t text_len;
17269   char * sec_name;
17270   size_t sec_name_len;
17271   int type;
17272   int flags;
17273   int linkonce;
17274
17275   if (idx)
17276     {
17277       prefix = ELF_STRING_ARM_unwind;
17278       prefix_once = ELF_STRING_ARM_unwind_once;
17279       type = SHT_ARM_EXIDX;
17280     }
17281   else
17282     {
17283       prefix = ELF_STRING_ARM_unwind_info;
17284       prefix_once = ELF_STRING_ARM_unwind_info_once;
17285       type = SHT_PROGBITS;
17286     }
17287
17288   text_name = segment_name (text_seg);
17289   if (streq (text_name, ".text"))
17290     text_name = "";
17291
17292   if (strncmp (text_name, ".gnu.linkonce.t.",
17293                strlen (".gnu.linkonce.t.")) == 0)
17294     {
17295       prefix = prefix_once;
17296       text_name += strlen (".gnu.linkonce.t.");
17297     }
17298
17299   prefix_len = strlen (prefix);
17300   text_len = strlen (text_name);
17301   sec_name_len = prefix_len + text_len;
17302   sec_name = xmalloc (sec_name_len + 1);
17303   memcpy (sec_name, prefix, prefix_len);
17304   memcpy (sec_name + prefix_len, text_name, text_len);
17305   sec_name[prefix_len + text_len] = '\0';
17306
17307   flags = SHF_ALLOC;
17308   linkonce = 0;
17309   group_name = 0;
17310
17311   /* Handle COMDAT group.  */
17312   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
17313     {
17314       group_name = elf_group_name (text_seg);
17315       if (group_name == NULL)
17316         {
17317           as_bad ("Group section `%s' has no group signature",
17318                   segment_name (text_seg));
17319           ignore_rest_of_line ();
17320           return;
17321         }
17322       flags |= SHF_GROUP;
17323       linkonce = 1;
17324     }
17325
17326   obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
17327
17328   /* Set the setion link for index tables.  */
17329   if (idx)
17330     elf_linked_to_section (now_seg) = text_seg;
17331 }
17332
17333
17334 /* Start an unwind table entry.  HAVE_DATA is nonzero if we have additional
17335    personality routine data.  Returns zero, or the index table value for
17336    and inline entry.  */
17337
17338 static valueT
17339 create_unwind_entry (int have_data)
17340 {
17341   int size;
17342   addressT where;
17343   char *ptr;
17344   /* The current word of data.  */
17345   valueT data;
17346   /* The number of bytes left in this word.  */
17347   int n;
17348
17349   finish_unwind_opcodes ();
17350
17351   /* Remember the current text section.  */
17352   unwind.saved_seg = now_seg;
17353   unwind.saved_subseg = now_subseg;
17354
17355   start_unwind_section (now_seg, 0);
17356
17357   if (unwind.personality_routine == NULL)
17358     {
17359       if (unwind.personality_index == -2)
17360         {
17361           if (have_data)
17362             as_bad (_("handerdata in cantunwind frame"));
17363           return 1; /* EXIDX_CANTUNWIND.  */
17364         }
17365
17366       /* Use a default personality routine if none is specified.  */
17367       if (unwind.personality_index == -1)
17368         {
17369           if (unwind.opcode_count > 3)
17370             unwind.personality_index = 1;
17371           else
17372             unwind.personality_index = 0;
17373         }
17374
17375       /* Space for the personality routine entry.  */
17376       if (unwind.personality_index == 0)
17377         {
17378           if (unwind.opcode_count > 3)
17379             as_bad (_("too many unwind opcodes for personality routine 0"));
17380
17381           if (!have_data)
17382             {
17383               /* All the data is inline in the index table.  */
17384               data = 0x80;
17385               n = 3;
17386               while (unwind.opcode_count > 0)
17387                 {
17388                   unwind.opcode_count--;
17389                   data = (data << 8) | unwind.opcodes[unwind.opcode_count];
17390                   n--;
17391                 }
17392
17393               /* Pad with "finish" opcodes.  */
17394               while (n--)
17395                 data = (data << 8) | 0xb0;
17396
17397               return data;
17398             }
17399           size = 0;
17400         }
17401       else
17402         /* We get two opcodes "free" in the first word.  */
17403         size = unwind.opcode_count - 2;
17404     }
17405   else
17406     /* An extra byte is required for the opcode count.  */
17407     size = unwind.opcode_count + 1;
17408
17409   size = (size + 3) >> 2;
17410   if (size > 0xff)
17411     as_bad (_("too many unwind opcodes"));
17412
17413   frag_align (2, 0, 0);
17414   record_alignment (now_seg, 2);
17415   unwind.table_entry = expr_build_dot ();
17416
17417   /* Allocate the table entry.  */
17418   ptr = frag_more ((size << 2) + 4);
17419   memset(ptr, 0, (size << 2) + 4);
17420   where = frag_now_fix () - ((size << 2) + 4);
17421
17422   switch (unwind.personality_index)
17423     {
17424     case -1:
17425       /* ??? Should this be a PLT generating relocation?  */
17426       /* Custom personality routine.  */
17427       fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
17428                BFD_RELOC_ARM_PREL31);
17429
17430       where += 4;
17431       ptr += 4;
17432
17433       /* Set the first byte to the number of additional words.  */
17434       data = size - 1;
17435       n = 3;
17436       break;
17437
17438     /* ABI defined personality routines.  */
17439     case 0:
17440       /* Three opcodes bytes are packed into the first word.  */
17441       data = 0x80;
17442       n = 3;
17443       break;
17444
17445     case 1:
17446     case 2:
17447       /* The size and first two opcode bytes go in the first word.  */
17448       data = ((0x80 + unwind.personality_index) << 8) | size;
17449       n = 2;
17450       break;
17451
17452     default:
17453       /* Should never happen.  */
17454       abort ();
17455     }
17456
17457   /* Pack the opcodes into words (MSB first), reversing the list at the same
17458      time.  */
17459   while (unwind.opcode_count > 0)
17460     {
17461       if (n == 0)
17462         {
17463           md_number_to_chars (ptr, data, 4);
17464           ptr += 4;
17465           n = 4;
17466           data = 0;
17467         }
17468       unwind.opcode_count--;
17469       n--;
17470       data = (data << 8) | unwind.opcodes[unwind.opcode_count];
17471     }
17472
17473   /* Finish off the last word.  */
17474   if (n < 4)
17475     {
17476       /* Pad with "finish" opcodes.  */
17477       while (n--)
17478         data = (data << 8) | 0xb0;
17479
17480       md_number_to_chars (ptr, data, 4);
17481     }
17482
17483   if (!have_data)
17484     {
17485       /* Add an empty descriptor if there is no user-specified data.   */
17486       ptr = frag_more (4);
17487       md_number_to_chars (ptr, 0, 4);
17488     }
17489
17490   return 0;
17491 }
17492
17493
17494 /* Initialize the DWARF-2 unwind information for this procedure.  */
17495
17496 void
17497 tc_arm_frame_initial_instructions (void)
17498 {
17499   cfi_add_CFA_def_cfa (REG_SP, 0);
17500 }
17501 #endif /* OBJ_ELF */
17502
17503 /* Convert REGNAME to a DWARF-2 register number.  */
17504
17505 int
17506 tc_arm_regname_to_dw2regnum (char *regname)
17507 {
17508   int reg = arm_reg_parse (&regname, REG_TYPE_RN);
17509
17510   if (reg == FAIL)
17511     return -1;
17512
17513   return reg;
17514 }
17515
17516 #ifdef TE_PE
17517 void
17518 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
17519 {
17520   expressionS expr;
17521
17522   expr.X_op = O_secrel;
17523   expr.X_add_symbol = symbol;
17524   expr.X_add_number = 0;
17525   emit_expr (&expr, size);
17526 }
17527 #endif
17528
17529 /* MD interface: Symbol and relocation handling.  */
17530
17531 /* Return the address within the segment that a PC-relative fixup is
17532    relative to.  For ARM, PC-relative fixups applied to instructions
17533    are generally relative to the location of the fixup plus 8 bytes.
17534    Thumb branches are offset by 4, and Thumb loads relative to PC
17535    require special handling.  */
17536
17537 long
17538 md_pcrel_from_section (fixS * fixP, segT seg)
17539 {
17540   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
17541
17542   /* If this is pc-relative and we are going to emit a relocation
17543      then we just want to put out any pipeline compensation that the linker
17544      will need.  Otherwise we want to use the calculated base.
17545      For WinCE we skip the bias for externals as well, since this
17546      is how the MS ARM-CE assembler behaves and we want to be compatible.  */
17547   if (fixP->fx_pcrel 
17548       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
17549           || (arm_force_relocation (fixP)
17550 #ifdef TE_WINCE
17551               && !S_IS_EXTERNAL (fixP->fx_addsy)
17552 #endif
17553               )))
17554     base = 0;
17555
17556   switch (fixP->fx_r_type)
17557     {
17558       /* PC relative addressing on the Thumb is slightly odd as the
17559          bottom two bits of the PC are forced to zero for the
17560          calculation.  This happens *after* application of the
17561          pipeline offset.  However, Thumb adrl already adjusts for
17562          this, so we need not do it again.  */
17563     case BFD_RELOC_ARM_THUMB_ADD:
17564       return base & ~3;
17565
17566     case BFD_RELOC_ARM_THUMB_OFFSET:
17567     case BFD_RELOC_ARM_T32_OFFSET_IMM:
17568     case BFD_RELOC_ARM_T32_ADD_PC12:
17569     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
17570       return (base + 4) & ~3;
17571
17572       /* Thumb branches are simply offset by +4.  */
17573     case BFD_RELOC_THUMB_PCREL_BRANCH7:
17574     case BFD_RELOC_THUMB_PCREL_BRANCH9:
17575     case BFD_RELOC_THUMB_PCREL_BRANCH12:
17576     case BFD_RELOC_THUMB_PCREL_BRANCH20:
17577     case BFD_RELOC_THUMB_PCREL_BRANCH23:
17578     case BFD_RELOC_THUMB_PCREL_BRANCH25:
17579     case BFD_RELOC_THUMB_PCREL_BLX:
17580       return base + 4;
17581
17582       /* ARM mode branches are offset by +8.  However, the Windows CE
17583          loader expects the relocation not to take this into account.  */
17584     case BFD_RELOC_ARM_PCREL_BRANCH:
17585     case BFD_RELOC_ARM_PCREL_CALL:
17586     case BFD_RELOC_ARM_PCREL_JUMP:
17587     case BFD_RELOC_ARM_PCREL_BLX:
17588     case BFD_RELOC_ARM_PLT32:
17589 #ifdef TE_WINCE
17590       /* When handling fixups immediately, because we have already 
17591          discovered the value of a symbol, or the address of the frag involved
17592          we must account for the offset by +8, as the OS loader will never see the reloc.
17593          see fixup_segment() in write.c
17594          The S_IS_EXTERNAL test handles the case of global symbols.
17595          Those need the calculated base, not just the pipe compensation the linker will need.  */
17596       if (fixP->fx_pcrel
17597           && fixP->fx_addsy != NULL
17598           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
17599           && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
17600         return base + 8;
17601       return base;
17602 #else
17603       return base + 8;
17604 #endif
17605
17606       /* ARM mode loads relative to PC are also offset by +8.  Unlike
17607          branches, the Windows CE loader *does* expect the relocation
17608          to take this into account.  */
17609     case BFD_RELOC_ARM_OFFSET_IMM:
17610     case BFD_RELOC_ARM_OFFSET_IMM8:
17611     case BFD_RELOC_ARM_HWLITERAL:
17612     case BFD_RELOC_ARM_LITERAL:
17613     case BFD_RELOC_ARM_CP_OFF_IMM:
17614       return base + 8;
17615
17616
17617       /* Other PC-relative relocations are un-offset.  */
17618     default:
17619       return base;
17620     }
17621 }
17622
17623 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
17624    Otherwise we have no need to default values of symbols.  */
17625
17626 symbolS *
17627 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
17628 {
17629 #ifdef OBJ_ELF
17630   if (name[0] == '_' && name[1] == 'G'
17631       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
17632     {
17633       if (!GOT_symbol)
17634         {
17635           if (symbol_find (name))
17636             as_bad ("GOT already in the symbol table");
17637
17638           GOT_symbol = symbol_new (name, undefined_section,
17639                                    (valueT) 0, & zero_address_frag);
17640         }
17641
17642       return GOT_symbol;
17643     }
17644 #endif
17645
17646   return 0;
17647 }
17648
17649 /* Subroutine of md_apply_fix.   Check to see if an immediate can be
17650    computed as two separate immediate values, added together.  We
17651    already know that this value cannot be computed by just one ARM
17652    instruction.  */
17653
17654 static unsigned int
17655 validate_immediate_twopart (unsigned int   val,
17656                             unsigned int * highpart)
17657 {
17658   unsigned int a;
17659   unsigned int i;
17660
17661   for (i = 0; i < 32; i += 2)
17662     if (((a = rotate_left (val, i)) & 0xff) != 0)
17663       {
17664         if (a & 0xff00)
17665           {
17666             if (a & ~ 0xffff)
17667               continue;
17668             * highpart = (a  >> 8) | ((i + 24) << 7);
17669           }
17670         else if (a & 0xff0000)
17671           {
17672             if (a & 0xff000000)
17673               continue;
17674             * highpart = (a >> 16) | ((i + 16) << 7);
17675           }
17676         else
17677           {
17678             assert (a & 0xff000000);
17679             * highpart = (a >> 24) | ((i + 8) << 7);
17680           }
17681
17682         return (a & 0xff) | (i << 7);
17683       }
17684
17685   return FAIL;
17686 }
17687
17688 static int
17689 validate_offset_imm (unsigned int val, int hwse)
17690 {
17691   if ((hwse && val > 255) || val > 4095)
17692     return FAIL;
17693   return val;
17694 }
17695
17696 /* Subroutine of md_apply_fix.   Do those data_ops which can take a
17697    negative immediate constant by altering the instruction.  A bit of
17698    a hack really.
17699         MOV <-> MVN
17700         AND <-> BIC
17701         ADC <-> SBC
17702         by inverting the second operand, and
17703         ADD <-> SUB
17704         CMP <-> CMN
17705         by negating the second operand.  */
17706
17707 static int
17708 negate_data_op (unsigned long * instruction,
17709                 unsigned long   value)
17710 {
17711   int op, new_inst;
17712   unsigned long negated, inverted;
17713
17714   negated = encode_arm_immediate (-value);
17715   inverted = encode_arm_immediate (~value);
17716
17717   op = (*instruction >> DATA_OP_SHIFT) & 0xf;
17718   switch (op)
17719     {
17720       /* First negates.  */
17721     case OPCODE_SUB:             /* ADD <-> SUB  */
17722       new_inst = OPCODE_ADD;
17723       value = negated;
17724       break;
17725
17726     case OPCODE_ADD:
17727       new_inst = OPCODE_SUB;
17728       value = negated;
17729       break;
17730
17731     case OPCODE_CMP:             /* CMP <-> CMN  */
17732       new_inst = OPCODE_CMN;
17733       value = negated;
17734       break;
17735
17736     case OPCODE_CMN:
17737       new_inst = OPCODE_CMP;
17738       value = negated;
17739       break;
17740
17741       /* Now Inverted ops.  */
17742     case OPCODE_MOV:             /* MOV <-> MVN  */
17743       new_inst = OPCODE_MVN;
17744       value = inverted;
17745       break;
17746
17747     case OPCODE_MVN:
17748       new_inst = OPCODE_MOV;
17749       value = inverted;
17750       break;
17751
17752     case OPCODE_AND:             /* AND <-> BIC  */
17753       new_inst = OPCODE_BIC;
17754       value = inverted;
17755       break;
17756
17757     case OPCODE_BIC:
17758       new_inst = OPCODE_AND;
17759       value = inverted;
17760       break;
17761
17762     case OPCODE_ADC:              /* ADC <-> SBC  */
17763       new_inst = OPCODE_SBC;
17764       value = inverted;
17765       break;
17766
17767     case OPCODE_SBC:
17768       new_inst = OPCODE_ADC;
17769       value = inverted;
17770       break;
17771
17772       /* We cannot do anything.  */
17773     default:
17774       return FAIL;
17775     }
17776
17777   if (value == (unsigned) FAIL)
17778     return FAIL;
17779
17780   *instruction &= OPCODE_MASK;
17781   *instruction |= new_inst << DATA_OP_SHIFT;
17782   return value;
17783 }
17784
17785 /* Like negate_data_op, but for Thumb-2.   */
17786
17787 static unsigned int
17788 thumb32_negate_data_op (offsetT *instruction, unsigned int value)
17789 {
17790   int op, new_inst;
17791   int rd;
17792   unsigned int negated, inverted;
17793
17794   negated = encode_thumb32_immediate (-value);
17795   inverted = encode_thumb32_immediate (~value);
17796
17797   rd = (*instruction >> 8) & 0xf;
17798   op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
17799   switch (op)
17800     {
17801       /* ADD <-> SUB.  Includes CMP <-> CMN.  */
17802     case T2_OPCODE_SUB:
17803       new_inst = T2_OPCODE_ADD;
17804       value = negated;
17805       break;
17806
17807     case T2_OPCODE_ADD:
17808       new_inst = T2_OPCODE_SUB;
17809       value = negated;
17810       break;
17811
17812       /* ORR <-> ORN.  Includes MOV <-> MVN.  */
17813     case T2_OPCODE_ORR:
17814       new_inst = T2_OPCODE_ORN;
17815       value = inverted;
17816       break;
17817
17818     case T2_OPCODE_ORN:
17819       new_inst = T2_OPCODE_ORR;
17820       value = inverted;
17821       break;
17822
17823       /* AND <-> BIC.  TST has no inverted equivalent.  */
17824     case T2_OPCODE_AND:
17825       new_inst = T2_OPCODE_BIC;
17826       if (rd == 15)
17827         value = FAIL;
17828       else
17829         value = inverted;
17830       break;
17831
17832     case T2_OPCODE_BIC:
17833       new_inst = T2_OPCODE_AND;
17834       value = inverted;
17835       break;
17836
17837       /* ADC <-> SBC  */
17838     case T2_OPCODE_ADC:
17839       new_inst = T2_OPCODE_SBC;
17840       value = inverted;
17841       break;
17842
17843     case T2_OPCODE_SBC:
17844       new_inst = T2_OPCODE_ADC;
17845       value = inverted;
17846       break;
17847
17848       /* We cannot do anything.  */
17849     default:
17850       return FAIL;
17851     }
17852
17853   if (value == (unsigned int)FAIL)
17854     return FAIL;
17855
17856   *instruction &= T2_OPCODE_MASK;
17857   *instruction |= new_inst << T2_DATA_OP_SHIFT;
17858   return value;
17859 }
17860
17861 /* Read a 32-bit thumb instruction from buf.  */
17862 static unsigned long
17863 get_thumb32_insn (char * buf)
17864 {
17865   unsigned long insn;
17866   insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
17867   insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
17868
17869   return insn;
17870 }
17871
17872
17873 /* We usually want to set the low bit on the address of thumb function
17874    symbols.  In particular .word foo - . should have the low bit set.
17875    Generic code tries to fold the difference of two symbols to
17876    a constant.  Prevent this and force a relocation when the first symbols
17877    is a thumb function.  */
17878 int
17879 arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
17880 {
17881   if (op == O_subtract
17882       && l->X_op == O_symbol
17883       && r->X_op == O_symbol
17884       && THUMB_IS_FUNC (l->X_add_symbol))
17885     {
17886       l->X_op = O_subtract;
17887       l->X_op_symbol = r->X_add_symbol;
17888       l->X_add_number -= r->X_add_number;
17889       return 1;
17890     }
17891   /* Process as normal.  */
17892   return 0;
17893 }
17894
17895 void
17896 md_apply_fix (fixS *    fixP,
17897                valueT * valP,
17898                segT     seg)
17899 {
17900   offsetT        value = * valP;
17901   offsetT        newval;
17902   unsigned int   newimm;
17903   unsigned long  temp;
17904   int            sign;
17905   char *         buf = fixP->fx_where + fixP->fx_frag->fr_literal;
17906
17907   assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
17908
17909   /* Note whether this will delete the relocation.  */
17910
17911   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
17912     fixP->fx_done = 1;
17913
17914   /* On a 64-bit host, silently truncate 'value' to 32 bits for
17915      consistency with the behavior on 32-bit hosts.  Remember value
17916      for emit_reloc.  */
17917   value &= 0xffffffff;
17918   value ^= 0x80000000;
17919   value -= 0x80000000; 
17920
17921   *valP = value;
17922   fixP->fx_addnumber = value;
17923
17924   /* Same treatment for fixP->fx_offset.  */
17925   fixP->fx_offset &= 0xffffffff;
17926   fixP->fx_offset ^= 0x80000000;
17927   fixP->fx_offset -= 0x80000000;
17928
17929   switch (fixP->fx_r_type)
17930     {
17931     case BFD_RELOC_NONE:
17932       /* This will need to go in the object file.  */
17933       fixP->fx_done = 0;
17934       break;
17935
17936     case BFD_RELOC_ARM_IMMEDIATE:
17937       /* We claim that this fixup has been processed here,
17938          even if in fact we generate an error because we do
17939          not have a reloc for it, so tc_gen_reloc will reject it.  */
17940       fixP->fx_done = 1;
17941
17942       if (fixP->fx_addsy
17943           && ! S_IS_DEFINED (fixP->fx_addsy))
17944         {
17945           as_bad_where (fixP->fx_file, fixP->fx_line,
17946                         _("undefined symbol %s used as an immediate value"),
17947                         S_GET_NAME (fixP->fx_addsy));
17948           break;
17949         }
17950
17951       newimm = encode_arm_immediate (value);
17952       temp = md_chars_to_number (buf, INSN_SIZE);
17953
17954       /* If the instruction will fail, see if we can fix things up by
17955          changing the opcode.  */
17956       if (newimm == (unsigned int) FAIL
17957           && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL)
17958         {
17959           as_bad_where (fixP->fx_file, fixP->fx_line,
17960                         _("invalid constant (%lx) after fixup"),
17961                         (unsigned long) value);
17962           break;
17963         }
17964
17965       newimm |= (temp & 0xfffff000);
17966       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
17967       break;
17968
17969     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
17970       {
17971         unsigned int highpart = 0;
17972         unsigned int newinsn  = 0xe1a00000; /* nop.  */
17973
17974         newimm = encode_arm_immediate (value);
17975         temp = md_chars_to_number (buf, INSN_SIZE);
17976
17977         /* If the instruction will fail, see if we can fix things up by
17978            changing the opcode.  */
17979         if (newimm == (unsigned int) FAIL
17980             && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
17981           {
17982             /* No ?  OK - try using two ADD instructions to generate
17983                the value.  */
17984             newimm = validate_immediate_twopart (value, & highpart);
17985
17986             /* Yes - then make sure that the second instruction is
17987                also an add.  */
17988             if (newimm != (unsigned int) FAIL)
17989               newinsn = temp;
17990             /* Still No ?  Try using a negated value.  */
17991             else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
17992               temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
17993             /* Otherwise - give up.  */
17994             else
17995               {
17996                 as_bad_where (fixP->fx_file, fixP->fx_line,
17997                               _("unable to compute ADRL instructions for PC offset of 0x%lx"),
17998                               (long) value);
17999                 break;
18000               }
18001
18002             /* Replace the first operand in the 2nd instruction (which
18003                is the PC) with the destination register.  We have
18004                already added in the PC in the first instruction and we
18005                do not want to do it again.  */
18006             newinsn &= ~ 0xf0000;
18007             newinsn |= ((newinsn & 0x0f000) << 4);
18008           }
18009
18010         newimm |= (temp & 0xfffff000);
18011         md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
18012
18013         highpart |= (newinsn & 0xfffff000);
18014         md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
18015       }
18016       break;
18017
18018     case BFD_RELOC_ARM_OFFSET_IMM:
18019       if (!fixP->fx_done && seg->use_rela_p)
18020         value = 0;
18021
18022     case BFD_RELOC_ARM_LITERAL:
18023       sign = value >= 0;
18024
18025       if (value < 0)
18026         value = - value;
18027
18028       if (validate_offset_imm (value, 0) == FAIL)
18029         {
18030           if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
18031             as_bad_where (fixP->fx_file, fixP->fx_line,
18032                           _("invalid literal constant: pool needs to be closer"));
18033           else
18034             as_bad_where (fixP->fx_file, fixP->fx_line,
18035                           _("bad immediate value for offset (%ld)"),
18036                           (long) value);
18037           break;
18038         }
18039
18040       newval = md_chars_to_number (buf, INSN_SIZE);
18041       newval &= 0xff7ff000;
18042       newval |= value | (sign ? INDEX_UP : 0);
18043       md_number_to_chars (buf, newval, INSN_SIZE);
18044       break;
18045
18046     case BFD_RELOC_ARM_OFFSET_IMM8:
18047     case BFD_RELOC_ARM_HWLITERAL:
18048       sign = value >= 0;
18049
18050       if (value < 0)
18051         value = - value;
18052
18053       if (validate_offset_imm (value, 1) == FAIL)
18054         {
18055           if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
18056             as_bad_where (fixP->fx_file, fixP->fx_line,
18057                           _("invalid literal constant: pool needs to be closer"));
18058           else
18059             as_bad (_("bad immediate value for 8-bit offset (%ld)"),
18060                     (long) value);
18061           break;
18062         }
18063
18064       newval = md_chars_to_number (buf, INSN_SIZE);
18065       newval &= 0xff7ff0f0;
18066       newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
18067       md_number_to_chars (buf, newval, INSN_SIZE);
18068       break;
18069
18070     case BFD_RELOC_ARM_T32_OFFSET_U8:
18071       if (value < 0 || value > 1020 || value % 4 != 0)
18072         as_bad_where (fixP->fx_file, fixP->fx_line,
18073                       _("bad immediate value for offset (%ld)"), (long) value);
18074       value /= 4;
18075
18076       newval = md_chars_to_number (buf+2, THUMB_SIZE);
18077       newval |= value;
18078       md_number_to_chars (buf+2, newval, THUMB_SIZE);
18079       break;
18080
18081     case BFD_RELOC_ARM_T32_OFFSET_IMM:
18082       /* This is a complicated relocation used for all varieties of Thumb32
18083          load/store instruction with immediate offset:
18084
18085          1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
18086                                                    *4, optional writeback(W)
18087                                                    (doubleword load/store)
18088
18089          1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
18090          1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
18091          1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
18092          1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
18093          1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
18094
18095          Uppercase letters indicate bits that are already encoded at
18096          this point.  Lowercase letters are our problem.  For the
18097          second block of instructions, the secondary opcode nybble
18098          (bits 8..11) is present, and bit 23 is zero, even if this is
18099          a PC-relative operation.  */
18100       newval = md_chars_to_number (buf, THUMB_SIZE);
18101       newval <<= 16;
18102       newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
18103
18104       if ((newval & 0xf0000000) == 0xe0000000)
18105         {
18106           /* Doubleword load/store: 8-bit offset, scaled by 4.  */
18107           if (value >= 0)
18108             newval |= (1 << 23);
18109           else
18110             value = -value;
18111           if (value % 4 != 0)
18112             {
18113               as_bad_where (fixP->fx_file, fixP->fx_line,
18114                             _("offset not a multiple of 4"));
18115               break;
18116             }
18117           value /= 4;
18118           if (value > 0xff)
18119             {
18120               as_bad_where (fixP->fx_file, fixP->fx_line,
18121                             _("offset out of range"));
18122               break;
18123             }
18124           newval &= ~0xff;
18125         }
18126       else if ((newval & 0x000f0000) == 0x000f0000)
18127         {
18128           /* PC-relative, 12-bit offset.  */
18129           if (value >= 0)
18130             newval |= (1 << 23);
18131           else
18132             value = -value;
18133           if (value > 0xfff)
18134             {
18135               as_bad_where (fixP->fx_file, fixP->fx_line,
18136                             _("offset out of range"));
18137               break;
18138             }
18139           newval &= ~0xfff;
18140         }
18141       else if ((newval & 0x00000100) == 0x00000100)
18142         {
18143           /* Writeback: 8-bit, +/- offset.  */
18144           if (value >= 0)
18145             newval |= (1 << 9);
18146           else
18147             value = -value;
18148           if (value > 0xff)
18149             {
18150               as_bad_where (fixP->fx_file, fixP->fx_line,
18151                             _("offset out of range"));
18152               break;
18153             }
18154           newval &= ~0xff;
18155         }
18156       else if ((newval & 0x00000f00) == 0x00000e00)
18157         {
18158           /* T-instruction: positive 8-bit offset.  */
18159           if (value < 0 || value > 0xff)
18160             {
18161               as_bad_where (fixP->fx_file, fixP->fx_line,
18162                             _("offset out of range"));
18163               break;
18164             }
18165           newval &= ~0xff;
18166           newval |= value;
18167         }
18168       else
18169         {
18170           /* Positive 12-bit or negative 8-bit offset.  */
18171           int limit;
18172           if (value >= 0)
18173             {
18174               newval |= (1 << 23);
18175               limit = 0xfff;
18176             }
18177           else
18178             {
18179               value = -value;
18180               limit = 0xff;
18181             }
18182           if (value > limit)
18183             {
18184               as_bad_where (fixP->fx_file, fixP->fx_line,
18185                             _("offset out of range"));
18186               break;
18187             }
18188           newval &= ~limit;
18189         }
18190
18191       newval |= value;
18192       md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
18193       md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
18194       break;
18195
18196     case BFD_RELOC_ARM_SHIFT_IMM:
18197       newval = md_chars_to_number (buf, INSN_SIZE);
18198       if (((unsigned long) value) > 32
18199           || (value == 32
18200               && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
18201         {
18202           as_bad_where (fixP->fx_file, fixP->fx_line,
18203                         _("shift expression is too large"));
18204           break;
18205         }
18206
18207       if (value == 0)
18208         /* Shifts of zero must be done as lsl.  */
18209         newval &= ~0x60;
18210       else if (value == 32)
18211         value = 0;
18212       newval &= 0xfffff07f;
18213       newval |= (value & 0x1f) << 7;
18214       md_number_to_chars (buf, newval, INSN_SIZE);
18215       break;
18216
18217     case BFD_RELOC_ARM_T32_IMMEDIATE:
18218     case BFD_RELOC_ARM_T32_ADD_IMM:
18219     case BFD_RELOC_ARM_T32_IMM12:
18220     case BFD_RELOC_ARM_T32_ADD_PC12:
18221       /* We claim that this fixup has been processed here,
18222          even if in fact we generate an error because we do
18223          not have a reloc for it, so tc_gen_reloc will reject it.  */
18224       fixP->fx_done = 1;
18225
18226       if (fixP->fx_addsy
18227           && ! S_IS_DEFINED (fixP->fx_addsy))
18228         {
18229           as_bad_where (fixP->fx_file, fixP->fx_line,
18230                         _("undefined symbol %s used as an immediate value"),
18231                         S_GET_NAME (fixP->fx_addsy));
18232           break;
18233         }
18234
18235       newval = md_chars_to_number (buf, THUMB_SIZE);
18236       newval <<= 16;
18237       newval |= md_chars_to_number (buf+2, THUMB_SIZE);
18238
18239       newimm = FAIL;
18240       if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
18241           || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
18242         {
18243           newimm = encode_thumb32_immediate (value);
18244           if (newimm == (unsigned int) FAIL)
18245             newimm = thumb32_negate_data_op (&newval, value);
18246         }
18247       if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
18248           && newimm == (unsigned int) FAIL)
18249         {
18250           /* Turn add/sum into addw/subw.  */
18251           if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
18252             newval = (newval & 0xfeffffff) | 0x02000000;
18253
18254           /* 12 bit immediate for addw/subw.  */
18255           if (value < 0)
18256             {
18257               value = -value;
18258               newval ^= 0x00a00000;
18259             }
18260           if (value > 0xfff)
18261             newimm = (unsigned int) FAIL;
18262           else
18263             newimm = value;
18264         }
18265
18266       if (newimm == (unsigned int)FAIL)
18267         {
18268           as_bad_where (fixP->fx_file, fixP->fx_line,
18269                         _("invalid constant (%lx) after fixup"),
18270                         (unsigned long) value);
18271           break;
18272         }
18273
18274       newval |= (newimm & 0x800) << 15;
18275       newval |= (newimm & 0x700) << 4;
18276       newval |= (newimm & 0x0ff);
18277
18278       md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
18279       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
18280       break;
18281
18282     case BFD_RELOC_ARM_SMC:
18283       if (((unsigned long) value) > 0xffff)
18284         as_bad_where (fixP->fx_file, fixP->fx_line,
18285                       _("invalid smc expression"));
18286       newval = md_chars_to_number (buf, INSN_SIZE);
18287       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
18288       md_number_to_chars (buf, newval, INSN_SIZE);
18289       break;
18290
18291     case BFD_RELOC_ARM_SWI:
18292       if (fixP->tc_fix_data != 0)
18293         {
18294           if (((unsigned long) value) > 0xff)
18295             as_bad_where (fixP->fx_file, fixP->fx_line,
18296                           _("invalid swi expression"));
18297           newval = md_chars_to_number (buf, THUMB_SIZE);
18298           newval |= value;
18299           md_number_to_chars (buf, newval, THUMB_SIZE);
18300         }
18301       else
18302         {
18303           if (((unsigned long) value) > 0x00ffffff)
18304             as_bad_where (fixP->fx_file, fixP->fx_line,
18305                           _("invalid swi expression"));
18306           newval = md_chars_to_number (buf, INSN_SIZE);
18307           newval |= value;
18308           md_number_to_chars (buf, newval, INSN_SIZE);
18309         }
18310       break;
18311
18312     case BFD_RELOC_ARM_MULTI:
18313       if (((unsigned long) value) > 0xffff)
18314         as_bad_where (fixP->fx_file, fixP->fx_line,
18315                       _("invalid expression in load/store multiple"));
18316       newval = value | md_chars_to_number (buf, INSN_SIZE);
18317       md_number_to_chars (buf, newval, INSN_SIZE);
18318       break;
18319
18320 #ifdef OBJ_ELF
18321     case BFD_RELOC_ARM_PCREL_CALL:
18322       newval = md_chars_to_number (buf, INSN_SIZE);
18323       if ((newval & 0xf0000000) == 0xf0000000)
18324         temp = 1;
18325       else
18326         temp = 3;
18327       goto arm_branch_common;
18328
18329     case BFD_RELOC_ARM_PCREL_JUMP:
18330     case BFD_RELOC_ARM_PLT32:
18331 #endif
18332     case BFD_RELOC_ARM_PCREL_BRANCH:
18333       temp = 3;
18334       goto arm_branch_common;
18335
18336     case BFD_RELOC_ARM_PCREL_BLX:
18337       temp = 1;
18338     arm_branch_common:
18339       /* We are going to store value (shifted right by two) in the
18340          instruction, in a 24 bit, signed field.  Bits 26 through 32 either
18341          all clear or all set and bit 0 must be clear.  For B/BL bit 1 must
18342          also be be clear.  */
18343       if (value & temp)
18344         as_bad_where (fixP->fx_file, fixP->fx_line,
18345                       _("misaligned branch destination"));
18346       if ((value & (offsetT)0xfe000000) != (offsetT)0
18347           && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
18348         as_bad_where (fixP->fx_file, fixP->fx_line,
18349                       _("branch out of range"));
18350
18351       if (fixP->fx_done || !seg->use_rela_p)
18352         {
18353           newval = md_chars_to_number (buf, INSN_SIZE);
18354           newval |= (value >> 2) & 0x00ffffff;
18355           /* Set the H bit on BLX instructions.  */
18356           if (temp == 1)
18357             {
18358               if (value & 2)
18359                 newval |= 0x01000000;
18360               else
18361                 newval &= ~0x01000000;
18362             }
18363           md_number_to_chars (buf, newval, INSN_SIZE);
18364         }
18365       break;
18366
18367     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
18368       /* CBZ can only branch forward.  */
18369
18370       /* Attempts to use CBZ to branch to the next instruction
18371          (which, strictly speaking, are prohibited) will be turned into
18372          no-ops.
18373
18374          FIXME: It may be better to remove the instruction completely and
18375          perform relaxation.  */
18376       if (value == -2)
18377         {
18378           newval = md_chars_to_number (buf, THUMB_SIZE);
18379           newval = 0xbf00; /* NOP encoding T1 */
18380           md_number_to_chars (buf, newval, THUMB_SIZE);
18381         }
18382       else
18383         {
18384           if (value & ~0x7e)
18385             as_bad_where (fixP->fx_file, fixP->fx_line,
18386                           _("branch out of range"));
18387
18388           if (fixP->fx_done || !seg->use_rela_p)
18389             {
18390               newval = md_chars_to_number (buf, THUMB_SIZE);
18391               newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
18392               md_number_to_chars (buf, newval, THUMB_SIZE);
18393             }
18394         }
18395       break;
18396
18397     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.  */
18398       if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
18399         as_bad_where (fixP->fx_file, fixP->fx_line,
18400                       _("branch out of range"));
18401
18402       if (fixP->fx_done || !seg->use_rela_p)
18403         {
18404           newval = md_chars_to_number (buf, THUMB_SIZE);
18405           newval |= (value & 0x1ff) >> 1;
18406           md_number_to_chars (buf, newval, THUMB_SIZE);
18407         }
18408       break;
18409
18410     case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
18411       if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
18412         as_bad_where (fixP->fx_file, fixP->fx_line,
18413                       _("branch out of range"));
18414
18415       if (fixP->fx_done || !seg->use_rela_p)
18416         {
18417           newval = md_chars_to_number (buf, THUMB_SIZE);
18418           newval |= (value & 0xfff) >> 1;
18419           md_number_to_chars (buf, newval, THUMB_SIZE);
18420         }
18421       break;
18422
18423     case BFD_RELOC_THUMB_PCREL_BRANCH20:
18424       if ((value & ~0x1fffff) && ((value & ~0x1fffff) != ~0x1fffff))
18425         as_bad_where (fixP->fx_file, fixP->fx_line,
18426                       _("conditional branch out of range"));
18427
18428       if (fixP->fx_done || !seg->use_rela_p)
18429         {
18430           offsetT newval2;
18431           addressT S, J1, J2, lo, hi;
18432
18433           S  = (value & 0x00100000) >> 20;
18434           J2 = (value & 0x00080000) >> 19;
18435           J1 = (value & 0x00040000) >> 18;
18436           hi = (value & 0x0003f000) >> 12;
18437           lo = (value & 0x00000ffe) >> 1;
18438
18439           newval   = md_chars_to_number (buf, THUMB_SIZE);
18440           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
18441           newval  |= (S << 10) | hi;
18442           newval2 |= (J1 << 13) | (J2 << 11) | lo;
18443           md_number_to_chars (buf, newval, THUMB_SIZE);
18444           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
18445         }
18446       break;
18447
18448     case BFD_RELOC_THUMB_PCREL_BLX:
18449     case BFD_RELOC_THUMB_PCREL_BRANCH23:
18450       if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
18451         as_bad_where (fixP->fx_file, fixP->fx_line,
18452                       _("branch out of range"));
18453
18454       if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
18455         /* For a BLX instruction, make sure that the relocation is rounded up
18456            to a word boundary.  This follows the semantics of the instruction
18457            which specifies that bit 1 of the target address will come from bit
18458            1 of the base address.  */
18459         value = (value + 1) & ~ 1;
18460
18461       if (fixP->fx_done || !seg->use_rela_p)
18462         {
18463           offsetT newval2;
18464
18465           newval   = md_chars_to_number (buf, THUMB_SIZE);
18466           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
18467           newval  |= (value & 0x7fffff) >> 12;
18468           newval2 |= (value & 0xfff) >> 1;
18469           md_number_to_chars (buf, newval, THUMB_SIZE);
18470           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
18471         }
18472       break;
18473
18474     case BFD_RELOC_THUMB_PCREL_BRANCH25:
18475       if ((value & ~0x1ffffff) && ((value & ~0x1ffffff) != ~0x1ffffff))
18476         as_bad_where (fixP->fx_file, fixP->fx_line,
18477                       _("branch out of range"));
18478
18479       if (fixP->fx_done || !seg->use_rela_p)
18480         {
18481           offsetT newval2;
18482           addressT S, I1, I2, lo, hi;
18483
18484           S  = (value & 0x01000000) >> 24;
18485           I1 = (value & 0x00800000) >> 23;
18486           I2 = (value & 0x00400000) >> 22;
18487           hi = (value & 0x003ff000) >> 12;
18488           lo = (value & 0x00000ffe) >> 1;
18489
18490           I1 = !(I1 ^ S);
18491           I2 = !(I2 ^ S);
18492
18493           newval   = md_chars_to_number (buf, THUMB_SIZE);
18494           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
18495           newval  |= (S << 10) | hi;
18496           newval2 |= (I1 << 13) | (I2 << 11) | lo;
18497           md_number_to_chars (buf, newval, THUMB_SIZE);
18498           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
18499         }
18500       break;
18501
18502     case BFD_RELOC_8:
18503       if (fixP->fx_done || !seg->use_rela_p)
18504         md_number_to_chars (buf, value, 1);
18505       break;
18506
18507     case BFD_RELOC_16:
18508       if (fixP->fx_done || !seg->use_rela_p)
18509         md_number_to_chars (buf, value, 2);
18510       break;
18511
18512 #ifdef OBJ_ELF
18513     case BFD_RELOC_ARM_TLS_GD32:
18514     case BFD_RELOC_ARM_TLS_LE32:
18515     case BFD_RELOC_ARM_TLS_IE32:
18516     case BFD_RELOC_ARM_TLS_LDM32:
18517     case BFD_RELOC_ARM_TLS_LDO32:
18518       S_SET_THREAD_LOCAL (fixP->fx_addsy);
18519       /* fall through */
18520
18521     case BFD_RELOC_ARM_GOT32:
18522     case BFD_RELOC_ARM_GOTOFF:
18523     case BFD_RELOC_ARM_TARGET2:
18524       if (fixP->fx_done || !seg->use_rela_p)
18525         md_number_to_chars (buf, 0, 4);
18526       break;
18527 #endif
18528
18529     case BFD_RELOC_RVA:
18530     case BFD_RELOC_32:
18531     case BFD_RELOC_ARM_TARGET1:
18532     case BFD_RELOC_ARM_ROSEGREL32:
18533     case BFD_RELOC_ARM_SBREL32:
18534     case BFD_RELOC_32_PCREL:
18535 #ifdef TE_PE
18536     case BFD_RELOC_32_SECREL:
18537 #endif
18538       if (fixP->fx_done || !seg->use_rela_p)
18539 #ifdef TE_WINCE
18540         /* For WinCE we only do this for pcrel fixups.  */
18541         if (fixP->fx_done || fixP->fx_pcrel)
18542 #endif
18543           md_number_to_chars (buf, value, 4);
18544       break;
18545
18546 #ifdef OBJ_ELF
18547     case BFD_RELOC_ARM_PREL31:
18548       if (fixP->fx_done || !seg->use_rela_p)
18549         {
18550           newval = md_chars_to_number (buf, 4) & 0x80000000;
18551           if ((value ^ (value >> 1)) & 0x40000000)
18552             {
18553               as_bad_where (fixP->fx_file, fixP->fx_line,
18554                             _("rel31 relocation overflow"));
18555             }
18556           newval |= value & 0x7fffffff;
18557           md_number_to_chars (buf, newval, 4);
18558         }
18559       break;
18560 #endif
18561
18562     case BFD_RELOC_ARM_CP_OFF_IMM:
18563     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
18564       if (value < -1023 || value > 1023 || (value & 3))
18565         as_bad_where (fixP->fx_file, fixP->fx_line,
18566                       _("co-processor offset out of range"));
18567     cp_off_common:
18568       sign = value >= 0;
18569       if (value < 0)
18570         value = -value;
18571       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
18572           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
18573         newval = md_chars_to_number (buf, INSN_SIZE);
18574       else
18575         newval = get_thumb32_insn (buf);
18576       newval &= 0xff7fff00;
18577       newval |= (value >> 2) | (sign ? INDEX_UP : 0);
18578       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
18579           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
18580         md_number_to_chars (buf, newval, INSN_SIZE);
18581       else
18582         put_thumb32_insn (buf, newval);
18583       break;
18584
18585     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
18586     case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
18587       if (value < -255 || value > 255)
18588         as_bad_where (fixP->fx_file, fixP->fx_line,
18589                       _("co-processor offset out of range"));
18590       value *= 4;
18591       goto cp_off_common;
18592
18593     case BFD_RELOC_ARM_THUMB_OFFSET:
18594       newval = md_chars_to_number (buf, THUMB_SIZE);
18595       /* Exactly what ranges, and where the offset is inserted depends
18596          on the type of instruction, we can establish this from the
18597          top 4 bits.  */
18598       switch (newval >> 12)
18599         {
18600         case 4: /* PC load.  */
18601           /* Thumb PC loads are somewhat odd, bit 1 of the PC is
18602              forced to zero for these loads; md_pcrel_from has already
18603              compensated for this.  */
18604           if (value & 3)
18605             as_bad_where (fixP->fx_file, fixP->fx_line,
18606                           _("invalid offset, target not word aligned (0x%08lX)"),
18607                           (((unsigned long) fixP->fx_frag->fr_address
18608                             + (unsigned long) fixP->fx_where) & ~3)
18609                           + (unsigned long) value);
18610
18611           if (value & ~0x3fc)
18612             as_bad_where (fixP->fx_file, fixP->fx_line,
18613                           _("invalid offset, value too big (0x%08lX)"),
18614                           (long) value);
18615
18616           newval |= value >> 2;
18617           break;
18618
18619         case 9: /* SP load/store.  */
18620           if (value & ~0x3fc)
18621             as_bad_where (fixP->fx_file, fixP->fx_line,
18622                           _("invalid offset, value too big (0x%08lX)"),
18623                           (long) value);
18624           newval |= value >> 2;
18625           break;
18626
18627         case 6: /* Word load/store.  */
18628           if (value & ~0x7c)
18629             as_bad_where (fixP->fx_file, fixP->fx_line,
18630                           _("invalid offset, value too big (0x%08lX)"),
18631                           (long) value);
18632           newval |= value << 4; /* 6 - 2.  */
18633           break;
18634
18635         case 7: /* Byte load/store.  */
18636           if (value & ~0x1f)
18637             as_bad_where (fixP->fx_file, fixP->fx_line,
18638                           _("invalid offset, value too big (0x%08lX)"),
18639                           (long) value);
18640           newval |= value << 6;
18641           break;
18642
18643         case 8: /* Halfword load/store.  */
18644           if (value & ~0x3e)
18645             as_bad_where (fixP->fx_file, fixP->fx_line,
18646                           _("invalid offset, value too big (0x%08lX)"),
18647                           (long) value);
18648           newval |= value << 5; /* 6 - 1.  */
18649           break;
18650
18651         default:
18652           as_bad_where (fixP->fx_file, fixP->fx_line,
18653                         "Unable to process relocation for thumb opcode: %lx",
18654                         (unsigned long) newval);
18655           break;
18656         }
18657       md_number_to_chars (buf, newval, THUMB_SIZE);
18658       break;
18659
18660     case BFD_RELOC_ARM_THUMB_ADD:
18661       /* This is a complicated relocation, since we use it for all of
18662          the following immediate relocations:
18663
18664             3bit ADD/SUB
18665             8bit ADD/SUB
18666             9bit ADD/SUB SP word-aligned
18667            10bit ADD PC/SP word-aligned
18668
18669          The type of instruction being processed is encoded in the
18670          instruction field:
18671
18672            0x8000  SUB
18673            0x00F0  Rd
18674            0x000F  Rs
18675       */
18676       newval = md_chars_to_number (buf, THUMB_SIZE);
18677       {
18678         int rd = (newval >> 4) & 0xf;
18679         int rs = newval & 0xf;
18680         int subtract = !!(newval & 0x8000);
18681
18682         /* Check for HI regs, only very restricted cases allowed:
18683            Adjusting SP, and using PC or SP to get an address.  */
18684         if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
18685             || (rs > 7 && rs != REG_SP && rs != REG_PC))
18686           as_bad_where (fixP->fx_file, fixP->fx_line,
18687                         _("invalid Hi register with immediate"));
18688
18689         /* If value is negative, choose the opposite instruction.  */
18690         if (value < 0)
18691           {
18692             value = -value;
18693             subtract = !subtract;
18694             if (value < 0)
18695               as_bad_where (fixP->fx_file, fixP->fx_line,
18696                             _("immediate value out of range"));
18697           }
18698
18699         if (rd == REG_SP)
18700           {
18701             if (value & ~0x1fc)
18702               as_bad_where (fixP->fx_file, fixP->fx_line,
18703                             _("invalid immediate for stack address calculation"));
18704             newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
18705             newval |= value >> 2;
18706           }
18707         else if (rs == REG_PC || rs == REG_SP)
18708           {
18709             if (subtract || value & ~0x3fc)
18710               as_bad_where (fixP->fx_file, fixP->fx_line,
18711                             _("invalid immediate for address calculation (value = 0x%08lX)"),
18712                             (unsigned long) value);
18713             newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
18714             newval |= rd << 8;
18715             newval |= value >> 2;
18716           }
18717         else if (rs == rd)
18718           {
18719             if (value & ~0xff)
18720               as_bad_where (fixP->fx_file, fixP->fx_line,
18721                             _("immediate value out of range"));
18722             newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
18723             newval |= (rd << 8) | value;
18724           }
18725         else
18726           {
18727             if (value & ~0x7)
18728               as_bad_where (fixP->fx_file, fixP->fx_line,
18729                             _("immediate value out of range"));
18730             newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
18731             newval |= rd | (rs << 3) | (value << 6);
18732           }
18733       }
18734       md_number_to_chars (buf, newval, THUMB_SIZE);
18735       break;
18736
18737     case BFD_RELOC_ARM_THUMB_IMM:
18738       newval = md_chars_to_number (buf, THUMB_SIZE);
18739       if (value < 0 || value > 255)
18740         as_bad_where (fixP->fx_file, fixP->fx_line,
18741                       _("invalid immediate: %ld is too large"),
18742                       (long) value);
18743       newval |= value;
18744       md_number_to_chars (buf, newval, THUMB_SIZE);
18745       break;
18746
18747     case BFD_RELOC_ARM_THUMB_SHIFT:
18748       /* 5bit shift value (0..32).  LSL cannot take 32.  */
18749       newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
18750       temp = newval & 0xf800;
18751       if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
18752         as_bad_where (fixP->fx_file, fixP->fx_line,
18753                       _("invalid shift value: %ld"), (long) value);
18754       /* Shifts of zero must be encoded as LSL.  */
18755       if (value == 0)
18756         newval = (newval & 0x003f) | T_OPCODE_LSL_I;
18757       /* Shifts of 32 are encoded as zero.  */
18758       else if (value == 32)
18759         value = 0;
18760       newval |= value << 6;
18761       md_number_to_chars (buf, newval, THUMB_SIZE);
18762       break;
18763
18764     case BFD_RELOC_VTABLE_INHERIT:
18765     case BFD_RELOC_VTABLE_ENTRY:
18766       fixP->fx_done = 0;
18767       return;
18768
18769     case BFD_RELOC_ARM_MOVW:
18770     case BFD_RELOC_ARM_MOVT:
18771     case BFD_RELOC_ARM_THUMB_MOVW:
18772     case BFD_RELOC_ARM_THUMB_MOVT:
18773       if (fixP->fx_done || !seg->use_rela_p)
18774         {
18775           /* REL format relocations are limited to a 16-bit addend.  */
18776           if (!fixP->fx_done)
18777             {
18778               if (value < -0x1000 || value > 0xffff)
18779                   as_bad_where (fixP->fx_file, fixP->fx_line,
18780                                 _("offset too big"));
18781             }
18782           else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
18783                    || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
18784             {
18785               value >>= 16;
18786             }
18787
18788           if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
18789               || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
18790             {
18791               newval = get_thumb32_insn (buf);
18792               newval &= 0xfbf08f00;
18793               newval |= (value & 0xf000) << 4;
18794               newval |= (value & 0x0800) << 15;
18795               newval |= (value & 0x0700) << 4;
18796               newval |= (value & 0x00ff);
18797               put_thumb32_insn (buf, newval);
18798             }
18799           else
18800             {
18801               newval = md_chars_to_number (buf, 4);
18802               newval &= 0xfff0f000;
18803               newval |= value & 0x0fff;
18804               newval |= (value & 0xf000) << 4;
18805               md_number_to_chars (buf, newval, 4);
18806             }
18807         }
18808       return;
18809
18810    case BFD_RELOC_ARM_ALU_PC_G0_NC:
18811    case BFD_RELOC_ARM_ALU_PC_G0:
18812    case BFD_RELOC_ARM_ALU_PC_G1_NC:
18813    case BFD_RELOC_ARM_ALU_PC_G1:
18814    case BFD_RELOC_ARM_ALU_PC_G2:
18815    case BFD_RELOC_ARM_ALU_SB_G0_NC:
18816    case BFD_RELOC_ARM_ALU_SB_G0:
18817    case BFD_RELOC_ARM_ALU_SB_G1_NC:
18818    case BFD_RELOC_ARM_ALU_SB_G1:
18819    case BFD_RELOC_ARM_ALU_SB_G2:
18820      assert (!fixP->fx_done);
18821      if (!seg->use_rela_p)
18822        {
18823          bfd_vma insn;
18824          bfd_vma encoded_addend;
18825          bfd_vma addend_abs = abs (value);
18826
18827          /* Check that the absolute value of the addend can be
18828             expressed as an 8-bit constant plus a rotation.  */
18829          encoded_addend = encode_arm_immediate (addend_abs);
18830          if (encoded_addend == (unsigned int) FAIL)
18831            as_bad_where (fixP->fx_file, fixP->fx_line,
18832                          _("the offset 0x%08lX is not representable"),
18833                          (unsigned long) addend_abs);
18834
18835          /* Extract the instruction.  */
18836          insn = md_chars_to_number (buf, INSN_SIZE);
18837
18838          /* If the addend is positive, use an ADD instruction.
18839             Otherwise use a SUB.  Take care not to destroy the S bit.  */
18840          insn &= 0xff1fffff;
18841          if (value < 0)
18842            insn |= 1 << 22;
18843          else
18844            insn |= 1 << 23;
18845
18846          /* Place the encoded addend into the first 12 bits of the
18847             instruction.  */
18848          insn &= 0xfffff000;
18849          insn |= encoded_addend;
18850    
18851          /* Update the instruction.  */  
18852          md_number_to_chars (buf, insn, INSN_SIZE);
18853        }
18854      break;
18855
18856     case BFD_RELOC_ARM_LDR_PC_G0:
18857     case BFD_RELOC_ARM_LDR_PC_G1:
18858     case BFD_RELOC_ARM_LDR_PC_G2:
18859     case BFD_RELOC_ARM_LDR_SB_G0:
18860     case BFD_RELOC_ARM_LDR_SB_G1:
18861     case BFD_RELOC_ARM_LDR_SB_G2:
18862       assert (!fixP->fx_done);
18863       if (!seg->use_rela_p)
18864         {
18865           bfd_vma insn;
18866           bfd_vma addend_abs = abs (value);
18867
18868           /* Check that the absolute value of the addend can be
18869              encoded in 12 bits.  */
18870           if (addend_abs >= 0x1000)
18871             as_bad_where (fixP->fx_file, fixP->fx_line,
18872                           _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
18873                           (unsigned long) addend_abs);
18874
18875           /* Extract the instruction.  */
18876           insn = md_chars_to_number (buf, INSN_SIZE);
18877
18878           /* If the addend is negative, clear bit 23 of the instruction.
18879              Otherwise set it.  */
18880           if (value < 0)
18881             insn &= ~(1 << 23);
18882           else
18883             insn |= 1 << 23;
18884
18885           /* Place the absolute value of the addend into the first 12 bits
18886              of the instruction.  */
18887           insn &= 0xfffff000;
18888           insn |= addend_abs;
18889     
18890           /* Update the instruction.  */  
18891           md_number_to_chars (buf, insn, INSN_SIZE);
18892         }
18893       break;
18894
18895     case BFD_RELOC_ARM_LDRS_PC_G0:
18896     case BFD_RELOC_ARM_LDRS_PC_G1:
18897     case BFD_RELOC_ARM_LDRS_PC_G2:
18898     case BFD_RELOC_ARM_LDRS_SB_G0:
18899     case BFD_RELOC_ARM_LDRS_SB_G1:
18900     case BFD_RELOC_ARM_LDRS_SB_G2:
18901       assert (!fixP->fx_done);
18902       if (!seg->use_rela_p)
18903         {
18904           bfd_vma insn;
18905           bfd_vma addend_abs = abs (value);
18906
18907           /* Check that the absolute value of the addend can be
18908              encoded in 8 bits.  */
18909           if (addend_abs >= 0x100)
18910             as_bad_where (fixP->fx_file, fixP->fx_line,
18911                           _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
18912                           (unsigned long) addend_abs);
18913
18914           /* Extract the instruction.  */
18915           insn = md_chars_to_number (buf, INSN_SIZE);
18916
18917           /* If the addend is negative, clear bit 23 of the instruction.
18918              Otherwise set it.  */
18919           if (value < 0)
18920             insn &= ~(1 << 23);
18921           else
18922             insn |= 1 << 23;
18923
18924           /* Place the first four bits of the absolute value of the addend
18925              into the first 4 bits of the instruction, and the remaining
18926              four into bits 8 .. 11.  */
18927           insn &= 0xfffff0f0;
18928           insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
18929     
18930           /* Update the instruction.  */  
18931           md_number_to_chars (buf, insn, INSN_SIZE);
18932         }
18933       break;
18934
18935     case BFD_RELOC_ARM_LDC_PC_G0:
18936     case BFD_RELOC_ARM_LDC_PC_G1:
18937     case BFD_RELOC_ARM_LDC_PC_G2:
18938     case BFD_RELOC_ARM_LDC_SB_G0:
18939     case BFD_RELOC_ARM_LDC_SB_G1:
18940     case BFD_RELOC_ARM_LDC_SB_G2:
18941       assert (!fixP->fx_done);
18942       if (!seg->use_rela_p)
18943         {
18944           bfd_vma insn;
18945           bfd_vma addend_abs = abs (value);
18946
18947           /* Check that the absolute value of the addend is a multiple of
18948              four and, when divided by four, fits in 8 bits.  */
18949           if (addend_abs & 0x3)
18950             as_bad_where (fixP->fx_file, fixP->fx_line,
18951                           _("bad offset 0x%08lX (must be word-aligned)"),
18952                           (unsigned long) addend_abs);
18953
18954           if ((addend_abs >> 2) > 0xff)
18955             as_bad_where (fixP->fx_file, fixP->fx_line,
18956                           _("bad offset 0x%08lX (must be an 8-bit number of words)"),
18957                           (unsigned long) addend_abs);
18958
18959           /* Extract the instruction.  */
18960           insn = md_chars_to_number (buf, INSN_SIZE);
18961
18962           /* If the addend is negative, clear bit 23 of the instruction.
18963              Otherwise set it.  */
18964           if (value < 0)
18965             insn &= ~(1 << 23);
18966           else
18967             insn |= 1 << 23;
18968
18969           /* Place the addend (divided by four) into the first eight
18970              bits of the instruction.  */
18971           insn &= 0xfffffff0;
18972           insn |= addend_abs >> 2;
18973     
18974           /* Update the instruction.  */  
18975           md_number_to_chars (buf, insn, INSN_SIZE);
18976         }
18977       break;
18978
18979     case BFD_RELOC_UNUSED:
18980     default:
18981       as_bad_where (fixP->fx_file, fixP->fx_line,
18982                     _("bad relocation fixup type (%d)"), fixP->fx_r_type);
18983     }
18984 }
18985
18986 /* Translate internal representation of relocation info to BFD target
18987    format.  */
18988
18989 arelent *
18990 tc_gen_reloc (asection *section, fixS *fixp)
18991 {
18992   arelent * reloc;
18993   bfd_reloc_code_real_type code;
18994
18995   reloc = xmalloc (sizeof (arelent));
18996
18997   reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
18998   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
18999   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
19000
19001   if (fixp->fx_pcrel)
19002     {
19003       if (section->use_rela_p)
19004         fixp->fx_offset -= md_pcrel_from_section (fixp, section);
19005       else
19006         fixp->fx_offset = reloc->address;
19007     }
19008   reloc->addend = fixp->fx_offset;
19009
19010   switch (fixp->fx_r_type)
19011     {
19012     case BFD_RELOC_8:
19013       if (fixp->fx_pcrel)
19014         {
19015           code = BFD_RELOC_8_PCREL;
19016           break;
19017         }
19018
19019     case BFD_RELOC_16:
19020       if (fixp->fx_pcrel)
19021         {
19022           code = BFD_RELOC_16_PCREL;
19023           break;
19024         }
19025
19026     case BFD_RELOC_32:
19027       if (fixp->fx_pcrel)
19028         {
19029           code = BFD_RELOC_32_PCREL;
19030           break;
19031         }
19032
19033     case BFD_RELOC_ARM_MOVW:
19034       if (fixp->fx_pcrel)
19035         {
19036           code = BFD_RELOC_ARM_MOVW_PCREL;
19037           break;
19038         }
19039
19040     case BFD_RELOC_ARM_MOVT:
19041       if (fixp->fx_pcrel)
19042         {
19043           code = BFD_RELOC_ARM_MOVT_PCREL;
19044           break;
19045         }
19046
19047     case BFD_RELOC_ARM_THUMB_MOVW:
19048       if (fixp->fx_pcrel)
19049         {
19050           code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
19051           break;
19052         }
19053
19054     case BFD_RELOC_ARM_THUMB_MOVT:
19055       if (fixp->fx_pcrel)
19056         {
19057           code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
19058           break;
19059         }
19060
19061     case BFD_RELOC_NONE:
19062     case BFD_RELOC_ARM_PCREL_BRANCH:
19063     case BFD_RELOC_ARM_PCREL_BLX:
19064     case BFD_RELOC_RVA:
19065     case BFD_RELOC_THUMB_PCREL_BRANCH7:
19066     case BFD_RELOC_THUMB_PCREL_BRANCH9:
19067     case BFD_RELOC_THUMB_PCREL_BRANCH12:
19068     case BFD_RELOC_THUMB_PCREL_BRANCH20:
19069     case BFD_RELOC_THUMB_PCREL_BRANCH23:
19070     case BFD_RELOC_THUMB_PCREL_BRANCH25:
19071     case BFD_RELOC_THUMB_PCREL_BLX:
19072     case BFD_RELOC_VTABLE_ENTRY:
19073     case BFD_RELOC_VTABLE_INHERIT:
19074 #ifdef TE_PE
19075     case BFD_RELOC_32_SECREL:
19076 #endif
19077       code = fixp->fx_r_type;
19078       break;
19079
19080     case BFD_RELOC_ARM_LITERAL:
19081     case BFD_RELOC_ARM_HWLITERAL:
19082       /* If this is called then the a literal has
19083          been referenced across a section boundary.  */
19084       as_bad_where (fixp->fx_file, fixp->fx_line,
19085                     _("literal referenced across section boundary"));
19086       return NULL;
19087
19088 #ifdef OBJ_ELF
19089     case BFD_RELOC_ARM_GOT32:
19090     case BFD_RELOC_ARM_GOTOFF:
19091     case BFD_RELOC_ARM_PLT32:
19092     case BFD_RELOC_ARM_TARGET1:
19093     case BFD_RELOC_ARM_ROSEGREL32:
19094     case BFD_RELOC_ARM_SBREL32:
19095     case BFD_RELOC_ARM_PREL31:
19096     case BFD_RELOC_ARM_TARGET2:
19097     case BFD_RELOC_ARM_TLS_LE32:
19098     case BFD_RELOC_ARM_TLS_LDO32:
19099     case BFD_RELOC_ARM_PCREL_CALL:
19100     case BFD_RELOC_ARM_PCREL_JUMP:
19101     case BFD_RELOC_ARM_ALU_PC_G0_NC:
19102     case BFD_RELOC_ARM_ALU_PC_G0:
19103     case BFD_RELOC_ARM_ALU_PC_G1_NC:
19104     case BFD_RELOC_ARM_ALU_PC_G1:
19105     case BFD_RELOC_ARM_ALU_PC_G2:
19106     case BFD_RELOC_ARM_LDR_PC_G0:
19107     case BFD_RELOC_ARM_LDR_PC_G1:
19108     case BFD_RELOC_ARM_LDR_PC_G2:
19109     case BFD_RELOC_ARM_LDRS_PC_G0:
19110     case BFD_RELOC_ARM_LDRS_PC_G1:
19111     case BFD_RELOC_ARM_LDRS_PC_G2:
19112     case BFD_RELOC_ARM_LDC_PC_G0:
19113     case BFD_RELOC_ARM_LDC_PC_G1:
19114     case BFD_RELOC_ARM_LDC_PC_G2:
19115     case BFD_RELOC_ARM_ALU_SB_G0_NC:
19116     case BFD_RELOC_ARM_ALU_SB_G0:
19117     case BFD_RELOC_ARM_ALU_SB_G1_NC:
19118     case BFD_RELOC_ARM_ALU_SB_G1:
19119     case BFD_RELOC_ARM_ALU_SB_G2:
19120     case BFD_RELOC_ARM_LDR_SB_G0:
19121     case BFD_RELOC_ARM_LDR_SB_G1:
19122     case BFD_RELOC_ARM_LDR_SB_G2:
19123     case BFD_RELOC_ARM_LDRS_SB_G0:
19124     case BFD_RELOC_ARM_LDRS_SB_G1:
19125     case BFD_RELOC_ARM_LDRS_SB_G2:
19126     case BFD_RELOC_ARM_LDC_SB_G0:
19127     case BFD_RELOC_ARM_LDC_SB_G1:
19128     case BFD_RELOC_ARM_LDC_SB_G2:
19129       code = fixp->fx_r_type;
19130       break;
19131
19132     case BFD_RELOC_ARM_TLS_GD32:
19133     case BFD_RELOC_ARM_TLS_IE32:
19134     case BFD_RELOC_ARM_TLS_LDM32:
19135       /* BFD will include the symbol's address in the addend.
19136          But we don't want that, so subtract it out again here.  */
19137       if (!S_IS_COMMON (fixp->fx_addsy))
19138         reloc->addend -= (*reloc->sym_ptr_ptr)->value;
19139       code = fixp->fx_r_type;
19140       break;
19141 #endif
19142
19143     case BFD_RELOC_ARM_IMMEDIATE:
19144       as_bad_where (fixp->fx_file, fixp->fx_line,
19145                     _("internal relocation (type: IMMEDIATE) not fixed up"));
19146       return NULL;
19147
19148     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
19149       as_bad_where (fixp->fx_file, fixp->fx_line,
19150                     _("ADRL used for a symbol not defined in the same file"));
19151       return NULL;
19152
19153     case BFD_RELOC_ARM_OFFSET_IMM:
19154       if (section->use_rela_p)
19155         {
19156           code = fixp->fx_r_type;
19157           break;
19158         }
19159
19160       if (fixp->fx_addsy != NULL
19161           && !S_IS_DEFINED (fixp->fx_addsy)
19162           && S_IS_LOCAL (fixp->fx_addsy))
19163         {
19164           as_bad_where (fixp->fx_file, fixp->fx_line,
19165                         _("undefined local label `%s'"),
19166                         S_GET_NAME (fixp->fx_addsy));
19167           return NULL;
19168         }
19169
19170       as_bad_where (fixp->fx_file, fixp->fx_line,
19171                     _("internal_relocation (type: OFFSET_IMM) not fixed up"));
19172       return NULL;
19173
19174     default:
19175       {
19176         char * type;
19177
19178         switch (fixp->fx_r_type)
19179           {
19180           case BFD_RELOC_NONE:             type = "NONE";         break;
19181           case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
19182           case BFD_RELOC_ARM_SHIFT_IMM:    type = "SHIFT_IMM";    break;
19183           case BFD_RELOC_ARM_SMC:          type = "SMC";          break;
19184           case BFD_RELOC_ARM_SWI:          type = "SWI";          break;
19185           case BFD_RELOC_ARM_MULTI:        type = "MULTI";        break;
19186           case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";   break;
19187           case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
19188           case BFD_RELOC_ARM_THUMB_ADD:    type = "THUMB_ADD";    break;
19189           case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
19190           case BFD_RELOC_ARM_THUMB_IMM:    type = "THUMB_IMM";    break;
19191           case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
19192           default:                         type = _("<unknown>"); break;
19193           }
19194         as_bad_where (fixp->fx_file, fixp->fx_line,
19195                       _("cannot represent %s relocation in this object file format"),
19196                       type);
19197         return NULL;
19198       }
19199     }
19200
19201 #ifdef OBJ_ELF
19202   if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
19203       && GOT_symbol
19204       && fixp->fx_addsy == GOT_symbol)
19205     {
19206       code = BFD_RELOC_ARM_GOTPC;
19207       reloc->addend = fixp->fx_offset = reloc->address;
19208     }
19209 #endif
19210
19211   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
19212
19213   if (reloc->howto == NULL)
19214     {
19215       as_bad_where (fixp->fx_file, fixp->fx_line,
19216                     _("cannot represent %s relocation in this object file format"),
19217                     bfd_get_reloc_code_name (code));
19218       return NULL;
19219     }
19220
19221   /* HACK: Since arm ELF uses Rel instead of Rela, encode the
19222      vtable entry to be used in the relocation's section offset.  */
19223   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
19224     reloc->address = fixp->fx_offset;
19225
19226   return reloc;
19227 }
19228
19229 /* This fix_new is called by cons via TC_CONS_FIX_NEW.  */
19230
19231 void
19232 cons_fix_new_arm (fragS *       frag,
19233                   int           where,
19234                   int           size,
19235                   expressionS * exp)
19236 {
19237   bfd_reloc_code_real_type type;
19238   int pcrel = 0;
19239
19240   /* Pick a reloc.
19241      FIXME: @@ Should look at CPU word size.  */
19242   switch (size)
19243     {
19244     case 1:
19245       type = BFD_RELOC_8;
19246       break;
19247     case 2:
19248       type = BFD_RELOC_16;
19249       break;
19250     case 4:
19251     default:
19252       type = BFD_RELOC_32;
19253       break;
19254     case 8:
19255       type = BFD_RELOC_64;
19256       break;
19257     }
19258
19259 #ifdef TE_PE
19260   if (exp->X_op == O_secrel)
19261   {
19262     exp->X_op = O_symbol;
19263     type = BFD_RELOC_32_SECREL;
19264   }
19265 #endif
19266
19267   fix_new_exp (frag, where, (int) size, exp, pcrel, type);
19268 }
19269
19270 #if defined OBJ_COFF || defined OBJ_ELF
19271 void
19272 arm_validate_fix (fixS * fixP)
19273 {
19274   /* If the destination of the branch is a defined symbol which does not have
19275      the THUMB_FUNC attribute, then we must be calling a function which has
19276      the (interfacearm) attribute.  We look for the Thumb entry point to that
19277      function and change the branch to refer to that function instead.  */
19278   if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
19279       && fixP->fx_addsy != NULL
19280       && S_IS_DEFINED (fixP->fx_addsy)
19281       && ! THUMB_IS_FUNC (fixP->fx_addsy))
19282     {
19283       fixP->fx_addsy = find_real_start (fixP->fx_addsy);
19284     }
19285 }
19286 #endif
19287
19288 int
19289 arm_force_relocation (struct fix * fixp)
19290 {
19291 #if defined (OBJ_COFF) && defined (TE_PE)
19292   if (fixp->fx_r_type == BFD_RELOC_RVA)
19293     return 1;
19294 #endif
19295
19296   /* Resolve these relocations even if the symbol is extern or weak.  */
19297   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
19298       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
19299       || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
19300       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
19301       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
19302       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
19303       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12)
19304     return 0;
19305
19306   /* Always leave these relocations for the linker.  */
19307   if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
19308        && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
19309       || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
19310     return 1;
19311
19312   /* Always generate relocations against function symbols.  */
19313   if (fixp->fx_r_type == BFD_RELOC_32
19314       && fixp->fx_addsy
19315       && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
19316     return 1;
19317
19318   return generic_force_reloc (fixp);
19319 }
19320
19321 #if defined (OBJ_ELF) || defined (OBJ_COFF)
19322 /* Relocations against function names must be left unadjusted,
19323    so that the linker can use this information to generate interworking
19324    stubs.  The MIPS version of this function
19325    also prevents relocations that are mips-16 specific, but I do not
19326    know why it does this.
19327
19328    FIXME:
19329    There is one other problem that ought to be addressed here, but
19330    which currently is not:  Taking the address of a label (rather
19331    than a function) and then later jumping to that address.  Such
19332    addresses also ought to have their bottom bit set (assuming that
19333    they reside in Thumb code), but at the moment they will not.  */
19334
19335 bfd_boolean
19336 arm_fix_adjustable (fixS * fixP)
19337 {
19338   if (fixP->fx_addsy == NULL)
19339     return 1;
19340
19341   /* Preserve relocations against symbols with function type.  */
19342   if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
19343     return 0;
19344
19345   if (THUMB_IS_FUNC (fixP->fx_addsy)
19346       && fixP->fx_subsy == NULL)
19347     return 0;
19348
19349   /* We need the symbol name for the VTABLE entries.  */
19350   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
19351       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
19352     return 0;
19353
19354   /* Don't allow symbols to be discarded on GOT related relocs.  */
19355   if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
19356       || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
19357       || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
19358       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
19359       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
19360       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
19361       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
19362       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
19363       || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
19364     return 0;
19365
19366   /* Similarly for group relocations.  */
19367   if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
19368        && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
19369       || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
19370     return 0;
19371
19372   return 1;
19373 }
19374 #endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
19375
19376 #ifdef OBJ_ELF
19377
19378 const char *
19379 elf32_arm_target_format (void)
19380 {
19381 #ifdef TE_SYMBIAN
19382   return (target_big_endian
19383           ? "elf32-bigarm-symbian"
19384           : "elf32-littlearm-symbian");
19385 #elif defined (TE_VXWORKS)
19386   return (target_big_endian
19387           ? "elf32-bigarm-vxworks"
19388           : "elf32-littlearm-vxworks");
19389 #else
19390   if (target_big_endian)
19391     return "elf32-bigarm";
19392   else
19393     return "elf32-littlearm";
19394 #endif
19395 }
19396
19397 void
19398 armelf_frob_symbol (symbolS * symp,
19399                     int *     puntp)
19400 {
19401   elf_frob_symbol (symp, puntp);
19402 }
19403 #endif
19404
19405 /* MD interface: Finalization.  */
19406
19407 /* A good place to do this, although this was probably not intended
19408    for this kind of use.  We need to dump the literal pool before
19409    references are made to a null symbol pointer.  */
19410
19411 void
19412 arm_cleanup (void)
19413 {
19414   literal_pool * pool;
19415
19416   for (pool = list_of_pools; pool; pool = pool->next)
19417     {
19418       /* Put it at the end of the relevent section.  */
19419       subseg_set (pool->section, pool->sub_section);
19420 #ifdef OBJ_ELF
19421       arm_elf_change_section ();
19422 #endif
19423       s_ltorg (0);
19424     }
19425 }
19426
19427 /* Adjust the symbol table.  This marks Thumb symbols as distinct from
19428    ARM ones.  */
19429
19430 void
19431 arm_adjust_symtab (void)
19432 {
19433 #ifdef OBJ_COFF
19434   symbolS * sym;
19435
19436   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
19437     {
19438       if (ARM_IS_THUMB (sym))
19439         {
19440           if (THUMB_IS_FUNC (sym))
19441             {
19442               /* Mark the symbol as a Thumb function.  */
19443               if (   S_GET_STORAGE_CLASS (sym) == C_STAT
19444                   || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!  */
19445                 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
19446
19447               else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
19448                 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
19449               else
19450                 as_bad (_("%s: unexpected function type: %d"),
19451                         S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
19452             }
19453           else switch (S_GET_STORAGE_CLASS (sym))
19454             {
19455             case C_EXT:
19456               S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
19457               break;
19458             case C_STAT:
19459               S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
19460               break;
19461             case C_LABEL:
19462               S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
19463               break;
19464             default:
19465               /* Do nothing.  */
19466               break;
19467             }
19468         }
19469
19470       if (ARM_IS_INTERWORK (sym))
19471         coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
19472     }
19473 #endif
19474 #ifdef OBJ_ELF
19475   symbolS * sym;
19476   char      bind;
19477
19478   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
19479     {
19480       if (ARM_IS_THUMB (sym))
19481         {
19482           elf_symbol_type * elf_sym;
19483
19484           elf_sym = elf_symbol (symbol_get_bfdsym (sym));
19485           bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
19486
19487           if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
19488                 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
19489             {
19490               /* If it's a .thumb_func, declare it as so,
19491                  otherwise tag label as .code 16.  */
19492               if (THUMB_IS_FUNC (sym))
19493                 elf_sym->internal_elf_sym.st_info =
19494                   ELF_ST_INFO (bind, STT_ARM_TFUNC);
19495               else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
19496                 elf_sym->internal_elf_sym.st_info =
19497                   ELF_ST_INFO (bind, STT_ARM_16BIT);
19498             }
19499         }
19500     }
19501 #endif
19502 }
19503
19504 /* MD interface: Initialization.  */
19505
19506 static void
19507 set_constant_flonums (void)
19508 {
19509   int i;
19510
19511   for (i = 0; i < NUM_FLOAT_VALS; i++)
19512     if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
19513       abort ();
19514 }
19515
19516 /* Auto-select Thumb mode if it's the only available instruction set for the
19517    given architecture.  */
19518
19519 static void
19520 autoselect_thumb_from_cpu_variant (void)
19521 {
19522   if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
19523     opcode_select (16);
19524 }
19525
19526 void
19527 md_begin (void)
19528 {
19529   unsigned mach;
19530   unsigned int i;
19531
19532   if (   (arm_ops_hsh = hash_new ()) == NULL
19533       || (arm_cond_hsh = hash_new ()) == NULL
19534       || (arm_shift_hsh = hash_new ()) == NULL
19535       || (arm_psr_hsh = hash_new ()) == NULL
19536       || (arm_v7m_psr_hsh = hash_new ()) == NULL
19537       || (arm_reg_hsh = hash_new ()) == NULL
19538       || (arm_reloc_hsh = hash_new ()) == NULL
19539       || (arm_barrier_opt_hsh = hash_new ()) == NULL)
19540     as_fatal (_("virtual memory exhausted"));
19541
19542   for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
19543     hash_insert (arm_ops_hsh, insns[i].template, (PTR) (insns + i));
19544   for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
19545     hash_insert (arm_cond_hsh, conds[i].template, (PTR) (conds + i));
19546   for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
19547     hash_insert (arm_shift_hsh, shift_names[i].name, (PTR) (shift_names + i));
19548   for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
19549     hash_insert (arm_psr_hsh, psrs[i].template, (PTR) (psrs + i));
19550   for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
19551     hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template, (PTR) (v7m_psrs + i));
19552   for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
19553     hash_insert (arm_reg_hsh, reg_names[i].name, (PTR) (reg_names + i));
19554   for (i = 0;
19555        i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
19556        i++)
19557     hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template,
19558                  (PTR) (barrier_opt_names + i));
19559 #ifdef OBJ_ELF
19560   for (i = 0; i < sizeof (reloc_names) / sizeof (struct reloc_entry); i++)
19561     hash_insert (arm_reloc_hsh, reloc_names[i].name, (PTR) (reloc_names + i));
19562 #endif
19563
19564   set_constant_flonums ();
19565
19566   /* Set the cpu variant based on the command-line options.  We prefer
19567      -mcpu= over -march= if both are set (as for GCC); and we prefer
19568      -mfpu= over any other way of setting the floating point unit.
19569      Use of legacy options with new options are faulted.  */
19570   if (legacy_cpu)
19571     {
19572       if (mcpu_cpu_opt || march_cpu_opt)
19573         as_bad (_("use of old and new-style options to set CPU type"));
19574
19575       mcpu_cpu_opt = legacy_cpu;
19576     }
19577   else if (!mcpu_cpu_opt)
19578     mcpu_cpu_opt = march_cpu_opt;
19579
19580   if (legacy_fpu)
19581     {
19582       if (mfpu_opt)
19583         as_bad (_("use of old and new-style options to set FPU type"));
19584
19585       mfpu_opt = legacy_fpu;
19586     }
19587   else if (!mfpu_opt)
19588     {
19589 #if !(defined (TE_LINUX) || defined (TE_NetBSD) || defined (TE_VXWORKS))
19590       /* Some environments specify a default FPU.  If they don't, infer it
19591          from the processor.  */
19592       if (mcpu_fpu_opt)
19593         mfpu_opt = mcpu_fpu_opt;
19594       else
19595         mfpu_opt = march_fpu_opt;
19596 #else
19597       mfpu_opt = &fpu_default;
19598 #endif
19599     }
19600
19601   if (!mfpu_opt)
19602     {
19603       if (mcpu_cpu_opt != NULL)
19604         mfpu_opt = &fpu_default;
19605       else if (mcpu_fpu_opt != NULL && ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
19606         mfpu_opt = &fpu_arch_vfp_v2;
19607       else
19608         mfpu_opt = &fpu_arch_fpa;
19609     }
19610
19611 #ifdef CPU_DEFAULT
19612   if (!mcpu_cpu_opt)
19613     {
19614       mcpu_cpu_opt = &cpu_default;
19615       selected_cpu = cpu_default;
19616     }
19617 #else
19618   if (mcpu_cpu_opt)
19619     selected_cpu = *mcpu_cpu_opt;
19620   else
19621     mcpu_cpu_opt = &arm_arch_any;
19622 #endif
19623
19624   ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
19625
19626   autoselect_thumb_from_cpu_variant ();
19627
19628   arm_arch_used = thumb_arch_used = arm_arch_none;
19629
19630 #if defined OBJ_COFF || defined OBJ_ELF
19631   {
19632     unsigned int flags = 0;
19633
19634 #if defined OBJ_ELF
19635     flags = meabi_flags;
19636
19637     switch (meabi_flags)
19638       {
19639       case EF_ARM_EABI_UNKNOWN:
19640 #endif
19641         /* Set the flags in the private structure.  */
19642         if (uses_apcs_26)      flags |= F_APCS26;
19643         if (support_interwork) flags |= F_INTERWORK;
19644         if (uses_apcs_float)   flags |= F_APCS_FLOAT;
19645         if (pic_code)          flags |= F_PIC;
19646         if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
19647           flags |= F_SOFT_FLOAT;
19648
19649         switch (mfloat_abi_opt)
19650           {
19651           case ARM_FLOAT_ABI_SOFT:
19652           case ARM_FLOAT_ABI_SOFTFP:
19653             flags |= F_SOFT_FLOAT;
19654             break;
19655
19656           case ARM_FLOAT_ABI_HARD:
19657             if (flags & F_SOFT_FLOAT)
19658               as_bad (_("hard-float conflicts with specified fpu"));
19659             break;
19660           }
19661
19662         /* Using pure-endian doubles (even if soft-float).      */
19663         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
19664           flags |= F_VFP_FLOAT;
19665
19666 #if defined OBJ_ELF
19667         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
19668             flags |= EF_ARM_MAVERICK_FLOAT;
19669         break;
19670
19671       case EF_ARM_EABI_VER4:
19672       case EF_ARM_EABI_VER5:
19673         /* No additional flags to set.  */
19674         break;
19675
19676       default:
19677         abort ();
19678       }
19679 #endif
19680     bfd_set_private_flags (stdoutput, flags);
19681
19682     /* We have run out flags in the COFF header to encode the
19683        status of ATPCS support, so instead we create a dummy,
19684        empty, debug section called .arm.atpcs.  */
19685     if (atpcs)
19686       {
19687         asection * sec;
19688
19689         sec = bfd_make_section (stdoutput, ".arm.atpcs");
19690
19691         if (sec != NULL)
19692           {
19693             bfd_set_section_flags
19694               (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
19695             bfd_set_section_size (stdoutput, sec, 0);
19696             bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
19697           }
19698       }
19699   }
19700 #endif
19701
19702   /* Record the CPU type as well.  */
19703   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
19704     mach = bfd_mach_arm_iWMMXt2;
19705   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
19706     mach = bfd_mach_arm_iWMMXt;
19707   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
19708     mach = bfd_mach_arm_XScale;
19709   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
19710     mach = bfd_mach_arm_ep9312;
19711   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
19712     mach = bfd_mach_arm_5TE;
19713   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
19714     {
19715       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
19716         mach = bfd_mach_arm_5T;
19717       else
19718         mach = bfd_mach_arm_5;
19719     }
19720   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
19721     {
19722       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
19723         mach = bfd_mach_arm_4T;
19724       else
19725         mach = bfd_mach_arm_4;
19726     }
19727   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
19728     mach = bfd_mach_arm_3M;
19729   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
19730     mach = bfd_mach_arm_3;
19731   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
19732     mach = bfd_mach_arm_2a;
19733   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
19734     mach = bfd_mach_arm_2;
19735   else
19736     mach = bfd_mach_arm_unknown;
19737
19738   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
19739 }
19740
19741 /* Command line processing.  */
19742
19743 /* md_parse_option
19744       Invocation line includes a switch not recognized by the base assembler.
19745       See if it's a processor-specific option.
19746
19747       This routine is somewhat complicated by the need for backwards
19748       compatibility (since older releases of gcc can't be changed).
19749       The new options try to make the interface as compatible as
19750       possible with GCC.
19751
19752       New options (supported) are:
19753
19754               -mcpu=<cpu name>           Assemble for selected processor
19755               -march=<architecture name> Assemble for selected architecture
19756               -mfpu=<fpu architecture>   Assemble for selected FPU.
19757               -EB/-mbig-endian           Big-endian
19758               -EL/-mlittle-endian        Little-endian
19759               -k                         Generate PIC code
19760               -mthumb                    Start in Thumb mode
19761               -mthumb-interwork          Code supports ARM/Thumb interworking
19762
19763       For now we will also provide support for:
19764
19765               -mapcs-32                  32-bit Program counter
19766               -mapcs-26                  26-bit Program counter
19767               -macps-float               Floats passed in FP registers
19768               -mapcs-reentrant           Reentrant code
19769               -matpcs
19770       (sometime these will probably be replaced with -mapcs=<list of options>
19771       and -matpcs=<list of options>)
19772
19773       The remaining options are only supported for back-wards compatibility.
19774       Cpu variants, the arm part is optional:
19775               -m[arm]1                Currently not supported.
19776               -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
19777               -m[arm]3                Arm 3 processor
19778               -m[arm]6[xx],           Arm 6 processors
19779               -m[arm]7[xx][t][[d]m]   Arm 7 processors
19780               -m[arm]8[10]            Arm 8 processors
19781               -m[arm]9[20][tdmi]      Arm 9 processors
19782               -mstrongarm[110[0]]     StrongARM processors
19783               -mxscale                XScale processors
19784               -m[arm]v[2345[t[e]]]    Arm architectures
19785               -mall                   All (except the ARM1)
19786       FP variants:
19787               -mfpa10, -mfpa11        FPA10 and 11 co-processor instructions
19788               -mfpe-old               (No float load/store multiples)
19789               -mvfpxd                 VFP Single precision
19790               -mvfp                   All VFP
19791               -mno-fpu                Disable all floating point instructions
19792
19793       The following CPU names are recognized:
19794               arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
19795               arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
19796               arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
19797               arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
19798               arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
19799               arm10t arm10e, arm1020t, arm1020e, arm10200e,
19800               strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
19801
19802       */
19803
19804 const char * md_shortopts = "m:k";
19805
19806 #ifdef ARM_BI_ENDIAN
19807 #define OPTION_EB (OPTION_MD_BASE + 0)
19808 #define OPTION_EL (OPTION_MD_BASE + 1)
19809 #else
19810 #if TARGET_BYTES_BIG_ENDIAN
19811 #define OPTION_EB (OPTION_MD_BASE + 0)
19812 #else
19813 #define OPTION_EL (OPTION_MD_BASE + 1)
19814 #endif
19815 #endif
19816
19817 struct option md_longopts[] =
19818 {
19819 #ifdef OPTION_EB
19820   {"EB", no_argument, NULL, OPTION_EB},
19821 #endif
19822 #ifdef OPTION_EL
19823   {"EL", no_argument, NULL, OPTION_EL},
19824 #endif
19825   {NULL, no_argument, NULL, 0}
19826 };
19827
19828 size_t md_longopts_size = sizeof (md_longopts);
19829
19830 struct arm_option_table
19831 {
19832   char *option;         /* Option name to match.  */
19833   char *help;           /* Help information.  */
19834   int  *var;            /* Variable to change.  */
19835   int   value;          /* What to change it to.  */
19836   char *deprecated;     /* If non-null, print this message.  */
19837 };
19838
19839 struct arm_option_table arm_opts[] =
19840 {
19841   {"k",      N_("generate PIC code"),      &pic_code,    1, NULL},
19842   {"mthumb", N_("assemble Thumb code"),    &thumb_mode,  1, NULL},
19843   {"mthumb-interwork", N_("support ARM/Thumb interworking"),
19844    &support_interwork, 1, NULL},
19845   {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
19846   {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
19847   {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
19848    1, NULL},
19849   {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
19850   {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
19851   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
19852   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
19853    NULL},
19854
19855   /* These are recognized by the assembler, but have no affect on code.  */
19856   {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
19857   {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
19858   {NULL, NULL, NULL, 0, NULL}
19859 };
19860
19861 struct arm_legacy_option_table
19862 {
19863   char *option;                         /* Option name to match.  */
19864   const arm_feature_set **var;          /* Variable to change.  */
19865   const arm_feature_set value;          /* What to change it to.  */
19866   char *deprecated;                     /* If non-null, print this message.  */
19867 };
19868
19869 const struct arm_legacy_option_table arm_legacy_opts[] =
19870 {
19871   /* DON'T add any new processors to this list -- we want the whole list
19872      to go away...  Add them to the processors table instead.  */
19873   {"marm1",      &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
19874   {"m1",         &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
19875   {"marm2",      &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
19876   {"m2",         &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
19877   {"marm250",    &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
19878   {"m250",       &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
19879   {"marm3",      &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
19880   {"m3",         &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
19881   {"marm6",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
19882   {"m6",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
19883   {"marm600",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
19884   {"m600",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
19885   {"marm610",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
19886   {"m610",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
19887   {"marm620",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
19888   {"m620",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
19889   {"marm7",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
19890   {"m7",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
19891   {"marm70",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
19892   {"m70",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
19893   {"marm700",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
19894   {"m700",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
19895   {"marm700i",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
19896   {"m700i",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
19897   {"marm710",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
19898   {"m710",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
19899   {"marm710c",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
19900   {"m710c",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
19901   {"marm720",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
19902   {"m720",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
19903   {"marm7d",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
19904   {"m7d",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
19905   {"marm7di",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
19906   {"m7di",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
19907   {"marm7m",     &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
19908   {"m7m",        &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
19909   {"marm7dm",    &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
19910   {"m7dm",       &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
19911   {"marm7dmi",   &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
19912   {"m7dmi",      &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
19913   {"marm7100",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
19914   {"m7100",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
19915   {"marm7500",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
19916   {"m7500",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
19917   {"marm7500fe", &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
19918   {"m7500fe",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
19919   {"marm7t",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
19920   {"m7t",        &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
19921   {"marm7tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
19922   {"m7tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
19923   {"marm710t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
19924   {"m710t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
19925   {"marm720t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
19926   {"m720t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
19927   {"marm740t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
19928   {"m740t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
19929   {"marm8",      &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
19930   {"m8",         &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
19931   {"marm810",    &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
19932   {"m810",       &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
19933   {"marm9",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
19934   {"m9",         &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
19935   {"marm9tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
19936   {"m9tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
19937   {"marm920",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
19938   {"m920",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
19939   {"marm940",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
19940   {"m940",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
19941   {"mstrongarm", &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
19942   {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
19943    N_("use -mcpu=strongarm110")},
19944   {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
19945    N_("use -mcpu=strongarm1100")},
19946   {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
19947    N_("use -mcpu=strongarm1110")},
19948   {"mxscale",    &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
19949   {"miwmmxt",    &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
19950   {"mall",       &legacy_cpu, ARM_ANY,         N_("use -mcpu=all")},
19951
19952   /* Architecture variants -- don't add any more to this list either.  */
19953   {"mv2",        &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
19954   {"marmv2",     &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
19955   {"mv2a",       &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
19956   {"marmv2a",    &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
19957   {"mv3",        &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
19958   {"marmv3",     &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
19959   {"mv3m",       &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
19960   {"marmv3m",    &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
19961   {"mv4",        &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
19962   {"marmv4",     &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
19963   {"mv4t",       &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
19964   {"marmv4t",    &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
19965   {"mv5",        &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
19966   {"marmv5",     &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
19967   {"mv5t",       &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
19968   {"marmv5t",    &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
19969   {"mv5e",       &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
19970   {"marmv5e",    &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
19971
19972   /* Floating point variants -- don't add any more to this list either.  */
19973   {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
19974   {"mfpa10",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
19975   {"mfpa11",   &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
19976   {"mno-fpu",  &legacy_fpu, ARM_ARCH_NONE,
19977    N_("use either -mfpu=softfpa or -mfpu=softvfp")},
19978
19979   {NULL, NULL, ARM_ARCH_NONE, NULL}
19980 };
19981
19982 struct arm_cpu_option_table
19983 {
19984   char *name;
19985   const arm_feature_set value;
19986   /* For some CPUs we assume an FPU unless the user explicitly sets
19987      -mfpu=...  */
19988   const arm_feature_set default_fpu;
19989   /* The canonical name of the CPU, or NULL to use NAME converted to upper
19990      case.  */
19991   const char *canonical_name;
19992 };
19993
19994 /* This list should, at a minimum, contain all the cpu names
19995    recognized by GCC.  */
19996 static const struct arm_cpu_option_table arm_cpus[] =
19997 {
19998   {"all",               ARM_ANY,         FPU_ARCH_FPA,    NULL},
19999   {"arm1",              ARM_ARCH_V1,     FPU_ARCH_FPA,    NULL},
20000   {"arm2",              ARM_ARCH_V2,     FPU_ARCH_FPA,    NULL},
20001   {"arm250",            ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL},
20002   {"arm3",              ARM_ARCH_V2S,    FPU_ARCH_FPA,    NULL},
20003   {"arm6",              ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20004   {"arm60",             ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20005   {"arm600",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20006   {"arm610",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20007   {"arm620",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20008   {"arm7",              ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20009   {"arm7m",             ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL},
20010   {"arm7d",             ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20011   {"arm7dm",            ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL},
20012   {"arm7di",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20013   {"arm7dmi",           ARM_ARCH_V3M,    FPU_ARCH_FPA,    NULL},
20014   {"arm70",             ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20015   {"arm700",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20016   {"arm700i",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20017   {"arm710",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20018   {"arm710t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
20019   {"arm720",            ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20020   {"arm720t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
20021   {"arm740t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
20022   {"arm710c",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20023   {"arm7100",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20024   {"arm7500",           ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20025   {"arm7500fe",         ARM_ARCH_V3,     FPU_ARCH_FPA,    NULL},
20026   {"arm7t",             ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
20027   {"arm7tdmi",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
20028   {"arm7tdmi-s",        ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
20029   {"arm8",              ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
20030   {"arm810",            ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
20031   {"strongarm",         ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
20032   {"strongarm1",        ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
20033   {"strongarm110",      ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
20034   {"strongarm1100",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
20035   {"strongarm1110",     ARM_ARCH_V4,     FPU_ARCH_FPA,    NULL},
20036   {"arm9",              ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
20037   {"arm920",            ARM_ARCH_V4T,    FPU_ARCH_FPA,    "ARM920T"},
20038   {"arm920t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
20039   {"arm922t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
20040   {"arm940t",           ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
20041   {"arm9tdmi",          ARM_ARCH_V4T,    FPU_ARCH_FPA,    NULL},
20042   /* For V5 or later processors we default to using VFP; but the user
20043      should really set the FPU type explicitly.  */
20044   {"arm9e-r0",          ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
20045   {"arm9e",             ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
20046   {"arm926ej",          ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"},
20047   {"arm926ejs",         ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM926EJ-S"},
20048   {"arm926ej-s",        ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL},
20049   {"arm946e-r0",        ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
20050   {"arm946e",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM946E-S"},
20051   {"arm946e-s",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
20052   {"arm966e-r0",        ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
20053   {"arm966e",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM966E-S"},
20054   {"arm966e-s",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
20055   {"arm968e-s",         ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
20056   {"arm10t",            ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL},
20057   {"arm10tdmi",         ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL},
20058   {"arm10e",            ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
20059   {"arm1020",           ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, "ARM1020E"},
20060   {"arm1020t",          ARM_ARCH_V5T,    FPU_ARCH_VFP_V1, NULL},
20061   {"arm1020e",          ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
20062   {"arm1022e",          ARM_ARCH_V5TE,   FPU_ARCH_VFP_V2, NULL},
20063   {"arm1026ejs",        ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, "ARM1026EJ-S"},
20064   {"arm1026ej-s",       ARM_ARCH_V5TEJ,  FPU_ARCH_VFP_V2, NULL},
20065   {"arm1136js",         ARM_ARCH_V6,     FPU_NONE,        "ARM1136J-S"},
20066   {"arm1136j-s",        ARM_ARCH_V6,     FPU_NONE,        NULL},
20067   {"arm1136jfs",        ARM_ARCH_V6,     FPU_ARCH_VFP_V2, "ARM1136JF-S"},
20068   {"arm1136jf-s",       ARM_ARCH_V6,     FPU_ARCH_VFP_V2, NULL},
20069   {"mpcore",            ARM_ARCH_V6K,    FPU_ARCH_VFP_V2, NULL},
20070   {"mpcorenovfp",       ARM_ARCH_V6K,    FPU_NONE,        NULL},
20071   {"arm1156t2-s",       ARM_ARCH_V6T2,   FPU_NONE,        NULL},
20072   {"arm1156t2f-s",      ARM_ARCH_V6T2,   FPU_ARCH_VFP_V2, NULL},
20073   {"arm1176jz-s",       ARM_ARCH_V6ZK,   FPU_NONE,        NULL},
20074   {"arm1176jzf-s",      ARM_ARCH_V6ZK,   FPU_ARCH_VFP_V2, NULL},
20075   {"cortex-a8",         ARM_ARCH_V7A,    ARM_FEATURE(0, FPU_VFP_V3
20076                                                         | FPU_NEON_EXT_V1),
20077                                                           NULL},
20078   {"cortex-a9",         ARM_ARCH_V7A,    ARM_FEATURE(0, FPU_VFP_V3
20079                                                         | FPU_NEON_EXT_V1),
20080                                                           NULL},
20081   {"cortex-r4",         ARM_ARCH_V7R,    FPU_NONE,        NULL},
20082   {"cortex-m3",         ARM_ARCH_V7M,    FPU_NONE,        NULL},
20083   /* ??? XSCALE is really an architecture.  */
20084   {"xscale",            ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL},
20085   /* ??? iwmmxt is not a processor.  */
20086   {"iwmmxt",            ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL},
20087   {"iwmmxt2",           ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL},
20088   {"i80200",            ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL},
20089   /* Maverick */
20090   {"ep9312",    ARM_FEATURE(ARM_AEXT_V4T, ARM_CEXT_MAVERICK), FPU_ARCH_MAVERICK, "ARM920T"},
20091   {NULL,                ARM_ARCH_NONE,   ARM_ARCH_NONE, NULL}
20092 };
20093
20094 struct arm_arch_option_table
20095 {
20096   char *name;
20097   const arm_feature_set value;
20098   const arm_feature_set default_fpu;
20099 };
20100
20101 /* This list should, at a minimum, contain all the architecture names
20102    recognized by GCC.  */
20103 static const struct arm_arch_option_table arm_archs[] =
20104 {
20105   {"all",               ARM_ANY,         FPU_ARCH_FPA},
20106   {"armv1",             ARM_ARCH_V1,     FPU_ARCH_FPA},
20107   {"armv2",             ARM_ARCH_V2,     FPU_ARCH_FPA},
20108   {"armv2a",            ARM_ARCH_V2S,    FPU_ARCH_FPA},
20109   {"armv2s",            ARM_ARCH_V2S,    FPU_ARCH_FPA},
20110   {"armv3",             ARM_ARCH_V3,     FPU_ARCH_FPA},
20111   {"armv3m",            ARM_ARCH_V3M,    FPU_ARCH_FPA},
20112   {"armv4",             ARM_ARCH_V4,     FPU_ARCH_FPA},
20113   {"armv4xm",           ARM_ARCH_V4xM,   FPU_ARCH_FPA},
20114   {"armv4t",            ARM_ARCH_V4T,    FPU_ARCH_FPA},
20115   {"armv4txm",          ARM_ARCH_V4TxM,  FPU_ARCH_FPA},
20116   {"armv5",             ARM_ARCH_V5,     FPU_ARCH_VFP},
20117   {"armv5t",            ARM_ARCH_V5T,    FPU_ARCH_VFP},
20118   {"armv5txm",          ARM_ARCH_V5TxM,  FPU_ARCH_VFP},
20119   {"armv5te",           ARM_ARCH_V5TE,   FPU_ARCH_VFP},
20120   {"armv5texp",         ARM_ARCH_V5TExP, FPU_ARCH_VFP},
20121   {"armv5tej",          ARM_ARCH_V5TEJ,  FPU_ARCH_VFP},
20122   {"armv6",             ARM_ARCH_V6,     FPU_ARCH_VFP},
20123   {"armv6j",            ARM_ARCH_V6,     FPU_ARCH_VFP},
20124   {"armv6k",            ARM_ARCH_V6K,    FPU_ARCH_VFP},
20125   {"armv6z",            ARM_ARCH_V6Z,    FPU_ARCH_VFP},
20126   {"armv6zk",           ARM_ARCH_V6ZK,   FPU_ARCH_VFP},
20127   {"armv6t2",           ARM_ARCH_V6T2,   FPU_ARCH_VFP},
20128   {"armv6kt2",          ARM_ARCH_V6KT2,  FPU_ARCH_VFP},
20129   {"armv6zt2",          ARM_ARCH_V6ZT2,  FPU_ARCH_VFP},
20130   {"armv6zkt2",         ARM_ARCH_V6ZKT2, FPU_ARCH_VFP},
20131   {"armv7",             ARM_ARCH_V7,     FPU_ARCH_VFP},
20132   /* The official spelling of the ARMv7 profile variants is the dashed form.
20133      Accept the non-dashed form for compatibility with old toolchains.  */
20134   {"armv7a",            ARM_ARCH_V7A,    FPU_ARCH_VFP},
20135   {"armv7r",            ARM_ARCH_V7R,    FPU_ARCH_VFP},
20136   {"armv7m",            ARM_ARCH_V7M,    FPU_ARCH_VFP},
20137   {"armv7-a",           ARM_ARCH_V7A,    FPU_ARCH_VFP},
20138   {"armv7-r",           ARM_ARCH_V7R,    FPU_ARCH_VFP},
20139   {"armv7-m",           ARM_ARCH_V7M,    FPU_ARCH_VFP},
20140   {"xscale",            ARM_ARCH_XSCALE, FPU_ARCH_VFP},
20141   {"iwmmxt",            ARM_ARCH_IWMMXT, FPU_ARCH_VFP},
20142   {"iwmmxt2",           ARM_ARCH_IWMMXT2,FPU_ARCH_VFP},
20143   {NULL,                ARM_ARCH_NONE,   ARM_ARCH_NONE}
20144 };
20145
20146 /* ISA extensions in the co-processor space.  */
20147 struct arm_option_cpu_value_table
20148 {
20149   char *name;
20150   const arm_feature_set value;
20151 };
20152
20153 static const struct arm_option_cpu_value_table arm_extensions[] =
20154 {
20155   {"maverick",          ARM_FEATURE (0, ARM_CEXT_MAVERICK)},
20156   {"xscale",            ARM_FEATURE (0, ARM_CEXT_XSCALE)},
20157   {"iwmmxt",            ARM_FEATURE (0, ARM_CEXT_IWMMXT)},
20158   {"iwmmxt2",           ARM_FEATURE (0, ARM_CEXT_IWMMXT2)},
20159   {"sec",               ARM_FEATURE (ARM_EXT_V6Z, 0)},
20160   {NULL,                ARM_ARCH_NONE}
20161 };
20162
20163 /* This list should, at a minimum, contain all the fpu names
20164    recognized by GCC.  */
20165 static const struct arm_option_cpu_value_table arm_fpus[] =
20166 {
20167   {"softfpa",           FPU_NONE},
20168   {"fpe",               FPU_ARCH_FPE},
20169   {"fpe2",              FPU_ARCH_FPE},
20170   {"fpe3",              FPU_ARCH_FPA},  /* Third release supports LFM/SFM.  */
20171   {"fpa",               FPU_ARCH_FPA},
20172   {"fpa10",             FPU_ARCH_FPA},
20173   {"fpa11",             FPU_ARCH_FPA},
20174   {"arm7500fe",         FPU_ARCH_FPA},
20175   {"softvfp",           FPU_ARCH_VFP},
20176   {"softvfp+vfp",       FPU_ARCH_VFP_V2},
20177   {"vfp",               FPU_ARCH_VFP_V2},
20178   {"vfpv2",             FPU_ARCH_VFP_V2},
20179   {"vfp9",              FPU_ARCH_VFP_V2},
20180   {"vfp3",              FPU_ARCH_VFP_V3},
20181   {"vfpv3",             FPU_ARCH_VFP_V3},
20182   {"vfp10",             FPU_ARCH_VFP_V2},
20183   {"vfp10-r0",          FPU_ARCH_VFP_V1},
20184   {"vfpxd",             FPU_ARCH_VFP_V1xD},
20185   {"arm1020t",          FPU_ARCH_VFP_V1},
20186   {"arm1020e",          FPU_ARCH_VFP_V2},
20187   {"arm1136jfs",        FPU_ARCH_VFP_V2},
20188   {"arm1136jf-s",       FPU_ARCH_VFP_V2},
20189   {"maverick",          FPU_ARCH_MAVERICK},
20190   {"neon",              FPU_ARCH_VFP_V3_PLUS_NEON_V1},
20191   {NULL,                ARM_ARCH_NONE}
20192 };
20193
20194 struct arm_option_value_table
20195 {
20196   char *name;
20197   long value;
20198 };
20199
20200 static const struct arm_option_value_table arm_float_abis[] =
20201 {
20202   {"hard",      ARM_FLOAT_ABI_HARD},
20203   {"softfp",    ARM_FLOAT_ABI_SOFTFP},
20204   {"soft",      ARM_FLOAT_ABI_SOFT},
20205   {NULL,        0}
20206 };
20207
20208 #ifdef OBJ_ELF
20209 /* We only know how to output GNU and ver 4/5 (AAELF) formats.  */
20210 static const struct arm_option_value_table arm_eabis[] =
20211 {
20212   {"gnu",       EF_ARM_EABI_UNKNOWN},
20213   {"4",         EF_ARM_EABI_VER4},
20214   {"5",         EF_ARM_EABI_VER5},
20215   {NULL,        0}
20216 };
20217 #endif
20218
20219 struct arm_long_option_table
20220 {
20221   char * option;                /* Substring to match.  */
20222   char * help;                  /* Help information.  */
20223   int (* func) (char * subopt); /* Function to decode sub-option.  */
20224   char * deprecated;            /* If non-null, print this message.  */
20225 };
20226
20227 static int
20228 arm_parse_extension (char * str, const arm_feature_set **opt_p)
20229 {
20230   arm_feature_set *ext_set = xmalloc (sizeof (arm_feature_set));
20231
20232   /* Copy the feature set, so that we can modify it.  */
20233   *ext_set = **opt_p;
20234   *opt_p = ext_set;
20235
20236   while (str != NULL && *str != 0)
20237     {
20238       const struct arm_option_cpu_value_table * opt;
20239       char * ext;
20240       int optlen;
20241
20242       if (*str != '+')
20243         {
20244           as_bad (_("invalid architectural extension"));
20245           return 0;
20246         }
20247
20248       str++;
20249       ext = strchr (str, '+');
20250
20251       if (ext != NULL)
20252         optlen = ext - str;
20253       else
20254         optlen = strlen (str);
20255
20256       if (optlen == 0)
20257         {
20258           as_bad (_("missing architectural extension"));
20259           return 0;
20260         }
20261
20262       for (opt = arm_extensions; opt->name != NULL; opt++)
20263         if (strncmp (opt->name, str, optlen) == 0)
20264           {
20265             ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
20266             break;
20267           }
20268
20269       if (opt->name == NULL)
20270         {
20271           as_bad (_("unknown architectural extnsion `%s'"), str);
20272           return 0;
20273         }
20274
20275       str = ext;
20276     };
20277
20278   return 1;
20279 }
20280
20281 static int
20282 arm_parse_cpu (char * str)
20283 {
20284   const struct arm_cpu_option_table * opt;
20285   char * ext = strchr (str, '+');
20286   int optlen;
20287
20288   if (ext != NULL)
20289     optlen = ext - str;
20290   else
20291     optlen = strlen (str);
20292
20293   if (optlen == 0)
20294     {
20295       as_bad (_("missing cpu name `%s'"), str);
20296       return 0;
20297     }
20298
20299   for (opt = arm_cpus; opt->name != NULL; opt++)
20300     if (strncmp (opt->name, str, optlen) == 0)
20301       {
20302         mcpu_cpu_opt = &opt->value;
20303         mcpu_fpu_opt = &opt->default_fpu;
20304         if (opt->canonical_name)
20305           strcpy(selected_cpu_name, opt->canonical_name);
20306         else
20307           {
20308             int i;
20309             for (i = 0; i < optlen; i++)
20310               selected_cpu_name[i] = TOUPPER (opt->name[i]);
20311             selected_cpu_name[i] = 0;
20312           }
20313
20314         if (ext != NULL)
20315           return arm_parse_extension (ext, &mcpu_cpu_opt);
20316
20317         return 1;
20318       }
20319
20320   as_bad (_("unknown cpu `%s'"), str);
20321   return 0;
20322 }
20323
20324 static int
20325 arm_parse_arch (char * str)
20326 {
20327   const struct arm_arch_option_table *opt;
20328   char *ext = strchr (str, '+');
20329   int optlen;
20330
20331   if (ext != NULL)
20332     optlen = ext - str;
20333   else
20334     optlen = strlen (str);
20335
20336   if (optlen == 0)
20337     {
20338       as_bad (_("missing architecture name `%s'"), str);
20339       return 0;
20340     }
20341
20342   for (opt = arm_archs; opt->name != NULL; opt++)
20343     if (strncmp (opt->name, str, optlen) == 0)
20344       {
20345         march_cpu_opt = &opt->value;
20346         march_fpu_opt = &opt->default_fpu;
20347         strcpy(selected_cpu_name, opt->name);
20348
20349         if (ext != NULL)
20350           return arm_parse_extension (ext, &march_cpu_opt);
20351
20352         return 1;
20353       }
20354
20355   as_bad (_("unknown architecture `%s'\n"), str);
20356   return 0;
20357 }
20358
20359 static int
20360 arm_parse_fpu (char * str)
20361 {
20362   const struct arm_option_cpu_value_table * opt;
20363
20364   for (opt = arm_fpus; opt->name != NULL; opt++)
20365     if (streq (opt->name, str))
20366       {
20367         mfpu_opt = &opt->value;
20368         return 1;
20369       }
20370
20371   as_bad (_("unknown floating point format `%s'\n"), str);
20372   return 0;
20373 }
20374
20375 static int
20376 arm_parse_float_abi (char * str)
20377 {
20378   const struct arm_option_value_table * opt;
20379
20380   for (opt = arm_float_abis; opt->name != NULL; opt++)
20381     if (streq (opt->name, str))
20382       {
20383         mfloat_abi_opt = opt->value;
20384         return 1;
20385       }
20386
20387   as_bad (_("unknown floating point abi `%s'\n"), str);
20388   return 0;
20389 }
20390
20391 #ifdef OBJ_ELF
20392 static int
20393 arm_parse_eabi (char * str)
20394 {
20395   const struct arm_option_value_table *opt;
20396
20397   for (opt = arm_eabis; opt->name != NULL; opt++)
20398     if (streq (opt->name, str))
20399       {
20400         meabi_flags = opt->value;
20401         return 1;
20402       }
20403   as_bad (_("unknown EABI `%s'\n"), str);
20404   return 0;
20405 }
20406 #endif
20407
20408 struct arm_long_option_table arm_long_opts[] =
20409 {
20410   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
20411    arm_parse_cpu, NULL},
20412   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
20413    arm_parse_arch, NULL},
20414   {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
20415    arm_parse_fpu, NULL},
20416   {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
20417    arm_parse_float_abi, NULL},
20418 #ifdef OBJ_ELF
20419   {"meabi=", N_("<ver>\t  assemble for eabi version <ver>"),
20420    arm_parse_eabi, NULL},
20421 #endif
20422   {NULL, NULL, 0, NULL}
20423 };
20424
20425 int
20426 md_parse_option (int c, char * arg)
20427 {
20428   struct arm_option_table *opt;
20429   const struct arm_legacy_option_table *fopt;
20430   struct arm_long_option_table *lopt;
20431
20432   switch (c)
20433     {
20434 #ifdef OPTION_EB
20435     case OPTION_EB:
20436       target_big_endian = 1;
20437       break;
20438 #endif
20439
20440 #ifdef OPTION_EL
20441     case OPTION_EL:
20442       target_big_endian = 0;
20443       break;
20444 #endif
20445
20446     case 'a':
20447       /* Listing option.  Just ignore these, we don't support additional
20448          ones.  */
20449       return 0;
20450
20451     default:
20452       for (opt = arm_opts; opt->option != NULL; opt++)
20453         {
20454           if (c == opt->option[0]
20455               && ((arg == NULL && opt->option[1] == 0)
20456                   || streq (arg, opt->option + 1)))
20457             {
20458 #if WARN_DEPRECATED
20459               /* If the option is deprecated, tell the user.  */
20460               if (opt->deprecated != NULL)
20461                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
20462                            arg ? arg : "", _(opt->deprecated));
20463 #endif
20464
20465               if (opt->var != NULL)
20466                 *opt->var = opt->value;
20467
20468               return 1;
20469             }
20470         }
20471
20472       for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
20473         {
20474           if (c == fopt->option[0]
20475               && ((arg == NULL && fopt->option[1] == 0)
20476                   || streq (arg, fopt->option + 1)))
20477             {
20478 #if WARN_DEPRECATED
20479               /* If the option is deprecated, tell the user.  */
20480               if (fopt->deprecated != NULL)
20481                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
20482                            arg ? arg : "", _(fopt->deprecated));
20483 #endif
20484
20485               if (fopt->var != NULL)
20486                 *fopt->var = &fopt->value;
20487
20488               return 1;
20489             }
20490         }
20491
20492       for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
20493         {
20494           /* These options are expected to have an argument.  */
20495           if (c == lopt->option[0]
20496               && arg != NULL
20497               && strncmp (arg, lopt->option + 1,
20498                           strlen (lopt->option + 1)) == 0)
20499             {
20500 #if WARN_DEPRECATED
20501               /* If the option is deprecated, tell the user.  */
20502               if (lopt->deprecated != NULL)
20503                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
20504                            _(lopt->deprecated));
20505 #endif
20506
20507               /* Call the sup-option parser.  */
20508               return lopt->func (arg + strlen (lopt->option) - 1);
20509             }
20510         }
20511
20512       return 0;
20513     }
20514
20515   return 1;
20516 }
20517
20518 void
20519 md_show_usage (FILE * fp)
20520 {
20521   struct arm_option_table *opt;
20522   struct arm_long_option_table *lopt;
20523
20524   fprintf (fp, _(" ARM-specific assembler options:\n"));
20525
20526   for (opt = arm_opts; opt->option != NULL; opt++)
20527     if (opt->help != NULL)
20528       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
20529
20530   for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
20531     if (lopt->help != NULL)
20532       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
20533
20534 #ifdef OPTION_EB
20535   fprintf (fp, _("\
20536   -EB                     assemble code for a big-endian cpu\n"));
20537 #endif
20538
20539 #ifdef OPTION_EL
20540   fprintf (fp, _("\
20541   -EL                     assemble code for a little-endian cpu\n"));
20542 #endif
20543 }
20544
20545
20546 #ifdef OBJ_ELF
20547 typedef struct
20548 {
20549   int val;
20550   arm_feature_set flags;
20551 } cpu_arch_ver_table;
20552
20553 /* Mapping from CPU features to EABI CPU arch values.  Table must be sorted
20554    least features first.  */
20555 static const cpu_arch_ver_table cpu_arch_ver[] =
20556 {
20557     {1, ARM_ARCH_V4},
20558     {2, ARM_ARCH_V4T},
20559     {3, ARM_ARCH_V5},
20560     {4, ARM_ARCH_V5TE},
20561     {5, ARM_ARCH_V5TEJ},
20562     {6, ARM_ARCH_V6},
20563     {7, ARM_ARCH_V6Z},
20564     {8, ARM_ARCH_V6K},
20565     {9, ARM_ARCH_V6T2},
20566     {10, ARM_ARCH_V7A},
20567     {10, ARM_ARCH_V7R},
20568     {10, ARM_ARCH_V7M},
20569     {0, ARM_ARCH_NONE}
20570 };
20571
20572 /* Set the public EABI object attributes.  */
20573 static void
20574 aeabi_set_public_attributes (void)
20575 {
20576   int arch;
20577   arm_feature_set flags;
20578   arm_feature_set tmp;
20579   const cpu_arch_ver_table *p;
20580
20581   /* Choose the architecture based on the capabilities of the requested cpu
20582      (if any) and/or the instructions actually used.  */
20583   ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
20584   ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
20585   ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
20586   /*Allow the user to override the reported architecture.  */
20587   if (object_arch)
20588     {
20589       ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
20590       ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
20591     }
20592
20593   tmp = flags;
20594   arch = 0;
20595   for (p = cpu_arch_ver; p->val; p++)
20596     {
20597       if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
20598         {
20599           arch = p->val;
20600           ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
20601         }
20602     }
20603
20604   /* Tag_CPU_name.  */
20605   if (selected_cpu_name[0])
20606     {
20607       char *p;
20608
20609       p = selected_cpu_name;
20610       if (strncmp(p, "armv", 4) == 0)
20611         {
20612           int i;
20613           
20614           p += 4;
20615           for (i = 0; p[i]; i++)
20616             p[i] = TOUPPER (p[i]);
20617         }
20618       bfd_elf_add_proc_attr_string (stdoutput, 5, p);
20619     }
20620   /* Tag_CPU_arch.  */
20621   bfd_elf_add_proc_attr_int (stdoutput, 6, arch);
20622   /* Tag_CPU_arch_profile.  */
20623   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
20624     bfd_elf_add_proc_attr_int (stdoutput, 7, 'A');
20625   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
20626     bfd_elf_add_proc_attr_int (stdoutput, 7, 'R');
20627   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m))
20628     bfd_elf_add_proc_attr_int (stdoutput, 7, 'M');
20629   /* Tag_ARM_ISA_use.  */
20630   if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_full))
20631     bfd_elf_add_proc_attr_int (stdoutput, 8, 1);
20632   /* Tag_THUMB_ISA_use.  */
20633   if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_full))
20634     bfd_elf_add_proc_attr_int (stdoutput, 9,
20635         ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_t2) ? 2 : 1);
20636   /* Tag_VFP_arch.  */
20637   if (ARM_CPU_HAS_FEATURE (thumb_arch_used, fpu_vfp_ext_v3)
20638       || ARM_CPU_HAS_FEATURE (arm_arch_used, fpu_vfp_ext_v3))
20639     bfd_elf_add_proc_attr_int (stdoutput, 10, 3);
20640   else if (ARM_CPU_HAS_FEATURE (thumb_arch_used, fpu_vfp_ext_v2)
20641            || ARM_CPU_HAS_FEATURE (arm_arch_used, fpu_vfp_ext_v2))
20642     bfd_elf_add_proc_attr_int (stdoutput, 10, 2);
20643   else if (ARM_CPU_HAS_FEATURE (thumb_arch_used, fpu_vfp_ext_v1)
20644            || ARM_CPU_HAS_FEATURE (arm_arch_used, fpu_vfp_ext_v1)
20645            || ARM_CPU_HAS_FEATURE (thumb_arch_used, fpu_vfp_ext_v1xd)
20646            || ARM_CPU_HAS_FEATURE (arm_arch_used, fpu_vfp_ext_v1xd))
20647     bfd_elf_add_proc_attr_int (stdoutput, 10, 1);
20648   /* Tag_WMMX_arch.  */
20649   if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_cext_iwmmxt)
20650       || ARM_CPU_HAS_FEATURE (arm_arch_used, arm_cext_iwmmxt))
20651     bfd_elf_add_proc_attr_int (stdoutput, 11, 1);
20652   /* Tag_NEON_arch.  */
20653   if (ARM_CPU_HAS_FEATURE (thumb_arch_used, fpu_neon_ext_v1)
20654       || ARM_CPU_HAS_FEATURE (arm_arch_used, fpu_neon_ext_v1))
20655     bfd_elf_add_proc_attr_int (stdoutput, 12, 1);
20656 }
20657
20658 /* Add the default contents for the .ARM.attributes section.  */
20659 void
20660 arm_md_end (void)
20661 {
20662   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
20663     return;
20664
20665   aeabi_set_public_attributes ();
20666 }
20667 #endif /* OBJ_ELF */
20668
20669
20670 /* Parse a .cpu directive.  */
20671
20672 static void
20673 s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
20674 {
20675   const struct arm_cpu_option_table *opt;
20676   char *name;
20677   char saved_char;
20678
20679   name = input_line_pointer;
20680   while (*input_line_pointer && !ISSPACE(*input_line_pointer))
20681     input_line_pointer++;
20682   saved_char = *input_line_pointer;
20683   *input_line_pointer = 0;
20684
20685   /* Skip the first "all" entry.  */
20686   for (opt = arm_cpus + 1; opt->name != NULL; opt++)
20687     if (streq (opt->name, name))
20688       {
20689         mcpu_cpu_opt = &opt->value;
20690         selected_cpu = opt->value;
20691         if (opt->canonical_name)
20692           strcpy(selected_cpu_name, opt->canonical_name);
20693         else
20694           {
20695             int i;
20696             for (i = 0; opt->name[i]; i++)
20697               selected_cpu_name[i] = TOUPPER (opt->name[i]);
20698             selected_cpu_name[i] = 0;
20699           }
20700         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
20701         *input_line_pointer = saved_char;
20702         demand_empty_rest_of_line ();
20703         return;
20704       }
20705   as_bad (_("unknown cpu `%s'"), name);
20706   *input_line_pointer = saved_char;
20707   ignore_rest_of_line ();
20708 }
20709
20710
20711 /* Parse a .arch directive.  */
20712
20713 static void
20714 s_arm_arch (int ignored ATTRIBUTE_UNUSED)
20715 {
20716   const struct arm_arch_option_table *opt;
20717   char saved_char;
20718   char *name;
20719
20720   name = input_line_pointer;
20721   while (*input_line_pointer && !ISSPACE(*input_line_pointer))
20722     input_line_pointer++;
20723   saved_char = *input_line_pointer;
20724   *input_line_pointer = 0;
20725
20726   /* Skip the first "all" entry.  */
20727   for (opt = arm_archs + 1; opt->name != NULL; opt++)
20728     if (streq (opt->name, name))
20729       {
20730         mcpu_cpu_opt = &opt->value;
20731         selected_cpu = opt->value;
20732         strcpy(selected_cpu_name, opt->name);
20733         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
20734         *input_line_pointer = saved_char;
20735         demand_empty_rest_of_line ();
20736         return;
20737       }
20738
20739   as_bad (_("unknown architecture `%s'\n"), name);
20740   *input_line_pointer = saved_char;
20741   ignore_rest_of_line ();
20742 }
20743
20744 /* Parse a .arch_extension directive.  */
20745
20746 static void
20747 s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
20748 {
20749   const struct arm_option_cpu_value_table *opt;
20750   char saved_char;
20751   char *name;
20752
20753   name = input_line_pointer;
20754   while (*input_line_pointer && !ISSPACE(*input_line_pointer))
20755     input_line_pointer++;
20756   saved_char = *input_line_pointer;
20757   *input_line_pointer = 0;
20758
20759   for (opt = arm_extensions; opt->name != NULL; opt++)
20760     if (streq (opt->name, name))
20761       {
20762         ARM_MERGE_FEATURE_SETS (cpu_variant, cpu_variant, opt->value);
20763         *input_line_pointer = saved_char;
20764         demand_empty_rest_of_line ();
20765         return;
20766       }
20767
20768   as_bad (_("unknown architecture `%s'\n"), name);
20769   *input_line_pointer = saved_char;
20770   ignore_rest_of_line ();
20771 }
20772
20773 /* Parse a .object_arch directive.  */
20774
20775 static void
20776 s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
20777 {
20778   const struct arm_arch_option_table *opt;
20779   char saved_char;
20780   char *name;
20781
20782   name = input_line_pointer;
20783   while (*input_line_pointer && !ISSPACE(*input_line_pointer))
20784     input_line_pointer++;
20785   saved_char = *input_line_pointer;
20786   *input_line_pointer = 0;
20787
20788   /* Skip the first "all" entry.  */
20789   for (opt = arm_archs + 1; opt->name != NULL; opt++)
20790     if (streq (opt->name, name))
20791       {
20792         object_arch = &opt->value;
20793         *input_line_pointer = saved_char;
20794         demand_empty_rest_of_line ();
20795         return;
20796       }
20797
20798   as_bad (_("unknown architecture `%s'\n"), name);
20799   *input_line_pointer = saved_char;
20800   ignore_rest_of_line ();
20801 }
20802
20803
20804 /* Parse a .fpu directive.  */
20805
20806 static void
20807 s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
20808 {
20809   const struct arm_option_cpu_value_table *opt;
20810   char saved_char;
20811   char *name;
20812
20813   name = input_line_pointer;
20814   while (*input_line_pointer && !ISSPACE(*input_line_pointer))
20815     input_line_pointer++;
20816   saved_char = *input_line_pointer;
20817   *input_line_pointer = 0;
20818   
20819   for (opt = arm_fpus; opt->name != NULL; opt++)
20820     if (streq (opt->name, name))
20821       {
20822         mfpu_opt = &opt->value;
20823         ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
20824         *input_line_pointer = saved_char;
20825         demand_empty_rest_of_line ();
20826         return;
20827       }
20828
20829   as_bad (_("unknown floating point format `%s'\n"), name);
20830   *input_line_pointer = saved_char;
20831   ignore_rest_of_line ();
20832 }
20833
20834 /* Copy symbol information.  */
20835 void
20836 arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
20837 {
20838   ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
20839 }