[PATCH 35/57][Arm][GAS] Add support for MVE instructions: vshlc and vshll
[external/binutils.git] / gas / config / tc-arm.c
1 /* tc-arm.c -- Assemble for the ARM
2    Copyright (C) 1994-2019 Free Software Foundation, Inc.
3    Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
4         Modified by David Taylor (dtaylor@armltd.co.uk)
5         Cirrus coprocessor mods by Aldy Hernandez (aldyh@redhat.com)
6         Cirrus coprocessor fixes by Petko Manolov (petkan@nucleusys.com)
7         Cirrus coprocessor fixes by Vladimir Ivanov (vladitx@nucleusys.com)
8
9    This file is part of GAS, the GNU Assembler.
10
11    GAS is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 3, or (at your option)
14    any later version.
15
16    GAS is distributed in the hope that it will be useful,
17    but WITHOUT ANY WARRANTY; without even the implied warranty of
18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19    GNU General Public License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with GAS; see the file COPYING.  If not, write to the Free
23    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
24    02110-1301, USA.  */
25
26 #include "as.h"
27 #include <limits.h>
28 #include <stdarg.h>
29 #define  NO_RELOC 0
30 #include "safe-ctype.h"
31 #include "subsegs.h"
32 #include "obstack.h"
33 #include "libiberty.h"
34 #include "opcode/arm.h"
35
36 #ifdef OBJ_ELF
37 #include "elf/arm.h"
38 #include "dw2gencfi.h"
39 #endif
40
41 #include "dwarf2dbg.h"
42
43 #ifdef OBJ_ELF
44 /* Must be at least the size of the largest unwind opcode (currently two).  */
45 #define ARM_OPCODE_CHUNK_SIZE 8
46
47 /* This structure holds the unwinding state.  */
48
49 static struct
50 {
51   symbolS *       proc_start;
52   symbolS *       table_entry;
53   symbolS *       personality_routine;
54   int             personality_index;
55   /* The segment containing the function.  */
56   segT            saved_seg;
57   subsegT         saved_subseg;
58   /* Opcodes generated from this function.  */
59   unsigned char * opcodes;
60   int             opcode_count;
61   int             opcode_alloc;
62   /* The number of bytes pushed to the stack.  */
63   offsetT         frame_size;
64   /* We don't add stack adjustment opcodes immediately so that we can merge
65      multiple adjustments.  We can also omit the final adjustment
66      when using a frame pointer.  */
67   offsetT         pending_offset;
68   /* These two fields are set by both unwind_movsp and unwind_setfp.  They
69      hold the reg+offset to use when restoring sp from a frame pointer.  */
70   offsetT         fp_offset;
71   int             fp_reg;
72   /* Nonzero if an unwind_setfp directive has been seen.  */
73   unsigned        fp_used:1;
74   /* Nonzero if the last opcode restores sp from fp_reg.  */
75   unsigned        sp_restored:1;
76 } unwind;
77
78 /* Whether --fdpic was given.  */
79 static int arm_fdpic;
80
81 #endif /* OBJ_ELF */
82
83 /* Results from operand parsing worker functions.  */
84
85 typedef enum
86 {
87   PARSE_OPERAND_SUCCESS,
88   PARSE_OPERAND_FAIL,
89   PARSE_OPERAND_FAIL_NO_BACKTRACK
90 } parse_operand_result;
91
92 enum arm_float_abi
93 {
94   ARM_FLOAT_ABI_HARD,
95   ARM_FLOAT_ABI_SOFTFP,
96   ARM_FLOAT_ABI_SOFT
97 };
98
99 /* Types of processor to assemble for.  */
100 #ifndef CPU_DEFAULT
101 /* The code that was here used to select a default CPU depending on compiler
102    pre-defines which were only present when doing native builds, thus
103    changing gas' default behaviour depending upon the build host.
104
105    If you have a target that requires a default CPU option then the you
106    should define CPU_DEFAULT here.  */
107 #endif
108
109 #ifndef FPU_DEFAULT
110 # ifdef TE_LINUX
111 #  define FPU_DEFAULT FPU_ARCH_FPA
112 # elif defined (TE_NetBSD)
113 #  ifdef OBJ_ELF
114 #   define FPU_DEFAULT FPU_ARCH_VFP     /* Soft-float, but VFP order.  */
115 #  else
116     /* Legacy a.out format.  */
117 #   define FPU_DEFAULT FPU_ARCH_FPA     /* Soft-float, but FPA order.  */
118 #  endif
119 # elif defined (TE_VXWORKS)
120 #  define FPU_DEFAULT FPU_ARCH_VFP      /* Soft-float, VFP order.  */
121 # else
122    /* For backwards compatibility, default to FPA.  */
123 #  define FPU_DEFAULT FPU_ARCH_FPA
124 # endif
125 #endif /* ifndef FPU_DEFAULT */
126
127 #define streq(a, b)           (strcmp (a, b) == 0)
128
129 /* Current set of feature bits available (CPU+FPU).  Different from
130    selected_cpu + selected_fpu in case of autodetection since the CPU
131    feature bits are then all set.  */
132 static arm_feature_set cpu_variant;
133 /* Feature bits used in each execution state.  Used to set build attribute
134    (in particular Tag_*_ISA_use) in CPU autodetection mode.  */
135 static arm_feature_set arm_arch_used;
136 static arm_feature_set thumb_arch_used;
137
138 /* Flags stored in private area of BFD structure.  */
139 static int uses_apcs_26      = FALSE;
140 static int atpcs             = FALSE;
141 static int support_interwork = FALSE;
142 static int uses_apcs_float   = FALSE;
143 static int pic_code          = FALSE;
144 static int fix_v4bx          = FALSE;
145 /* Warn on using deprecated features.  */
146 static int warn_on_deprecated = TRUE;
147
148 /* Understand CodeComposer Studio assembly syntax.  */
149 bfd_boolean codecomposer_syntax = FALSE;
150
151 /* Variables that we set while parsing command-line options.  Once all
152    options have been read we re-process these values to set the real
153    assembly flags.  */
154
155 /* CPU and FPU feature bits set for legacy CPU and FPU options (eg. -marm1
156    instead of -mcpu=arm1).  */
157 static const arm_feature_set *legacy_cpu = NULL;
158 static const arm_feature_set *legacy_fpu = NULL;
159
160 /* CPU, extension and FPU feature bits selected by -mcpu.  */
161 static const arm_feature_set *mcpu_cpu_opt = NULL;
162 static arm_feature_set *mcpu_ext_opt = NULL;
163 static const arm_feature_set *mcpu_fpu_opt = NULL;
164
165 /* CPU, extension and FPU feature bits selected by -march.  */
166 static const arm_feature_set *march_cpu_opt = NULL;
167 static arm_feature_set *march_ext_opt = NULL;
168 static const arm_feature_set *march_fpu_opt = NULL;
169
170 /* Feature bits selected by -mfpu.  */
171 static const arm_feature_set *mfpu_opt = NULL;
172
173 /* Constants for known architecture features.  */
174 static const arm_feature_set fpu_default = FPU_DEFAULT;
175 static const arm_feature_set fpu_arch_vfp_v1 ATTRIBUTE_UNUSED = FPU_ARCH_VFP_V1;
176 static const arm_feature_set fpu_arch_vfp_v2 = FPU_ARCH_VFP_V2;
177 static const arm_feature_set fpu_arch_vfp_v3 ATTRIBUTE_UNUSED = FPU_ARCH_VFP_V3;
178 static const arm_feature_set fpu_arch_neon_v1 ATTRIBUTE_UNUSED = FPU_ARCH_NEON_V1;
179 static const arm_feature_set fpu_arch_fpa = FPU_ARCH_FPA;
180 static const arm_feature_set fpu_any_hard = FPU_ANY_HARD;
181 #ifdef OBJ_ELF
182 static const arm_feature_set fpu_arch_maverick = FPU_ARCH_MAVERICK;
183 #endif
184 static const arm_feature_set fpu_endian_pure = FPU_ARCH_ENDIAN_PURE;
185
186 #ifdef CPU_DEFAULT
187 static const arm_feature_set cpu_default = CPU_DEFAULT;
188 #endif
189
190 static const arm_feature_set arm_ext_v1 = ARM_FEATURE_CORE_LOW (ARM_EXT_V1);
191 static const arm_feature_set arm_ext_v2 = ARM_FEATURE_CORE_LOW (ARM_EXT_V2);
192 static const arm_feature_set arm_ext_v2s = ARM_FEATURE_CORE_LOW (ARM_EXT_V2S);
193 static const arm_feature_set arm_ext_v3 = ARM_FEATURE_CORE_LOW (ARM_EXT_V3);
194 static const arm_feature_set arm_ext_v3m = ARM_FEATURE_CORE_LOW (ARM_EXT_V3M);
195 static const arm_feature_set arm_ext_v4 = ARM_FEATURE_CORE_LOW (ARM_EXT_V4);
196 static const arm_feature_set arm_ext_v4t = ARM_FEATURE_CORE_LOW (ARM_EXT_V4T);
197 static const arm_feature_set arm_ext_v5 = ARM_FEATURE_CORE_LOW (ARM_EXT_V5);
198 static const arm_feature_set arm_ext_v4t_5 =
199   ARM_FEATURE_CORE_LOW (ARM_EXT_V4T | ARM_EXT_V5);
200 static const arm_feature_set arm_ext_v5t = ARM_FEATURE_CORE_LOW (ARM_EXT_V5T);
201 static const arm_feature_set arm_ext_v5e = ARM_FEATURE_CORE_LOW (ARM_EXT_V5E);
202 static const arm_feature_set arm_ext_v5exp = ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP);
203 static const arm_feature_set arm_ext_v5j = ARM_FEATURE_CORE_LOW (ARM_EXT_V5J);
204 static const arm_feature_set arm_ext_v6 = ARM_FEATURE_CORE_LOW (ARM_EXT_V6);
205 static const arm_feature_set arm_ext_v6k = ARM_FEATURE_CORE_LOW (ARM_EXT_V6K);
206 static const arm_feature_set arm_ext_v6t2 = ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2);
207 /* Only for compatability of hint instructions.  */
208 static const arm_feature_set arm_ext_v6k_v6t2 =
209   ARM_FEATURE_CORE_LOW (ARM_EXT_V6K | ARM_EXT_V6T2);
210 static const arm_feature_set arm_ext_v6_notm =
211   ARM_FEATURE_CORE_LOW (ARM_EXT_V6_NOTM);
212 static const arm_feature_set arm_ext_v6_dsp =
213   ARM_FEATURE_CORE_LOW (ARM_EXT_V6_DSP);
214 static const arm_feature_set arm_ext_barrier =
215   ARM_FEATURE_CORE_LOW (ARM_EXT_BARRIER);
216 static const arm_feature_set arm_ext_msr =
217   ARM_FEATURE_CORE_LOW (ARM_EXT_THUMB_MSR);
218 static const arm_feature_set arm_ext_div = ARM_FEATURE_CORE_LOW (ARM_EXT_DIV);
219 static const arm_feature_set arm_ext_v7 = ARM_FEATURE_CORE_LOW (ARM_EXT_V7);
220 static const arm_feature_set arm_ext_v7a = ARM_FEATURE_CORE_LOW (ARM_EXT_V7A);
221 static const arm_feature_set arm_ext_v7r = ARM_FEATURE_CORE_LOW (ARM_EXT_V7R);
222 #ifdef OBJ_ELF
223 static const arm_feature_set ATTRIBUTE_UNUSED arm_ext_v7m = ARM_FEATURE_CORE_LOW (ARM_EXT_V7M);
224 #endif
225 static const arm_feature_set arm_ext_v8 = ARM_FEATURE_CORE_LOW (ARM_EXT_V8);
226 static const arm_feature_set arm_ext_m =
227   ARM_FEATURE_CORE (ARM_EXT_V6M | ARM_EXT_V7M,
228                     ARM_EXT2_V8M | ARM_EXT2_V8M_MAIN);
229 static const arm_feature_set arm_ext_mp = ARM_FEATURE_CORE_LOW (ARM_EXT_MP);
230 static const arm_feature_set arm_ext_sec = ARM_FEATURE_CORE_LOW (ARM_EXT_SEC);
231 static const arm_feature_set arm_ext_os = ARM_FEATURE_CORE_LOW (ARM_EXT_OS);
232 static const arm_feature_set arm_ext_adiv = ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV);
233 static const arm_feature_set arm_ext_virt = ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT);
234 static const arm_feature_set arm_ext_pan = ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN);
235 static const arm_feature_set arm_ext_v8m = ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M);
236 static const arm_feature_set arm_ext_v8m_main =
237   ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN);
238 static const arm_feature_set arm_ext_v8_1m_main =
239 ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_1M_MAIN);
240 /* Instructions in ARMv8-M only found in M profile architectures.  */
241 static const arm_feature_set arm_ext_v8m_m_only =
242   ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M | ARM_EXT2_V8M_MAIN);
243 static const arm_feature_set arm_ext_v6t2_v8m =
244   ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M);
245 /* Instructions shared between ARMv8-A and ARMv8-M.  */
246 static const arm_feature_set arm_ext_atomics =
247   ARM_FEATURE_CORE_HIGH (ARM_EXT2_ATOMICS);
248 #ifdef OBJ_ELF
249 /* DSP instructions Tag_DSP_extension refers to.  */
250 static const arm_feature_set arm_ext_dsp =
251   ARM_FEATURE_CORE_LOW (ARM_EXT_V5E | ARM_EXT_V5ExP | ARM_EXT_V6_DSP);
252 #endif
253 static const arm_feature_set arm_ext_ras =
254   ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS);
255 /* FP16 instructions.  */
256 static const arm_feature_set arm_ext_fp16 =
257   ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST);
258 static const arm_feature_set arm_ext_fp16_fml =
259   ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_FML);
260 static const arm_feature_set arm_ext_v8_2 =
261   ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_2A);
262 static const arm_feature_set arm_ext_v8_3 =
263   ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A);
264 static const arm_feature_set arm_ext_sb =
265   ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB);
266 static const arm_feature_set arm_ext_predres =
267   ARM_FEATURE_CORE_HIGH (ARM_EXT2_PREDRES);
268
269 static const arm_feature_set arm_arch_any = ARM_ANY;
270 #ifdef OBJ_ELF
271 static const arm_feature_set fpu_any = FPU_ANY;
272 #endif
273 static const arm_feature_set arm_arch_full ATTRIBUTE_UNUSED = ARM_FEATURE (-1, -1, -1);
274 static const arm_feature_set arm_arch_t2 = ARM_ARCH_THUMB2;
275 static const arm_feature_set arm_arch_none = ARM_ARCH_NONE;
276
277 static const arm_feature_set arm_cext_iwmmxt2 =
278   ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT2);
279 static const arm_feature_set arm_cext_iwmmxt =
280   ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT);
281 static const arm_feature_set arm_cext_xscale =
282   ARM_FEATURE_COPROC (ARM_CEXT_XSCALE);
283 static const arm_feature_set arm_cext_maverick =
284   ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK);
285 static const arm_feature_set fpu_fpa_ext_v1 =
286   ARM_FEATURE_COPROC (FPU_FPA_EXT_V1);
287 static const arm_feature_set fpu_fpa_ext_v2 =
288   ARM_FEATURE_COPROC (FPU_FPA_EXT_V2);
289 static const arm_feature_set fpu_vfp_ext_v1xd =
290   ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD);
291 static const arm_feature_set fpu_vfp_ext_v1 =
292   ARM_FEATURE_COPROC (FPU_VFP_EXT_V1);
293 static const arm_feature_set fpu_vfp_ext_v2 =
294   ARM_FEATURE_COPROC (FPU_VFP_EXT_V2);
295 static const arm_feature_set fpu_vfp_ext_v3xd =
296   ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD);
297 static const arm_feature_set fpu_vfp_ext_v3 =
298   ARM_FEATURE_COPROC (FPU_VFP_EXT_V3);
299 static const arm_feature_set fpu_vfp_ext_d32 =
300   ARM_FEATURE_COPROC (FPU_VFP_EXT_D32);
301 static const arm_feature_set fpu_neon_ext_v1 =
302   ARM_FEATURE_COPROC (FPU_NEON_EXT_V1);
303 static const arm_feature_set fpu_vfp_v3_or_neon_ext =
304   ARM_FEATURE_COPROC (FPU_NEON_EXT_V1 | FPU_VFP_EXT_V3);
305 static const arm_feature_set mve_ext =
306   ARM_FEATURE_COPROC (FPU_MVE);
307 static const arm_feature_set mve_fp_ext =
308   ARM_FEATURE_COPROC (FPU_MVE_FP);
309 #ifdef OBJ_ELF
310 static const arm_feature_set fpu_vfp_fp16 =
311   ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16);
312 static const arm_feature_set fpu_neon_ext_fma =
313   ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA);
314 #endif
315 static const arm_feature_set fpu_vfp_ext_fma =
316   ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA);
317 static const arm_feature_set fpu_vfp_ext_armv8 =
318   ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8);
319 static const arm_feature_set fpu_vfp_ext_armv8xd =
320   ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8xD);
321 static const arm_feature_set fpu_neon_ext_armv8 =
322   ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8);
323 static const arm_feature_set fpu_crypto_ext_armv8 =
324   ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8);
325 static const arm_feature_set crc_ext_armv8 =
326   ARM_FEATURE_COPROC (CRC_EXT_ARMV8);
327 static const arm_feature_set fpu_neon_ext_v8_1 =
328   ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA);
329 static const arm_feature_set fpu_neon_ext_dotprod =
330   ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD);
331
332 static int mfloat_abi_opt = -1;
333 /* Architecture feature bits selected by the last -mcpu/-march or .cpu/.arch
334    directive.  */
335 static arm_feature_set selected_arch = ARM_ARCH_NONE;
336 /* Extension feature bits selected by the last -mcpu/-march or .arch_extension
337    directive.  */
338 static arm_feature_set selected_ext = ARM_ARCH_NONE;
339 /* Feature bits selected by the last -mcpu/-march or by the combination of the
340    last .cpu/.arch directive .arch_extension directives since that
341    directive.  */
342 static arm_feature_set selected_cpu = ARM_ARCH_NONE;
343 /* FPU feature bits selected by the last -mfpu or .fpu directive.  */
344 static arm_feature_set selected_fpu = FPU_NONE;
345 /* Feature bits selected by the last .object_arch directive.  */
346 static arm_feature_set selected_object_arch = ARM_ARCH_NONE;
347 /* Must be long enough to hold any of the names in arm_cpus.  */
348 static char selected_cpu_name[20];
349
350 extern FLONUM_TYPE generic_floating_point_number;
351
352 /* Return if no cpu was selected on command-line.  */
353 static bfd_boolean
354 no_cpu_selected (void)
355 {
356   return ARM_FEATURE_EQUAL (selected_cpu, arm_arch_none);
357 }
358
359 #ifdef OBJ_ELF
360 # ifdef EABI_DEFAULT
361 static int meabi_flags = EABI_DEFAULT;
362 # else
363 static int meabi_flags = EF_ARM_EABI_UNKNOWN;
364 # endif
365
366 static int attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
367
368 bfd_boolean
369 arm_is_eabi (void)
370 {
371   return (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4);
372 }
373 #endif
374
375 #ifdef OBJ_ELF
376 /* Pre-defined "_GLOBAL_OFFSET_TABLE_"  */
377 symbolS * GOT_symbol;
378 #endif
379
380 /* 0: assemble for ARM,
381    1: assemble for Thumb,
382    2: assemble for Thumb even though target CPU does not support thumb
383       instructions.  */
384 static int thumb_mode = 0;
385 /* A value distinct from the possible values for thumb_mode that we
386    can use to record whether thumb_mode has been copied into the
387    tc_frag_data field of a frag.  */
388 #define MODE_RECORDED (1 << 4)
389
390 /* Specifies the intrinsic IT insn behavior mode.  */
391 enum implicit_it_mode
392 {
393   IMPLICIT_IT_MODE_NEVER  = 0x00,
394   IMPLICIT_IT_MODE_ARM    = 0x01,
395   IMPLICIT_IT_MODE_THUMB  = 0x02,
396   IMPLICIT_IT_MODE_ALWAYS = (IMPLICIT_IT_MODE_ARM | IMPLICIT_IT_MODE_THUMB)
397 };
398 static int implicit_it_mode = IMPLICIT_IT_MODE_ARM;
399
400 /* If unified_syntax is true, we are processing the new unified
401    ARM/Thumb syntax.  Important differences from the old ARM mode:
402
403      - Immediate operands do not require a # prefix.
404      - Conditional affixes always appear at the end of the
405        instruction.  (For backward compatibility, those instructions
406        that formerly had them in the middle, continue to accept them
407        there.)
408      - The IT instruction may appear, and if it does is validated
409        against subsequent conditional affixes.  It does not generate
410        machine code.
411
412    Important differences from the old Thumb mode:
413
414      - Immediate operands do not require a # prefix.
415      - Most of the V6T2 instructions are only available in unified mode.
416      - The .N and .W suffixes are recognized and honored (it is an error
417        if they cannot be honored).
418      - All instructions set the flags if and only if they have an 's' affix.
419      - Conditional affixes may be used.  They are validated against
420        preceding IT instructions.  Unlike ARM mode, you cannot use a
421        conditional affix except in the scope of an IT instruction.  */
422
423 static bfd_boolean unified_syntax = FALSE;
424
425 /* An immediate operand can start with #, and ld*, st*, pld operands
426    can contain [ and ].  We need to tell APP not to elide whitespace
427    before a [, which can appear as the first operand for pld.
428    Likewise, a { can appear as the first operand for push, pop, vld*, etc.  */
429 const char arm_symbol_chars[] = "#[]{}";
430
431 enum neon_el_type
432 {
433   NT_invtype,
434   NT_untyped,
435   NT_integer,
436   NT_float,
437   NT_poly,
438   NT_signed,
439   NT_unsigned
440 };
441
442 struct neon_type_el
443 {
444   enum neon_el_type type;
445   unsigned size;
446 };
447
448 #define NEON_MAX_TYPE_ELS 4
449
450 struct neon_type
451 {
452   struct neon_type_el el[NEON_MAX_TYPE_ELS];
453   unsigned elems;
454 };
455
456 enum pred_instruction_type
457 {
458    OUTSIDE_PRED_INSN,
459    INSIDE_VPT_INSN,
460    INSIDE_IT_INSN,
461    INSIDE_IT_LAST_INSN,
462    IF_INSIDE_IT_LAST_INSN, /* Either outside or inside;
463                               if inside, should be the last one.  */
464    NEUTRAL_IT_INSN,        /* This could be either inside or outside,
465                               i.e. BKPT and NOP.  */
466    IT_INSN,                /* The IT insn has been parsed.  */
467    VPT_INSN,               /* The VPT/VPST insn has been parsed.  */
468    MVE_OUTSIDE_PRED_INSN , /* Instruction to indicate a MVE instruction without
469                               a predication code.  */
470    MVE_UNPREDICABLE_INSN   /* MVE instruction that is non-predicable.  */
471 };
472
473 /* The maximum number of operands we need.  */
474 #define ARM_IT_MAX_OPERANDS 6
475 #define ARM_IT_MAX_RELOCS 3
476
477 struct arm_it
478 {
479   const char *  error;
480   unsigned long instruction;
481   int           size;
482   int           size_req;
483   int           cond;
484   /* "uncond_value" is set to the value in place of the conditional field in
485      unconditional versions of the instruction, or -1 if nothing is
486      appropriate.  */
487   int           uncond_value;
488   struct neon_type vectype;
489   /* This does not indicate an actual NEON instruction, only that
490      the mnemonic accepts neon-style type suffixes.  */
491   int           is_neon;
492   /* Set to the opcode if the instruction needs relaxation.
493      Zero if the instruction is not relaxed.  */
494   unsigned long relax;
495   struct
496   {
497     bfd_reloc_code_real_type type;
498     expressionS              exp;
499     int                      pc_rel;
500   } relocs[ARM_IT_MAX_RELOCS];
501
502   enum pred_instruction_type pred_insn_type;
503
504   struct
505   {
506     unsigned reg;
507     signed int imm;
508     struct neon_type_el vectype;
509     unsigned present    : 1;  /* Operand present.  */
510     unsigned isreg      : 1;  /* Operand was a register.  */
511     unsigned immisreg   : 2;  /* .imm field is a second register.
512                                  0: imm, 1: gpr, 2: MVE Q-register.  */
513     unsigned isscalar   : 2;  /* Operand is a (SIMD) scalar:
514                                  0) not scalar,
515                                  1) Neon scalar,
516                                  2) MVE scalar.  */
517     unsigned immisalign : 1;  /* Immediate is an alignment specifier.  */
518     unsigned immisfloat : 1;  /* Immediate was parsed as a float.  */
519     /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
520        instructions. This allows us to disambiguate ARM <-> vector insns.  */
521     unsigned regisimm   : 1;  /* 64-bit immediate, reg forms high 32 bits.  */
522     unsigned isvec      : 1;  /* Is a single, double or quad VFP/Neon reg.  */
523     unsigned isquad     : 1;  /* Operand is SIMD quad register.  */
524     unsigned issingle   : 1;  /* Operand is VFP single-precision register.  */
525     unsigned iszr       : 1;  /* Operand is ZR register.  */
526     unsigned hasreloc   : 1;  /* Operand has relocation suffix.  */
527     unsigned writeback  : 1;  /* Operand has trailing !  */
528     unsigned preind     : 1;  /* Preindexed address.  */
529     unsigned postind    : 1;  /* Postindexed address.  */
530     unsigned negative   : 1;  /* Index register was negated.  */
531     unsigned shifted    : 1;  /* Shift applied to operation.  */
532     unsigned shift_kind : 3;  /* Shift operation (enum shift_kind).  */
533   } operands[ARM_IT_MAX_OPERANDS];
534 };
535
536 static struct arm_it inst;
537
538 #define NUM_FLOAT_VALS 8
539
540 const char * fp_const[] =
541 {
542   "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
543 };
544
545 LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
546
547 #define FAIL    (-1)
548 #define SUCCESS (0)
549
550 #define SUFF_S 1
551 #define SUFF_D 2
552 #define SUFF_E 3
553 #define SUFF_P 4
554
555 #define CP_T_X   0x00008000
556 #define CP_T_Y   0x00400000
557
558 #define CONDS_BIT        0x00100000
559 #define LOAD_BIT         0x00100000
560
561 #define DOUBLE_LOAD_FLAG 0x00000001
562
563 struct asm_cond
564 {
565   const char *   template_name;
566   unsigned long  value;
567 };
568
569 #define COND_ALWAYS 0xE
570
571 struct asm_psr
572 {
573   const char *   template_name;
574   unsigned long  field;
575 };
576
577 struct asm_barrier_opt
578 {
579   const char *    template_name;
580   unsigned long   value;
581   const arm_feature_set arch;
582 };
583
584 /* The bit that distinguishes CPSR and SPSR.  */
585 #define SPSR_BIT   (1 << 22)
586
587 /* The individual PSR flag bits.  */
588 #define PSR_c   (1 << 16)
589 #define PSR_x   (1 << 17)
590 #define PSR_s   (1 << 18)
591 #define PSR_f   (1 << 19)
592
593 struct reloc_entry
594 {
595   const char *              name;
596   bfd_reloc_code_real_type  reloc;
597 };
598
599 enum vfp_reg_pos
600 {
601   VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
602   VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
603 };
604
605 enum vfp_ldstm_type
606 {
607   VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
608 };
609
610 /* Bits for DEFINED field in neon_typed_alias.  */
611 #define NTA_HASTYPE  1
612 #define NTA_HASINDEX 2
613
614 struct neon_typed_alias
615 {
616   unsigned char        defined;
617   unsigned char        index;
618   struct neon_type_el  eltype;
619 };
620
621 /* ARM register categories.  This includes coprocessor numbers and various
622    architecture extensions' registers.  Each entry should have an error message
623    in reg_expected_msgs below.  */
624 enum arm_reg_type
625 {
626   REG_TYPE_RN,
627   REG_TYPE_CP,
628   REG_TYPE_CN,
629   REG_TYPE_FN,
630   REG_TYPE_VFS,
631   REG_TYPE_VFD,
632   REG_TYPE_NQ,
633   REG_TYPE_VFSD,
634   REG_TYPE_NDQ,
635   REG_TYPE_NSD,
636   REG_TYPE_NSDQ,
637   REG_TYPE_VFC,
638   REG_TYPE_MVF,
639   REG_TYPE_MVD,
640   REG_TYPE_MVFX,
641   REG_TYPE_MVDX,
642   REG_TYPE_MVAX,
643   REG_TYPE_MQ,
644   REG_TYPE_DSPSC,
645   REG_TYPE_MMXWR,
646   REG_TYPE_MMXWC,
647   REG_TYPE_MMXWCG,
648   REG_TYPE_XSCALE,
649   REG_TYPE_RNB,
650   REG_TYPE_ZR
651 };
652
653 /* Structure for a hash table entry for a register.
654    If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
655    information which states whether a vector type or index is specified (for a
656    register alias created with .dn or .qn). Otherwise NEON should be NULL.  */
657 struct reg_entry
658 {
659   const char *               name;
660   unsigned int               number;
661   unsigned char              type;
662   unsigned char              builtin;
663   struct neon_typed_alias *  neon;
664 };
665
666 /* Diagnostics used when we don't get a register of the expected type.  */
667 const char * const reg_expected_msgs[] =
668 {
669   [REG_TYPE_RN]     = N_("ARM register expected"),
670   [REG_TYPE_CP]     = N_("bad or missing co-processor number"),
671   [REG_TYPE_CN]     = N_("co-processor register expected"),
672   [REG_TYPE_FN]     = N_("FPA register expected"),
673   [REG_TYPE_VFS]    = N_("VFP single precision register expected"),
674   [REG_TYPE_VFD]    = N_("VFP/Neon double precision register expected"),
675   [REG_TYPE_NQ]     = N_("Neon quad precision register expected"),
676   [REG_TYPE_VFSD]   = N_("VFP single or double precision register expected"),
677   [REG_TYPE_NDQ]    = N_("Neon double or quad precision register expected"),
678   [REG_TYPE_NSD]    = N_("Neon single or double precision register expected"),
679   [REG_TYPE_NSDQ]   = N_("VFP single, double or Neon quad precision register"
680                          " expected"),
681   [REG_TYPE_VFC]    = N_("VFP system register expected"),
682   [REG_TYPE_MVF]    = N_("Maverick MVF register expected"),
683   [REG_TYPE_MVD]    = N_("Maverick MVD register expected"),
684   [REG_TYPE_MVFX]   = N_("Maverick MVFX register expected"),
685   [REG_TYPE_MVDX]   = N_("Maverick MVDX register expected"),
686   [REG_TYPE_MVAX]   = N_("Maverick MVAX register expected"),
687   [REG_TYPE_DSPSC]  = N_("Maverick DSPSC register expected"),
688   [REG_TYPE_MMXWR]  = N_("iWMMXt data register expected"),
689   [REG_TYPE_MMXWC]  = N_("iWMMXt control register expected"),
690   [REG_TYPE_MMXWCG] = N_("iWMMXt scalar register expected"),
691   [REG_TYPE_XSCALE] = N_("XScale accumulator register expected"),
692   [REG_TYPE_MQ]     = N_("MVE vector register expected"),
693   [REG_TYPE_RNB]    = N_("")
694 };
695
696 /* Some well known registers that we refer to directly elsewhere.  */
697 #define REG_R12 12
698 #define REG_SP  13
699 #define REG_LR  14
700 #define REG_PC  15
701
702 /* ARM instructions take 4bytes in the object file, Thumb instructions
703    take 2:  */
704 #define INSN_SIZE       4
705
706 struct asm_opcode
707 {
708   /* Basic string to match.  */
709   const char * template_name;
710
711   /* Parameters to instruction.  */
712   unsigned int operands[8];
713
714   /* Conditional tag - see opcode_lookup.  */
715   unsigned int tag : 4;
716
717   /* Basic instruction code.  */
718   unsigned int avalue;
719
720   /* Thumb-format instruction code.  */
721   unsigned int tvalue;
722
723   /* Which architecture variant provides this instruction.  */
724   const arm_feature_set * avariant;
725   const arm_feature_set * tvariant;
726
727   /* Function to call to encode instruction in ARM format.  */
728   void (* aencode) (void);
729
730   /* Function to call to encode instruction in Thumb format.  */
731   void (* tencode) (void);
732
733   /* Indicates whether this instruction may be vector predicated.  */
734   unsigned int mayBeVecPred : 1;
735 };
736
737 /* Defines for various bits that we will want to toggle.  */
738 #define INST_IMMEDIATE  0x02000000
739 #define OFFSET_REG      0x02000000
740 #define HWOFFSET_IMM    0x00400000
741 #define SHIFT_BY_REG    0x00000010
742 #define PRE_INDEX       0x01000000
743 #define INDEX_UP        0x00800000
744 #define WRITE_BACK      0x00200000
745 #define LDM_TYPE_2_OR_3 0x00400000
746 #define CPSI_MMOD       0x00020000
747
748 #define LITERAL_MASK    0xf000f000
749 #define OPCODE_MASK     0xfe1fffff
750 #define V4_STR_BIT      0x00000020
751 #define VLDR_VMOV_SAME  0x0040f000
752
753 #define T2_SUBS_PC_LR   0xf3de8f00
754
755 #define DATA_OP_SHIFT   21
756 #define SBIT_SHIFT      20
757
758 #define T2_OPCODE_MASK  0xfe1fffff
759 #define T2_DATA_OP_SHIFT 21
760 #define T2_SBIT_SHIFT    20
761
762 #define A_COND_MASK         0xf0000000
763 #define A_PUSH_POP_OP_MASK  0x0fff0000
764
765 /* Opcodes for pushing/poping registers to/from the stack.  */
766 #define A1_OPCODE_PUSH    0x092d0000
767 #define A2_OPCODE_PUSH    0x052d0004
768 #define A2_OPCODE_POP     0x049d0004
769
770 /* Codes to distinguish the arithmetic instructions.  */
771 #define OPCODE_AND      0
772 #define OPCODE_EOR      1
773 #define OPCODE_SUB      2
774 #define OPCODE_RSB      3
775 #define OPCODE_ADD      4
776 #define OPCODE_ADC      5
777 #define OPCODE_SBC      6
778 #define OPCODE_RSC      7
779 #define OPCODE_TST      8
780 #define OPCODE_TEQ      9
781 #define OPCODE_CMP      10
782 #define OPCODE_CMN      11
783 #define OPCODE_ORR      12
784 #define OPCODE_MOV      13
785 #define OPCODE_BIC      14
786 #define OPCODE_MVN      15
787
788 #define T2_OPCODE_AND   0
789 #define T2_OPCODE_BIC   1
790 #define T2_OPCODE_ORR   2
791 #define T2_OPCODE_ORN   3
792 #define T2_OPCODE_EOR   4
793 #define T2_OPCODE_ADD   8
794 #define T2_OPCODE_ADC   10
795 #define T2_OPCODE_SBC   11
796 #define T2_OPCODE_SUB   13
797 #define T2_OPCODE_RSB   14
798
799 #define T_OPCODE_MUL 0x4340
800 #define T_OPCODE_TST 0x4200
801 #define T_OPCODE_CMN 0x42c0
802 #define T_OPCODE_NEG 0x4240
803 #define T_OPCODE_MVN 0x43c0
804
805 #define T_OPCODE_ADD_R3 0x1800
806 #define T_OPCODE_SUB_R3 0x1a00
807 #define T_OPCODE_ADD_HI 0x4400
808 #define T_OPCODE_ADD_ST 0xb000
809 #define T_OPCODE_SUB_ST 0xb080
810 #define T_OPCODE_ADD_SP 0xa800
811 #define T_OPCODE_ADD_PC 0xa000
812 #define T_OPCODE_ADD_I8 0x3000
813 #define T_OPCODE_SUB_I8 0x3800
814 #define T_OPCODE_ADD_I3 0x1c00
815 #define T_OPCODE_SUB_I3 0x1e00
816
817 #define T_OPCODE_ASR_R  0x4100
818 #define T_OPCODE_LSL_R  0x4080
819 #define T_OPCODE_LSR_R  0x40c0
820 #define T_OPCODE_ROR_R  0x41c0
821 #define T_OPCODE_ASR_I  0x1000
822 #define T_OPCODE_LSL_I  0x0000
823 #define T_OPCODE_LSR_I  0x0800
824
825 #define T_OPCODE_MOV_I8 0x2000
826 #define T_OPCODE_CMP_I8 0x2800
827 #define T_OPCODE_CMP_LR 0x4280
828 #define T_OPCODE_MOV_HR 0x4600
829 #define T_OPCODE_CMP_HR 0x4500
830
831 #define T_OPCODE_LDR_PC 0x4800
832 #define T_OPCODE_LDR_SP 0x9800
833 #define T_OPCODE_STR_SP 0x9000
834 #define T_OPCODE_LDR_IW 0x6800
835 #define T_OPCODE_STR_IW 0x6000
836 #define T_OPCODE_LDR_IH 0x8800
837 #define T_OPCODE_STR_IH 0x8000
838 #define T_OPCODE_LDR_IB 0x7800
839 #define T_OPCODE_STR_IB 0x7000
840 #define T_OPCODE_LDR_RW 0x5800
841 #define T_OPCODE_STR_RW 0x5000
842 #define T_OPCODE_LDR_RH 0x5a00
843 #define T_OPCODE_STR_RH 0x5200
844 #define T_OPCODE_LDR_RB 0x5c00
845 #define T_OPCODE_STR_RB 0x5400
846
847 #define T_OPCODE_PUSH   0xb400
848 #define T_OPCODE_POP    0xbc00
849
850 #define T_OPCODE_BRANCH 0xe000
851
852 #define THUMB_SIZE      2       /* Size of thumb instruction.  */
853 #define THUMB_PP_PC_LR 0x0100
854 #define THUMB_LOAD_BIT 0x0800
855 #define THUMB2_LOAD_BIT 0x00100000
856
857 #define BAD_SYNTAX      _("syntax error")
858 #define BAD_ARGS        _("bad arguments to instruction")
859 #define BAD_SP          _("r13 not allowed here")
860 #define BAD_PC          _("r15 not allowed here")
861 #define BAD_ODD         _("Odd register not allowed here")
862 #define BAD_EVEN        _("Even register not allowed here")
863 #define BAD_COND        _("instruction cannot be conditional")
864 #define BAD_OVERLAP     _("registers may not be the same")
865 #define BAD_HIREG       _("lo register required")
866 #define BAD_THUMB32     _("instruction not supported in Thumb16 mode")
867 #define BAD_ADDR_MODE   _("instruction does not accept this addressing mode")
868 #define BAD_BRANCH      _("branch must be last instruction in IT block")
869 #define BAD_BRANCH_OFF  _("branch out of range or not a multiple of 2")
870 #define BAD_NOT_IT      _("instruction not allowed in IT block")
871 #define BAD_NOT_VPT     _("instruction missing MVE vector predication code")
872 #define BAD_FPU         _("selected FPU does not support instruction")
873 #define BAD_OUT_IT      _("thumb conditional instruction should be in IT block")
874 #define BAD_OUT_VPT     \
875         _("vector predicated instruction should be in VPT/VPST block")
876 #define BAD_IT_COND     _("incorrect condition in IT block")
877 #define BAD_VPT_COND    _("incorrect condition in VPT/VPST block")
878 #define BAD_IT_IT       _("IT falling in the range of a previous IT block")
879 #define MISSING_FNSTART _("missing .fnstart before unwinding directive")
880 #define BAD_PC_ADDRESSING \
881         _("cannot use register index with PC-relative addressing")
882 #define BAD_PC_WRITEBACK \
883         _("cannot use writeback with PC-relative addressing")
884 #define BAD_RANGE       _("branch out of range")
885 #define BAD_FP16        _("selected processor does not support fp16 instruction")
886 #define UNPRED_REG(R)   _("using " R " results in unpredictable behaviour")
887 #define THUMB1_RELOC_ONLY  _("relocation valid in thumb1 code only")
888 #define MVE_NOT_IT      _("Warning: instruction is UNPREDICTABLE in an IT " \
889                           "block")
890 #define MVE_NOT_VPT     _("Warning: instruction is UNPREDICTABLE in a VPT " \
891                           "block")
892 #define MVE_BAD_PC      _("Warning: instruction is UNPREDICTABLE with PC" \
893                           " operand")
894 #define MVE_BAD_SP      _("Warning: instruction is UNPREDICTABLE with SP" \
895                           " operand")
896 #define BAD_SIMD_TYPE   _("bad type in SIMD instruction")
897 #define BAD_MVE_AUTO    \
898   _("GAS auto-detection mode and -march=all is deprecated for MVE, please" \
899     " use a valid -march or -mcpu option.")
900 #define BAD_MVE_SRCDEST _("Warning: 32-bit element size and same destination "\
901                           "and source operands makes instruction UNPREDICTABLE")
902 #define BAD_EL_TYPE     _("bad element type for instruction")
903 #define MVE_BAD_QREG    _("MVE vector register Q[0..7] expected")
904
905 static struct hash_control * arm_ops_hsh;
906 static struct hash_control * arm_cond_hsh;
907 static struct hash_control * arm_vcond_hsh;
908 static struct hash_control * arm_shift_hsh;
909 static struct hash_control * arm_psr_hsh;
910 static struct hash_control * arm_v7m_psr_hsh;
911 static struct hash_control * arm_reg_hsh;
912 static struct hash_control * arm_reloc_hsh;
913 static struct hash_control * arm_barrier_opt_hsh;
914
915 /* Stuff needed to resolve the label ambiguity
916    As:
917      ...
918      label:   <insn>
919    may differ from:
920      ...
921      label:
922               <insn>  */
923
924 symbolS *  last_label_seen;
925 static int label_is_thumb_function_name = FALSE;
926
927 /* Literal pool structure.  Held on a per-section
928    and per-sub-section basis.  */
929
930 #define MAX_LITERAL_POOL_SIZE 1024
931 typedef struct literal_pool
932 {
933   expressionS            literals [MAX_LITERAL_POOL_SIZE];
934   unsigned int           next_free_entry;
935   unsigned int           id;
936   symbolS *              symbol;
937   segT                   section;
938   subsegT                sub_section;
939 #ifdef OBJ_ELF
940   struct dwarf2_line_info locs [MAX_LITERAL_POOL_SIZE];
941 #endif
942   struct literal_pool *  next;
943   unsigned int           alignment;
944 } literal_pool;
945
946 /* Pointer to a linked list of literal pools.  */
947 literal_pool * list_of_pools = NULL;
948
949 typedef enum asmfunc_states
950 {
951   OUTSIDE_ASMFUNC,
952   WAITING_ASMFUNC_NAME,
953   WAITING_ENDASMFUNC
954 } asmfunc_states;
955
956 static asmfunc_states asmfunc_state = OUTSIDE_ASMFUNC;
957
958 #ifdef OBJ_ELF
959 #  define now_pred seg_info (now_seg)->tc_segment_info_data.current_pred
960 #else
961 static struct current_pred now_pred;
962 #endif
963
964 static inline int
965 now_pred_compatible (int cond)
966 {
967   return (cond & ~1) == (now_pred.cc & ~1);
968 }
969
970 static inline int
971 conditional_insn (void)
972 {
973   return inst.cond != COND_ALWAYS;
974 }
975
976 static int in_pred_block (void);
977
978 static int handle_pred_state (void);
979
980 static void force_automatic_it_block_close (void);
981
982 static void it_fsm_post_encode (void);
983
984 #define set_pred_insn_type(type)                        \
985   do                                            \
986     {                                           \
987       inst.pred_insn_type = type;                       \
988       if (handle_pred_state () == FAIL)         \
989         return;                                 \
990     }                                           \
991   while (0)
992
993 #define set_pred_insn_type_nonvoid(type, failret) \
994   do                                            \
995     {                                           \
996       inst.pred_insn_type = type;                       \
997       if (handle_pred_state () == FAIL)         \
998         return failret;                         \
999     }                                           \
1000   while(0)
1001
1002 #define set_pred_insn_type_last()                               \
1003   do                                                    \
1004     {                                                   \
1005       if (inst.cond == COND_ALWAYS)                     \
1006         set_pred_insn_type (IF_INSIDE_IT_LAST_INSN);    \
1007       else                                              \
1008         set_pred_insn_type (INSIDE_IT_LAST_INSN);               \
1009     }                                                   \
1010   while (0)
1011
1012 /* Pure syntax.  */
1013
1014 /* This array holds the chars that always start a comment.  If the
1015    pre-processor is disabled, these aren't very useful.  */
1016 char arm_comment_chars[] = "@";
1017
1018 /* This array holds the chars that only start a comment at the beginning of
1019    a line.  If the line seems to have the form '# 123 filename'
1020    .line and .file directives will appear in the pre-processed output.  */
1021 /* Note that input_file.c hand checks for '#' at the beginning of the
1022    first line of the input file.  This is because the compiler outputs
1023    #NO_APP at the beginning of its output.  */
1024 /* Also note that comments like this one will always work.  */
1025 const char line_comment_chars[] = "#";
1026
1027 char arm_line_separator_chars[] = ";";
1028
1029 /* Chars that can be used to separate mant
1030    from exp in floating point numbers.  */
1031 const char EXP_CHARS[] = "eE";
1032
1033 /* Chars that mean this number is a floating point constant.  */
1034 /* As in 0f12.456  */
1035 /* or    0d1.2345e12  */
1036
1037 const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
1038
1039 /* Prefix characters that indicate the start of an immediate
1040    value.  */
1041 #define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
1042
1043 /* Separator character handling.  */
1044
1045 #define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
1046
1047 static inline int
1048 skip_past_char (char ** str, char c)
1049 {
1050   /* PR gas/14987: Allow for whitespace before the expected character.  */
1051   skip_whitespace (*str);
1052
1053   if (**str == c)
1054     {
1055       (*str)++;
1056       return SUCCESS;
1057     }
1058   else
1059     return FAIL;
1060 }
1061
1062 #define skip_past_comma(str) skip_past_char (str, ',')
1063
1064 /* Arithmetic expressions (possibly involving symbols).  */
1065
1066 /* Return TRUE if anything in the expression is a bignum.  */
1067
1068 static bfd_boolean
1069 walk_no_bignums (symbolS * sp)
1070 {
1071   if (symbol_get_value_expression (sp)->X_op == O_big)
1072     return TRUE;
1073
1074   if (symbol_get_value_expression (sp)->X_add_symbol)
1075     {
1076       return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
1077               || (symbol_get_value_expression (sp)->X_op_symbol
1078                   && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
1079     }
1080
1081   return FALSE;
1082 }
1083
1084 static bfd_boolean in_my_get_expression = FALSE;
1085
1086 /* Third argument to my_get_expression.  */
1087 #define GE_NO_PREFIX 0
1088 #define GE_IMM_PREFIX 1
1089 #define GE_OPT_PREFIX 2
1090 /* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
1091    immediates, as can be used in Neon VMVN and VMOV immediate instructions.  */
1092 #define GE_OPT_PREFIX_BIG 3
1093
1094 static int
1095 my_get_expression (expressionS * ep, char ** str, int prefix_mode)
1096 {
1097   char * save_in;
1098
1099   /* In unified syntax, all prefixes are optional.  */
1100   if (unified_syntax)
1101     prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
1102                   : GE_OPT_PREFIX;
1103
1104   switch (prefix_mode)
1105     {
1106     case GE_NO_PREFIX: break;
1107     case GE_IMM_PREFIX:
1108       if (!is_immediate_prefix (**str))
1109         {
1110           inst.error = _("immediate expression requires a # prefix");
1111           return FAIL;
1112         }
1113       (*str)++;
1114       break;
1115     case GE_OPT_PREFIX:
1116     case GE_OPT_PREFIX_BIG:
1117       if (is_immediate_prefix (**str))
1118         (*str)++;
1119       break;
1120     default:
1121       abort ();
1122     }
1123
1124   memset (ep, 0, sizeof (expressionS));
1125
1126   save_in = input_line_pointer;
1127   input_line_pointer = *str;
1128   in_my_get_expression = TRUE;
1129   expression (ep);
1130   in_my_get_expression = FALSE;
1131
1132   if (ep->X_op == O_illegal || ep->X_op == O_absent)
1133     {
1134       /* We found a bad or missing expression in md_operand().  */
1135       *str = input_line_pointer;
1136       input_line_pointer = save_in;
1137       if (inst.error == NULL)
1138         inst.error = (ep->X_op == O_absent
1139                       ? _("missing expression") :_("bad expression"));
1140       return 1;
1141     }
1142
1143   /* Get rid of any bignums now, so that we don't generate an error for which
1144      we can't establish a line number later on.  Big numbers are never valid
1145      in instructions, which is where this routine is always called.  */
1146   if (prefix_mode != GE_OPT_PREFIX_BIG
1147       && (ep->X_op == O_big
1148           || (ep->X_add_symbol
1149               && (walk_no_bignums (ep->X_add_symbol)
1150                   || (ep->X_op_symbol
1151                       && walk_no_bignums (ep->X_op_symbol))))))
1152     {
1153       inst.error = _("invalid constant");
1154       *str = input_line_pointer;
1155       input_line_pointer = save_in;
1156       return 1;
1157     }
1158
1159   *str = input_line_pointer;
1160   input_line_pointer = save_in;
1161   return SUCCESS;
1162 }
1163
1164 /* Turn a string in input_line_pointer into a floating point constant
1165    of type TYPE, and store the appropriate bytes in *LITP.  The number
1166    of LITTLENUMS emitted is stored in *SIZEP.  An error message is
1167    returned, or NULL on OK.
1168
1169    Note that fp constants aren't represent in the normal way on the ARM.
1170    In big endian mode, things are as expected.  However, in little endian
1171    mode fp constants are big-endian word-wise, and little-endian byte-wise
1172    within the words.  For example, (double) 1.1 in big endian mode is
1173    the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
1174    the byte sequence 99 99 f1 3f 9a 99 99 99.
1175
1176    ??? The format of 12 byte floats is uncertain according to gcc's arm.h.  */
1177
1178 const char *
1179 md_atof (int type, char * litP, int * sizeP)
1180 {
1181   int prec;
1182   LITTLENUM_TYPE words[MAX_LITTLENUMS];
1183   char *t;
1184   int i;
1185
1186   switch (type)
1187     {
1188     case 'f':
1189     case 'F':
1190     case 's':
1191     case 'S':
1192       prec = 2;
1193       break;
1194
1195     case 'd':
1196     case 'D':
1197     case 'r':
1198     case 'R':
1199       prec = 4;
1200       break;
1201
1202     case 'x':
1203     case 'X':
1204       prec = 5;
1205       break;
1206
1207     case 'p':
1208     case 'P':
1209       prec = 5;
1210       break;
1211
1212     default:
1213       *sizeP = 0;
1214       return _("Unrecognized or unsupported floating point constant");
1215     }
1216
1217   t = atof_ieee (input_line_pointer, type, words);
1218   if (t)
1219     input_line_pointer = t;
1220   *sizeP = prec * sizeof (LITTLENUM_TYPE);
1221
1222   if (target_big_endian)
1223     {
1224       for (i = 0; i < prec; i++)
1225         {
1226           md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1227           litP += sizeof (LITTLENUM_TYPE);
1228         }
1229     }
1230   else
1231     {
1232       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
1233         for (i = prec - 1; i >= 0; i--)
1234           {
1235             md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1236             litP += sizeof (LITTLENUM_TYPE);
1237           }
1238       else
1239         /* For a 4 byte float the order of elements in `words' is 1 0.
1240            For an 8 byte float the order is 1 0 3 2.  */
1241         for (i = 0; i < prec; i += 2)
1242           {
1243             md_number_to_chars (litP, (valueT) words[i + 1],
1244                                 sizeof (LITTLENUM_TYPE));
1245             md_number_to_chars (litP + sizeof (LITTLENUM_TYPE),
1246                                 (valueT) words[i], sizeof (LITTLENUM_TYPE));
1247             litP += 2 * sizeof (LITTLENUM_TYPE);
1248           }
1249     }
1250
1251   return NULL;
1252 }
1253
1254 /* We handle all bad expressions here, so that we can report the faulty
1255    instruction in the error message.  */
1256
1257 void
1258 md_operand (expressionS * exp)
1259 {
1260   if (in_my_get_expression)
1261     exp->X_op = O_illegal;
1262 }
1263
1264 /* Immediate values.  */
1265
1266 #ifdef OBJ_ELF
1267 /* Generic immediate-value read function for use in directives.
1268    Accepts anything that 'expression' can fold to a constant.
1269    *val receives the number.  */
1270
1271 static int
1272 immediate_for_directive (int *val)
1273 {
1274   expressionS exp;
1275   exp.X_op = O_illegal;
1276
1277   if (is_immediate_prefix (*input_line_pointer))
1278     {
1279       input_line_pointer++;
1280       expression (&exp);
1281     }
1282
1283   if (exp.X_op != O_constant)
1284     {
1285       as_bad (_("expected #constant"));
1286       ignore_rest_of_line ();
1287       return FAIL;
1288     }
1289   *val = exp.X_add_number;
1290   return SUCCESS;
1291 }
1292 #endif
1293
1294 /* Register parsing.  */
1295
1296 /* Generic register parser.  CCP points to what should be the
1297    beginning of a register name.  If it is indeed a valid register
1298    name, advance CCP over it and return the reg_entry structure;
1299    otherwise return NULL.  Does not issue diagnostics.  */
1300
1301 static struct reg_entry *
1302 arm_reg_parse_multi (char **ccp)
1303 {
1304   char *start = *ccp;
1305   char *p;
1306   struct reg_entry *reg;
1307
1308   skip_whitespace (start);
1309
1310 #ifdef REGISTER_PREFIX
1311   if (*start != REGISTER_PREFIX)
1312     return NULL;
1313   start++;
1314 #endif
1315 #ifdef OPTIONAL_REGISTER_PREFIX
1316   if (*start == OPTIONAL_REGISTER_PREFIX)
1317     start++;
1318 #endif
1319
1320   p = start;
1321   if (!ISALPHA (*p) || !is_name_beginner (*p))
1322     return NULL;
1323
1324   do
1325     p++;
1326   while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1327
1328   reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1329
1330   if (!reg)
1331     return NULL;
1332
1333   *ccp = p;
1334   return reg;
1335 }
1336
1337 static int
1338 arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
1339                     enum arm_reg_type type)
1340 {
1341   /* Alternative syntaxes are accepted for a few register classes.  */
1342   switch (type)
1343     {
1344     case REG_TYPE_MVF:
1345     case REG_TYPE_MVD:
1346     case REG_TYPE_MVFX:
1347     case REG_TYPE_MVDX:
1348       /* Generic coprocessor register names are allowed for these.  */
1349       if (reg && reg->type == REG_TYPE_CN)
1350         return reg->number;
1351       break;
1352
1353     case REG_TYPE_CP:
1354       /* For backward compatibility, a bare number is valid here.  */
1355       {
1356         unsigned long processor = strtoul (start, ccp, 10);
1357         if (*ccp != start && processor <= 15)
1358           return processor;
1359       }
1360       /* Fall through.  */
1361
1362     case REG_TYPE_MMXWC:
1363       /* WC includes WCG.  ??? I'm not sure this is true for all
1364          instructions that take WC registers.  */
1365       if (reg && reg->type == REG_TYPE_MMXWCG)
1366         return reg->number;
1367       break;
1368
1369     default:
1370       break;
1371     }
1372
1373   return FAIL;
1374 }
1375
1376 /* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1377    return value is the register number or FAIL.  */
1378
1379 static int
1380 arm_reg_parse (char **ccp, enum arm_reg_type type)
1381 {
1382   char *start = *ccp;
1383   struct reg_entry *reg = arm_reg_parse_multi (ccp);
1384   int ret;
1385
1386   /* Do not allow a scalar (reg+index) to parse as a register.  */
1387   if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1388     return FAIL;
1389
1390   if (reg && reg->type == type)
1391     return reg->number;
1392
1393   if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1394     return ret;
1395
1396   *ccp = start;
1397   return FAIL;
1398 }
1399
1400 /* Parse a Neon type specifier. *STR should point at the leading '.'
1401    character. Does no verification at this stage that the type fits the opcode
1402    properly. E.g.,
1403
1404      .i32.i32.s16
1405      .s32.f32
1406      .u16
1407
1408    Can all be legally parsed by this function.
1409
1410    Fills in neon_type struct pointer with parsed information, and updates STR
1411    to point after the parsed type specifier. Returns SUCCESS if this was a legal
1412    type, FAIL if not.  */
1413
1414 static int
1415 parse_neon_type (struct neon_type *type, char **str)
1416 {
1417   char *ptr = *str;
1418
1419   if (type)
1420     type->elems = 0;
1421
1422   while (type->elems < NEON_MAX_TYPE_ELS)
1423     {
1424       enum neon_el_type thistype = NT_untyped;
1425       unsigned thissize = -1u;
1426
1427       if (*ptr != '.')
1428         break;
1429
1430       ptr++;
1431
1432       /* Just a size without an explicit type.  */
1433       if (ISDIGIT (*ptr))
1434         goto parsesize;
1435
1436       switch (TOLOWER (*ptr))
1437         {
1438         case 'i': thistype = NT_integer; break;
1439         case 'f': thistype = NT_float; break;
1440         case 'p': thistype = NT_poly; break;
1441         case 's': thistype = NT_signed; break;
1442         case 'u': thistype = NT_unsigned; break;
1443         case 'd':
1444           thistype = NT_float;
1445           thissize = 64;
1446           ptr++;
1447           goto done;
1448         default:
1449           as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1450           return FAIL;
1451         }
1452
1453       ptr++;
1454
1455       /* .f is an abbreviation for .f32.  */
1456       if (thistype == NT_float && !ISDIGIT (*ptr))
1457         thissize = 32;
1458       else
1459         {
1460         parsesize:
1461           thissize = strtoul (ptr, &ptr, 10);
1462
1463           if (thissize != 8 && thissize != 16 && thissize != 32
1464               && thissize != 64)
1465             {
1466               as_bad (_("bad size %d in type specifier"), thissize);
1467               return FAIL;
1468             }
1469         }
1470
1471       done:
1472       if (type)
1473         {
1474           type->el[type->elems].type = thistype;
1475           type->el[type->elems].size = thissize;
1476           type->elems++;
1477         }
1478     }
1479
1480   /* Empty/missing type is not a successful parse.  */
1481   if (type->elems == 0)
1482     return FAIL;
1483
1484   *str = ptr;
1485
1486   return SUCCESS;
1487 }
1488
1489 /* Errors may be set multiple times during parsing or bit encoding
1490    (particularly in the Neon bits), but usually the earliest error which is set
1491    will be the most meaningful. Avoid overwriting it with later (cascading)
1492    errors by calling this function.  */
1493
1494 static void
1495 first_error (const char *err)
1496 {
1497   if (!inst.error)
1498     inst.error = err;
1499 }
1500
1501 /* Parse a single type, e.g. ".s32", leading period included.  */
1502 static int
1503 parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1504 {
1505   char *str = *ccp;
1506   struct neon_type optype;
1507
1508   if (*str == '.')
1509     {
1510       if (parse_neon_type (&optype, &str) == SUCCESS)
1511         {
1512           if (optype.elems == 1)
1513             *vectype = optype.el[0];
1514           else
1515             {
1516               first_error (_("only one type should be specified for operand"));
1517               return FAIL;
1518             }
1519         }
1520       else
1521         {
1522           first_error (_("vector type expected"));
1523           return FAIL;
1524         }
1525     }
1526   else
1527     return FAIL;
1528
1529   *ccp = str;
1530
1531   return SUCCESS;
1532 }
1533
1534 /* Special meanings for indices (which have a range of 0-7), which will fit into
1535    a 4-bit integer.  */
1536
1537 #define NEON_ALL_LANES          15
1538 #define NEON_INTERLEAVE_LANES   14
1539
1540 /* Record a use of the given feature.  */
1541 static void
1542 record_feature_use (const arm_feature_set *feature)
1543 {
1544   if (thumb_mode)
1545     ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, *feature);
1546   else
1547     ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, *feature);
1548 }
1549
1550 /* If the given feature available in the selected CPU, mark it as used.
1551    Returns TRUE iff feature is available.  */
1552 static bfd_boolean
1553 mark_feature_used (const arm_feature_set *feature)
1554 {
1555
1556   /* Do not support the use of MVE only instructions when in auto-detection or
1557      -march=all.  */
1558   if (((feature == &mve_ext) || (feature == &mve_fp_ext))
1559       && ARM_CPU_IS_ANY (cpu_variant))
1560     {
1561       first_error (BAD_MVE_AUTO);
1562       return FALSE;
1563     }
1564   /* Ensure the option is valid on the current architecture.  */
1565   if (!ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
1566     return FALSE;
1567
1568   /* Add the appropriate architecture feature for the barrier option used.
1569      */
1570   record_feature_use (feature);
1571
1572   return TRUE;
1573 }
1574
1575 /* Parse either a register or a scalar, with an optional type. Return the
1576    register number, and optionally fill in the actual type of the register
1577    when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1578    type/index information in *TYPEINFO.  */
1579
1580 static int
1581 parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
1582                            enum arm_reg_type *rtype,
1583                            struct neon_typed_alias *typeinfo)
1584 {
1585   char *str = *ccp;
1586   struct reg_entry *reg = arm_reg_parse_multi (&str);
1587   struct neon_typed_alias atype;
1588   struct neon_type_el parsetype;
1589
1590   atype.defined = 0;
1591   atype.index = -1;
1592   atype.eltype.type = NT_invtype;
1593   atype.eltype.size = -1;
1594
1595   /* Try alternate syntax for some types of register. Note these are mutually
1596      exclusive with the Neon syntax extensions.  */
1597   if (reg == NULL)
1598     {
1599       int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1600       if (altreg != FAIL)
1601         *ccp = str;
1602       if (typeinfo)
1603         *typeinfo = atype;
1604       return altreg;
1605     }
1606
1607   /* Undo polymorphism when a set of register types may be accepted.  */
1608   if ((type == REG_TYPE_NDQ
1609        && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1610       || (type == REG_TYPE_VFSD
1611           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1612       || (type == REG_TYPE_NSDQ
1613           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
1614               || reg->type == REG_TYPE_NQ))
1615       || (type == REG_TYPE_NSD
1616           && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1617       || (type == REG_TYPE_MMXWC
1618           && (reg->type == REG_TYPE_MMXWCG)))
1619     type = (enum arm_reg_type) reg->type;
1620
1621   if (type == REG_TYPE_MQ)
1622     {
1623       if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
1624         return FAIL;
1625
1626       if (!reg || reg->type != REG_TYPE_NQ)
1627         return FAIL;
1628
1629       if (reg->number > 14 && !mark_feature_used (&fpu_vfp_ext_d32))
1630         {
1631           first_error (_("expected MVE register [q0..q7]"));
1632           return FAIL;
1633         }
1634       type = REG_TYPE_NQ;
1635     }
1636   else if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext)
1637            && (type == REG_TYPE_NQ))
1638     return FAIL;
1639
1640
1641   if (type != reg->type)
1642     return FAIL;
1643
1644   if (reg->neon)
1645     atype = *reg->neon;
1646
1647   if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1648     {
1649       if ((atype.defined & NTA_HASTYPE) != 0)
1650         {
1651           first_error (_("can't redefine type for operand"));
1652           return FAIL;
1653         }
1654       atype.defined |= NTA_HASTYPE;
1655       atype.eltype = parsetype;
1656     }
1657
1658   if (skip_past_char (&str, '[') == SUCCESS)
1659     {
1660       if (type != REG_TYPE_VFD
1661           && !(type == REG_TYPE_VFS
1662                && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8_2))
1663           && !(type == REG_TYPE_NQ
1664                && ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext)))
1665         {
1666           if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
1667             first_error (_("only D and Q registers may be indexed"));
1668           else
1669             first_error (_("only D registers may be indexed"));
1670           return FAIL;
1671         }
1672
1673       if ((atype.defined & NTA_HASINDEX) != 0)
1674         {
1675           first_error (_("can't change index for operand"));
1676           return FAIL;
1677         }
1678
1679       atype.defined |= NTA_HASINDEX;
1680
1681       if (skip_past_char (&str, ']') == SUCCESS)
1682         atype.index = NEON_ALL_LANES;
1683       else
1684         {
1685           expressionS exp;
1686
1687           my_get_expression (&exp, &str, GE_NO_PREFIX);
1688
1689           if (exp.X_op != O_constant)
1690             {
1691               first_error (_("constant expression required"));
1692               return FAIL;
1693             }
1694
1695           if (skip_past_char (&str, ']') == FAIL)
1696             return FAIL;
1697
1698           atype.index = exp.X_add_number;
1699         }
1700     }
1701
1702   if (typeinfo)
1703     *typeinfo = atype;
1704
1705   if (rtype)
1706     *rtype = type;
1707
1708   *ccp = str;
1709
1710   return reg->number;
1711 }
1712
1713 /* Like arm_reg_parse, but also allow the following extra features:
1714     - If RTYPE is non-zero, return the (possibly restricted) type of the
1715       register (e.g. Neon double or quad reg when either has been requested).
1716     - If this is a Neon vector type with additional type information, fill
1717       in the struct pointed to by VECTYPE (if non-NULL).
1718    This function will fault on encountering a scalar.  */
1719
1720 static int
1721 arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
1722                      enum arm_reg_type *rtype, struct neon_type_el *vectype)
1723 {
1724   struct neon_typed_alias atype;
1725   char *str = *ccp;
1726   int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1727
1728   if (reg == FAIL)
1729     return FAIL;
1730
1731   /* Do not allow regname(... to parse as a register.  */
1732   if (*str == '(')
1733     return FAIL;
1734
1735   /* Do not allow a scalar (reg+index) to parse as a register.  */
1736   if ((atype.defined & NTA_HASINDEX) != 0)
1737     {
1738       first_error (_("register operand expected, but got scalar"));
1739       return FAIL;
1740     }
1741
1742   if (vectype)
1743     *vectype = atype.eltype;
1744
1745   *ccp = str;
1746
1747   return reg;
1748 }
1749
1750 #define NEON_SCALAR_REG(X)      ((X) >> 4)
1751 #define NEON_SCALAR_INDEX(X)    ((X) & 15)
1752
1753 /* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1754    have enough information to be able to do a good job bounds-checking. So, we
1755    just do easy checks here, and do further checks later.  */
1756
1757 static int
1758 parse_scalar (char **ccp, int elsize, struct neon_type_el *type, enum
1759               arm_reg_type reg_type)
1760 {
1761   int reg;
1762   char *str = *ccp;
1763   struct neon_typed_alias atype;
1764   unsigned reg_size;
1765
1766   reg = parse_typed_reg_or_scalar (&str, reg_type, NULL, &atype);
1767
1768   switch (reg_type)
1769     {
1770     case REG_TYPE_VFS:
1771       reg_size = 32;
1772       break;
1773     case REG_TYPE_VFD:
1774       reg_size = 64;
1775       break;
1776     case REG_TYPE_MQ:
1777       reg_size = 128;
1778       break;
1779     default:
1780       gas_assert (0);
1781       return FAIL;
1782     }
1783
1784   if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
1785     return FAIL;
1786
1787   if (reg_type != REG_TYPE_MQ && atype.index == NEON_ALL_LANES)
1788     {
1789       first_error (_("scalar must have an index"));
1790       return FAIL;
1791     }
1792   else if (atype.index >= reg_size / elsize)
1793     {
1794       first_error (_("scalar index out of range"));
1795       return FAIL;
1796     }
1797
1798   if (type)
1799     *type = atype.eltype;
1800
1801   *ccp = str;
1802
1803   return reg * 16 + atype.index;
1804 }
1805
1806 /* Types of registers in a list.  */
1807
1808 enum reg_list_els
1809 {
1810   REGLIST_RN,
1811   REGLIST_CLRM,
1812   REGLIST_VFP_S,
1813   REGLIST_VFP_S_VPR,
1814   REGLIST_VFP_D,
1815   REGLIST_VFP_D_VPR,
1816   REGLIST_NEON_D
1817 };
1818
1819 /* Parse an ARM register list.  Returns the bitmask, or FAIL.  */
1820
1821 static long
1822 parse_reg_list (char ** strp, enum reg_list_els etype)
1823 {
1824   char *str = *strp;
1825   long range = 0;
1826   int another_range;
1827
1828   gas_assert (etype == REGLIST_RN || etype == REGLIST_CLRM);
1829
1830   /* We come back here if we get ranges concatenated by '+' or '|'.  */
1831   do
1832     {
1833       skip_whitespace (str);
1834
1835       another_range = 0;
1836
1837       if (*str == '{')
1838         {
1839           int in_range = 0;
1840           int cur_reg = -1;
1841
1842           str++;
1843           do
1844             {
1845               int reg;
1846               const char apsr_str[] = "apsr";
1847               int apsr_str_len = strlen (apsr_str);
1848
1849               reg = arm_reg_parse (&str, REGLIST_RN);
1850               if (etype == REGLIST_CLRM)
1851                 {
1852                   if (reg == REG_SP || reg == REG_PC)
1853                     reg = FAIL;
1854                   else if (reg == FAIL
1855                            && !strncasecmp (str, apsr_str, apsr_str_len)
1856                            && !ISALPHA (*(str + apsr_str_len)))
1857                     {
1858                       reg = 15;
1859                       str += apsr_str_len;
1860                     }
1861
1862                   if (reg == FAIL)
1863                     {
1864                       first_error (_("r0-r12, lr or APSR expected"));
1865                       return FAIL;
1866                     }
1867                 }
1868               else /* etype == REGLIST_RN.  */
1869                 {
1870                   if (reg == FAIL)
1871                     {
1872                       first_error (_(reg_expected_msgs[REGLIST_RN]));
1873                       return FAIL;
1874                     }
1875                 }
1876
1877               if (in_range)
1878                 {
1879                   int i;
1880
1881                   if (reg <= cur_reg)
1882                     {
1883                       first_error (_("bad range in register list"));
1884                       return FAIL;
1885                     }
1886
1887                   for (i = cur_reg + 1; i < reg; i++)
1888                     {
1889                       if (range & (1 << i))
1890                         as_tsktsk
1891                           (_("Warning: duplicated register (r%d) in register list"),
1892                            i);
1893                       else
1894                         range |= 1 << i;
1895                     }
1896                   in_range = 0;
1897                 }
1898
1899               if (range & (1 << reg))
1900                 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1901                            reg);
1902               else if (reg <= cur_reg)
1903                 as_tsktsk (_("Warning: register range not in ascending order"));
1904
1905               range |= 1 << reg;
1906               cur_reg = reg;
1907             }
1908           while (skip_past_comma (&str) != FAIL
1909                  || (in_range = 1, *str++ == '-'));
1910           str--;
1911
1912           if (skip_past_char (&str, '}') == FAIL)
1913             {
1914               first_error (_("missing `}'"));
1915               return FAIL;
1916             }
1917         }
1918       else if (etype == REGLIST_RN)
1919         {
1920           expressionS exp;
1921
1922           if (my_get_expression (&exp, &str, GE_NO_PREFIX))
1923             return FAIL;
1924
1925           if (exp.X_op == O_constant)
1926             {
1927               if (exp.X_add_number
1928                   != (exp.X_add_number & 0x0000ffff))
1929                 {
1930                   inst.error = _("invalid register mask");
1931                   return FAIL;
1932                 }
1933
1934               if ((range & exp.X_add_number) != 0)
1935                 {
1936                   int regno = range & exp.X_add_number;
1937
1938                   regno &= -regno;
1939                   regno = (1 << regno) - 1;
1940                   as_tsktsk
1941                     (_("Warning: duplicated register (r%d) in register list"),
1942                      regno);
1943                 }
1944
1945               range |= exp.X_add_number;
1946             }
1947           else
1948             {
1949               if (inst.relocs[0].type != 0)
1950                 {
1951                   inst.error = _("expression too complex");
1952                   return FAIL;
1953                 }
1954
1955               memcpy (&inst.relocs[0].exp, &exp, sizeof (expressionS));
1956               inst.relocs[0].type = BFD_RELOC_ARM_MULTI;
1957               inst.relocs[0].pc_rel = 0;
1958             }
1959         }
1960
1961       if (*str == '|' || *str == '+')
1962         {
1963           str++;
1964           another_range = 1;
1965         }
1966     }
1967   while (another_range);
1968
1969   *strp = str;
1970   return range;
1971 }
1972
1973 /* Parse a VFP register list.  If the string is invalid return FAIL.
1974    Otherwise return the number of registers, and set PBASE to the first
1975    register.  Parses registers of type ETYPE.
1976    If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1977      - Q registers can be used to specify pairs of D registers
1978      - { } can be omitted from around a singleton register list
1979          FIXME: This is not implemented, as it would require backtracking in
1980          some cases, e.g.:
1981            vtbl.8 d3,d4,d5
1982          This could be done (the meaning isn't really ambiguous), but doesn't
1983          fit in well with the current parsing framework.
1984      - 32 D registers may be used (also true for VFPv3).
1985    FIXME: Types are ignored in these register lists, which is probably a
1986    bug.  */
1987
1988 static int
1989 parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype,
1990                     bfd_boolean *partial_match)
1991 {
1992   char *str = *ccp;
1993   int base_reg;
1994   int new_base;
1995   enum arm_reg_type regtype = (enum arm_reg_type) 0;
1996   int max_regs = 0;
1997   int count = 0;
1998   int warned = 0;
1999   unsigned long mask = 0;
2000   int i;
2001   bfd_boolean vpr_seen = FALSE;
2002   bfd_boolean expect_vpr =
2003     (etype == REGLIST_VFP_S_VPR) || (etype == REGLIST_VFP_D_VPR);
2004
2005   if (skip_past_char (&str, '{') == FAIL)
2006     {
2007       inst.error = _("expecting {");
2008       return FAIL;
2009     }
2010
2011   switch (etype)
2012     {
2013     case REGLIST_VFP_S:
2014     case REGLIST_VFP_S_VPR:
2015       regtype = REG_TYPE_VFS;
2016       max_regs = 32;
2017       break;
2018
2019     case REGLIST_VFP_D:
2020     case REGLIST_VFP_D_VPR:
2021       regtype = REG_TYPE_VFD;
2022       break;
2023
2024     case REGLIST_NEON_D:
2025       regtype = REG_TYPE_NDQ;
2026       break;
2027
2028     default:
2029       gas_assert (0);
2030     }
2031
2032   if (etype != REGLIST_VFP_S && etype != REGLIST_VFP_S_VPR)
2033     {
2034       /* VFPv3 allows 32 D registers, except for the VFPv3-D16 variant.  */
2035       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
2036         {
2037           max_regs = 32;
2038           if (thumb_mode)
2039             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
2040                                     fpu_vfp_ext_d32);
2041           else
2042             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
2043                                     fpu_vfp_ext_d32);
2044         }
2045       else
2046         max_regs = 16;
2047     }
2048
2049   base_reg = max_regs;
2050   *partial_match = FALSE;
2051
2052   do
2053     {
2054       int setmask = 1, addregs = 1;
2055       const char vpr_str[] = "vpr";
2056       int vpr_str_len = strlen (vpr_str);
2057
2058       new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
2059
2060       if (expect_vpr)
2061         {
2062           if (new_base == FAIL
2063               && !strncasecmp (str, vpr_str, vpr_str_len)
2064               && !ISALPHA (*(str + vpr_str_len))
2065               && !vpr_seen)
2066             {
2067               vpr_seen = TRUE;
2068               str += vpr_str_len;
2069               if (count == 0)
2070                 base_reg = 0; /* Canonicalize VPR only on d0 with 0 regs.  */
2071             }
2072           else if (vpr_seen)
2073             {
2074               first_error (_("VPR expected last"));
2075               return FAIL;
2076             }
2077           else if (new_base == FAIL)
2078             {
2079               if (regtype == REG_TYPE_VFS)
2080                 first_error (_("VFP single precision register or VPR "
2081                                "expected"));
2082               else /* regtype == REG_TYPE_VFD.  */
2083                 first_error (_("VFP/Neon double precision register or VPR "
2084                                "expected"));
2085               return FAIL;
2086             }
2087         }
2088       else if (new_base == FAIL)
2089         {
2090           first_error (_(reg_expected_msgs[regtype]));
2091           return FAIL;
2092         }
2093
2094       *partial_match = TRUE;
2095       if (vpr_seen)
2096         continue;
2097
2098       if (new_base >= max_regs)
2099         {
2100           first_error (_("register out of range in list"));
2101           return FAIL;
2102         }
2103
2104       /* Note: a value of 2 * n is returned for the register Q<n>.  */
2105       if (regtype == REG_TYPE_NQ)
2106         {
2107           setmask = 3;
2108           addregs = 2;
2109         }
2110
2111       if (new_base < base_reg)
2112         base_reg = new_base;
2113
2114       if (mask & (setmask << new_base))
2115         {
2116           first_error (_("invalid register list"));
2117           return FAIL;
2118         }
2119
2120       if ((mask >> new_base) != 0 && ! warned && !vpr_seen)
2121         {
2122           as_tsktsk (_("register list not in ascending order"));
2123           warned = 1;
2124         }
2125
2126       mask |= setmask << new_base;
2127       count += addregs;
2128
2129       if (*str == '-') /* We have the start of a range expression */
2130         {
2131           int high_range;
2132
2133           str++;
2134
2135           if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
2136               == FAIL)
2137             {
2138               inst.error = gettext (reg_expected_msgs[regtype]);
2139               return FAIL;
2140             }
2141
2142           if (high_range >= max_regs)
2143             {
2144               first_error (_("register out of range in list"));
2145               return FAIL;
2146             }
2147
2148           if (regtype == REG_TYPE_NQ)
2149             high_range = high_range + 1;
2150
2151           if (high_range <= new_base)
2152             {
2153               inst.error = _("register range not in ascending order");
2154               return FAIL;
2155             }
2156
2157           for (new_base += addregs; new_base <= high_range; new_base += addregs)
2158             {
2159               if (mask & (setmask << new_base))
2160                 {
2161                   inst.error = _("invalid register list");
2162                   return FAIL;
2163                 }
2164
2165               mask |= setmask << new_base;
2166               count += addregs;
2167             }
2168         }
2169     }
2170   while (skip_past_comma (&str) != FAIL);
2171
2172   str++;
2173
2174   /* Sanity check -- should have raised a parse error above.  */
2175   if ((!vpr_seen && count == 0) || count > max_regs)
2176     abort ();
2177
2178   *pbase = base_reg;
2179
2180   if (expect_vpr && !vpr_seen)
2181     {
2182       first_error (_("VPR expected last"));
2183       return FAIL;
2184     }
2185
2186   /* Final test -- the registers must be consecutive.  */
2187   mask >>= base_reg;
2188   for (i = 0; i < count; i++)
2189     {
2190       if ((mask & (1u << i)) == 0)
2191         {
2192           inst.error = _("non-contiguous register range");
2193           return FAIL;
2194         }
2195     }
2196
2197   *ccp = str;
2198
2199   return count;
2200 }
2201
2202 /* True if two alias types are the same.  */
2203
2204 static bfd_boolean
2205 neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
2206 {
2207   if (!a && !b)
2208     return TRUE;
2209
2210   if (!a || !b)
2211     return FALSE;
2212
2213   if (a->defined != b->defined)
2214     return FALSE;
2215
2216   if ((a->defined & NTA_HASTYPE) != 0
2217       && (a->eltype.type != b->eltype.type
2218           || a->eltype.size != b->eltype.size))
2219     return FALSE;
2220
2221   if ((a->defined & NTA_HASINDEX) != 0
2222       && (a->index != b->index))
2223     return FALSE;
2224
2225   return TRUE;
2226 }
2227
2228 /* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
2229    The base register is put in *PBASE.
2230    The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
2231    the return value.
2232    The register stride (minus one) is put in bit 4 of the return value.
2233    Bits [6:5] encode the list length (minus one).
2234    The type of the list elements is put in *ELTYPE, if non-NULL.  */
2235
2236 #define NEON_LANE(X)            ((X) & 0xf)
2237 #define NEON_REG_STRIDE(X)      ((((X) >> 4) & 1) + 1)
2238 #define NEON_REGLIST_LENGTH(X)  ((((X) >> 5) & 3) + 1)
2239
2240 static int
2241 parse_neon_el_struct_list (char **str, unsigned *pbase,
2242                            int mve,
2243                            struct neon_type_el *eltype)
2244 {
2245   char *ptr = *str;
2246   int base_reg = -1;
2247   int reg_incr = -1;
2248   int count = 0;
2249   int lane = -1;
2250   int leading_brace = 0;
2251   enum arm_reg_type rtype = REG_TYPE_NDQ;
2252   const char *const incr_error = mve ? _("register stride must be 1") :
2253     _("register stride must be 1 or 2");
2254   const char *const type_error = _("mismatched element/structure types in list");
2255   struct neon_typed_alias firsttype;
2256   firsttype.defined = 0;
2257   firsttype.eltype.type = NT_invtype;
2258   firsttype.eltype.size = -1;
2259   firsttype.index = -1;
2260
2261   if (skip_past_char (&ptr, '{') == SUCCESS)
2262     leading_brace = 1;
2263
2264   do
2265     {
2266       struct neon_typed_alias atype;
2267       if (mve)
2268         rtype = REG_TYPE_MQ;
2269       int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
2270
2271       if (getreg == FAIL)
2272         {
2273           first_error (_(reg_expected_msgs[rtype]));
2274           return FAIL;
2275         }
2276
2277       if (base_reg == -1)
2278         {
2279           base_reg = getreg;
2280           if (rtype == REG_TYPE_NQ)
2281             {
2282               reg_incr = 1;
2283             }
2284           firsttype = atype;
2285         }
2286       else if (reg_incr == -1)
2287         {
2288           reg_incr = getreg - base_reg;
2289           if (reg_incr < 1 || reg_incr > 2)
2290             {
2291               first_error (_(incr_error));
2292               return FAIL;
2293             }
2294         }
2295       else if (getreg != base_reg + reg_incr * count)
2296         {
2297           first_error (_(incr_error));
2298           return FAIL;
2299         }
2300
2301       if (! neon_alias_types_same (&atype, &firsttype))
2302         {
2303           first_error (_(type_error));
2304           return FAIL;
2305         }
2306
2307       /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
2308          modes.  */
2309       if (ptr[0] == '-')
2310         {
2311           struct neon_typed_alias htype;
2312           int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
2313           if (lane == -1)
2314             lane = NEON_INTERLEAVE_LANES;
2315           else if (lane != NEON_INTERLEAVE_LANES)
2316             {
2317               first_error (_(type_error));
2318               return FAIL;
2319             }
2320           if (reg_incr == -1)
2321             reg_incr = 1;
2322           else if (reg_incr != 1)
2323             {
2324               first_error (_("don't use Rn-Rm syntax with non-unit stride"));
2325               return FAIL;
2326             }
2327           ptr++;
2328           hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
2329           if (hireg == FAIL)
2330             {
2331               first_error (_(reg_expected_msgs[rtype]));
2332               return FAIL;
2333             }
2334           if (! neon_alias_types_same (&htype, &firsttype))
2335             {
2336               first_error (_(type_error));
2337               return FAIL;
2338             }
2339           count += hireg + dregs - getreg;
2340           continue;
2341         }
2342
2343       /* If we're using Q registers, we can't use [] or [n] syntax.  */
2344       if (rtype == REG_TYPE_NQ)
2345         {
2346           count += 2;
2347           continue;
2348         }
2349
2350       if ((atype.defined & NTA_HASINDEX) != 0)
2351         {
2352           if (lane == -1)
2353             lane = atype.index;
2354           else if (lane != atype.index)
2355             {
2356               first_error (_(type_error));
2357               return FAIL;
2358             }
2359         }
2360       else if (lane == -1)
2361         lane = NEON_INTERLEAVE_LANES;
2362       else if (lane != NEON_INTERLEAVE_LANES)
2363         {
2364           first_error (_(type_error));
2365           return FAIL;
2366         }
2367       count++;
2368     }
2369   while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
2370
2371   /* No lane set by [x]. We must be interleaving structures.  */
2372   if (lane == -1)
2373     lane = NEON_INTERLEAVE_LANES;
2374
2375   /* Sanity check.  */
2376   if (lane == -1 || base_reg == -1 || count < 1 || (!mve && count > 4)
2377       || (count > 1 && reg_incr == -1))
2378     {
2379       first_error (_("error parsing element/structure list"));
2380       return FAIL;
2381     }
2382
2383   if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
2384     {
2385       first_error (_("expected }"));
2386       return FAIL;
2387     }
2388
2389   if (reg_incr == -1)
2390     reg_incr = 1;
2391
2392   if (eltype)
2393     *eltype = firsttype.eltype;
2394
2395   *pbase = base_reg;
2396   *str = ptr;
2397
2398   return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
2399 }
2400
2401 /* Parse an explicit relocation suffix on an expression.  This is
2402    either nothing, or a word in parentheses.  Note that if !OBJ_ELF,
2403    arm_reloc_hsh contains no entries, so this function can only
2404    succeed if there is no () after the word.  Returns -1 on error,
2405    BFD_RELOC_UNUSED if there wasn't any suffix.  */
2406
2407 static int
2408 parse_reloc (char **str)
2409 {
2410   struct reloc_entry *r;
2411   char *p, *q;
2412
2413   if (**str != '(')
2414     return BFD_RELOC_UNUSED;
2415
2416   p = *str + 1;
2417   q = p;
2418
2419   while (*q && *q != ')' && *q != ',')
2420     q++;
2421   if (*q != ')')
2422     return -1;
2423
2424   if ((r = (struct reloc_entry *)
2425        hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
2426     return -1;
2427
2428   *str = q + 1;
2429   return r->reloc;
2430 }
2431
2432 /* Directives: register aliases.  */
2433
2434 static struct reg_entry *
2435 insert_reg_alias (char *str, unsigned number, int type)
2436 {
2437   struct reg_entry *new_reg;
2438   const char *name;
2439
2440   if ((new_reg = (struct reg_entry *) hash_find (arm_reg_hsh, str)) != 0)
2441     {
2442       if (new_reg->builtin)
2443         as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
2444
2445       /* Only warn about a redefinition if it's not defined as the
2446          same register.  */
2447       else if (new_reg->number != number || new_reg->type != type)
2448         as_warn (_("ignoring redefinition of register alias '%s'"), str);
2449
2450       return NULL;
2451     }
2452
2453   name = xstrdup (str);
2454   new_reg = XNEW (struct reg_entry);
2455
2456   new_reg->name = name;
2457   new_reg->number = number;
2458   new_reg->type = type;
2459   new_reg->builtin = FALSE;
2460   new_reg->neon = NULL;
2461
2462   if (hash_insert (arm_reg_hsh, name, (void *) new_reg))
2463     abort ();
2464
2465   return new_reg;
2466 }
2467
2468 static void
2469 insert_neon_reg_alias (char *str, int number, int type,
2470                        struct neon_typed_alias *atype)
2471 {
2472   struct reg_entry *reg = insert_reg_alias (str, number, type);
2473
2474   if (!reg)
2475     {
2476       first_error (_("attempt to redefine typed alias"));
2477       return;
2478     }
2479
2480   if (atype)
2481     {
2482       reg->neon = XNEW (struct neon_typed_alias);
2483       *reg->neon = *atype;
2484     }
2485 }
2486
2487 /* Look for the .req directive.  This is of the form:
2488
2489         new_register_name .req existing_register_name
2490
2491    If we find one, or if it looks sufficiently like one that we want to
2492    handle any error here, return TRUE.  Otherwise return FALSE.  */
2493
2494 static bfd_boolean
2495 create_register_alias (char * newname, char *p)
2496 {
2497   struct reg_entry *old;
2498   char *oldname, *nbuf;
2499   size_t nlen;
2500
2501   /* The input scrubber ensures that whitespace after the mnemonic is
2502      collapsed to single spaces.  */
2503   oldname = p;
2504   if (strncmp (oldname, " .req ", 6) != 0)
2505     return FALSE;
2506
2507   oldname += 6;
2508   if (*oldname == '\0')
2509     return FALSE;
2510
2511   old = (struct reg_entry *) hash_find (arm_reg_hsh, oldname);
2512   if (!old)
2513     {
2514       as_warn (_("unknown register '%s' -- .req ignored"), oldname);
2515       return TRUE;
2516     }
2517
2518   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2519      the desired alias name, and p points to its end.  If not, then
2520      the desired alias name is in the global original_case_string.  */
2521 #ifdef TC_CASE_SENSITIVE
2522   nlen = p - newname;
2523 #else
2524   newname = original_case_string;
2525   nlen = strlen (newname);
2526 #endif
2527
2528   nbuf = xmemdup0 (newname, nlen);
2529
2530   /* Create aliases under the new name as stated; an all-lowercase
2531      version of the new name; and an all-uppercase version of the new
2532      name.  */
2533   if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
2534     {
2535       for (p = nbuf; *p; p++)
2536         *p = TOUPPER (*p);
2537
2538       if (strncmp (nbuf, newname, nlen))
2539         {
2540           /* If this attempt to create an additional alias fails, do not bother
2541              trying to create the all-lower case alias.  We will fail and issue
2542              a second, duplicate error message.  This situation arises when the
2543              programmer does something like:
2544                foo .req r0
2545                Foo .req r1
2546              The second .req creates the "Foo" alias but then fails to create
2547              the artificial FOO alias because it has already been created by the
2548              first .req.  */
2549           if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
2550             {
2551               free (nbuf);
2552               return TRUE;
2553             }
2554         }
2555
2556       for (p = nbuf; *p; p++)
2557         *p = TOLOWER (*p);
2558
2559       if (strncmp (nbuf, newname, nlen))
2560         insert_reg_alias (nbuf, old->number, old->type);
2561     }
2562
2563   free (nbuf);
2564   return TRUE;
2565 }
2566
2567 /* Create a Neon typed/indexed register alias using directives, e.g.:
2568      X .dn d5.s32[1]
2569      Y .qn 6.s16
2570      Z .dn d7
2571      T .dn Z[0]
2572    These typed registers can be used instead of the types specified after the
2573    Neon mnemonic, so long as all operands given have types. Types can also be
2574    specified directly, e.g.:
2575      vadd d0.s32, d1.s32, d2.s32  */
2576
2577 static bfd_boolean
2578 create_neon_reg_alias (char *newname, char *p)
2579 {
2580   enum arm_reg_type basetype;
2581   struct reg_entry *basereg;
2582   struct reg_entry mybasereg;
2583   struct neon_type ntype;
2584   struct neon_typed_alias typeinfo;
2585   char *namebuf, *nameend ATTRIBUTE_UNUSED;
2586   int namelen;
2587
2588   typeinfo.defined = 0;
2589   typeinfo.eltype.type = NT_invtype;
2590   typeinfo.eltype.size = -1;
2591   typeinfo.index = -1;
2592
2593   nameend = p;
2594
2595   if (strncmp (p, " .dn ", 5) == 0)
2596     basetype = REG_TYPE_VFD;
2597   else if (strncmp (p, " .qn ", 5) == 0)
2598     basetype = REG_TYPE_NQ;
2599   else
2600     return FALSE;
2601
2602   p += 5;
2603
2604   if (*p == '\0')
2605     return FALSE;
2606
2607   basereg = arm_reg_parse_multi (&p);
2608
2609   if (basereg && basereg->type != basetype)
2610     {
2611       as_bad (_("bad type for register"));
2612       return FALSE;
2613     }
2614
2615   if (basereg == NULL)
2616     {
2617       expressionS exp;
2618       /* Try parsing as an integer.  */
2619       my_get_expression (&exp, &p, GE_NO_PREFIX);
2620       if (exp.X_op != O_constant)
2621         {
2622           as_bad (_("expression must be constant"));
2623           return FALSE;
2624         }
2625       basereg = &mybasereg;
2626       basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
2627                                                   : exp.X_add_number;
2628       basereg->neon = 0;
2629     }
2630
2631   if (basereg->neon)
2632     typeinfo = *basereg->neon;
2633
2634   if (parse_neon_type (&ntype, &p) == SUCCESS)
2635     {
2636       /* We got a type.  */
2637       if (typeinfo.defined & NTA_HASTYPE)
2638         {
2639           as_bad (_("can't redefine the type of a register alias"));
2640           return FALSE;
2641         }
2642
2643       typeinfo.defined |= NTA_HASTYPE;
2644       if (ntype.elems != 1)
2645         {
2646           as_bad (_("you must specify a single type only"));
2647           return FALSE;
2648         }
2649       typeinfo.eltype = ntype.el[0];
2650     }
2651
2652   if (skip_past_char (&p, '[') == SUCCESS)
2653     {
2654       expressionS exp;
2655       /* We got a scalar index.  */
2656
2657       if (typeinfo.defined & NTA_HASINDEX)
2658         {
2659           as_bad (_("can't redefine the index of a scalar alias"));
2660           return FALSE;
2661         }
2662
2663       my_get_expression (&exp, &p, GE_NO_PREFIX);
2664
2665       if (exp.X_op != O_constant)
2666         {
2667           as_bad (_("scalar index must be constant"));
2668           return FALSE;
2669         }
2670
2671       typeinfo.defined |= NTA_HASINDEX;
2672       typeinfo.index = exp.X_add_number;
2673
2674       if (skip_past_char (&p, ']') == FAIL)
2675         {
2676           as_bad (_("expecting ]"));
2677           return FALSE;
2678         }
2679     }
2680
2681   /* If TC_CASE_SENSITIVE is defined, then newname already points to
2682      the desired alias name, and p points to its end.  If not, then
2683      the desired alias name is in the global original_case_string.  */
2684 #ifdef TC_CASE_SENSITIVE
2685   namelen = nameend - newname;
2686 #else
2687   newname = original_case_string;
2688   namelen = strlen (newname);
2689 #endif
2690
2691   namebuf = xmemdup0 (newname, namelen);
2692
2693   insert_neon_reg_alias (namebuf, basereg->number, basetype,
2694                          typeinfo.defined != 0 ? &typeinfo : NULL);
2695
2696   /* Insert name in all uppercase.  */
2697   for (p = namebuf; *p; p++)
2698     *p = TOUPPER (*p);
2699
2700   if (strncmp (namebuf, newname, namelen))
2701     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2702                            typeinfo.defined != 0 ? &typeinfo : NULL);
2703
2704   /* Insert name in all lowercase.  */
2705   for (p = namebuf; *p; p++)
2706     *p = TOLOWER (*p);
2707
2708   if (strncmp (namebuf, newname, namelen))
2709     insert_neon_reg_alias (namebuf, basereg->number, basetype,
2710                            typeinfo.defined != 0 ? &typeinfo : NULL);
2711
2712   free (namebuf);
2713   return TRUE;
2714 }
2715
2716 /* Should never be called, as .req goes between the alias and the
2717    register name, not at the beginning of the line.  */
2718
2719 static void
2720 s_req (int a ATTRIBUTE_UNUSED)
2721 {
2722   as_bad (_("invalid syntax for .req directive"));
2723 }
2724
2725 static void
2726 s_dn (int a ATTRIBUTE_UNUSED)
2727 {
2728   as_bad (_("invalid syntax for .dn directive"));
2729 }
2730
2731 static void
2732 s_qn (int a ATTRIBUTE_UNUSED)
2733 {
2734   as_bad (_("invalid syntax for .qn directive"));
2735 }
2736
2737 /* The .unreq directive deletes an alias which was previously defined
2738    by .req.  For example:
2739
2740        my_alias .req r11
2741        .unreq my_alias    */
2742
2743 static void
2744 s_unreq (int a ATTRIBUTE_UNUSED)
2745 {
2746   char * name;
2747   char saved_char;
2748
2749   name = input_line_pointer;
2750
2751   while (*input_line_pointer != 0
2752          && *input_line_pointer != ' '
2753          && *input_line_pointer != '\n')
2754     ++input_line_pointer;
2755
2756   saved_char = *input_line_pointer;
2757   *input_line_pointer = 0;
2758
2759   if (!*name)
2760     as_bad (_("invalid syntax for .unreq directive"));
2761   else
2762     {
2763       struct reg_entry *reg = (struct reg_entry *) hash_find (arm_reg_hsh,
2764                                                               name);
2765
2766       if (!reg)
2767         as_bad (_("unknown register alias '%s'"), name);
2768       else if (reg->builtin)
2769         as_warn (_("ignoring attempt to use .unreq on fixed register name: '%s'"),
2770                  name);
2771       else
2772         {
2773           char * p;
2774           char * nbuf;
2775
2776           hash_delete (arm_reg_hsh, name, FALSE);
2777           free ((char *) reg->name);
2778           if (reg->neon)
2779             free (reg->neon);
2780           free (reg);
2781
2782           /* Also locate the all upper case and all lower case versions.
2783              Do not complain if we cannot find one or the other as it
2784              was probably deleted above.  */
2785
2786           nbuf = strdup (name);
2787           for (p = nbuf; *p; p++)
2788             *p = TOUPPER (*p);
2789           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2790           if (reg)
2791             {
2792               hash_delete (arm_reg_hsh, nbuf, FALSE);
2793               free ((char *) reg->name);
2794               if (reg->neon)
2795                 free (reg->neon);
2796               free (reg);
2797             }
2798
2799           for (p = nbuf; *p; p++)
2800             *p = TOLOWER (*p);
2801           reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2802           if (reg)
2803             {
2804               hash_delete (arm_reg_hsh, nbuf, FALSE);
2805               free ((char *) reg->name);
2806               if (reg->neon)
2807                 free (reg->neon);
2808               free (reg);
2809             }
2810
2811           free (nbuf);
2812         }
2813     }
2814
2815   *input_line_pointer = saved_char;
2816   demand_empty_rest_of_line ();
2817 }
2818
2819 /* Directives: Instruction set selection.  */
2820
2821 #ifdef OBJ_ELF
2822 /* This code is to handle mapping symbols as defined in the ARM ELF spec.
2823    (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2824    Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2825    and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped.  */
2826
2827 /* Create a new mapping symbol for the transition to STATE.  */
2828
2829 static void
2830 make_mapping_symbol (enum mstate state, valueT value, fragS *frag)
2831 {
2832   symbolS * symbolP;
2833   const char * symname;
2834   int type;
2835
2836   switch (state)
2837     {
2838     case MAP_DATA:
2839       symname = "$d";
2840       type = BSF_NO_FLAGS;
2841       break;
2842     case MAP_ARM:
2843       symname = "$a";
2844       type = BSF_NO_FLAGS;
2845       break;
2846     case MAP_THUMB:
2847       symname = "$t";
2848       type = BSF_NO_FLAGS;
2849       break;
2850     default:
2851       abort ();
2852     }
2853
2854   symbolP = symbol_new (symname, now_seg, value, frag);
2855   symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2856
2857   switch (state)
2858     {
2859     case MAP_ARM:
2860       THUMB_SET_FUNC (symbolP, 0);
2861       ARM_SET_THUMB (symbolP, 0);
2862       ARM_SET_INTERWORK (symbolP, support_interwork);
2863       break;
2864
2865     case MAP_THUMB:
2866       THUMB_SET_FUNC (symbolP, 1);
2867       ARM_SET_THUMB (symbolP, 1);
2868       ARM_SET_INTERWORK (symbolP, support_interwork);
2869       break;
2870
2871     case MAP_DATA:
2872     default:
2873       break;
2874     }
2875
2876   /* Save the mapping symbols for future reference.  Also check that
2877      we do not place two mapping symbols at the same offset within a
2878      frag.  We'll handle overlap between frags in
2879      check_mapping_symbols.
2880
2881      If .fill or other data filling directive generates zero sized data,
2882      the mapping symbol for the following code will have the same value
2883      as the one generated for the data filling directive.  In this case,
2884      we replace the old symbol with the new one at the same address.  */
2885   if (value == 0)
2886     {
2887       if (frag->tc_frag_data.first_map != NULL)
2888         {
2889           know (S_GET_VALUE (frag->tc_frag_data.first_map) == 0);
2890           symbol_remove (frag->tc_frag_data.first_map, &symbol_rootP, &symbol_lastP);
2891         }
2892       frag->tc_frag_data.first_map = symbolP;
2893     }
2894   if (frag->tc_frag_data.last_map != NULL)
2895     {
2896       know (S_GET_VALUE (frag->tc_frag_data.last_map) <= S_GET_VALUE (symbolP));
2897       if (S_GET_VALUE (frag->tc_frag_data.last_map) == S_GET_VALUE (symbolP))
2898         symbol_remove (frag->tc_frag_data.last_map, &symbol_rootP, &symbol_lastP);
2899     }
2900   frag->tc_frag_data.last_map = symbolP;
2901 }
2902
2903 /* We must sometimes convert a region marked as code to data during
2904    code alignment, if an odd number of bytes have to be padded.  The
2905    code mapping symbol is pushed to an aligned address.  */
2906
2907 static void
2908 insert_data_mapping_symbol (enum mstate state,
2909                             valueT value, fragS *frag, offsetT bytes)
2910 {
2911   /* If there was already a mapping symbol, remove it.  */
2912   if (frag->tc_frag_data.last_map != NULL
2913       && S_GET_VALUE (frag->tc_frag_data.last_map) == frag->fr_address + value)
2914     {
2915       symbolS *symp = frag->tc_frag_data.last_map;
2916
2917       if (value == 0)
2918         {
2919           know (frag->tc_frag_data.first_map == symp);
2920           frag->tc_frag_data.first_map = NULL;
2921         }
2922       frag->tc_frag_data.last_map = NULL;
2923       symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2924     }
2925
2926   make_mapping_symbol (MAP_DATA, value, frag);
2927   make_mapping_symbol (state, value + bytes, frag);
2928 }
2929
2930 static void mapping_state_2 (enum mstate state, int max_chars);
2931
2932 /* Set the mapping state to STATE.  Only call this when about to
2933    emit some STATE bytes to the file.  */
2934
2935 #define TRANSITION(from, to) (mapstate == (from) && state == (to))
2936 void
2937 mapping_state (enum mstate state)
2938 {
2939   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2940
2941   if (mapstate == state)
2942     /* The mapping symbol has already been emitted.
2943        There is nothing else to do.  */
2944     return;
2945
2946   if (state == MAP_ARM || state == MAP_THUMB)
2947     /*  PR gas/12931
2948         All ARM instructions require 4-byte alignment.
2949         (Almost) all Thumb instructions require 2-byte alignment.
2950
2951         When emitting instructions into any section, mark the section
2952         appropriately.
2953
2954         Some Thumb instructions are alignment-sensitive modulo 4 bytes,
2955         but themselves require 2-byte alignment; this applies to some
2956         PC- relative forms.  However, these cases will involve implicit
2957         literal pool generation or an explicit .align >=2, both of
2958         which will cause the section to me marked with sufficient
2959         alignment.  Thus, we don't handle those cases here.  */
2960     record_alignment (now_seg, state == MAP_ARM ? 2 : 1);
2961
2962   if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
2963     /* This case will be evaluated later.  */
2964     return;
2965
2966   mapping_state_2 (state, 0);
2967 }
2968
2969 /* Same as mapping_state, but MAX_CHARS bytes have already been
2970    allocated.  Put the mapping symbol that far back.  */
2971
2972 static void
2973 mapping_state_2 (enum mstate state, int max_chars)
2974 {
2975   enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2976
2977   if (!SEG_NORMAL (now_seg))
2978     return;
2979
2980   if (mapstate == state)
2981     /* The mapping symbol has already been emitted.
2982        There is nothing else to do.  */
2983     return;
2984
2985   if (TRANSITION (MAP_UNDEFINED, MAP_ARM)
2986           || TRANSITION (MAP_UNDEFINED, MAP_THUMB))
2987     {
2988       struct frag * const frag_first = seg_info (now_seg)->frchainP->frch_root;
2989       const int add_symbol = (frag_now != frag_first) || (frag_now_fix () > 0);
2990
2991       if (add_symbol)
2992         make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
2993     }
2994
2995   seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2996   make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
2997 }
2998 #undef TRANSITION
2999 #else
3000 #define mapping_state(x) ((void)0)
3001 #define mapping_state_2(x, y) ((void)0)
3002 #endif
3003
3004 /* Find the real, Thumb encoded start of a Thumb function.  */
3005
3006 #ifdef OBJ_COFF
3007 static symbolS *
3008 find_real_start (symbolS * symbolP)
3009 {
3010   char *       real_start;
3011   const char * name = S_GET_NAME (symbolP);
3012   symbolS *    new_target;
3013
3014   /* This definition must agree with the one in gcc/config/arm/thumb.c.  */
3015 #define STUB_NAME ".real_start_of"
3016
3017   if (name == NULL)
3018     abort ();
3019
3020   /* The compiler may generate BL instructions to local labels because
3021      it needs to perform a branch to a far away location. These labels
3022      do not have a corresponding ".real_start_of" label.  We check
3023      both for S_IS_LOCAL and for a leading dot, to give a way to bypass
3024      the ".real_start_of" convention for nonlocal branches.  */
3025   if (S_IS_LOCAL (symbolP) || name[0] == '.')
3026     return symbolP;
3027
3028   real_start = concat (STUB_NAME, name, NULL);
3029   new_target = symbol_find (real_start);
3030   free (real_start);
3031
3032   if (new_target == NULL)
3033     {
3034       as_warn (_("Failed to find real start of function: %s\n"), name);
3035       new_target = symbolP;
3036     }
3037
3038   return new_target;
3039 }
3040 #endif
3041
3042 static void
3043 opcode_select (int width)
3044 {
3045   switch (width)
3046     {
3047     case 16:
3048       if (! thumb_mode)
3049         {
3050           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
3051             as_bad (_("selected processor does not support THUMB opcodes"));
3052
3053           thumb_mode = 1;
3054           /* No need to force the alignment, since we will have been
3055              coming from ARM mode, which is word-aligned.  */
3056           record_alignment (now_seg, 1);
3057         }
3058       break;
3059
3060     case 32:
3061       if (thumb_mode)
3062         {
3063           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
3064             as_bad (_("selected processor does not support ARM opcodes"));
3065
3066           thumb_mode = 0;
3067
3068           if (!need_pass_2)
3069             frag_align (2, 0, 0);
3070
3071           record_alignment (now_seg, 1);
3072         }
3073       break;
3074
3075     default:
3076       as_bad (_("invalid instruction size selected (%d)"), width);
3077     }
3078 }
3079
3080 static void
3081 s_arm (int ignore ATTRIBUTE_UNUSED)
3082 {
3083   opcode_select (32);
3084   demand_empty_rest_of_line ();
3085 }
3086
3087 static void
3088 s_thumb (int ignore ATTRIBUTE_UNUSED)
3089 {
3090   opcode_select (16);
3091   demand_empty_rest_of_line ();
3092 }
3093
3094 static void
3095 s_code (int unused ATTRIBUTE_UNUSED)
3096 {
3097   int temp;
3098
3099   temp = get_absolute_expression ();
3100   switch (temp)
3101     {
3102     case 16:
3103     case 32:
3104       opcode_select (temp);
3105       break;
3106
3107     default:
3108       as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
3109     }
3110 }
3111
3112 static void
3113 s_force_thumb (int ignore ATTRIBUTE_UNUSED)
3114 {
3115   /* If we are not already in thumb mode go into it, EVEN if
3116      the target processor does not support thumb instructions.
3117      This is used by gcc/config/arm/lib1funcs.asm for example
3118      to compile interworking support functions even if the
3119      target processor should not support interworking.  */
3120   if (! thumb_mode)
3121     {
3122       thumb_mode = 2;
3123       record_alignment (now_seg, 1);
3124     }
3125
3126   demand_empty_rest_of_line ();
3127 }
3128
3129 static void
3130 s_thumb_func (int ignore ATTRIBUTE_UNUSED)
3131 {
3132   s_thumb (0);
3133
3134   /* The following label is the name/address of the start of a Thumb function.
3135      We need to know this for the interworking support.  */
3136   label_is_thumb_function_name = TRUE;
3137 }
3138
3139 /* Perform a .set directive, but also mark the alias as
3140    being a thumb function.  */
3141
3142 static void
3143 s_thumb_set (int equiv)
3144 {
3145   /* XXX the following is a duplicate of the code for s_set() in read.c
3146      We cannot just call that code as we need to get at the symbol that
3147      is created.  */
3148   char *    name;
3149   char      delim;
3150   char *    end_name;
3151   symbolS * symbolP;
3152
3153   /* Especial apologies for the random logic:
3154      This just grew, and could be parsed much more simply!
3155      Dean - in haste.  */
3156   delim     = get_symbol_name (& name);
3157   end_name  = input_line_pointer;
3158   (void) restore_line_pointer (delim);
3159
3160   if (*input_line_pointer != ',')
3161     {
3162       *end_name = 0;
3163       as_bad (_("expected comma after name \"%s\""), name);
3164       *end_name = delim;
3165       ignore_rest_of_line ();
3166       return;
3167     }
3168
3169   input_line_pointer++;
3170   *end_name = 0;
3171
3172   if (name[0] == '.' && name[1] == '\0')
3173     {
3174       /* XXX - this should not happen to .thumb_set.  */
3175       abort ();
3176     }
3177
3178   if ((symbolP = symbol_find (name)) == NULL
3179       && (symbolP = md_undefined_symbol (name)) == NULL)
3180     {
3181 #ifndef NO_LISTING
3182       /* When doing symbol listings, play games with dummy fragments living
3183          outside the normal fragment chain to record the file and line info
3184          for this symbol.  */
3185       if (listing & LISTING_SYMBOLS)
3186         {
3187           extern struct list_info_struct * listing_tail;
3188           fragS * dummy_frag = (fragS * ) xmalloc (sizeof (fragS));
3189
3190           memset (dummy_frag, 0, sizeof (fragS));
3191           dummy_frag->fr_type = rs_fill;
3192           dummy_frag->line = listing_tail;
3193           symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
3194           dummy_frag->fr_symbol = symbolP;
3195         }
3196       else
3197 #endif
3198         symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
3199
3200 #ifdef OBJ_COFF
3201       /* "set" symbols are local unless otherwise specified.  */
3202       SF_SET_LOCAL (symbolP);
3203 #endif /* OBJ_COFF  */
3204     }                           /* Make a new symbol.  */
3205
3206   symbol_table_insert (symbolP);
3207
3208   * end_name = delim;
3209
3210   if (equiv
3211       && S_IS_DEFINED (symbolP)
3212       && S_GET_SEGMENT (symbolP) != reg_section)
3213     as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
3214
3215   pseudo_set (symbolP);
3216
3217   demand_empty_rest_of_line ();
3218
3219   /* XXX Now we come to the Thumb specific bit of code.  */
3220
3221   THUMB_SET_FUNC (symbolP, 1);
3222   ARM_SET_THUMB (symbolP, 1);
3223 #if defined OBJ_ELF || defined OBJ_COFF
3224   ARM_SET_INTERWORK (symbolP, support_interwork);
3225 #endif
3226 }
3227
3228 /* Directives: Mode selection.  */
3229
3230 /* .syntax [unified|divided] - choose the new unified syntax
3231    (same for Arm and Thumb encoding, modulo slight differences in what
3232    can be represented) or the old divergent syntax for each mode.  */
3233 static void
3234 s_syntax (int unused ATTRIBUTE_UNUSED)
3235 {
3236   char *name, delim;
3237
3238   delim = get_symbol_name (& name);
3239
3240   if (!strcasecmp (name, "unified"))
3241     unified_syntax = TRUE;
3242   else if (!strcasecmp (name, "divided"))
3243     unified_syntax = FALSE;
3244   else
3245     {
3246       as_bad (_("unrecognized syntax mode \"%s\""), name);
3247       return;
3248     }
3249   (void) restore_line_pointer (delim);
3250   demand_empty_rest_of_line ();
3251 }
3252
3253 /* Directives: sectioning and alignment.  */
3254
3255 static void
3256 s_bss (int ignore ATTRIBUTE_UNUSED)
3257 {
3258   /* We don't support putting frags in the BSS segment, we fake it by
3259      marking in_bss, then looking at s_skip for clues.  */
3260   subseg_set (bss_section, 0);
3261   demand_empty_rest_of_line ();
3262
3263 #ifdef md_elf_section_change_hook
3264   md_elf_section_change_hook ();
3265 #endif
3266 }
3267
3268 static void
3269 s_even (int ignore ATTRIBUTE_UNUSED)
3270 {
3271   /* Never make frag if expect extra pass.  */
3272   if (!need_pass_2)
3273     frag_align (1, 0, 0);
3274
3275   record_alignment (now_seg, 1);
3276
3277   demand_empty_rest_of_line ();
3278 }
3279
3280 /* Directives: CodeComposer Studio.  */
3281
3282 /*  .ref  (for CodeComposer Studio syntax only).  */
3283 static void
3284 s_ccs_ref (int unused ATTRIBUTE_UNUSED)
3285 {
3286   if (codecomposer_syntax)
3287     ignore_rest_of_line ();
3288   else
3289     as_bad (_(".ref pseudo-op only available with -mccs flag."));
3290 }
3291
3292 /*  If name is not NULL, then it is used for marking the beginning of a
3293     function, whereas if it is NULL then it means the function end.  */
3294 static void
3295 asmfunc_debug (const char * name)
3296 {
3297   static const char * last_name = NULL;
3298
3299   if (name != NULL)
3300     {
3301       gas_assert (last_name == NULL);
3302       last_name = name;
3303
3304       if (debug_type == DEBUG_STABS)
3305          stabs_generate_asm_func (name, name);
3306     }
3307   else
3308     {
3309       gas_assert (last_name != NULL);
3310
3311       if (debug_type == DEBUG_STABS)
3312         stabs_generate_asm_endfunc (last_name, last_name);
3313
3314       last_name = NULL;
3315     }
3316 }
3317
3318 static void
3319 s_ccs_asmfunc (int unused ATTRIBUTE_UNUSED)
3320 {
3321   if (codecomposer_syntax)
3322     {
3323       switch (asmfunc_state)
3324         {
3325         case OUTSIDE_ASMFUNC:
3326           asmfunc_state = WAITING_ASMFUNC_NAME;
3327           break;
3328
3329         case WAITING_ASMFUNC_NAME:
3330           as_bad (_(".asmfunc repeated."));
3331           break;
3332
3333         case WAITING_ENDASMFUNC:
3334           as_bad (_(".asmfunc without function."));
3335           break;
3336         }
3337       demand_empty_rest_of_line ();
3338     }
3339   else
3340     as_bad (_(".asmfunc pseudo-op only available with -mccs flag."));
3341 }
3342
3343 static void
3344 s_ccs_endasmfunc (int unused ATTRIBUTE_UNUSED)
3345 {
3346   if (codecomposer_syntax)
3347     {
3348       switch (asmfunc_state)
3349         {
3350         case OUTSIDE_ASMFUNC:
3351           as_bad (_(".endasmfunc without a .asmfunc."));
3352           break;
3353
3354         case WAITING_ASMFUNC_NAME:
3355           as_bad (_(".endasmfunc without function."));
3356           break;
3357
3358         case WAITING_ENDASMFUNC:
3359           asmfunc_state = OUTSIDE_ASMFUNC;
3360           asmfunc_debug (NULL);
3361           break;
3362         }
3363       demand_empty_rest_of_line ();
3364     }
3365   else
3366     as_bad (_(".endasmfunc pseudo-op only available with -mccs flag."));
3367 }
3368
3369 static void
3370 s_ccs_def (int name)
3371 {
3372   if (codecomposer_syntax)
3373     s_globl (name);
3374   else
3375     as_bad (_(".def pseudo-op only available with -mccs flag."));
3376 }
3377
3378 /* Directives: Literal pools.  */
3379
3380 static literal_pool *
3381 find_literal_pool (void)
3382 {
3383   literal_pool * pool;
3384
3385   for (pool = list_of_pools; pool != NULL; pool = pool->next)
3386     {
3387       if (pool->section == now_seg
3388           && pool->sub_section == now_subseg)
3389         break;
3390     }
3391
3392   return pool;
3393 }
3394
3395 static literal_pool *
3396 find_or_make_literal_pool (void)
3397 {
3398   /* Next literal pool ID number.  */
3399   static unsigned int latest_pool_num = 1;
3400   literal_pool *      pool;
3401
3402   pool = find_literal_pool ();
3403
3404   if (pool == NULL)
3405     {
3406       /* Create a new pool.  */
3407       pool = XNEW (literal_pool);
3408       if (! pool)
3409         return NULL;
3410
3411       pool->next_free_entry = 0;
3412       pool->section         = now_seg;
3413       pool->sub_section     = now_subseg;
3414       pool->next            = list_of_pools;
3415       pool->symbol          = NULL;
3416       pool->alignment       = 2;
3417
3418       /* Add it to the list.  */
3419       list_of_pools = pool;
3420     }
3421
3422   /* New pools, and emptied pools, will have a NULL symbol.  */
3423   if (pool->symbol == NULL)
3424     {
3425       pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
3426                                     (valueT) 0, &zero_address_frag);
3427       pool->id = latest_pool_num ++;
3428     }
3429
3430   /* Done.  */
3431   return pool;
3432 }
3433
3434 /* Add the literal in the global 'inst'
3435    structure to the relevant literal pool.  */
3436
3437 static int
3438 add_to_lit_pool (unsigned int nbytes)
3439 {
3440 #define PADDING_SLOT 0x1
3441 #define LIT_ENTRY_SIZE_MASK 0xFF
3442   literal_pool * pool;
3443   unsigned int entry, pool_size = 0;
3444   bfd_boolean padding_slot_p = FALSE;
3445   unsigned imm1 = 0;
3446   unsigned imm2 = 0;
3447
3448   if (nbytes == 8)
3449     {
3450       imm1 = inst.operands[1].imm;
3451       imm2 = (inst.operands[1].regisimm ? inst.operands[1].reg
3452                : inst.relocs[0].exp.X_unsigned ? 0
3453                : ((bfd_int64_t) inst.operands[1].imm) >> 32);
3454       if (target_big_endian)
3455         {
3456           imm1 = imm2;
3457           imm2 = inst.operands[1].imm;
3458         }
3459     }
3460
3461   pool = find_or_make_literal_pool ();
3462
3463   /* Check if this literal value is already in the pool.  */
3464   for (entry = 0; entry < pool->next_free_entry; entry ++)
3465     {
3466       if (nbytes == 4)
3467         {
3468           if ((pool->literals[entry].X_op == inst.relocs[0].exp.X_op)
3469               && (inst.relocs[0].exp.X_op == O_constant)
3470               && (pool->literals[entry].X_add_number
3471                   == inst.relocs[0].exp.X_add_number)
3472               && (pool->literals[entry].X_md == nbytes)
3473               && (pool->literals[entry].X_unsigned
3474                   == inst.relocs[0].exp.X_unsigned))
3475             break;
3476
3477           if ((pool->literals[entry].X_op == inst.relocs[0].exp.X_op)
3478               && (inst.relocs[0].exp.X_op == O_symbol)
3479               && (pool->literals[entry].X_add_number
3480                   == inst.relocs[0].exp.X_add_number)
3481               && (pool->literals[entry].X_add_symbol
3482                   == inst.relocs[0].exp.X_add_symbol)
3483               && (pool->literals[entry].X_op_symbol
3484                   == inst.relocs[0].exp.X_op_symbol)
3485               && (pool->literals[entry].X_md == nbytes))
3486             break;
3487         }
3488       else if ((nbytes == 8)
3489                && !(pool_size & 0x7)
3490                && ((entry + 1) != pool->next_free_entry)
3491                && (pool->literals[entry].X_op == O_constant)
3492                && (pool->literals[entry].X_add_number == (offsetT) imm1)
3493                && (pool->literals[entry].X_unsigned
3494                    == inst.relocs[0].exp.X_unsigned)
3495                && (pool->literals[entry + 1].X_op == O_constant)
3496                && (pool->literals[entry + 1].X_add_number == (offsetT) imm2)
3497                && (pool->literals[entry + 1].X_unsigned
3498                    == inst.relocs[0].exp.X_unsigned))
3499         break;
3500
3501       padding_slot_p = ((pool->literals[entry].X_md >> 8) == PADDING_SLOT);
3502       if (padding_slot_p && (nbytes == 4))
3503         break;
3504
3505       pool_size += 4;
3506     }
3507
3508   /* Do we need to create a new entry?  */
3509   if (entry == pool->next_free_entry)
3510     {
3511       if (entry >= MAX_LITERAL_POOL_SIZE)
3512         {
3513           inst.error = _("literal pool overflow");
3514           return FAIL;
3515         }
3516
3517       if (nbytes == 8)
3518         {
3519           /* For 8-byte entries, we align to an 8-byte boundary,
3520              and split it into two 4-byte entries, because on 32-bit
3521              host, 8-byte constants are treated as big num, thus
3522              saved in "generic_bignum" which will be overwritten
3523              by later assignments.
3524
3525              We also need to make sure there is enough space for
3526              the split.
3527
3528              We also check to make sure the literal operand is a
3529              constant number.  */
3530           if (!(inst.relocs[0].exp.X_op == O_constant
3531                 || inst.relocs[0].exp.X_op == O_big))
3532             {
3533               inst.error = _("invalid type for literal pool");
3534               return FAIL;
3535             }
3536           else if (pool_size & 0x7)
3537             {
3538               if ((entry + 2) >= MAX_LITERAL_POOL_SIZE)
3539                 {
3540                   inst.error = _("literal pool overflow");
3541                   return FAIL;
3542                 }
3543
3544               pool->literals[entry] = inst.relocs[0].exp;
3545               pool->literals[entry].X_op = O_constant;
3546               pool->literals[entry].X_add_number = 0;
3547               pool->literals[entry++].X_md = (PADDING_SLOT << 8) | 4;
3548               pool->next_free_entry += 1;
3549               pool_size += 4;
3550             }
3551           else if ((entry + 1) >= MAX_LITERAL_POOL_SIZE)
3552             {
3553               inst.error = _("literal pool overflow");
3554               return FAIL;
3555             }
3556
3557           pool->literals[entry] = inst.relocs[0].exp;
3558           pool->literals[entry].X_op = O_constant;
3559           pool->literals[entry].X_add_number = imm1;
3560           pool->literals[entry].X_unsigned = inst.relocs[0].exp.X_unsigned;
3561           pool->literals[entry++].X_md = 4;
3562           pool->literals[entry] = inst.relocs[0].exp;
3563           pool->literals[entry].X_op = O_constant;
3564           pool->literals[entry].X_add_number = imm2;
3565           pool->literals[entry].X_unsigned = inst.relocs[0].exp.X_unsigned;
3566           pool->literals[entry].X_md = 4;
3567           pool->alignment = 3;
3568           pool->next_free_entry += 1;
3569         }
3570       else
3571         {
3572           pool->literals[entry] = inst.relocs[0].exp;
3573           pool->literals[entry].X_md = 4;
3574         }
3575
3576 #ifdef OBJ_ELF
3577       /* PR ld/12974: Record the location of the first source line to reference
3578          this entry in the literal pool.  If it turns out during linking that the
3579          symbol does not exist we will be able to give an accurate line number for
3580          the (first use of the) missing reference.  */
3581       if (debug_type == DEBUG_DWARF2)
3582         dwarf2_where (pool->locs + entry);
3583 #endif
3584       pool->next_free_entry += 1;
3585     }
3586   else if (padding_slot_p)
3587     {
3588       pool->literals[entry] = inst.relocs[0].exp;
3589       pool->literals[entry].X_md = nbytes;
3590     }
3591
3592   inst.relocs[0].exp.X_op             = O_symbol;
3593   inst.relocs[0].exp.X_add_number = pool_size;
3594   inst.relocs[0].exp.X_add_symbol = pool->symbol;
3595
3596   return SUCCESS;
3597 }
3598
3599 bfd_boolean
3600 tc_start_label_without_colon (void)
3601 {
3602   bfd_boolean ret = TRUE;
3603
3604   if (codecomposer_syntax && asmfunc_state == WAITING_ASMFUNC_NAME)
3605     {
3606       const char *label = input_line_pointer;
3607
3608       while (!is_end_of_line[(int) label[-1]])
3609         --label;
3610
3611       if (*label == '.')
3612         {
3613           as_bad (_("Invalid label '%s'"), label);
3614           ret = FALSE;
3615         }
3616
3617       asmfunc_debug (label);
3618
3619       asmfunc_state = WAITING_ENDASMFUNC;
3620     }
3621
3622   return ret;
3623 }
3624
3625 /* Can't use symbol_new here, so have to create a symbol and then at
3626    a later date assign it a value. That's what these functions do.  */
3627
3628 static void
3629 symbol_locate (symbolS *    symbolP,
3630                const char * name,       /* It is copied, the caller can modify.  */
3631                segT         segment,    /* Segment identifier (SEG_<something>).  */
3632                valueT       valu,       /* Symbol value.  */
3633                fragS *      frag)       /* Associated fragment.  */
3634 {
3635   size_t name_length;
3636   char * preserved_copy_of_name;
3637
3638   name_length = strlen (name) + 1;   /* +1 for \0.  */
3639   obstack_grow (&notes, name, name_length);
3640   preserved_copy_of_name = (char *) obstack_finish (&notes);
3641
3642 #ifdef tc_canonicalize_symbol_name
3643   preserved_copy_of_name =
3644     tc_canonicalize_symbol_name (preserved_copy_of_name);
3645 #endif
3646
3647   S_SET_NAME (symbolP, preserved_copy_of_name);
3648
3649   S_SET_SEGMENT (symbolP, segment);
3650   S_SET_VALUE (symbolP, valu);
3651   symbol_clear_list_pointers (symbolP);
3652
3653   symbol_set_frag (symbolP, frag);
3654
3655   /* Link to end of symbol chain.  */
3656   {
3657     extern int symbol_table_frozen;
3658
3659     if (symbol_table_frozen)
3660       abort ();
3661   }
3662
3663   symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
3664
3665   obj_symbol_new_hook (symbolP);
3666
3667 #ifdef tc_symbol_new_hook
3668   tc_symbol_new_hook (symbolP);
3669 #endif
3670
3671 #ifdef DEBUG_SYMS
3672   verify_symbol_chain (symbol_rootP, symbol_lastP);
3673 #endif /* DEBUG_SYMS  */
3674 }
3675
3676 static void
3677 s_ltorg (int ignored ATTRIBUTE_UNUSED)
3678 {
3679   unsigned int entry;
3680   literal_pool * pool;
3681   char sym_name[20];
3682
3683   pool = find_literal_pool ();
3684   if (pool == NULL
3685       || pool->symbol == NULL
3686       || pool->next_free_entry == 0)
3687     return;
3688
3689   /* Align pool as you have word accesses.
3690      Only make a frag if we have to.  */
3691   if (!need_pass_2)
3692     frag_align (pool->alignment, 0, 0);
3693
3694   record_alignment (now_seg, 2);
3695
3696 #ifdef OBJ_ELF
3697   seg_info (now_seg)->tc_segment_info_data.mapstate = MAP_DATA;
3698   make_mapping_symbol (MAP_DATA, (valueT) frag_now_fix (), frag_now);
3699 #endif
3700   sprintf (sym_name, "$$lit_\002%x", pool->id);
3701
3702   symbol_locate (pool->symbol, sym_name, now_seg,
3703                  (valueT) frag_now_fix (), frag_now);
3704   symbol_table_insert (pool->symbol);
3705
3706   ARM_SET_THUMB (pool->symbol, thumb_mode);
3707
3708 #if defined OBJ_COFF || defined OBJ_ELF
3709   ARM_SET_INTERWORK (pool->symbol, support_interwork);
3710 #endif
3711
3712   for (entry = 0; entry < pool->next_free_entry; entry ++)
3713     {
3714 #ifdef OBJ_ELF
3715       if (debug_type == DEBUG_DWARF2)
3716         dwarf2_gen_line_info (frag_now_fix (), pool->locs + entry);
3717 #endif
3718       /* First output the expression in the instruction to the pool.  */
3719       emit_expr (&(pool->literals[entry]),
3720                  pool->literals[entry].X_md & LIT_ENTRY_SIZE_MASK);
3721     }
3722
3723   /* Mark the pool as empty.  */
3724   pool->next_free_entry = 0;
3725   pool->symbol = NULL;
3726 }
3727
3728 #ifdef OBJ_ELF
3729 /* Forward declarations for functions below, in the MD interface
3730    section.  */
3731 static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
3732 static valueT create_unwind_entry (int);
3733 static void start_unwind_section (const segT, int);
3734 static void add_unwind_opcode (valueT, int);
3735 static void flush_pending_unwind (void);
3736
3737 /* Directives: Data.  */
3738
3739 static void
3740 s_arm_elf_cons (int nbytes)
3741 {
3742   expressionS exp;
3743
3744 #ifdef md_flush_pending_output
3745   md_flush_pending_output ();
3746 #endif
3747
3748   if (is_it_end_of_statement ())
3749     {
3750       demand_empty_rest_of_line ();
3751       return;
3752     }
3753
3754 #ifdef md_cons_align
3755   md_cons_align (nbytes);
3756 #endif
3757
3758   mapping_state (MAP_DATA);
3759   do
3760     {
3761       int reloc;
3762       char *base = input_line_pointer;
3763
3764       expression (& exp);
3765
3766       if (exp.X_op != O_symbol)
3767         emit_expr (&exp, (unsigned int) nbytes);
3768       else
3769         {
3770           char *before_reloc = input_line_pointer;
3771           reloc = parse_reloc (&input_line_pointer);
3772           if (reloc == -1)
3773             {
3774               as_bad (_("unrecognized relocation suffix"));
3775               ignore_rest_of_line ();
3776               return;
3777             }
3778           else if (reloc == BFD_RELOC_UNUSED)
3779             emit_expr (&exp, (unsigned int) nbytes);
3780           else
3781             {
3782               reloc_howto_type *howto = (reloc_howto_type *)
3783                   bfd_reloc_type_lookup (stdoutput,
3784                                          (bfd_reloc_code_real_type) reloc);
3785               int size = bfd_get_reloc_size (howto);
3786
3787               if (reloc == BFD_RELOC_ARM_PLT32)
3788                 {
3789                   as_bad (_("(plt) is only valid on branch targets"));
3790                   reloc = BFD_RELOC_UNUSED;
3791                   size = 0;
3792                 }
3793
3794               if (size > nbytes)
3795                 as_bad (ngettext ("%s relocations do not fit in %d byte",
3796                                   "%s relocations do not fit in %d bytes",
3797                                   nbytes),
3798                         howto->name, nbytes);
3799               else
3800                 {
3801                   /* We've parsed an expression stopping at O_symbol.
3802                      But there may be more expression left now that we
3803                      have parsed the relocation marker.  Parse it again.
3804                      XXX Surely there is a cleaner way to do this.  */
3805                   char *p = input_line_pointer;
3806                   int offset;
3807                   char *save_buf = XNEWVEC (char, input_line_pointer - base);
3808
3809                   memcpy (save_buf, base, input_line_pointer - base);
3810                   memmove (base + (input_line_pointer - before_reloc),
3811                            base, before_reloc - base);
3812
3813                   input_line_pointer = base + (input_line_pointer-before_reloc);
3814                   expression (&exp);
3815                   memcpy (base, save_buf, p - base);
3816
3817                   offset = nbytes - size;
3818                   p = frag_more (nbytes);
3819                   memset (p, 0, nbytes);
3820                   fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
3821                                size, &exp, 0, (enum bfd_reloc_code_real) reloc);
3822                   free (save_buf);
3823                 }
3824             }
3825         }
3826     }
3827   while (*input_line_pointer++ == ',');
3828
3829   /* Put terminator back into stream.  */
3830   input_line_pointer --;
3831   demand_empty_rest_of_line ();
3832 }
3833
3834 /* Emit an expression containing a 32-bit thumb instruction.
3835    Implementation based on put_thumb32_insn.  */
3836
3837 static void
3838 emit_thumb32_expr (expressionS * exp)
3839 {
3840   expressionS exp_high = *exp;
3841
3842   exp_high.X_add_number = (unsigned long)exp_high.X_add_number >> 16;
3843   emit_expr (& exp_high, (unsigned int) THUMB_SIZE);
3844   exp->X_add_number &= 0xffff;
3845   emit_expr (exp, (unsigned int) THUMB_SIZE);
3846 }
3847
3848 /*  Guess the instruction size based on the opcode.  */
3849
3850 static int
3851 thumb_insn_size (int opcode)
3852 {
3853   if ((unsigned int) opcode < 0xe800u)
3854     return 2;
3855   else if ((unsigned int) opcode >= 0xe8000000u)
3856     return 4;
3857   else
3858     return 0;
3859 }
3860
3861 static bfd_boolean
3862 emit_insn (expressionS *exp, int nbytes)
3863 {
3864   int size = 0;
3865
3866   if (exp->X_op == O_constant)
3867     {
3868       size = nbytes;
3869
3870       if (size == 0)
3871         size = thumb_insn_size (exp->X_add_number);
3872
3873       if (size != 0)
3874         {
3875           if (size == 2 && (unsigned int)exp->X_add_number > 0xffffu)
3876             {
3877               as_bad (_(".inst.n operand too big. "\
3878                         "Use .inst.w instead"));
3879               size = 0;
3880             }
3881           else
3882             {
3883               if (now_pred.state == AUTOMATIC_PRED_BLOCK)
3884                 set_pred_insn_type_nonvoid (OUTSIDE_PRED_INSN, 0);
3885               else
3886                 set_pred_insn_type_nonvoid (NEUTRAL_IT_INSN, 0);
3887
3888               if (thumb_mode && (size > THUMB_SIZE) && !target_big_endian)
3889                 emit_thumb32_expr (exp);
3890               else
3891                 emit_expr (exp, (unsigned int) size);
3892
3893               it_fsm_post_encode ();
3894             }
3895         }
3896       else
3897         as_bad (_("cannot determine Thumb instruction size. "   \
3898                   "Use .inst.n/.inst.w instead"));
3899     }
3900   else
3901     as_bad (_("constant expression required"));
3902
3903   return (size != 0);
3904 }
3905
3906 /* Like s_arm_elf_cons but do not use md_cons_align and
3907    set the mapping state to MAP_ARM/MAP_THUMB.  */
3908
3909 static void
3910 s_arm_elf_inst (int nbytes)
3911 {
3912   if (is_it_end_of_statement ())
3913     {
3914       demand_empty_rest_of_line ();
3915       return;
3916     }
3917
3918   /* Calling mapping_state () here will not change ARM/THUMB,
3919      but will ensure not to be in DATA state.  */
3920
3921   if (thumb_mode)
3922     mapping_state (MAP_THUMB);
3923   else
3924     {
3925       if (nbytes != 0)
3926         {
3927           as_bad (_("width suffixes are invalid in ARM mode"));
3928           ignore_rest_of_line ();
3929           return;
3930         }
3931
3932       nbytes = 4;
3933
3934       mapping_state (MAP_ARM);
3935     }
3936
3937   do
3938     {
3939       expressionS exp;
3940
3941       expression (& exp);
3942
3943       if (! emit_insn (& exp, nbytes))
3944         {
3945           ignore_rest_of_line ();
3946           return;
3947         }
3948     }
3949   while (*input_line_pointer++ == ',');
3950
3951   /* Put terminator back into stream.  */
3952   input_line_pointer --;
3953   demand_empty_rest_of_line ();
3954 }
3955
3956 /* Parse a .rel31 directive.  */
3957
3958 static void
3959 s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
3960 {
3961   expressionS exp;
3962   char *p;
3963   valueT highbit;
3964
3965   highbit = 0;
3966   if (*input_line_pointer == '1')
3967     highbit = 0x80000000;
3968   else if (*input_line_pointer != '0')
3969     as_bad (_("expected 0 or 1"));
3970
3971   input_line_pointer++;
3972   if (*input_line_pointer != ',')
3973     as_bad (_("missing comma"));
3974   input_line_pointer++;
3975
3976 #ifdef md_flush_pending_output
3977   md_flush_pending_output ();
3978 #endif
3979
3980 #ifdef md_cons_align
3981   md_cons_align (4);
3982 #endif
3983
3984   mapping_state (MAP_DATA);
3985
3986   expression (&exp);
3987
3988   p = frag_more (4);
3989   md_number_to_chars (p, highbit, 4);
3990   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3991                BFD_RELOC_ARM_PREL31);
3992
3993   demand_empty_rest_of_line ();
3994 }
3995
3996 /* Directives: AEABI stack-unwind tables.  */
3997
3998 /* Parse an unwind_fnstart directive.  Simply records the current location.  */
3999
4000 static void
4001 s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
4002 {
4003   demand_empty_rest_of_line ();
4004   if (unwind.proc_start)
4005     {
4006       as_bad (_("duplicate .fnstart directive"));
4007       return;
4008     }
4009
4010   /* Mark the start of the function.  */
4011   unwind.proc_start = expr_build_dot ();
4012
4013   /* Reset the rest of the unwind info.  */
4014   unwind.opcode_count = 0;
4015   unwind.table_entry = NULL;
4016   unwind.personality_routine = NULL;
4017   unwind.personality_index = -1;
4018   unwind.frame_size = 0;
4019   unwind.fp_offset = 0;
4020   unwind.fp_reg = REG_SP;
4021   unwind.fp_used = 0;
4022   unwind.sp_restored = 0;
4023 }
4024
4025
4026 /* Parse a handlerdata directive.  Creates the exception handling table entry
4027    for the function.  */
4028
4029 static void
4030 s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
4031 {
4032   demand_empty_rest_of_line ();
4033   if (!unwind.proc_start)
4034     as_bad (MISSING_FNSTART);
4035
4036   if (unwind.table_entry)
4037     as_bad (_("duplicate .handlerdata directive"));
4038
4039   create_unwind_entry (1);
4040 }
4041
4042 /* Parse an unwind_fnend directive.  Generates the index table entry.  */
4043
4044 static void
4045 s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
4046 {
4047   long where;
4048   char *ptr;
4049   valueT val;
4050   unsigned int marked_pr_dependency;
4051
4052   demand_empty_rest_of_line ();
4053
4054   if (!unwind.proc_start)
4055     {
4056       as_bad (_(".fnend directive without .fnstart"));
4057       return;
4058     }
4059
4060   /* Add eh table entry.  */
4061   if (unwind.table_entry == NULL)
4062     val = create_unwind_entry (0);
4063   else
4064     val = 0;
4065
4066   /* Add index table entry.  This is two words.  */
4067   start_unwind_section (unwind.saved_seg, 1);
4068   frag_align (2, 0, 0);
4069   record_alignment (now_seg, 2);
4070
4071   ptr = frag_more (8);
4072   memset (ptr, 0, 8);
4073   where = frag_now_fix () - 8;
4074
4075   /* Self relative offset of the function start.  */
4076   fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
4077            BFD_RELOC_ARM_PREL31);
4078
4079   /* Indicate dependency on EHABI-defined personality routines to the
4080      linker, if it hasn't been done already.  */
4081   marked_pr_dependency
4082     = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
4083   if (unwind.personality_index >= 0 && unwind.personality_index < 3
4084       && !(marked_pr_dependency & (1 << unwind.personality_index)))
4085     {
4086       static const char *const name[] =
4087         {
4088           "__aeabi_unwind_cpp_pr0",
4089           "__aeabi_unwind_cpp_pr1",
4090           "__aeabi_unwind_cpp_pr2"
4091         };
4092       symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
4093       fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
4094       seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
4095         |= 1 << unwind.personality_index;
4096     }
4097
4098   if (val)
4099     /* Inline exception table entry.  */
4100     md_number_to_chars (ptr + 4, val, 4);
4101   else
4102     /* Self relative offset of the table entry.  */
4103     fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
4104              BFD_RELOC_ARM_PREL31);
4105
4106   /* Restore the original section.  */
4107   subseg_set (unwind.saved_seg, unwind.saved_subseg);
4108
4109   unwind.proc_start = NULL;
4110 }
4111
4112
4113 /* Parse an unwind_cantunwind directive.  */
4114
4115 static void
4116 s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
4117 {
4118   demand_empty_rest_of_line ();
4119   if (!unwind.proc_start)
4120     as_bad (MISSING_FNSTART);
4121
4122   if (unwind.personality_routine || unwind.personality_index != -1)
4123     as_bad (_("personality routine specified for cantunwind frame"));
4124
4125   unwind.personality_index = -2;
4126 }
4127
4128
4129 /* Parse a personalityindex directive.  */
4130
4131 static void
4132 s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
4133 {
4134   expressionS exp;
4135
4136   if (!unwind.proc_start)
4137     as_bad (MISSING_FNSTART);
4138
4139   if (unwind.personality_routine || unwind.personality_index != -1)
4140     as_bad (_("duplicate .personalityindex directive"));
4141
4142   expression (&exp);
4143
4144   if (exp.X_op != O_constant
4145       || exp.X_add_number < 0 || exp.X_add_number > 15)
4146     {
4147       as_bad (_("bad personality routine number"));
4148       ignore_rest_of_line ();
4149       return;
4150     }
4151
4152   unwind.personality_index = exp.X_add_number;
4153
4154   demand_empty_rest_of_line ();
4155 }
4156
4157
4158 /* Parse a personality directive.  */
4159
4160 static void
4161 s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
4162 {
4163   char *name, *p, c;
4164
4165   if (!unwind.proc_start)
4166     as_bad (MISSING_FNSTART);
4167
4168   if (unwind.personality_routine || unwind.personality_index != -1)
4169     as_bad (_("duplicate .personality directive"));
4170
4171   c = get_symbol_name (& name);
4172   p = input_line_pointer;
4173   if (c == '"')
4174     ++ input_line_pointer;
4175   unwind.personality_routine = symbol_find_or_make (name);
4176   *p = c;
4177   demand_empty_rest_of_line ();
4178 }
4179
4180
4181 /* Parse a directive saving core registers.  */
4182
4183 static void
4184 s_arm_unwind_save_core (void)
4185 {
4186   valueT op;
4187   long range;
4188   int n;
4189
4190   range = parse_reg_list (&input_line_pointer, REGLIST_RN);
4191   if (range == FAIL)
4192     {
4193       as_bad (_("expected register list"));
4194       ignore_rest_of_line ();
4195       return;
4196     }
4197
4198   demand_empty_rest_of_line ();
4199
4200   /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
4201      into .unwind_save {..., sp...}.  We aren't bothered about the value of
4202      ip because it is clobbered by calls.  */
4203   if (unwind.sp_restored && unwind.fp_reg == 12
4204       && (range & 0x3000) == 0x1000)
4205     {
4206       unwind.opcode_count--;
4207       unwind.sp_restored = 0;
4208       range = (range | 0x2000) & ~0x1000;
4209       unwind.pending_offset = 0;
4210     }
4211
4212   /* Pop r4-r15.  */
4213   if (range & 0xfff0)
4214     {
4215       /* See if we can use the short opcodes.  These pop a block of up to 8
4216          registers starting with r4, plus maybe r14.  */
4217       for (n = 0; n < 8; n++)
4218         {
4219           /* Break at the first non-saved register.      */
4220           if ((range & (1 << (n + 4))) == 0)
4221             break;
4222         }
4223       /* See if there are any other bits set.  */
4224       if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
4225         {
4226           /* Use the long form.  */
4227           op = 0x8000 | ((range >> 4) & 0xfff);
4228           add_unwind_opcode (op, 2);
4229         }
4230       else
4231         {
4232           /* Use the short form.  */
4233           if (range & 0x4000)
4234             op = 0xa8; /* Pop r14.      */
4235           else
4236             op = 0xa0; /* Do not pop r14.  */
4237           op |= (n - 1);
4238           add_unwind_opcode (op, 1);
4239         }
4240     }
4241
4242   /* Pop r0-r3.  */
4243   if (range & 0xf)
4244     {
4245       op = 0xb100 | (range & 0xf);
4246       add_unwind_opcode (op, 2);
4247     }
4248
4249   /* Record the number of bytes pushed.  */
4250   for (n = 0; n < 16; n++)
4251     {
4252       if (range & (1 << n))
4253         unwind.frame_size += 4;
4254     }
4255 }
4256
4257
4258 /* Parse a directive saving FPA registers.  */
4259
4260 static void
4261 s_arm_unwind_save_fpa (int reg)
4262 {
4263   expressionS exp;
4264   int num_regs;
4265   valueT op;
4266
4267   /* Get Number of registers to transfer.  */
4268   if (skip_past_comma (&input_line_pointer) != FAIL)
4269     expression (&exp);
4270   else
4271     exp.X_op = O_illegal;
4272
4273   if (exp.X_op != O_constant)
4274     {
4275       as_bad (_("expected , <constant>"));
4276       ignore_rest_of_line ();
4277       return;
4278     }
4279
4280   num_regs = exp.X_add_number;
4281
4282   if (num_regs < 1 || num_regs > 4)
4283     {
4284       as_bad (_("number of registers must be in the range [1:4]"));
4285       ignore_rest_of_line ();
4286       return;
4287     }
4288
4289   demand_empty_rest_of_line ();
4290
4291   if (reg == 4)
4292     {
4293       /* Short form.  */
4294       op = 0xb4 | (num_regs - 1);
4295       add_unwind_opcode (op, 1);
4296     }
4297   else
4298     {
4299       /* Long form.  */
4300       op = 0xc800 | (reg << 4) | (num_regs - 1);
4301       add_unwind_opcode (op, 2);
4302     }
4303   unwind.frame_size += num_regs * 12;
4304 }
4305
4306
4307 /* Parse a directive saving VFP registers for ARMv6 and above.  */
4308
4309 static void
4310 s_arm_unwind_save_vfp_armv6 (void)
4311 {
4312   int count;
4313   unsigned int start;
4314   valueT op;
4315   int num_vfpv3_regs = 0;
4316   int num_regs_below_16;
4317   bfd_boolean partial_match;
4318
4319   count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D,
4320                               &partial_match);
4321   if (count == FAIL)
4322     {
4323       as_bad (_("expected register list"));
4324       ignore_rest_of_line ();
4325       return;
4326     }
4327
4328   demand_empty_rest_of_line ();
4329
4330   /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
4331      than FSTMX/FLDMX-style ones).  */
4332
4333   /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31.  */
4334   if (start >= 16)
4335     num_vfpv3_regs = count;
4336   else if (start + count > 16)
4337     num_vfpv3_regs = start + count - 16;
4338
4339   if (num_vfpv3_regs > 0)
4340     {
4341       int start_offset = start > 16 ? start - 16 : 0;
4342       op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
4343       add_unwind_opcode (op, 2);
4344     }
4345
4346   /* Generate opcode for registers numbered in the range 0 .. 15.  */
4347   num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
4348   gas_assert (num_regs_below_16 + num_vfpv3_regs == count);
4349   if (num_regs_below_16 > 0)
4350     {
4351       op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
4352       add_unwind_opcode (op, 2);
4353     }
4354
4355   unwind.frame_size += count * 8;
4356 }
4357
4358
4359 /* Parse a directive saving VFP registers for pre-ARMv6.  */
4360
4361 static void
4362 s_arm_unwind_save_vfp (void)
4363 {
4364   int count;
4365   unsigned int reg;
4366   valueT op;
4367   bfd_boolean partial_match;
4368
4369   count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D,
4370                               &partial_match);
4371   if (count == FAIL)
4372     {
4373       as_bad (_("expected register list"));
4374       ignore_rest_of_line ();
4375       return;
4376     }
4377
4378   demand_empty_rest_of_line ();
4379
4380   if (reg == 8)
4381     {
4382       /* Short form.  */
4383       op = 0xb8 | (count - 1);
4384       add_unwind_opcode (op, 1);
4385     }
4386   else
4387     {
4388       /* Long form.  */
4389       op = 0xb300 | (reg << 4) | (count - 1);
4390       add_unwind_opcode (op, 2);
4391     }
4392   unwind.frame_size += count * 8 + 4;
4393 }
4394
4395
4396 /* Parse a directive saving iWMMXt data registers.  */
4397
4398 static void
4399 s_arm_unwind_save_mmxwr (void)
4400 {
4401   int reg;
4402   int hi_reg;
4403   int i;
4404   unsigned mask = 0;
4405   valueT op;
4406
4407   if (*input_line_pointer == '{')
4408     input_line_pointer++;
4409
4410   do
4411     {
4412       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
4413
4414       if (reg == FAIL)
4415         {
4416           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
4417           goto error;
4418         }
4419
4420       if (mask >> reg)
4421         as_tsktsk (_("register list not in ascending order"));
4422       mask |= 1 << reg;
4423
4424       if (*input_line_pointer == '-')
4425         {
4426           input_line_pointer++;
4427           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
4428           if (hi_reg == FAIL)
4429             {
4430               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
4431               goto error;
4432             }
4433           else if (reg >= hi_reg)
4434             {
4435               as_bad (_("bad register range"));
4436               goto error;
4437             }
4438           for (; reg < hi_reg; reg++)
4439             mask |= 1 << reg;
4440         }
4441     }
4442   while (skip_past_comma (&input_line_pointer) != FAIL);
4443
4444   skip_past_char (&input_line_pointer, '}');
4445
4446   demand_empty_rest_of_line ();
4447
4448   /* Generate any deferred opcodes because we're going to be looking at
4449      the list.  */
4450   flush_pending_unwind ();
4451
4452   for (i = 0; i < 16; i++)
4453     {
4454       if (mask & (1 << i))
4455         unwind.frame_size += 8;
4456     }
4457
4458   /* Attempt to combine with a previous opcode.  We do this because gcc
4459      likes to output separate unwind directives for a single block of
4460      registers.  */
4461   if (unwind.opcode_count > 0)
4462     {
4463       i = unwind.opcodes[unwind.opcode_count - 1];
4464       if ((i & 0xf8) == 0xc0)
4465         {
4466           i &= 7;
4467           /* Only merge if the blocks are contiguous.  */
4468           if (i < 6)
4469             {
4470               if ((mask & 0xfe00) == (1 << 9))
4471                 {
4472                   mask |= ((1 << (i + 11)) - 1) & 0xfc00;
4473                   unwind.opcode_count--;
4474                 }
4475             }
4476           else if (i == 6 && unwind.opcode_count >= 2)
4477             {
4478               i = unwind.opcodes[unwind.opcode_count - 2];
4479               reg = i >> 4;
4480               i &= 0xf;
4481
4482               op = 0xffff << (reg - 1);
4483               if (reg > 0
4484                   && ((mask & op) == (1u << (reg - 1))))
4485                 {
4486                   op = (1 << (reg + i + 1)) - 1;
4487                   op &= ~((1 << reg) - 1);
4488                   mask |= op;
4489                   unwind.opcode_count -= 2;
4490                 }
4491             }
4492         }
4493     }
4494
4495   hi_reg = 15;
4496   /* We want to generate opcodes in the order the registers have been
4497      saved, ie. descending order.  */
4498   for (reg = 15; reg >= -1; reg--)
4499     {
4500       /* Save registers in blocks.  */
4501       if (reg < 0
4502           || !(mask & (1 << reg)))
4503         {
4504           /* We found an unsaved reg.  Generate opcodes to save the
4505              preceding block.   */
4506           if (reg != hi_reg)
4507             {
4508               if (reg == 9)
4509                 {
4510                   /* Short form.  */
4511                   op = 0xc0 | (hi_reg - 10);
4512                   add_unwind_opcode (op, 1);
4513                 }
4514               else
4515                 {
4516                   /* Long form.  */
4517                   op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
4518                   add_unwind_opcode (op, 2);
4519                 }
4520             }
4521           hi_reg = reg - 1;
4522         }
4523     }
4524
4525   return;
4526 error:
4527   ignore_rest_of_line ();
4528 }
4529
4530 static void
4531 s_arm_unwind_save_mmxwcg (void)
4532 {
4533   int reg;
4534   int hi_reg;
4535   unsigned mask = 0;
4536   valueT op;
4537
4538   if (*input_line_pointer == '{')
4539     input_line_pointer++;
4540
4541   skip_whitespace (input_line_pointer);
4542
4543   do
4544     {
4545       reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
4546
4547       if (reg == FAIL)
4548         {
4549           as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
4550           goto error;
4551         }
4552
4553       reg -= 8;
4554       if (mask >> reg)
4555         as_tsktsk (_("register list not in ascending order"));
4556       mask |= 1 << reg;
4557
4558       if (*input_line_pointer == '-')
4559         {
4560           input_line_pointer++;
4561           hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
4562           if (hi_reg == FAIL)
4563             {
4564               as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
4565               goto error;
4566             }
4567           else if (reg >= hi_reg)
4568             {
4569               as_bad (_("bad register range"));
4570               goto error;
4571             }
4572           for (; reg < hi_reg; reg++)
4573             mask |= 1 << reg;
4574         }
4575     }
4576   while (skip_past_comma (&input_line_pointer) != FAIL);
4577
4578   skip_past_char (&input_line_pointer, '}');
4579
4580   demand_empty_rest_of_line ();
4581
4582   /* Generate any deferred opcodes because we're going to be looking at
4583      the list.  */
4584   flush_pending_unwind ();
4585
4586   for (reg = 0; reg < 16; reg++)
4587     {
4588       if (mask & (1 << reg))
4589         unwind.frame_size += 4;
4590     }
4591   op = 0xc700 | mask;
4592   add_unwind_opcode (op, 2);
4593   return;
4594 error:
4595   ignore_rest_of_line ();
4596 }
4597
4598
4599 /* Parse an unwind_save directive.
4600    If the argument is non-zero, this is a .vsave directive.  */
4601
4602 static void
4603 s_arm_unwind_save (int arch_v6)
4604 {
4605   char *peek;
4606   struct reg_entry *reg;
4607   bfd_boolean had_brace = FALSE;
4608
4609   if (!unwind.proc_start)
4610     as_bad (MISSING_FNSTART);
4611
4612   /* Figure out what sort of save we have.  */
4613   peek = input_line_pointer;
4614
4615   if (*peek == '{')
4616     {
4617       had_brace = TRUE;
4618       peek++;
4619     }
4620
4621   reg = arm_reg_parse_multi (&peek);
4622
4623   if (!reg)
4624     {
4625       as_bad (_("register expected"));
4626       ignore_rest_of_line ();
4627       return;
4628     }
4629
4630   switch (reg->type)
4631     {
4632     case REG_TYPE_FN:
4633       if (had_brace)
4634         {
4635           as_bad (_("FPA .unwind_save does not take a register list"));
4636           ignore_rest_of_line ();
4637           return;
4638         }
4639       input_line_pointer = peek;
4640       s_arm_unwind_save_fpa (reg->number);
4641       return;
4642
4643     case REG_TYPE_RN:
4644       s_arm_unwind_save_core ();
4645       return;
4646
4647     case REG_TYPE_VFD:
4648       if (arch_v6)
4649         s_arm_unwind_save_vfp_armv6 ();
4650       else
4651         s_arm_unwind_save_vfp ();
4652       return;
4653
4654     case REG_TYPE_MMXWR:
4655       s_arm_unwind_save_mmxwr ();
4656       return;
4657
4658     case REG_TYPE_MMXWCG:
4659       s_arm_unwind_save_mmxwcg ();
4660       return;
4661
4662     default:
4663       as_bad (_(".unwind_save does not support this kind of register"));
4664       ignore_rest_of_line ();
4665     }
4666 }
4667
4668
4669 /* Parse an unwind_movsp directive.  */
4670
4671 static void
4672 s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
4673 {
4674   int reg;
4675   valueT op;
4676   int offset;
4677
4678   if (!unwind.proc_start)
4679     as_bad (MISSING_FNSTART);
4680
4681   reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4682   if (reg == FAIL)
4683     {
4684       as_bad ("%s", _(reg_expected_msgs[REG_TYPE_RN]));
4685       ignore_rest_of_line ();
4686       return;
4687     }
4688
4689   /* Optional constant.  */
4690   if (skip_past_comma (&input_line_pointer) != FAIL)
4691     {
4692       if (immediate_for_directive (&offset) == FAIL)
4693         return;
4694     }
4695   else
4696     offset = 0;
4697
4698   demand_empty_rest_of_line ();
4699
4700   if (reg == REG_SP || reg == REG_PC)
4701     {
4702       as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
4703       return;
4704     }
4705
4706   if (unwind.fp_reg != REG_SP)
4707     as_bad (_("unexpected .unwind_movsp directive"));
4708
4709   /* Generate opcode to restore the value.  */
4710   op = 0x90 | reg;
4711   add_unwind_opcode (op, 1);
4712
4713   /* Record the information for later.  */
4714   unwind.fp_reg = reg;
4715   unwind.fp_offset = unwind.frame_size - offset;
4716   unwind.sp_restored = 1;
4717 }
4718
4719 /* Parse an unwind_pad directive.  */
4720
4721 static void
4722 s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
4723 {
4724   int offset;
4725
4726   if (!unwind.proc_start)
4727     as_bad (MISSING_FNSTART);
4728
4729   if (immediate_for_directive (&offset) == FAIL)
4730     return;
4731
4732   if (offset & 3)
4733     {
4734       as_bad (_("stack increment must be multiple of 4"));
4735       ignore_rest_of_line ();
4736       return;
4737     }
4738
4739   /* Don't generate any opcodes, just record the details for later.  */
4740   unwind.frame_size += offset;
4741   unwind.pending_offset += offset;
4742
4743   demand_empty_rest_of_line ();
4744 }
4745
4746 /* Parse an unwind_setfp directive.  */
4747
4748 static void
4749 s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
4750 {
4751   int sp_reg;
4752   int fp_reg;
4753   int offset;
4754
4755   if (!unwind.proc_start)
4756     as_bad (MISSING_FNSTART);
4757
4758   fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4759   if (skip_past_comma (&input_line_pointer) == FAIL)
4760     sp_reg = FAIL;
4761   else
4762     sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4763
4764   if (fp_reg == FAIL || sp_reg == FAIL)
4765     {
4766       as_bad (_("expected <reg>, <reg>"));
4767       ignore_rest_of_line ();
4768       return;
4769     }
4770
4771   /* Optional constant.  */
4772   if (skip_past_comma (&input_line_pointer) != FAIL)
4773     {
4774       if (immediate_for_directive (&offset) == FAIL)
4775         return;
4776     }
4777   else
4778     offset = 0;
4779
4780   demand_empty_rest_of_line ();
4781
4782   if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
4783     {
4784       as_bad (_("register must be either sp or set by a previous"
4785                 "unwind_movsp directive"));
4786       return;
4787     }
4788
4789   /* Don't generate any opcodes, just record the information for later.  */
4790   unwind.fp_reg = fp_reg;
4791   unwind.fp_used = 1;
4792   if (sp_reg == REG_SP)
4793     unwind.fp_offset = unwind.frame_size - offset;
4794   else
4795     unwind.fp_offset -= offset;
4796 }
4797
4798 /* Parse an unwind_raw directive.  */
4799
4800 static void
4801 s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
4802 {
4803   expressionS exp;
4804   /* This is an arbitrary limit.         */
4805   unsigned char op[16];
4806   int count;
4807
4808   if (!unwind.proc_start)
4809     as_bad (MISSING_FNSTART);
4810
4811   expression (&exp);
4812   if (exp.X_op == O_constant
4813       && skip_past_comma (&input_line_pointer) != FAIL)
4814     {
4815       unwind.frame_size += exp.X_add_number;
4816       expression (&exp);
4817     }
4818   else
4819     exp.X_op = O_illegal;
4820
4821   if (exp.X_op != O_constant)
4822     {
4823       as_bad (_("expected <offset>, <opcode>"));
4824       ignore_rest_of_line ();
4825       return;
4826     }
4827
4828   count = 0;
4829
4830   /* Parse the opcode.  */
4831   for (;;)
4832     {
4833       if (count >= 16)
4834         {
4835           as_bad (_("unwind opcode too long"));
4836           ignore_rest_of_line ();
4837         }
4838       if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
4839         {
4840           as_bad (_("invalid unwind opcode"));
4841           ignore_rest_of_line ();
4842           return;
4843         }
4844       op[count++] = exp.X_add_number;
4845
4846       /* Parse the next byte.  */
4847       if (skip_past_comma (&input_line_pointer) == FAIL)
4848         break;
4849
4850       expression (&exp);
4851     }
4852
4853   /* Add the opcode bytes in reverse order.  */
4854   while (count--)
4855     add_unwind_opcode (op[count], 1);
4856
4857   demand_empty_rest_of_line ();
4858 }
4859
4860
4861 /* Parse a .eabi_attribute directive.  */
4862
4863 static void
4864 s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
4865 {
4866   int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
4867
4868   if (tag >= 0 && tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4869     attributes_set_explicitly[tag] = 1;
4870 }
4871
4872 /* Emit a tls fix for the symbol.  */
4873
4874 static void
4875 s_arm_tls_descseq (int ignored ATTRIBUTE_UNUSED)
4876 {
4877   char *p;
4878   expressionS exp;
4879 #ifdef md_flush_pending_output
4880   md_flush_pending_output ();
4881 #endif
4882
4883 #ifdef md_cons_align
4884   md_cons_align (4);
4885 #endif
4886
4887   /* Since we're just labelling the code, there's no need to define a
4888      mapping symbol.  */
4889   expression (&exp);
4890   p = obstack_next_free (&frchain_now->frch_obstack);
4891   fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
4892                thumb_mode ? BFD_RELOC_ARM_THM_TLS_DESCSEQ
4893                : BFD_RELOC_ARM_TLS_DESCSEQ);
4894 }
4895 #endif /* OBJ_ELF */
4896
4897 static void s_arm_arch (int);
4898 static void s_arm_object_arch (int);
4899 static void s_arm_cpu (int);
4900 static void s_arm_fpu (int);
4901 static void s_arm_arch_extension (int);
4902
4903 #ifdef TE_PE
4904
4905 static void
4906 pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
4907 {
4908   expressionS exp;
4909
4910   do
4911     {
4912       expression (&exp);
4913       if (exp.X_op == O_symbol)
4914         exp.X_op = O_secrel;
4915
4916       emit_expr (&exp, 4);
4917     }
4918   while (*input_line_pointer++ == ',');
4919
4920   input_line_pointer--;
4921   demand_empty_rest_of_line ();
4922 }
4923 #endif /* TE_PE */
4924
4925 /* This table describes all the machine specific pseudo-ops the assembler
4926    has to support.  The fields are:
4927      pseudo-op name without dot
4928      function to call to execute this pseudo-op
4929      Integer arg to pass to the function.  */
4930
4931 const pseudo_typeS md_pseudo_table[] =
4932 {
4933   /* Never called because '.req' does not start a line.  */
4934   { "req",         s_req,         0 },
4935   /* Following two are likewise never called.  */
4936   { "dn",          s_dn,          0 },
4937   { "qn",          s_qn,          0 },
4938   { "unreq",       s_unreq,       0 },
4939   { "bss",         s_bss,         0 },
4940   { "align",       s_align_ptwo,  2 },
4941   { "arm",         s_arm,         0 },
4942   { "thumb",       s_thumb,       0 },
4943   { "code",        s_code,        0 },
4944   { "force_thumb", s_force_thumb, 0 },
4945   { "thumb_func",  s_thumb_func,  0 },
4946   { "thumb_set",   s_thumb_set,   0 },
4947   { "even",        s_even,        0 },
4948   { "ltorg",       s_ltorg,       0 },
4949   { "pool",        s_ltorg,       0 },
4950   { "syntax",      s_syntax,      0 },
4951   { "cpu",         s_arm_cpu,     0 },
4952   { "arch",        s_arm_arch,    0 },
4953   { "object_arch", s_arm_object_arch,   0 },
4954   { "fpu",         s_arm_fpu,     0 },
4955   { "arch_extension", s_arm_arch_extension, 0 },
4956 #ifdef OBJ_ELF
4957   { "word",             s_arm_elf_cons, 4 },
4958   { "long",             s_arm_elf_cons, 4 },
4959   { "inst.n",           s_arm_elf_inst, 2 },
4960   { "inst.w",           s_arm_elf_inst, 4 },
4961   { "inst",             s_arm_elf_inst, 0 },
4962   { "rel31",            s_arm_rel31,      0 },
4963   { "fnstart",          s_arm_unwind_fnstart,   0 },
4964   { "fnend",            s_arm_unwind_fnend,     0 },
4965   { "cantunwind",       s_arm_unwind_cantunwind, 0 },
4966   { "personality",      s_arm_unwind_personality, 0 },
4967   { "personalityindex", s_arm_unwind_personalityindex, 0 },
4968   { "handlerdata",      s_arm_unwind_handlerdata, 0 },
4969   { "save",             s_arm_unwind_save,      0 },
4970   { "vsave",            s_arm_unwind_save,      1 },
4971   { "movsp",            s_arm_unwind_movsp,     0 },
4972   { "pad",              s_arm_unwind_pad,       0 },
4973   { "setfp",            s_arm_unwind_setfp,     0 },
4974   { "unwind_raw",       s_arm_unwind_raw,       0 },
4975   { "eabi_attribute",   s_arm_eabi_attribute,   0 },
4976   { "tlsdescseq",       s_arm_tls_descseq,      0 },
4977 #else
4978   { "word",        cons, 4},
4979
4980   /* These are used for dwarf.  */
4981   {"2byte", cons, 2},
4982   {"4byte", cons, 4},
4983   {"8byte", cons, 8},
4984   /* These are used for dwarf2.  */
4985   { "file", dwarf2_directive_file, 0 },
4986   { "loc",  dwarf2_directive_loc,  0 },
4987   { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
4988 #endif
4989   { "extend",      float_cons, 'x' },
4990   { "ldouble",     float_cons, 'x' },
4991   { "packed",      float_cons, 'p' },
4992 #ifdef TE_PE
4993   {"secrel32", pe_directive_secrel, 0},
4994 #endif
4995
4996   /* These are for compatibility with CodeComposer Studio.  */
4997   {"ref",          s_ccs_ref,        0},
4998   {"def",          s_ccs_def,        0},
4999   {"asmfunc",      s_ccs_asmfunc,    0},
5000   {"endasmfunc",   s_ccs_endasmfunc, 0},
5001
5002   { 0, 0, 0 }
5003 };
5004 \f
5005 /* Parser functions used exclusively in instruction operands.  */
5006
5007 /* Generic immediate-value read function for use in insn parsing.
5008    STR points to the beginning of the immediate (the leading #);
5009    VAL receives the value; if the value is outside [MIN, MAX]
5010    issue an error.  PREFIX_OPT is true if the immediate prefix is
5011    optional.  */
5012
5013 static int
5014 parse_immediate (char **str, int *val, int min, int max,
5015                  bfd_boolean prefix_opt)
5016 {
5017   expressionS exp;
5018
5019   my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
5020   if (exp.X_op != O_constant)
5021     {
5022       inst.error = _("constant expression required");
5023       return FAIL;
5024     }
5025
5026   if (exp.X_add_number < min || exp.X_add_number > max)
5027     {
5028       inst.error = _("immediate value out of range");
5029       return FAIL;
5030     }
5031
5032   *val = exp.X_add_number;
5033   return SUCCESS;
5034 }
5035
5036 /* Less-generic immediate-value read function with the possibility of loading a
5037    big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
5038    instructions. Puts the result directly in inst.operands[i].  */
5039
5040 static int
5041 parse_big_immediate (char **str, int i, expressionS *in_exp,
5042                      bfd_boolean allow_symbol_p)
5043 {
5044   expressionS exp;
5045   expressionS *exp_p = in_exp ? in_exp : &exp;
5046   char *ptr = *str;
5047
5048   my_get_expression (exp_p, &ptr, GE_OPT_PREFIX_BIG);
5049
5050   if (exp_p->X_op == O_constant)
5051     {
5052       inst.operands[i].imm = exp_p->X_add_number & 0xffffffff;
5053       /* If we're on a 64-bit host, then a 64-bit number can be returned using
5054          O_constant.  We have to be careful not to break compilation for
5055          32-bit X_add_number, though.  */
5056       if ((exp_p->X_add_number & ~(offsetT)(0xffffffffU)) != 0)
5057         {
5058           /* X >> 32 is illegal if sizeof (exp_p->X_add_number) == 4.  */
5059           inst.operands[i].reg = (((exp_p->X_add_number >> 16) >> 16)
5060                                   & 0xffffffff);
5061           inst.operands[i].regisimm = 1;
5062         }
5063     }
5064   else if (exp_p->X_op == O_big
5065            && LITTLENUM_NUMBER_OF_BITS * exp_p->X_add_number > 32)
5066     {
5067       unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
5068
5069       /* Bignums have their least significant bits in
5070          generic_bignum[0]. Make sure we put 32 bits in imm and
5071          32 bits in reg,  in a (hopefully) portable way.  */
5072       gas_assert (parts != 0);
5073
5074       /* Make sure that the number is not too big.
5075          PR 11972: Bignums can now be sign-extended to the
5076          size of a .octa so check that the out of range bits
5077          are all zero or all one.  */
5078       if (LITTLENUM_NUMBER_OF_BITS * exp_p->X_add_number > 64)
5079         {
5080           LITTLENUM_TYPE m = -1;
5081
5082           if (generic_bignum[parts * 2] != 0
5083               && generic_bignum[parts * 2] != m)
5084             return FAIL;
5085
5086           for (j = parts * 2 + 1; j < (unsigned) exp_p->X_add_number; j++)
5087             if (generic_bignum[j] != generic_bignum[j-1])
5088               return FAIL;
5089         }
5090
5091       inst.operands[i].imm = 0;
5092       for (j = 0; j < parts; j++, idx++)
5093         inst.operands[i].imm |= generic_bignum[idx]
5094                                 << (LITTLENUM_NUMBER_OF_BITS * j);
5095       inst.operands[i].reg = 0;
5096       for (j = 0; j < parts; j++, idx++)
5097         inst.operands[i].reg |= generic_bignum[idx]
5098                                 << (LITTLENUM_NUMBER_OF_BITS * j);
5099       inst.operands[i].regisimm = 1;
5100     }
5101   else if (!(exp_p->X_op == O_symbol && allow_symbol_p))
5102     return FAIL;
5103
5104   *str = ptr;
5105
5106   return SUCCESS;
5107 }
5108
5109 /* Returns the pseudo-register number of an FPA immediate constant,
5110    or FAIL if there isn't a valid constant here.  */
5111
5112 static int
5113 parse_fpa_immediate (char ** str)
5114 {
5115   LITTLENUM_TYPE words[MAX_LITTLENUMS];
5116   char *         save_in;
5117   expressionS    exp;
5118   int            i;
5119   int            j;
5120
5121   /* First try and match exact strings, this is to guarantee
5122      that some formats will work even for cross assembly.  */
5123
5124   for (i = 0; fp_const[i]; i++)
5125     {
5126       if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
5127         {
5128           char *start = *str;
5129
5130           *str += strlen (fp_const[i]);
5131           if (is_end_of_line[(unsigned char) **str])
5132             return i + 8;
5133           *str = start;
5134         }
5135     }
5136
5137   /* Just because we didn't get a match doesn't mean that the constant
5138      isn't valid, just that it is in a format that we don't
5139      automatically recognize.  Try parsing it with the standard
5140      expression routines.  */
5141
5142   memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
5143
5144   /* Look for a raw floating point number.  */
5145   if ((save_in = atof_ieee (*str, 'x', words)) != NULL
5146       && is_end_of_line[(unsigned char) *save_in])
5147     {
5148       for (i = 0; i < NUM_FLOAT_VALS; i++)
5149         {
5150           for (j = 0; j < MAX_LITTLENUMS; j++)
5151             {
5152               if (words[j] != fp_values[i][j])
5153                 break;
5154             }
5155
5156           if (j == MAX_LITTLENUMS)
5157             {
5158               *str = save_in;
5159               return i + 8;
5160             }
5161         }
5162     }
5163
5164   /* Try and parse a more complex expression, this will probably fail
5165      unless the code uses a floating point prefix (eg "0f").  */
5166   save_in = input_line_pointer;
5167   input_line_pointer = *str;
5168   if (expression (&exp) == absolute_section
5169       && exp.X_op == O_big
5170       && exp.X_add_number < 0)
5171     {
5172       /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
5173          Ditto for 15.  */
5174 #define X_PRECISION 5
5175 #define E_PRECISION 15L
5176       if (gen_to_words (words, X_PRECISION, E_PRECISION) == 0)
5177         {
5178           for (i = 0; i < NUM_FLOAT_VALS; i++)
5179             {
5180               for (j = 0; j < MAX_LITTLENUMS; j++)
5181                 {
5182                   if (words[j] != fp_values[i][j])
5183                     break;
5184                 }
5185
5186               if (j == MAX_LITTLENUMS)
5187                 {
5188                   *str = input_line_pointer;
5189                   input_line_pointer = save_in;
5190                   return i + 8;
5191                 }
5192             }
5193         }
5194     }
5195
5196   *str = input_line_pointer;
5197   input_line_pointer = save_in;
5198   inst.error = _("invalid FPA immediate expression");
5199   return FAIL;
5200 }
5201
5202 /* Returns 1 if a number has "quarter-precision" float format
5203    0baBbbbbbc defgh000 00000000 00000000.  */
5204
5205 static int
5206 is_quarter_float (unsigned imm)
5207 {
5208   int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
5209   return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
5210 }
5211
5212
5213 /* Detect the presence of a floating point or integer zero constant,
5214    i.e. #0.0 or #0.  */
5215
5216 static bfd_boolean
5217 parse_ifimm_zero (char **in)
5218 {
5219   int error_code;
5220
5221   if (!is_immediate_prefix (**in))
5222     {
5223       /* In unified syntax, all prefixes are optional.  */
5224       if (!unified_syntax)
5225         return FALSE;
5226     }
5227   else
5228     ++*in;
5229
5230   /* Accept #0x0 as a synonym for #0.  */
5231   if (strncmp (*in, "0x", 2) == 0)
5232     {
5233       int val;
5234       if (parse_immediate (in, &val, 0, 0, TRUE) == FAIL)
5235         return FALSE;
5236       return TRUE;
5237     }
5238
5239   error_code = atof_generic (in, ".", EXP_CHARS,
5240                              &generic_floating_point_number);
5241
5242   if (!error_code
5243       && generic_floating_point_number.sign == '+'
5244       && (generic_floating_point_number.low
5245           > generic_floating_point_number.leader))
5246     return TRUE;
5247
5248   return FALSE;
5249 }
5250
5251 /* Parse an 8-bit "quarter-precision" floating point number of the form:
5252    0baBbbbbbc defgh000 00000000 00000000.
5253    The zero and minus-zero cases need special handling, since they can't be
5254    encoded in the "quarter-precision" float format, but can nonetheless be
5255    loaded as integer constants.  */
5256
5257 static unsigned
5258 parse_qfloat_immediate (char **ccp, int *immed)
5259 {
5260   char *str = *ccp;
5261   char *fpnum;
5262   LITTLENUM_TYPE words[MAX_LITTLENUMS];
5263   int found_fpchar = 0;
5264
5265   skip_past_char (&str, '#');
5266
5267   /* We must not accidentally parse an integer as a floating-point number. Make
5268      sure that the value we parse is not an integer by checking for special
5269      characters '.' or 'e'.
5270      FIXME: This is a horrible hack, but doing better is tricky because type
5271      information isn't in a very usable state at parse time.  */
5272   fpnum = str;
5273   skip_whitespace (fpnum);
5274
5275   if (strncmp (fpnum, "0x", 2) == 0)
5276     return FAIL;
5277   else
5278     {
5279       for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
5280         if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
5281           {
5282             found_fpchar = 1;
5283             break;
5284           }
5285
5286       if (!found_fpchar)
5287         return FAIL;
5288     }
5289
5290   if ((str = atof_ieee (str, 's', words)) != NULL)
5291     {
5292       unsigned fpword = 0;
5293       int i;
5294
5295       /* Our FP word must be 32 bits (single-precision FP).  */
5296       for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
5297         {
5298           fpword <<= LITTLENUM_NUMBER_OF_BITS;
5299           fpword |= words[i];
5300         }
5301
5302       if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
5303         *immed = fpword;
5304       else
5305         return FAIL;
5306
5307       *ccp = str;
5308
5309       return SUCCESS;
5310     }
5311
5312   return FAIL;
5313 }
5314
5315 /* Shift operands.  */
5316 enum shift_kind
5317 {
5318   SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX, SHIFT_UXTW
5319 };
5320
5321 struct asm_shift_name
5322 {
5323   const char      *name;
5324   enum shift_kind  kind;
5325 };
5326
5327 /* Third argument to parse_shift.  */
5328 enum parse_shift_mode
5329 {
5330   NO_SHIFT_RESTRICT,            /* Any kind of shift is accepted.  */
5331   SHIFT_IMMEDIATE,              /* Shift operand must be an immediate.  */
5332   SHIFT_LSL_OR_ASR_IMMEDIATE,   /* Shift must be LSL or ASR immediate.  */
5333   SHIFT_ASR_IMMEDIATE,          /* Shift must be ASR immediate.  */
5334   SHIFT_LSL_IMMEDIATE,          /* Shift must be LSL immediate.  */
5335   SHIFT_UXTW_IMMEDIATE          /* Shift must be UXTW immediate.  */
5336 };
5337
5338 /* Parse a <shift> specifier on an ARM data processing instruction.
5339    This has three forms:
5340
5341      (LSL|LSR|ASL|ASR|ROR) Rs
5342      (LSL|LSR|ASL|ASR|ROR) #imm
5343      RRX
5344
5345    Note that ASL is assimilated to LSL in the instruction encoding, and
5346    RRX to ROR #0 (which cannot be written as such).  */
5347
5348 static int
5349 parse_shift (char **str, int i, enum parse_shift_mode mode)
5350 {
5351   const struct asm_shift_name *shift_name;
5352   enum shift_kind shift;
5353   char *s = *str;
5354   char *p = s;
5355   int reg;
5356
5357   for (p = *str; ISALPHA (*p); p++)
5358     ;
5359
5360   if (p == *str)
5361     {
5362       inst.error = _("shift expression expected");
5363       return FAIL;
5364     }
5365
5366   shift_name = (const struct asm_shift_name *) hash_find_n (arm_shift_hsh, *str,
5367                                                             p - *str);
5368
5369   if (shift_name == NULL)
5370     {
5371       inst.error = _("shift expression expected");
5372       return FAIL;
5373     }
5374
5375   shift = shift_name->kind;
5376
5377   switch (mode)
5378     {
5379     case NO_SHIFT_RESTRICT:
5380     case SHIFT_IMMEDIATE:
5381       if (shift == SHIFT_UXTW)
5382         {
5383           inst.error = _("'UXTW' not allowed here");
5384           return FAIL;
5385         }
5386       break;
5387
5388     case SHIFT_LSL_OR_ASR_IMMEDIATE:
5389       if (shift != SHIFT_LSL && shift != SHIFT_ASR)
5390         {
5391           inst.error = _("'LSL' or 'ASR' required");
5392           return FAIL;
5393         }
5394       break;
5395
5396     case SHIFT_LSL_IMMEDIATE:
5397       if (shift != SHIFT_LSL)
5398         {
5399           inst.error = _("'LSL' required");
5400           return FAIL;
5401         }
5402       break;
5403
5404     case SHIFT_ASR_IMMEDIATE:
5405       if (shift != SHIFT_ASR)
5406         {
5407           inst.error = _("'ASR' required");
5408           return FAIL;
5409         }
5410       break;
5411     case SHIFT_UXTW_IMMEDIATE:
5412       if (shift != SHIFT_UXTW)
5413         {
5414           inst.error = _("'UXTW' required");
5415           return FAIL;
5416         }
5417       break;
5418
5419     default: abort ();
5420     }
5421
5422   if (shift != SHIFT_RRX)
5423     {
5424       /* Whitespace can appear here if the next thing is a bare digit.  */
5425       skip_whitespace (p);
5426
5427       if (mode == NO_SHIFT_RESTRICT
5428           && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5429         {
5430           inst.operands[i].imm = reg;
5431           inst.operands[i].immisreg = 1;
5432         }
5433       else if (my_get_expression (&inst.relocs[0].exp, &p, GE_IMM_PREFIX))
5434         return FAIL;
5435     }
5436   inst.operands[i].shift_kind = shift;
5437   inst.operands[i].shifted = 1;
5438   *str = p;
5439   return SUCCESS;
5440 }
5441
5442 /* Parse a <shifter_operand> for an ARM data processing instruction:
5443
5444       #<immediate>
5445       #<immediate>, <rotate>
5446       <Rm>
5447       <Rm>, <shift>
5448
5449    where <shift> is defined by parse_shift above, and <rotate> is a
5450    multiple of 2 between 0 and 30.  Validation of immediate operands
5451    is deferred to md_apply_fix.  */
5452
5453 static int
5454 parse_shifter_operand (char **str, int i)
5455 {
5456   int value;
5457   expressionS exp;
5458
5459   if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
5460     {
5461       inst.operands[i].reg = value;
5462       inst.operands[i].isreg = 1;
5463
5464       /* parse_shift will override this if appropriate */
5465       inst.relocs[0].exp.X_op = O_constant;
5466       inst.relocs[0].exp.X_add_number = 0;
5467
5468       if (skip_past_comma (str) == FAIL)
5469         return SUCCESS;
5470
5471       /* Shift operation on register.  */
5472       return parse_shift (str, i, NO_SHIFT_RESTRICT);
5473     }
5474
5475   if (my_get_expression (&inst.relocs[0].exp, str, GE_IMM_PREFIX))
5476     return FAIL;
5477
5478   if (skip_past_comma (str) == SUCCESS)
5479     {
5480       /* #x, y -- ie explicit rotation by Y.  */
5481       if (my_get_expression (&exp, str, GE_NO_PREFIX))
5482         return FAIL;
5483
5484       if (exp.X_op != O_constant || inst.relocs[0].exp.X_op != O_constant)
5485         {
5486           inst.error = _("constant expression expected");
5487           return FAIL;
5488         }
5489
5490       value = exp.X_add_number;
5491       if (value < 0 || value > 30 || value % 2 != 0)
5492         {
5493           inst.error = _("invalid rotation");
5494           return FAIL;
5495         }
5496       if (inst.relocs[0].exp.X_add_number < 0
5497           || inst.relocs[0].exp.X_add_number > 255)
5498         {
5499           inst.error = _("invalid constant");
5500           return FAIL;
5501         }
5502
5503       /* Encode as specified.  */
5504       inst.operands[i].imm = inst.relocs[0].exp.X_add_number | value << 7;
5505       return SUCCESS;
5506     }
5507
5508   inst.relocs[0].type = BFD_RELOC_ARM_IMMEDIATE;
5509   inst.relocs[0].pc_rel = 0;
5510   return SUCCESS;
5511 }
5512
5513 /* Group relocation information.  Each entry in the table contains the
5514    textual name of the relocation as may appear in assembler source
5515    and must end with a colon.
5516    Along with this textual name are the relocation codes to be used if
5517    the corresponding instruction is an ALU instruction (ADD or SUB only),
5518    an LDR, an LDRS, or an LDC.  */
5519
5520 struct group_reloc_table_entry
5521 {
5522   const char *name;
5523   int alu_code;
5524   int ldr_code;
5525   int ldrs_code;
5526   int ldc_code;
5527 };
5528
5529 typedef enum
5530 {
5531   /* Varieties of non-ALU group relocation.  */
5532
5533   GROUP_LDR,
5534   GROUP_LDRS,
5535   GROUP_LDC,
5536   GROUP_MVE
5537 } group_reloc_type;
5538
5539 static struct group_reloc_table_entry group_reloc_table[] =
5540   { /* Program counter relative: */
5541     { "pc_g0_nc",
5542       BFD_RELOC_ARM_ALU_PC_G0_NC,       /* ALU */
5543       0,                                /* LDR */
5544       0,                                /* LDRS */
5545       0 },                              /* LDC */
5546     { "pc_g0",
5547       BFD_RELOC_ARM_ALU_PC_G0,          /* ALU */
5548       BFD_RELOC_ARM_LDR_PC_G0,          /* LDR */
5549       BFD_RELOC_ARM_LDRS_PC_G0,         /* LDRS */
5550       BFD_RELOC_ARM_LDC_PC_G0 },        /* LDC */
5551     { "pc_g1_nc",
5552       BFD_RELOC_ARM_ALU_PC_G1_NC,       /* ALU */
5553       0,                                /* LDR */
5554       0,                                /* LDRS */
5555       0 },                              /* LDC */
5556     { "pc_g1",
5557       BFD_RELOC_ARM_ALU_PC_G1,          /* ALU */
5558       BFD_RELOC_ARM_LDR_PC_G1,          /* LDR */
5559       BFD_RELOC_ARM_LDRS_PC_G1,         /* LDRS */
5560       BFD_RELOC_ARM_LDC_PC_G1 },        /* LDC */
5561     { "pc_g2",
5562       BFD_RELOC_ARM_ALU_PC_G2,          /* ALU */
5563       BFD_RELOC_ARM_LDR_PC_G2,          /* LDR */
5564       BFD_RELOC_ARM_LDRS_PC_G2,         /* LDRS */
5565       BFD_RELOC_ARM_LDC_PC_G2 },        /* LDC */
5566     /* Section base relative */
5567     { "sb_g0_nc",
5568       BFD_RELOC_ARM_ALU_SB_G0_NC,       /* ALU */
5569       0,                                /* LDR */
5570       0,                                /* LDRS */
5571       0 },                              /* LDC */
5572     { "sb_g0",
5573       BFD_RELOC_ARM_ALU_SB_G0,          /* ALU */
5574       BFD_RELOC_ARM_LDR_SB_G0,          /* LDR */
5575       BFD_RELOC_ARM_LDRS_SB_G0,         /* LDRS */
5576       BFD_RELOC_ARM_LDC_SB_G0 },        /* LDC */
5577     { "sb_g1_nc",
5578       BFD_RELOC_ARM_ALU_SB_G1_NC,       /* ALU */
5579       0,                                /* LDR */
5580       0,                                /* LDRS */
5581       0 },                              /* LDC */
5582     { "sb_g1",
5583       BFD_RELOC_ARM_ALU_SB_G1,          /* ALU */
5584       BFD_RELOC_ARM_LDR_SB_G1,          /* LDR */
5585       BFD_RELOC_ARM_LDRS_SB_G1,         /* LDRS */
5586       BFD_RELOC_ARM_LDC_SB_G1 },        /* LDC */
5587     { "sb_g2",
5588       BFD_RELOC_ARM_ALU_SB_G2,          /* ALU */
5589       BFD_RELOC_ARM_LDR_SB_G2,          /* LDR */
5590       BFD_RELOC_ARM_LDRS_SB_G2,         /* LDRS */
5591       BFD_RELOC_ARM_LDC_SB_G2 },        /* LDC */
5592     /* Absolute thumb alu relocations.  */
5593     { "lower0_7",
5594       BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC,/* ALU.  */
5595       0,                                /* LDR.  */
5596       0,                                /* LDRS.  */
5597       0 },                              /* LDC.  */
5598     { "lower8_15",
5599       BFD_RELOC_ARM_THUMB_ALU_ABS_G1_NC,/* ALU.  */
5600       0,                                /* LDR.  */
5601       0,                                /* LDRS.  */
5602       0 },                              /* LDC.  */
5603     { "upper0_7",
5604       BFD_RELOC_ARM_THUMB_ALU_ABS_G2_NC,/* ALU.  */
5605       0,                                /* LDR.  */
5606       0,                                /* LDRS.  */
5607       0 },                              /* LDC.  */
5608     { "upper8_15",
5609       BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC,/* ALU.  */
5610       0,                                /* LDR.  */
5611       0,                                /* LDRS.  */
5612       0 } };                            /* LDC.  */
5613
5614 /* Given the address of a pointer pointing to the textual name of a group
5615    relocation as may appear in assembler source, attempt to find its details
5616    in group_reloc_table.  The pointer will be updated to the character after
5617    the trailing colon.  On failure, FAIL will be returned; SUCCESS
5618    otherwise.  On success, *entry will be updated to point at the relevant
5619    group_reloc_table entry. */
5620
5621 static int
5622 find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
5623 {
5624   unsigned int i;
5625   for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
5626     {
5627       int length = strlen (group_reloc_table[i].name);
5628
5629       if (strncasecmp (group_reloc_table[i].name, *str, length) == 0
5630           && (*str)[length] == ':')
5631         {
5632           *out = &group_reloc_table[i];
5633           *str += (length + 1);
5634           return SUCCESS;
5635         }
5636     }
5637
5638   return FAIL;
5639 }
5640
5641 /* Parse a <shifter_operand> for an ARM data processing instruction
5642    (as for parse_shifter_operand) where group relocations are allowed:
5643
5644       #<immediate>
5645       #<immediate>, <rotate>
5646       #:<group_reloc>:<expression>
5647       <Rm>
5648       <Rm>, <shift>
5649
5650    where <group_reloc> is one of the strings defined in group_reloc_table.
5651    The hashes are optional.
5652
5653    Everything else is as for parse_shifter_operand.  */
5654
5655 static parse_operand_result
5656 parse_shifter_operand_group_reloc (char **str, int i)
5657 {
5658   /* Determine if we have the sequence of characters #: or just :
5659      coming next.  If we do, then we check for a group relocation.
5660      If we don't, punt the whole lot to parse_shifter_operand.  */
5661
5662   if (((*str)[0] == '#' && (*str)[1] == ':')
5663       || (*str)[0] == ':')
5664     {
5665       struct group_reloc_table_entry *entry;
5666
5667       if ((*str)[0] == '#')
5668         (*str) += 2;
5669       else
5670         (*str)++;
5671
5672       /* Try to parse a group relocation.  Anything else is an error.  */
5673       if (find_group_reloc_table_entry (str, &entry) == FAIL)
5674         {
5675           inst.error = _("unknown group relocation");
5676           return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5677         }
5678
5679       /* We now have the group relocation table entry corresponding to
5680          the name in the assembler source.  Next, we parse the expression.  */
5681       if (my_get_expression (&inst.relocs[0].exp, str, GE_NO_PREFIX))
5682         return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5683
5684       /* Record the relocation type (always the ALU variant here).  */
5685       inst.relocs[0].type = (bfd_reloc_code_real_type) entry->alu_code;
5686       gas_assert (inst.relocs[0].type != 0);
5687
5688       return PARSE_OPERAND_SUCCESS;
5689     }
5690   else
5691     return parse_shifter_operand (str, i) == SUCCESS
5692            ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
5693
5694   /* Never reached.  */
5695 }
5696
5697 /* Parse a Neon alignment expression.  Information is written to
5698    inst.operands[i].  We assume the initial ':' has been skipped.
5699
5700    align        .imm = align << 8, .immisalign=1, .preind=0  */
5701 static parse_operand_result
5702 parse_neon_alignment (char **str, int i)
5703 {
5704   char *p = *str;
5705   expressionS exp;
5706
5707   my_get_expression (&exp, &p, GE_NO_PREFIX);
5708
5709   if (exp.X_op != O_constant)
5710     {
5711       inst.error = _("alignment must be constant");
5712       return PARSE_OPERAND_FAIL;
5713     }
5714
5715   inst.operands[i].imm = exp.X_add_number << 8;
5716   inst.operands[i].immisalign = 1;
5717   /* Alignments are not pre-indexes.  */
5718   inst.operands[i].preind = 0;
5719
5720   *str = p;
5721   return PARSE_OPERAND_SUCCESS;
5722 }
5723
5724 /* Parse all forms of an ARM address expression.  Information is written
5725    to inst.operands[i] and/or inst.relocs[0].
5726
5727    Preindexed addressing (.preind=1):
5728
5729    [Rn, #offset]       .reg=Rn .relocs[0].exp=offset
5730    [Rn, +/-Rm]         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5731    [Rn, +/-Rm, shift]  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5732                        .shift_kind=shift .relocs[0].exp=shift_imm
5733
5734    These three may have a trailing ! which causes .writeback to be set also.
5735
5736    Postindexed addressing (.postind=1, .writeback=1):
5737
5738    [Rn], #offset       .reg=Rn .relocs[0].exp=offset
5739    [Rn], +/-Rm         .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5740    [Rn], +/-Rm, shift  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5741                        .shift_kind=shift .relocs[0].exp=shift_imm
5742
5743    Unindexed addressing (.preind=0, .postind=0):
5744
5745    [Rn], {option}      .reg=Rn .imm=option .immisreg=0
5746
5747    Other:
5748
5749    [Rn]{!}             shorthand for [Rn,#0]{!}
5750    =immediate          .isreg=0 .relocs[0].exp=immediate
5751    label               .reg=PC .relocs[0].pc_rel=1 .relocs[0].exp=label
5752
5753   It is the caller's responsibility to check for addressing modes not
5754   supported by the instruction, and to set inst.relocs[0].type.  */
5755
5756 static parse_operand_result
5757 parse_address_main (char **str, int i, int group_relocations,
5758                     group_reloc_type group_type)
5759 {
5760   char *p = *str;
5761   int reg;
5762
5763   if (skip_past_char (&p, '[') == FAIL)
5764     {
5765       if (skip_past_char (&p, '=') == FAIL)
5766         {
5767           /* Bare address - translate to PC-relative offset.  */
5768           inst.relocs[0].pc_rel = 1;
5769           inst.operands[i].reg = REG_PC;
5770           inst.operands[i].isreg = 1;
5771           inst.operands[i].preind = 1;
5772
5773           if (my_get_expression (&inst.relocs[0].exp, &p, GE_OPT_PREFIX_BIG))
5774             return PARSE_OPERAND_FAIL;
5775         }
5776       else if (parse_big_immediate (&p, i, &inst.relocs[0].exp,
5777                                     /*allow_symbol_p=*/TRUE))
5778         return PARSE_OPERAND_FAIL;
5779
5780       *str = p;
5781       return PARSE_OPERAND_SUCCESS;
5782     }
5783
5784   /* PR gas/14887: Allow for whitespace after the opening bracket.  */
5785   skip_whitespace (p);
5786
5787   if (group_type == GROUP_MVE)
5788     {
5789       enum arm_reg_type rtype = REG_TYPE_MQ;
5790       struct neon_type_el et;
5791       if ((reg = arm_typed_reg_parse (&p, rtype, &rtype, &et)) != FAIL)
5792         {
5793           inst.operands[i].isquad = 1;
5794         }
5795       else if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5796         {
5797           inst.error = BAD_ADDR_MODE;
5798           return PARSE_OPERAND_FAIL;
5799         }
5800     }
5801   else if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5802     {
5803       if (group_type == GROUP_MVE)
5804         inst.error = BAD_ADDR_MODE;
5805       else
5806         inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5807       return PARSE_OPERAND_FAIL;
5808     }
5809   inst.operands[i].reg = reg;
5810   inst.operands[i].isreg = 1;
5811
5812   if (skip_past_comma (&p) == SUCCESS)
5813     {
5814       inst.operands[i].preind = 1;
5815
5816       if (*p == '+') p++;
5817       else if (*p == '-') p++, inst.operands[i].negative = 1;
5818
5819       enum arm_reg_type rtype = REG_TYPE_MQ;
5820       struct neon_type_el et;
5821       if (group_type == GROUP_MVE
5822           && (reg = arm_typed_reg_parse (&p, rtype, &rtype, &et)) != FAIL)
5823         {
5824           inst.operands[i].immisreg = 2;
5825           inst.operands[i].imm = reg;
5826
5827           if (skip_past_comma (&p) == SUCCESS)
5828             {
5829               if (parse_shift (&p, i, SHIFT_UXTW_IMMEDIATE) == SUCCESS)
5830                 {
5831                   inst.operands[i].imm |= inst.relocs[0].exp.X_add_number << 5;
5832                   inst.relocs[0].exp.X_add_number = 0;
5833                 }
5834               else
5835                 return PARSE_OPERAND_FAIL;
5836             }
5837         }
5838       else if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5839         {
5840           inst.operands[i].imm = reg;
5841           inst.operands[i].immisreg = 1;
5842
5843           if (skip_past_comma (&p) == SUCCESS)
5844             if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5845               return PARSE_OPERAND_FAIL;
5846         }
5847       else if (skip_past_char (&p, ':') == SUCCESS)
5848         {
5849           /* FIXME: '@' should be used here, but it's filtered out by generic
5850              code before we get to see it here. This may be subject to
5851              change.  */
5852           parse_operand_result result = parse_neon_alignment (&p, i);
5853
5854           if (result != PARSE_OPERAND_SUCCESS)
5855             return result;
5856         }
5857       else
5858         {
5859           if (inst.operands[i].negative)
5860             {
5861               inst.operands[i].negative = 0;
5862               p--;
5863             }
5864
5865           if (group_relocations
5866               && ((*p == '#' && *(p + 1) == ':') || *p == ':'))
5867             {
5868               struct group_reloc_table_entry *entry;
5869
5870               /* Skip over the #: or : sequence.  */
5871               if (*p == '#')
5872                 p += 2;
5873               else
5874                 p++;
5875
5876               /* Try to parse a group relocation.  Anything else is an
5877                  error.  */
5878               if (find_group_reloc_table_entry (&p, &entry) == FAIL)
5879                 {
5880                   inst.error = _("unknown group relocation");
5881                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5882                 }
5883
5884               /* We now have the group relocation table entry corresponding to
5885                  the name in the assembler source.  Next, we parse the
5886                  expression.  */
5887               if (my_get_expression (&inst.relocs[0].exp, &p, GE_NO_PREFIX))
5888                 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5889
5890               /* Record the relocation type.  */
5891               switch (group_type)
5892                 {
5893                   case GROUP_LDR:
5894                     inst.relocs[0].type
5895                         = (bfd_reloc_code_real_type) entry->ldr_code;
5896                     break;
5897
5898                   case GROUP_LDRS:
5899                     inst.relocs[0].type
5900                         = (bfd_reloc_code_real_type) entry->ldrs_code;
5901                     break;
5902
5903                   case GROUP_LDC:
5904                     inst.relocs[0].type
5905                         = (bfd_reloc_code_real_type) entry->ldc_code;
5906                     break;
5907
5908                   default:
5909                     gas_assert (0);
5910                 }
5911
5912               if (inst.relocs[0].type == 0)
5913                 {
5914                   inst.error = _("this group relocation is not allowed on this instruction");
5915                   return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5916                 }
5917             }
5918           else
5919             {
5920               char *q = p;
5921
5922               if (my_get_expression (&inst.relocs[0].exp, &p, GE_IMM_PREFIX))
5923                 return PARSE_OPERAND_FAIL;
5924               /* If the offset is 0, find out if it's a +0 or -0.  */
5925               if (inst.relocs[0].exp.X_op == O_constant
5926                   && inst.relocs[0].exp.X_add_number == 0)
5927                 {
5928                   skip_whitespace (q);
5929                   if (*q == '#')
5930                     {
5931                       q++;
5932                       skip_whitespace (q);
5933                     }
5934                   if (*q == '-')
5935                     inst.operands[i].negative = 1;
5936                 }
5937             }
5938         }
5939     }
5940   else if (skip_past_char (&p, ':') == SUCCESS)
5941     {
5942       /* FIXME: '@' should be used here, but it's filtered out by generic code
5943          before we get to see it here. This may be subject to change.  */
5944       parse_operand_result result = parse_neon_alignment (&p, i);
5945
5946       if (result != PARSE_OPERAND_SUCCESS)
5947         return result;
5948     }
5949
5950   if (skip_past_char (&p, ']') == FAIL)
5951     {
5952       inst.error = _("']' expected");
5953       return PARSE_OPERAND_FAIL;
5954     }
5955
5956   if (skip_past_char (&p, '!') == SUCCESS)
5957     inst.operands[i].writeback = 1;
5958
5959   else if (skip_past_comma (&p) == SUCCESS)
5960     {
5961       if (skip_past_char (&p, '{') == SUCCESS)
5962         {
5963           /* [Rn], {expr} - unindexed, with option */
5964           if (parse_immediate (&p, &inst.operands[i].imm,
5965                                0, 255, TRUE) == FAIL)
5966             return PARSE_OPERAND_FAIL;
5967
5968           if (skip_past_char (&p, '}') == FAIL)
5969             {
5970               inst.error = _("'}' expected at end of 'option' field");
5971               return PARSE_OPERAND_FAIL;
5972             }
5973           if (inst.operands[i].preind)
5974             {
5975               inst.error = _("cannot combine index with option");
5976               return PARSE_OPERAND_FAIL;
5977             }
5978           *str = p;
5979           return PARSE_OPERAND_SUCCESS;
5980         }
5981       else
5982         {
5983           inst.operands[i].postind = 1;
5984           inst.operands[i].writeback = 1;
5985
5986           if (inst.operands[i].preind)
5987             {
5988               inst.error = _("cannot combine pre- and post-indexing");
5989               return PARSE_OPERAND_FAIL;
5990             }
5991
5992           if (*p == '+') p++;
5993           else if (*p == '-') p++, inst.operands[i].negative = 1;
5994
5995           enum arm_reg_type rtype = REG_TYPE_MQ;
5996           struct neon_type_el et;
5997           if (group_type == GROUP_MVE
5998               && (reg = arm_typed_reg_parse (&p, rtype, &rtype, &et)) != FAIL)
5999             {
6000               inst.operands[i].immisreg = 2;
6001               inst.operands[i].imm = reg;
6002             }
6003           else if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
6004             {
6005               /* We might be using the immediate for alignment already. If we
6006                  are, OR the register number into the low-order bits.  */
6007               if (inst.operands[i].immisalign)
6008                 inst.operands[i].imm |= reg;
6009               else
6010                 inst.operands[i].imm = reg;
6011               inst.operands[i].immisreg = 1;
6012
6013               if (skip_past_comma (&p) == SUCCESS)
6014                 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
6015                   return PARSE_OPERAND_FAIL;
6016             }
6017           else
6018             {
6019               char *q = p;
6020
6021               if (inst.operands[i].negative)
6022                 {
6023                   inst.operands[i].negative = 0;
6024                   p--;
6025                 }
6026               if (my_get_expression (&inst.relocs[0].exp, &p, GE_IMM_PREFIX))
6027                 return PARSE_OPERAND_FAIL;
6028               /* If the offset is 0, find out if it's a +0 or -0.  */
6029               if (inst.relocs[0].exp.X_op == O_constant
6030                   && inst.relocs[0].exp.X_add_number == 0)
6031                 {
6032                   skip_whitespace (q);
6033                   if (*q == '#')
6034                     {
6035                       q++;
6036                       skip_whitespace (q);
6037                     }
6038                   if (*q == '-')
6039                     inst.operands[i].negative = 1;
6040                 }
6041             }
6042         }
6043     }
6044
6045   /* If at this point neither .preind nor .postind is set, we have a
6046      bare [Rn]{!}, which is shorthand for [Rn,#0]{!}.  */
6047   if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
6048     {
6049       inst.operands[i].preind = 1;
6050       inst.relocs[0].exp.X_op = O_constant;
6051       inst.relocs[0].exp.X_add_number = 0;
6052     }
6053   *str = p;
6054   return PARSE_OPERAND_SUCCESS;
6055 }
6056
6057 static int
6058 parse_address (char **str, int i)
6059 {
6060   return parse_address_main (str, i, 0, GROUP_LDR) == PARSE_OPERAND_SUCCESS
6061          ? SUCCESS : FAIL;
6062 }
6063
6064 static parse_operand_result
6065 parse_address_group_reloc (char **str, int i, group_reloc_type type)
6066 {
6067   return parse_address_main (str, i, 1, type);
6068 }
6069
6070 /* Parse an operand for a MOVW or MOVT instruction.  */
6071 static int
6072 parse_half (char **str)
6073 {
6074   char * p;
6075
6076   p = *str;
6077   skip_past_char (&p, '#');
6078   if (strncasecmp (p, ":lower16:", 9) == 0)
6079     inst.relocs[0].type = BFD_RELOC_ARM_MOVW;
6080   else if (strncasecmp (p, ":upper16:", 9) == 0)
6081     inst.relocs[0].type = BFD_RELOC_ARM_MOVT;
6082
6083   if (inst.relocs[0].type != BFD_RELOC_UNUSED)
6084     {
6085       p += 9;
6086       skip_whitespace (p);
6087     }
6088
6089   if (my_get_expression (&inst.relocs[0].exp, &p, GE_NO_PREFIX))
6090     return FAIL;
6091
6092   if (inst.relocs[0].type == BFD_RELOC_UNUSED)
6093     {
6094       if (inst.relocs[0].exp.X_op != O_constant)
6095         {
6096           inst.error = _("constant expression expected");
6097           return FAIL;
6098         }
6099       if (inst.relocs[0].exp.X_add_number < 0
6100           || inst.relocs[0].exp.X_add_number > 0xffff)
6101         {
6102           inst.error = _("immediate value out of range");
6103           return FAIL;
6104         }
6105     }
6106   *str = p;
6107   return SUCCESS;
6108 }
6109
6110 /* Miscellaneous. */
6111
6112 /* Parse a PSR flag operand.  The value returned is FAIL on syntax error,
6113    or a bitmask suitable to be or-ed into the ARM msr instruction.  */
6114 static int
6115 parse_psr (char **str, bfd_boolean lhs)
6116 {
6117   char *p;
6118   unsigned long psr_field;
6119   const struct asm_psr *psr;
6120   char *start;
6121   bfd_boolean is_apsr = FALSE;
6122   bfd_boolean m_profile = ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m);
6123
6124   /* PR gas/12698:  If the user has specified -march=all then m_profile will
6125      be TRUE, but we want to ignore it in this case as we are building for any
6126      CPU type, including non-m variants.  */
6127   if (ARM_FEATURE_CORE_EQUAL (selected_cpu, arm_arch_any))
6128     m_profile = FALSE;
6129
6130   /* CPSR's and SPSR's can now be lowercase.  This is just a convenience
6131      feature for ease of use and backwards compatibility.  */
6132   p = *str;
6133   if (strncasecmp (p, "SPSR", 4) == 0)
6134     {
6135       if (m_profile)
6136         goto unsupported_psr;
6137
6138       psr_field = SPSR_BIT;
6139     }
6140   else if (strncasecmp (p, "CPSR", 4) == 0)
6141     {
6142       if (m_profile)
6143         goto unsupported_psr;
6144
6145       psr_field = 0;
6146     }
6147   else if (strncasecmp (p, "APSR", 4) == 0)
6148     {
6149       /* APSR[_<bits>] can be used as a synonym for CPSR[_<flags>] on ARMv7-A
6150          and ARMv7-R architecture CPUs.  */
6151       is_apsr = TRUE;
6152       psr_field = 0;
6153     }
6154   else if (m_profile)
6155     {
6156       start = p;
6157       do
6158         p++;
6159       while (ISALNUM (*p) || *p == '_');
6160
6161       if (strncasecmp (start, "iapsr", 5) == 0
6162           || strncasecmp (start, "eapsr", 5) == 0
6163           || strncasecmp (start, "xpsr", 4) == 0
6164           || strncasecmp (start, "psr", 3) == 0)
6165         p = start + strcspn (start, "rR") + 1;
6166
6167       psr = (const struct asm_psr *) hash_find_n (arm_v7m_psr_hsh, start,
6168                                                   p - start);
6169
6170       if (!psr)
6171         return FAIL;
6172
6173       /* If APSR is being written, a bitfield may be specified.  Note that
6174          APSR itself is handled above.  */
6175       if (psr->field <= 3)
6176         {
6177           psr_field = psr->field;
6178           is_apsr = TRUE;
6179           goto check_suffix;
6180         }
6181
6182       *str = p;
6183       /* M-profile MSR instructions have the mask field set to "10", except
6184          *PSR variants which modify APSR, which may use a different mask (and
6185          have been handled already).  Do that by setting the PSR_f field
6186          here.  */
6187       return psr->field | (lhs ? PSR_f : 0);
6188     }
6189   else
6190     goto unsupported_psr;
6191
6192   p += 4;
6193 check_suffix:
6194   if (*p == '_')
6195     {
6196       /* A suffix follows.  */
6197       p++;
6198       start = p;
6199
6200       do
6201         p++;
6202       while (ISALNUM (*p) || *p == '_');
6203
6204       if (is_apsr)
6205         {
6206           /* APSR uses a notation for bits, rather than fields.  */
6207           unsigned int nzcvq_bits = 0;
6208           unsigned int g_bit = 0;
6209           char *bit;
6210
6211           for (bit = start; bit != p; bit++)
6212             {
6213               switch (TOLOWER (*bit))
6214                 {
6215                 case 'n':
6216                   nzcvq_bits |= (nzcvq_bits & 0x01) ? 0x20 : 0x01;
6217                   break;
6218
6219                 case 'z':
6220                   nzcvq_bits |= (nzcvq_bits & 0x02) ? 0x20 : 0x02;
6221                   break;
6222
6223                 case 'c':
6224                   nzcvq_bits |= (nzcvq_bits & 0x04) ? 0x20 : 0x04;
6225                   break;
6226
6227                 case 'v':
6228                   nzcvq_bits |= (nzcvq_bits & 0x08) ? 0x20 : 0x08;
6229                   break;
6230
6231                 case 'q':
6232                   nzcvq_bits |= (nzcvq_bits & 0x10) ? 0x20 : 0x10;
6233                   break;
6234
6235                 case 'g':
6236                   g_bit |= (g_bit & 0x1) ? 0x2 : 0x1;
6237                   break;
6238
6239                 default:
6240                   inst.error = _("unexpected bit specified after APSR");
6241                   return FAIL;
6242                 }
6243             }
6244
6245           if (nzcvq_bits == 0x1f)
6246             psr_field |= PSR_f;
6247
6248           if (g_bit == 0x1)
6249             {
6250               if (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp))
6251                 {
6252                   inst.error = _("selected processor does not "
6253                                  "support DSP extension");
6254                   return FAIL;
6255                 }
6256
6257               psr_field |= PSR_s;
6258             }
6259
6260           if ((nzcvq_bits & 0x20) != 0
6261               || (nzcvq_bits != 0x1f && nzcvq_bits != 0)
6262               || (g_bit & 0x2) != 0)
6263             {
6264               inst.error = _("bad bitmask specified after APSR");
6265               return FAIL;
6266             }
6267         }
6268       else
6269         {
6270           psr = (const struct asm_psr *) hash_find_n (arm_psr_hsh, start,
6271                                                       p - start);
6272           if (!psr)
6273             goto error;
6274
6275           psr_field |= psr->field;
6276         }
6277     }
6278   else
6279     {
6280       if (ISALNUM (*p))
6281         goto error;    /* Garbage after "[CS]PSR".  */
6282
6283       /* Unadorned APSR is equivalent to APSR_nzcvq/CPSR_f (for writes).  This
6284          is deprecated, but allow it anyway.  */
6285       if (is_apsr && lhs)
6286         {
6287           psr_field |= PSR_f;
6288           as_tsktsk (_("writing to APSR without specifying a bitmask is "
6289                        "deprecated"));
6290         }
6291       else if (!m_profile)
6292         /* These bits are never right for M-profile devices: don't set them
6293            (only code paths which read/write APSR reach here).  */
6294         psr_field |= (PSR_c | PSR_f);
6295     }
6296   *str = p;
6297   return psr_field;
6298
6299  unsupported_psr:
6300   inst.error = _("selected processor does not support requested special "
6301                  "purpose register");
6302   return FAIL;
6303
6304  error:
6305   inst.error = _("flag for {c}psr instruction expected");
6306   return FAIL;
6307 }
6308
6309 static int
6310 parse_sys_vldr_vstr (char **str)
6311 {
6312   unsigned i;
6313   int val = FAIL;
6314   struct {
6315     const char *name;
6316     int regl;
6317     int regh;
6318   } sysregs[] = {
6319     {"FPSCR",           0x1, 0x0},
6320     {"FPSCR_nzcvqc",    0x2, 0x0},
6321     {"VPR",             0x4, 0x1},
6322     {"P0",              0x5, 0x1},
6323     {"FPCXTNS",         0x6, 0x1},
6324     {"FPCXTS",          0x7, 0x1}
6325   };
6326   char *op_end = strchr (*str, ',');
6327   size_t op_strlen = op_end - *str;
6328
6329   for (i = 0; i < sizeof (sysregs) / sizeof (sysregs[0]); i++)
6330     {
6331       if (!strncmp (*str, sysregs[i].name, op_strlen))
6332         {
6333           val = sysregs[i].regl | (sysregs[i].regh << 3);
6334           *str = op_end;
6335           break;
6336         }
6337     }
6338
6339   return val;
6340 }
6341
6342 /* Parse the flags argument to CPSI[ED].  Returns FAIL on error, or a
6343    value suitable for splatting into the AIF field of the instruction.  */
6344
6345 static int
6346 parse_cps_flags (char **str)
6347 {
6348   int val = 0;
6349   int saw_a_flag = 0;
6350   char *s = *str;
6351
6352   for (;;)
6353     switch (*s++)
6354       {
6355       case '\0': case ',':
6356         goto done;
6357
6358       case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
6359       case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
6360       case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
6361
6362       default:
6363         inst.error = _("unrecognized CPS flag");
6364         return FAIL;
6365       }
6366
6367  done:
6368   if (saw_a_flag == 0)
6369     {
6370       inst.error = _("missing CPS flags");
6371       return FAIL;
6372     }
6373
6374   *str = s - 1;
6375   return val;
6376 }
6377
6378 /* Parse an endian specifier ("BE" or "LE", case insensitive);
6379    returns 0 for big-endian, 1 for little-endian, FAIL for an error.  */
6380
6381 static int
6382 parse_endian_specifier (char **str)
6383 {
6384   int little_endian;
6385   char *s = *str;
6386
6387   if (strncasecmp (s, "BE", 2))
6388     little_endian = 0;
6389   else if (strncasecmp (s, "LE", 2))
6390     little_endian = 1;
6391   else
6392     {
6393       inst.error = _("valid endian specifiers are be or le");
6394       return FAIL;
6395     }
6396
6397   if (ISALNUM (s[2]) || s[2] == '_')
6398     {
6399       inst.error = _("valid endian specifiers are be or le");
6400       return FAIL;
6401     }
6402
6403   *str = s + 2;
6404   return little_endian;
6405 }
6406
6407 /* Parse a rotation specifier: ROR #0, #8, #16, #24.  *val receives a
6408    value suitable for poking into the rotate field of an sxt or sxta
6409    instruction, or FAIL on error.  */
6410
6411 static int
6412 parse_ror (char **str)
6413 {
6414   int rot;
6415   char *s = *str;
6416
6417   if (strncasecmp (s, "ROR", 3) == 0)
6418     s += 3;
6419   else
6420     {
6421       inst.error = _("missing rotation field after comma");
6422       return FAIL;
6423     }
6424
6425   if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
6426     return FAIL;
6427
6428   switch (rot)
6429     {
6430     case  0: *str = s; return 0x0;
6431     case  8: *str = s; return 0x1;
6432     case 16: *str = s; return 0x2;
6433     case 24: *str = s; return 0x3;
6434
6435     default:
6436       inst.error = _("rotation can only be 0, 8, 16, or 24");
6437       return FAIL;
6438     }
6439 }
6440
6441 /* Parse a conditional code (from conds[] below).  The value returned is in the
6442    range 0 .. 14, or FAIL.  */
6443 static int
6444 parse_cond (char **str)
6445 {
6446   char *q;
6447   const struct asm_cond *c;
6448   int n;
6449   /* Condition codes are always 2 characters, so matching up to
6450      3 characters is sufficient.  */
6451   char cond[3];
6452
6453   q = *str;
6454   n = 0;
6455   while (ISALPHA (*q) && n < 3)
6456     {
6457       cond[n] = TOLOWER (*q);
6458       q++;
6459       n++;
6460     }
6461
6462   c = (const struct asm_cond *) hash_find_n (arm_cond_hsh, cond, n);
6463   if (!c)
6464     {
6465       inst.error = _("condition required");
6466       return FAIL;
6467     }
6468
6469   *str = q;
6470   return c->value;
6471 }
6472
6473 /* Parse an option for a barrier instruction.  Returns the encoding for the
6474    option, or FAIL.  */
6475 static int
6476 parse_barrier (char **str)
6477 {
6478   char *p, *q;
6479   const struct asm_barrier_opt *o;
6480
6481   p = q = *str;
6482   while (ISALPHA (*q))
6483     q++;
6484
6485   o = (const struct asm_barrier_opt *) hash_find_n (arm_barrier_opt_hsh, p,
6486                                                     q - p);
6487   if (!o)
6488     return FAIL;
6489
6490   if (!mark_feature_used (&o->arch))
6491     return FAIL;
6492
6493   *str = q;
6494   return o->value;
6495 }
6496
6497 /* Parse the operands of a table branch instruction.  Similar to a memory
6498    operand.  */
6499 static int
6500 parse_tb (char **str)
6501 {
6502   char * p = *str;
6503   int reg;
6504
6505   if (skip_past_char (&p, '[') == FAIL)
6506     {
6507       inst.error = _("'[' expected");
6508       return FAIL;
6509     }
6510
6511   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
6512     {
6513       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
6514       return FAIL;
6515     }
6516   inst.operands[0].reg = reg;
6517
6518   if (skip_past_comma (&p) == FAIL)
6519     {
6520       inst.error = _("',' expected");
6521       return FAIL;
6522     }
6523
6524   if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
6525     {
6526       inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
6527       return FAIL;
6528     }
6529   inst.operands[0].imm = reg;
6530
6531   if (skip_past_comma (&p) == SUCCESS)
6532     {
6533       if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
6534         return FAIL;
6535       if (inst.relocs[0].exp.X_add_number != 1)
6536         {
6537           inst.error = _("invalid shift");
6538           return FAIL;
6539         }
6540       inst.operands[0].shifted = 1;
6541     }
6542
6543   if (skip_past_char (&p, ']') == FAIL)
6544     {
6545       inst.error = _("']' expected");
6546       return FAIL;
6547     }
6548   *str = p;
6549   return SUCCESS;
6550 }
6551
6552 /* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
6553    information on the types the operands can take and how they are encoded.
6554    Up to four operands may be read; this function handles setting the
6555    ".present" field for each read operand itself.
6556    Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
6557    else returns FAIL.  */
6558
6559 static int
6560 parse_neon_mov (char **str, int *which_operand)
6561 {
6562   int i = *which_operand, val;
6563   enum arm_reg_type rtype;
6564   char *ptr = *str;
6565   struct neon_type_el optype;
6566
6567    if ((val = parse_scalar (&ptr, 8, &optype, REG_TYPE_MQ)) != FAIL)
6568     {
6569       /* Cases 17 or 19.  */
6570       inst.operands[i].reg = val;
6571       inst.operands[i].isvec = 1;
6572       inst.operands[i].isscalar = 2;
6573       inst.operands[i].vectype = optype;
6574       inst.operands[i++].present = 1;
6575
6576       if (skip_past_comma (&ptr) == FAIL)
6577         goto wanted_comma;
6578
6579       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6580         {
6581           /* Case 17: VMOV<c>.<dt> <Qd[idx]>, <Rt>  */
6582           inst.operands[i].reg = val;
6583           inst.operands[i].isreg = 1;
6584           inst.operands[i].present = 1;
6585         }
6586       else if ((val = parse_scalar (&ptr, 8, &optype, REG_TYPE_MQ)) != FAIL)
6587         {
6588           /* Case 19: VMOV<c> <Qd[idx]>, <Qd[idx2]>, <Rt>, <Rt2>  */
6589           inst.operands[i].reg = val;
6590           inst.operands[i].isvec = 1;
6591           inst.operands[i].isscalar = 2;
6592           inst.operands[i].vectype = optype;
6593           inst.operands[i++].present = 1;
6594
6595           if (skip_past_comma (&ptr) == FAIL)
6596             goto wanted_comma;
6597
6598           if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6599             goto wanted_arm;
6600
6601           inst.operands[i].reg = val;
6602           inst.operands[i].isreg = 1;
6603           inst.operands[i++].present = 1;
6604
6605           if (skip_past_comma (&ptr) == FAIL)
6606             goto wanted_comma;
6607
6608           if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6609             goto wanted_arm;
6610
6611           inst.operands[i].reg = val;
6612           inst.operands[i].isreg = 1;
6613           inst.operands[i].present = 1;
6614         }
6615       else
6616         {
6617           first_error (_("expected ARM or MVE vector register"));
6618           return FAIL;
6619         }
6620     }
6621    else if ((val = parse_scalar (&ptr, 8, &optype, REG_TYPE_VFD)) != FAIL)
6622     {
6623       /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>.  */
6624       inst.operands[i].reg = val;
6625       inst.operands[i].isscalar = 1;
6626       inst.operands[i].vectype = optype;
6627       inst.operands[i++].present = 1;
6628
6629       if (skip_past_comma (&ptr) == FAIL)
6630         goto wanted_comma;
6631
6632       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6633         goto wanted_arm;
6634
6635       inst.operands[i].reg = val;
6636       inst.operands[i].isreg = 1;
6637       inst.operands[i].present = 1;
6638     }
6639   else if (((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
6640             != FAIL)
6641            || ((val = arm_typed_reg_parse (&ptr, REG_TYPE_MQ, &rtype, &optype))
6642                != FAIL))
6643     {
6644       /* Cases 0, 1, 2, 3, 5 (D only).  */
6645       if (skip_past_comma (&ptr) == FAIL)
6646         goto wanted_comma;
6647
6648       inst.operands[i].reg = val;
6649       inst.operands[i].isreg = 1;
6650       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
6651       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6652       inst.operands[i].isvec = 1;
6653       inst.operands[i].vectype = optype;
6654       inst.operands[i++].present = 1;
6655
6656       if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6657         {
6658           /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
6659              Case 13: VMOV <Sd>, <Rm>  */
6660           inst.operands[i].reg = val;
6661           inst.operands[i].isreg = 1;
6662           inst.operands[i].present = 1;
6663
6664           if (rtype == REG_TYPE_NQ)
6665             {
6666               first_error (_("can't use Neon quad register here"));
6667               return FAIL;
6668             }
6669           else if (rtype != REG_TYPE_VFS)
6670             {
6671               i++;
6672               if (skip_past_comma (&ptr) == FAIL)
6673                 goto wanted_comma;
6674               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6675                 goto wanted_arm;
6676               inst.operands[i].reg = val;
6677               inst.operands[i].isreg = 1;
6678               inst.operands[i].present = 1;
6679             }
6680         }
6681       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
6682                                            &optype)) != FAIL)
6683         {
6684           /* Case 0: VMOV<c><q> <Qd>, <Qm>
6685              Case 1: VMOV<c><q> <Dd>, <Dm>
6686              Case 8: VMOV.F32 <Sd>, <Sm>
6687              Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm>  */
6688
6689           inst.operands[i].reg = val;
6690           inst.operands[i].isreg = 1;
6691           inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
6692           inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6693           inst.operands[i].isvec = 1;
6694           inst.operands[i].vectype = optype;
6695           inst.operands[i].present = 1;
6696
6697           if (skip_past_comma (&ptr) == SUCCESS)
6698             {
6699               /* Case 15.  */
6700               i++;
6701
6702               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6703                 goto wanted_arm;
6704
6705               inst.operands[i].reg = val;
6706               inst.operands[i].isreg = 1;
6707               inst.operands[i++].present = 1;
6708
6709               if (skip_past_comma (&ptr) == FAIL)
6710                 goto wanted_comma;
6711
6712               if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6713                 goto wanted_arm;
6714
6715               inst.operands[i].reg = val;
6716               inst.operands[i].isreg = 1;
6717               inst.operands[i].present = 1;
6718             }
6719         }
6720       else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
6721           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
6722              Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
6723              Case 10: VMOV.F32 <Sd>, #<imm>
6724              Case 11: VMOV.F64 <Dd>, #<imm>  */
6725         inst.operands[i].immisfloat = 1;
6726       else if (parse_big_immediate (&ptr, i, NULL, /*allow_symbol_p=*/FALSE)
6727                == SUCCESS)
6728           /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
6729              Case 3: VMOV<c><q>.<dt> <Dd>, #<imm>  */
6730         ;
6731       else
6732         {
6733           first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
6734           return FAIL;
6735         }
6736     }
6737   else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6738     {
6739       /* Cases 6, 7, 16, 18.  */
6740       inst.operands[i].reg = val;
6741       inst.operands[i].isreg = 1;
6742       inst.operands[i++].present = 1;
6743
6744       if (skip_past_comma (&ptr) == FAIL)
6745         goto wanted_comma;
6746
6747       if ((val = parse_scalar (&ptr, 8, &optype, REG_TYPE_MQ)) != FAIL)
6748         {
6749           /* Case 18: VMOV<c>.<dt> <Rt>, <Qn[idx]>  */
6750           inst.operands[i].reg = val;
6751           inst.operands[i].isscalar = 2;
6752           inst.operands[i].present = 1;
6753           inst.operands[i].vectype = optype;
6754         }
6755       else if ((val = parse_scalar (&ptr, 8, &optype, REG_TYPE_VFD)) != FAIL)
6756         {
6757           /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]>  */
6758           inst.operands[i].reg = val;
6759           inst.operands[i].isscalar = 1;
6760           inst.operands[i].present = 1;
6761           inst.operands[i].vectype = optype;
6762         }
6763       else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6764         {
6765           inst.operands[i].reg = val;
6766           inst.operands[i].isreg = 1;
6767           inst.operands[i++].present = 1;
6768
6769           if (skip_past_comma (&ptr) == FAIL)
6770             goto wanted_comma;
6771
6772           if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
6773               != FAIL)
6774             {
6775               /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm>  */
6776
6777               inst.operands[i].reg = val;
6778               inst.operands[i].isreg = 1;
6779               inst.operands[i].isvec = 1;
6780               inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6781               inst.operands[i].vectype = optype;
6782               inst.operands[i].present = 1;
6783
6784               if (rtype == REG_TYPE_VFS)
6785                 {
6786                   /* Case 14.  */
6787                   i++;
6788                   if (skip_past_comma (&ptr) == FAIL)
6789                     goto wanted_comma;
6790                   if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
6791                                                   &optype)) == FAIL)
6792                     {
6793                       first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
6794                       return FAIL;
6795                     }
6796                   inst.operands[i].reg = val;
6797                   inst.operands[i].isreg = 1;
6798                   inst.operands[i].isvec = 1;
6799                   inst.operands[i].issingle = 1;
6800                   inst.operands[i].vectype = optype;
6801                   inst.operands[i].present = 1;
6802                 }
6803             }
6804           else
6805             {
6806               if ((val = parse_scalar (&ptr, 8, &optype, REG_TYPE_MQ))
6807                        != FAIL)
6808                 {
6809                   /* Case 16: VMOV<c> <Rt>, <Rt2>, <Qd[idx]>, <Qd[idx2]>  */
6810                   inst.operands[i].reg = val;
6811                   inst.operands[i].isvec = 1;
6812                   inst.operands[i].isscalar = 2;
6813                   inst.operands[i].vectype = optype;
6814                   inst.operands[i++].present = 1;
6815
6816                   if (skip_past_comma (&ptr) == FAIL)
6817                     goto wanted_comma;
6818
6819                   if ((val = parse_scalar (&ptr, 8, &optype, REG_TYPE_MQ))
6820                       == FAIL)
6821                     {
6822                       first_error (_(reg_expected_msgs[REG_TYPE_MQ]));
6823                       return FAIL;
6824                     }
6825                   inst.operands[i].reg = val;
6826                   inst.operands[i].isvec = 1;
6827                   inst.operands[i].isscalar = 2;
6828                   inst.operands[i].vectype = optype;
6829                   inst.operands[i].present = 1;
6830                 }
6831               else
6832                 {
6833                   first_error (_("VFP single, double or MVE vector register"
6834                                " expected"));
6835                   return FAIL;
6836                 }
6837             }
6838         }
6839       else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
6840                != FAIL)
6841         {
6842           /* Case 13.  */
6843           inst.operands[i].reg = val;
6844           inst.operands[i].isreg = 1;
6845           inst.operands[i].isvec = 1;
6846           inst.operands[i].issingle = 1;
6847           inst.operands[i].vectype = optype;
6848           inst.operands[i].present = 1;
6849         }
6850     }
6851   else
6852     {
6853       first_error (_("parse error"));
6854       return FAIL;
6855     }
6856
6857   /* Successfully parsed the operands. Update args.  */
6858   *which_operand = i;
6859   *str = ptr;
6860   return SUCCESS;
6861
6862  wanted_comma:
6863   first_error (_("expected comma"));
6864   return FAIL;
6865
6866  wanted_arm:
6867   first_error (_(reg_expected_msgs[REG_TYPE_RN]));
6868   return FAIL;
6869 }
6870
6871 /* Use this macro when the operand constraints are different
6872    for ARM and THUMB (e.g. ldrd).  */
6873 #define MIX_ARM_THUMB_OPERANDS(arm_operand, thumb_operand) \
6874         ((arm_operand) | ((thumb_operand) << 16))
6875
6876 /* Matcher codes for parse_operands.  */
6877 enum operand_parse_code
6878 {
6879   OP_stop,      /* end of line */
6880
6881   OP_RR,        /* ARM register */
6882   OP_RRnpc,     /* ARM register, not r15 */
6883   OP_RRnpcsp,   /* ARM register, neither r15 nor r13 (a.k.a. 'BadReg') */
6884   OP_RRnpcb,    /* ARM register, not r15, in square brackets */
6885   OP_RRnpctw,   /* ARM register, not r15 in Thumb-state or with writeback,
6886                    optional trailing ! */
6887   OP_RRw,       /* ARM register, not r15, optional trailing ! */
6888   OP_RCP,       /* Coprocessor number */
6889   OP_RCN,       /* Coprocessor register */
6890   OP_RF,        /* FPA register */
6891   OP_RVS,       /* VFP single precision register */
6892   OP_RVD,       /* VFP double precision register (0..15) */
6893   OP_RND,       /* Neon double precision register (0..31) */
6894   OP_RNDMQ,     /* Neon double precision (0..31) or MVE vector register.  */
6895   OP_RNDMQR,    /* Neon double precision (0..31), MVE vector or ARM register.
6896                  */
6897   OP_RNQ,       /* Neon quad precision register */
6898   OP_RNQMQ,     /* Neon quad or MVE vector register.  */
6899   OP_RVSD,      /* VFP single or double precision register */
6900   OP_RVSD_COND, /* VFP single, double precision register or condition code.  */
6901   OP_RVSDMQ,    /* VFP single, double precision or MVE vector register.  */
6902   OP_RNSD,      /* Neon single or double precision register */
6903   OP_RNDQ,      /* Neon double or quad precision register */
6904   OP_RNDQMQ,     /* Neon double, quad or MVE vector register.  */
6905   OP_RNDQMQR,   /* Neon double, quad, MVE vector or ARM register.  */
6906   OP_RNSDQ,     /* Neon single, double or quad precision register */
6907   OP_RNSC,      /* Neon scalar D[X] */
6908   OP_RVC,       /* VFP control register */
6909   OP_RMF,       /* Maverick F register */
6910   OP_RMD,       /* Maverick D register */
6911   OP_RMFX,      /* Maverick FX register */
6912   OP_RMDX,      /* Maverick DX register */
6913   OP_RMAX,      /* Maverick AX register */
6914   OP_RMDS,      /* Maverick DSPSC register */
6915   OP_RIWR,      /* iWMMXt wR register */
6916   OP_RIWC,      /* iWMMXt wC register */
6917   OP_RIWG,      /* iWMMXt wCG register */
6918   OP_RXA,       /* XScale accumulator register */
6919
6920   OP_RNSDQMQ,   /* Neon single, double or quad register or MVE vector register
6921                  */
6922   OP_RNSDQMQR,  /* Neon single, double or quad register, MVE vector register or
6923                    GPR (no SP/SP)  */
6924   OP_RMQ,       /* MVE vector register.  */
6925   OP_RMQRZ,     /* MVE vector or ARM register including ZR.  */
6926   OP_RMQRR,     /* MVE vector or ARM register.  */
6927
6928   /* New operands for Armv8.1-M Mainline.  */
6929   OP_LR,        /* ARM LR register */
6930   OP_RRe,       /* ARM register, only even numbered.  */
6931   OP_RRo,       /* ARM register, only odd numbered, not r13 or r15.  */
6932   OP_RRnpcsp_I32, /* ARM register (no BadReg) or literal 1 .. 32 */
6933
6934   OP_REGLST,    /* ARM register list */
6935   OP_CLRMLST,   /* CLRM register list */
6936   OP_VRSLST,    /* VFP single-precision register list */
6937   OP_VRDLST,    /* VFP double-precision register list */
6938   OP_VRSDLST,   /* VFP single or double-precision register list (& quad) */
6939   OP_NRDLST,    /* Neon double-precision register list (d0-d31, qN aliases) */
6940   OP_NSTRLST,   /* Neon element/structure list */
6941   OP_VRSDVLST,  /* VFP single or double-precision register list and VPR */
6942   OP_MSTRLST2,  /* MVE vector list with two elements.  */
6943   OP_MSTRLST4,  /* MVE vector list with four elements.  */
6944
6945   OP_RNDQ_I0,   /* Neon D or Q reg, or immediate zero.  */
6946   OP_RVSD_I0,   /* VFP S or D reg, or immediate zero.  */
6947   OP_RSVD_FI0, /* VFP S or D reg, or floating point immediate zero.  */
6948   OP_RSVDMQ_FI0, /* VFP S, D, MVE vector register or floating point immediate
6949                     zero.  */
6950   OP_RR_RNSC,   /* ARM reg or Neon scalar.  */
6951   OP_RNSD_RNSC, /* Neon S or D reg, or Neon scalar.  */
6952   OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar.  */
6953   OP_RNSDQ_RNSC_MQ, /* Vector S, D or Q reg, Neon scalar or MVE vector register.
6954                      */
6955   OP_RNSDQ_RNSC_MQ_RR, /* Vector S, D or Q reg, or MVE vector reg , or Neon
6956                           scalar, or ARM register.  */
6957   OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar.  */
6958   OP_RNDQ_RNSC_RR, /* Neon D or Q reg, Neon scalar, or ARM register.  */
6959   OP_RNDQMQ_RNSC_RR, /* Neon D or Q reg, Neon scalar, MVE vector or ARM
6960                         register.  */
6961   OP_RNDQMQ_RNSC, /* Neon D, Q or MVE vector reg, or Neon scalar.  */
6962   OP_RND_RNSC,  /* Neon D reg, or Neon scalar.  */
6963   OP_VMOV,      /* Neon VMOV operands.  */
6964   OP_RNDQ_Ibig, /* Neon D or Q reg, or big immediate for logic and VMVN.  */
6965   /* Neon D, Q or MVE vector register, or big immediate for logic and VMVN.  */
6966   OP_RNDQMQ_Ibig,
6967   OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift.  */
6968   OP_RNDQMQ_I63b_RR, /* Neon D or Q reg, immediate for shift, MVE vector or
6969                         ARM register.  */
6970   OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2.  */
6971   OP_VLDR,      /* VLDR operand.  */
6972
6973   OP_I0,        /* immediate zero */
6974   OP_I7,        /* immediate value 0 .. 7 */
6975   OP_I15,       /*                 0 .. 15 */
6976   OP_I16,       /*                 1 .. 16 */
6977   OP_I16z,      /*                 0 .. 16 */
6978   OP_I31,       /*                 0 .. 31 */
6979   OP_I31w,      /*                 0 .. 31, optional trailing ! */
6980   OP_I32,       /*                 1 .. 32 */
6981   OP_I32z,      /*                 0 .. 32 */
6982   OP_I63,       /*                 0 .. 63 */
6983   OP_I63s,      /*               -64 .. 63 */
6984   OP_I64,       /*                 1 .. 64 */
6985   OP_I64z,      /*                 0 .. 64 */
6986   OP_I255,      /*                 0 .. 255 */
6987
6988   OP_I4b,       /* immediate, prefix optional, 1 .. 4 */
6989   OP_I7b,       /*                             0 .. 7 */
6990   OP_I15b,      /*                             0 .. 15 */
6991   OP_I31b,      /*                             0 .. 31 */
6992
6993   OP_SH,        /* shifter operand */
6994   OP_SHG,       /* shifter operand with possible group relocation */
6995   OP_ADDR,      /* Memory address expression (any mode) */
6996   OP_ADDRMVE,   /* Memory address expression for MVE's VSTR/VLDR.  */
6997   OP_ADDRGLDR,  /* Mem addr expr (any mode) with possible LDR group reloc */
6998   OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
6999   OP_ADDRGLDC,  /* Mem addr expr (any mode) with possible LDC group reloc */
7000   OP_EXP,       /* arbitrary expression */
7001   OP_EXPi,      /* same, with optional immediate prefix */
7002   OP_EXPr,      /* same, with optional relocation suffix */
7003   OP_EXPs,      /* same, with optional non-first operand relocation suffix */
7004   OP_HALF,      /* 0 .. 65535 or low/high reloc.  */
7005   OP_IROT1,     /* VCADD rotate immediate: 90, 270.  */
7006   OP_IROT2,     /* VCMLA rotate immediate: 0, 90, 180, 270.  */
7007
7008   OP_CPSF,      /* CPS flags */
7009   OP_ENDI,      /* Endianness specifier */
7010   OP_wPSR,      /* CPSR/SPSR/APSR mask for msr (writing).  */
7011   OP_rPSR,      /* CPSR/SPSR/APSR mask for msr (reading).  */
7012   OP_COND,      /* conditional code */
7013   OP_TB,        /* Table branch.  */
7014
7015   OP_APSR_RR,   /* ARM register or "APSR_nzcv".  */
7016
7017   OP_RRnpc_I0,  /* ARM register or literal 0 */
7018   OP_RR_EXr,    /* ARM register or expression with opt. reloc stuff. */
7019   OP_RR_EXi,    /* ARM register or expression with imm prefix */
7020   OP_RF_IF,     /* FPA register or immediate */
7021   OP_RIWR_RIWC, /* iWMMXt R or C reg */
7022   OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
7023
7024   /* Optional operands.  */
7025   OP_oI7b,       /* immediate, prefix optional, 0 .. 7 */
7026   OP_oI31b,      /*                             0 .. 31 */
7027   OP_oI32b,      /*                             1 .. 32 */
7028   OP_oI32z,      /*                             0 .. 32 */
7029   OP_oIffffb,    /*                             0 .. 65535 */
7030   OP_oI255c,     /*       curly-brace enclosed, 0 .. 255 */
7031
7032   OP_oRR,        /* ARM register */
7033   OP_oLR,        /* ARM LR register */
7034   OP_oRRnpc,     /* ARM register, not the PC */
7035   OP_oRRnpcsp,   /* ARM register, neither the PC nor the SP (a.k.a. BadReg) */
7036   OP_oRRw,       /* ARM register, not r15, optional trailing ! */
7037   OP_oRND,       /* Optional Neon double precision register */
7038   OP_oRNQ,       /* Optional Neon quad precision register */
7039   OP_oRNDQMQ,     /* Optional Neon double, quad or MVE vector register.  */
7040   OP_oRNDQ,      /* Optional Neon double or quad precision register */
7041   OP_oRNSDQ,     /* Optional single, double or quad precision vector register */
7042   OP_oRNSDQMQ,   /* Optional single, double or quad register or MVE vector
7043                     register.  */
7044   OP_oSHll,      /* LSL immediate */
7045   OP_oSHar,      /* ASR immediate */
7046   OP_oSHllar,    /* LSL or ASR immediate */
7047   OP_oROR,       /* ROR 0/8/16/24 */
7048   OP_oBARRIER_I15, /* Option argument for a barrier instruction.  */
7049
7050   OP_oRMQRZ,    /* optional MVE vector or ARM register including ZR.  */
7051
7052   /* Some pre-defined mixed (ARM/THUMB) operands.  */
7053   OP_RR_npcsp           = MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
7054   OP_RRnpc_npcsp        = MIX_ARM_THUMB_OPERANDS (OP_RRnpc, OP_RRnpcsp),
7055   OP_oRRnpc_npcsp       = MIX_ARM_THUMB_OPERANDS (OP_oRRnpc, OP_oRRnpcsp),
7056
7057   OP_FIRST_OPTIONAL = OP_oI7b
7058 };
7059
7060 /* Generic instruction operand parser.  This does no encoding and no
7061    semantic validation; it merely squirrels values away in the inst
7062    structure.  Returns SUCCESS or FAIL depending on whether the
7063    specified grammar matched.  */
7064 static int
7065 parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
7066 {
7067   unsigned const int *upat = pattern;
7068   char *backtrack_pos = 0;
7069   const char *backtrack_error = 0;
7070   int i, val = 0, backtrack_index = 0;
7071   enum arm_reg_type rtype;
7072   parse_operand_result result;
7073   unsigned int op_parse_code;
7074   bfd_boolean partial_match;
7075
7076 #define po_char_or_fail(chr)                    \
7077   do                                            \
7078     {                                           \
7079       if (skip_past_char (&str, chr) == FAIL)   \
7080         goto bad_args;                          \
7081     }                                           \
7082   while (0)
7083
7084 #define po_reg_or_fail(regtype)                                 \
7085   do                                                            \
7086     {                                                           \
7087       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
7088                                  & inst.operands[i].vectype);   \
7089       if (val == FAIL)                                          \
7090         {                                                       \
7091           first_error (_(reg_expected_msgs[regtype]));          \
7092           goto failure;                                         \
7093         }                                                       \
7094       inst.operands[i].reg = val;                               \
7095       inst.operands[i].isreg = 1;                               \
7096       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
7097       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
7098       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
7099                              || rtype == REG_TYPE_VFD           \
7100                              || rtype == REG_TYPE_NQ);          \
7101       inst.operands[i].iszr = (rtype == REG_TYPE_ZR);           \
7102     }                                                           \
7103   while (0)
7104
7105 #define po_reg_or_goto(regtype, label)                          \
7106   do                                                            \
7107     {                                                           \
7108       val = arm_typed_reg_parse (& str, regtype, & rtype,       \
7109                                  & inst.operands[i].vectype);   \
7110       if (val == FAIL)                                          \
7111         goto label;                                             \
7112                                                                 \
7113       inst.operands[i].reg = val;                               \
7114       inst.operands[i].isreg = 1;                               \
7115       inst.operands[i].isquad = (rtype == REG_TYPE_NQ);         \
7116       inst.operands[i].issingle = (rtype == REG_TYPE_VFS);      \
7117       inst.operands[i].isvec = (rtype == REG_TYPE_VFS           \
7118                              || rtype == REG_TYPE_VFD           \
7119                              || rtype == REG_TYPE_NQ);          \
7120       inst.operands[i].iszr = (rtype == REG_TYPE_ZR);           \
7121     }                                                           \
7122   while (0)
7123
7124 #define po_imm_or_fail(min, max, popt)                          \
7125   do                                                            \
7126     {                                                           \
7127       if (parse_immediate (&str, &val, min, max, popt) == FAIL) \
7128         goto failure;                                           \
7129       inst.operands[i].imm = val;                               \
7130     }                                                           \
7131   while (0)
7132
7133 #define po_scalar_or_goto(elsz, label, reg_type)                        \
7134   do                                                                    \
7135     {                                                                   \
7136       val = parse_scalar (& str, elsz, & inst.operands[i].vectype,      \
7137                           reg_type);                                    \
7138       if (val == FAIL)                                                  \
7139         goto label;                                                     \
7140       inst.operands[i].reg = val;                                       \
7141       inst.operands[i].isscalar = 1;                                    \
7142     }                                                                   \
7143   while (0)
7144
7145 #define po_misc_or_fail(expr)                   \
7146   do                                            \
7147     {                                           \
7148       if (expr)                                 \
7149         goto failure;                           \
7150     }                                           \
7151   while (0)
7152
7153 #define po_misc_or_fail_no_backtrack(expr)              \
7154   do                                                    \
7155     {                                                   \
7156       result = expr;                                    \
7157       if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK)    \
7158         backtrack_pos = 0;                              \
7159       if (result != PARSE_OPERAND_SUCCESS)              \
7160         goto failure;                                   \
7161     }                                                   \
7162   while (0)
7163
7164 #define po_barrier_or_imm(str)                             \
7165   do                                                       \
7166     {                                                      \
7167       val = parse_barrier (&str);                          \
7168       if (val == FAIL && ! ISALPHA (*str))                 \
7169         goto immediate;                                    \
7170       if (val == FAIL                                      \
7171           /* ISB can only take SY as an option.  */        \
7172           || ((inst.instruction & 0xf0) == 0x60            \
7173                && val != 0xf))                             \
7174         {                                                  \
7175            inst.error = _("invalid barrier type");         \
7176            backtrack_pos = 0;                              \
7177            goto failure;                                   \
7178         }                                                  \
7179     }                                                      \
7180   while (0)
7181
7182   skip_whitespace (str);
7183
7184   for (i = 0; upat[i] != OP_stop; i++)
7185     {
7186       op_parse_code = upat[i];
7187       if (op_parse_code >= 1<<16)
7188         op_parse_code = thumb ? (op_parse_code >> 16)
7189                                 : (op_parse_code & ((1<<16)-1));
7190
7191       if (op_parse_code >= OP_FIRST_OPTIONAL)
7192         {
7193           /* Remember where we are in case we need to backtrack.  */
7194           backtrack_pos = str;
7195           backtrack_error = inst.error;
7196           backtrack_index = i;
7197         }
7198
7199       if (i > 0 && (i > 1 || inst.operands[0].present))
7200         po_char_or_fail (',');
7201
7202       switch (op_parse_code)
7203         {
7204           /* Registers */
7205         case OP_oRRnpc:
7206         case OP_oRRnpcsp:
7207         case OP_RRnpc:
7208         case OP_RRnpcsp:
7209         case OP_oRR:
7210         case OP_RRe:
7211         case OP_RRo:
7212         case OP_LR:
7213         case OP_oLR:
7214         case OP_RR:    po_reg_or_fail (REG_TYPE_RN);      break;
7215         case OP_RCP:   po_reg_or_fail (REG_TYPE_CP);      break;
7216         case OP_RCN:   po_reg_or_fail (REG_TYPE_CN);      break;
7217         case OP_RF:    po_reg_or_fail (REG_TYPE_FN);      break;
7218         case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);     break;
7219         case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);     break;
7220         case OP_oRND:
7221         case OP_RNDMQR:
7222           po_reg_or_goto (REG_TYPE_RN, try_rndmq);
7223           break;
7224         try_rndmq:
7225         case OP_RNDMQ:
7226           po_reg_or_goto (REG_TYPE_MQ, try_rnd);
7227           break;
7228         try_rnd:
7229         case OP_RND:   po_reg_or_fail (REG_TYPE_VFD);     break;
7230         case OP_RVC:
7231           po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
7232           break;
7233           /* Also accept generic coprocessor regs for unknown registers.  */
7234           coproc_reg:
7235           po_reg_or_fail (REG_TYPE_CN);
7236           break;
7237         case OP_RMF:   po_reg_or_fail (REG_TYPE_MVF);     break;
7238         case OP_RMD:   po_reg_or_fail (REG_TYPE_MVD);     break;
7239         case OP_RMFX:  po_reg_or_fail (REG_TYPE_MVFX);    break;
7240         case OP_RMDX:  po_reg_or_fail (REG_TYPE_MVDX);    break;
7241         case OP_RMAX:  po_reg_or_fail (REG_TYPE_MVAX);    break;
7242         case OP_RMDS:  po_reg_or_fail (REG_TYPE_DSPSC);   break;
7243         case OP_RIWR:  po_reg_or_fail (REG_TYPE_MMXWR);   break;
7244         case OP_RIWC:  po_reg_or_fail (REG_TYPE_MMXWC);   break;
7245         case OP_RIWG:  po_reg_or_fail (REG_TYPE_MMXWCG);  break;
7246         case OP_RXA:   po_reg_or_fail (REG_TYPE_XSCALE);  break;
7247         case OP_oRNQ:
7248         case OP_RNQMQ:
7249           po_reg_or_goto (REG_TYPE_MQ, try_nq);
7250           break;
7251         try_nq:
7252         case OP_RNQ:   po_reg_or_fail (REG_TYPE_NQ);      break;
7253         case OP_RNSD:  po_reg_or_fail (REG_TYPE_NSD);     break;
7254         case OP_RNDQMQR:
7255           po_reg_or_goto (REG_TYPE_RN, try_rndqmq);
7256           break;
7257         try_rndqmq:
7258         case OP_oRNDQMQ:
7259         case OP_RNDQMQ:
7260           po_reg_or_goto (REG_TYPE_MQ, try_rndq);
7261           break;
7262         try_rndq:
7263         case OP_oRNDQ:
7264         case OP_RNDQ:  po_reg_or_fail (REG_TYPE_NDQ);     break;
7265         case OP_RVSDMQ:
7266           po_reg_or_goto (REG_TYPE_MQ, try_rvsd);
7267           break;
7268         try_rvsd:
7269         case OP_RVSD:  po_reg_or_fail (REG_TYPE_VFSD);    break;
7270         case OP_RVSD_COND:
7271           po_reg_or_goto (REG_TYPE_VFSD, try_cond);
7272           break;
7273         case OP_oRNSDQ:
7274         case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ);    break;
7275         case OP_RNSDQMQR:
7276           po_reg_or_goto (REG_TYPE_RN, try_mq);
7277           break;
7278           try_mq:
7279         case OP_oRNSDQMQ:
7280         case OP_RNSDQMQ:
7281           po_reg_or_goto (REG_TYPE_MQ, try_nsdq2);
7282           break;
7283           try_nsdq2:
7284           po_reg_or_fail (REG_TYPE_NSDQ);
7285           inst.error = 0;
7286           break;
7287         case OP_RMQRR:
7288           po_reg_or_goto (REG_TYPE_RN, try_rmq);
7289           break;
7290         try_rmq:
7291         case OP_RMQ:
7292           po_reg_or_fail (REG_TYPE_MQ);
7293           break;
7294         /* Neon scalar. Using an element size of 8 means that some invalid
7295            scalars are accepted here, so deal with those in later code.  */
7296         case OP_RNSC:  po_scalar_or_goto (8, failure, REG_TYPE_VFD);    break;
7297
7298         case OP_RNDQ_I0:
7299           {
7300             po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
7301             break;
7302             try_imm0:
7303             po_imm_or_fail (0, 0, TRUE);
7304           }
7305           break;
7306
7307         case OP_RVSD_I0:
7308           po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
7309           break;
7310
7311         case OP_RSVDMQ_FI0:
7312           po_reg_or_goto (REG_TYPE_MQ, try_rsvd_fi0);
7313           break;
7314         try_rsvd_fi0:
7315         case OP_RSVD_FI0:
7316           {
7317             po_reg_or_goto (REG_TYPE_VFSD, try_ifimm0);
7318             break;
7319             try_ifimm0:
7320             if (parse_ifimm_zero (&str))
7321               inst.operands[i].imm = 0;
7322             else
7323             {
7324               inst.error
7325                 = _("only floating point zero is allowed as immediate value");
7326               goto failure;
7327             }
7328           }
7329           break;
7330
7331         case OP_RR_RNSC:
7332           {
7333             po_scalar_or_goto (8, try_rr, REG_TYPE_VFD);
7334             break;
7335             try_rr:
7336             po_reg_or_fail (REG_TYPE_RN);
7337           }
7338           break;
7339
7340         case OP_RNSDQ_RNSC_MQ_RR:
7341           po_reg_or_goto (REG_TYPE_RN, try_rnsdq_rnsc_mq);
7342           break;
7343         try_rnsdq_rnsc_mq:
7344         case OP_RNSDQ_RNSC_MQ:
7345           po_reg_or_goto (REG_TYPE_MQ, try_rnsdq_rnsc);
7346           break;
7347         try_rnsdq_rnsc:
7348         case OP_RNSDQ_RNSC:
7349           {
7350             po_scalar_or_goto (8, try_nsdq, REG_TYPE_VFD);
7351             inst.error = 0;
7352             break;
7353             try_nsdq:
7354             po_reg_or_fail (REG_TYPE_NSDQ);
7355             inst.error = 0;
7356           }
7357           break;
7358
7359         case OP_RNSD_RNSC:
7360           {
7361             po_scalar_or_goto (8, try_s_scalar, REG_TYPE_VFD);
7362             break;
7363             try_s_scalar:
7364             po_scalar_or_goto (4, try_nsd, REG_TYPE_VFS);
7365             break;
7366             try_nsd:
7367             po_reg_or_fail (REG_TYPE_NSD);
7368           }
7369           break;
7370
7371         case OP_RNDQMQ_RNSC_RR:
7372           po_reg_or_goto (REG_TYPE_MQ, try_rndq_rnsc_rr);
7373           break;
7374         try_rndq_rnsc_rr:
7375         case OP_RNDQ_RNSC_RR:
7376           po_reg_or_goto (REG_TYPE_RN, try_rndq_rnsc);
7377           break;
7378         case OP_RNDQMQ_RNSC:
7379           po_reg_or_goto (REG_TYPE_MQ, try_rndq_rnsc);
7380           break;
7381         try_rndq_rnsc:
7382         case OP_RNDQ_RNSC:
7383           {
7384             po_scalar_or_goto (8, try_ndq, REG_TYPE_VFD);
7385             break;
7386             try_ndq:
7387             po_reg_or_fail (REG_TYPE_NDQ);
7388           }
7389           break;
7390
7391         case OP_RND_RNSC:
7392           {
7393             po_scalar_or_goto (8, try_vfd, REG_TYPE_VFD);
7394             break;
7395             try_vfd:
7396             po_reg_or_fail (REG_TYPE_VFD);
7397           }
7398           break;
7399
7400         case OP_VMOV:
7401           /* WARNING: parse_neon_mov can move the operand counter, i. If we're
7402              not careful then bad things might happen.  */
7403           po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
7404           break;
7405
7406         case OP_RNDQMQ_Ibig:
7407           po_reg_or_goto (REG_TYPE_MQ, try_rndq_ibig);
7408           break;
7409         try_rndq_ibig:
7410         case OP_RNDQ_Ibig:
7411           {
7412             po_reg_or_goto (REG_TYPE_NDQ, try_immbig);
7413             break;
7414             try_immbig:
7415             /* There's a possibility of getting a 64-bit immediate here, so
7416                we need special handling.  */
7417             if (parse_big_immediate (&str, i, NULL, /*allow_symbol_p=*/FALSE)
7418                 == FAIL)
7419               {
7420                 inst.error = _("immediate value is out of range");
7421                 goto failure;
7422               }
7423           }
7424           break;
7425
7426         case OP_RNDQMQ_I63b_RR:
7427           po_reg_or_goto (REG_TYPE_MQ, try_rndq_i63b_rr);
7428           break;
7429         try_rndq_i63b_rr:
7430           po_reg_or_goto (REG_TYPE_RN, try_rndq_i63b);
7431           break;
7432         try_rndq_i63b:
7433         case OP_RNDQ_I63b:
7434           {
7435             po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
7436             break;
7437             try_shimm:
7438             po_imm_or_fail (0, 63, TRUE);
7439           }
7440           break;
7441
7442         case OP_RRnpcb:
7443           po_char_or_fail ('[');
7444           po_reg_or_fail  (REG_TYPE_RN);
7445           po_char_or_fail (']');
7446           break;
7447
7448         case OP_RRnpctw:
7449         case OP_RRw:
7450         case OP_oRRw:
7451           po_reg_or_fail (REG_TYPE_RN);
7452           if (skip_past_char (&str, '!') == SUCCESS)
7453             inst.operands[i].writeback = 1;
7454           break;
7455
7456           /* Immediates */
7457         case OP_I7:      po_imm_or_fail (  0,      7, FALSE);   break;
7458         case OP_I15:     po_imm_or_fail (  0,     15, FALSE);   break;
7459         case OP_I16:     po_imm_or_fail (  1,     16, FALSE);   break;
7460         case OP_I16z:    po_imm_or_fail (  0,     16, FALSE);   break;
7461         case OP_I31:     po_imm_or_fail (  0,     31, FALSE);   break;
7462         case OP_I32:     po_imm_or_fail (  1,     32, FALSE);   break;
7463         case OP_I32z:    po_imm_or_fail (  0,     32, FALSE);   break;
7464         case OP_I63s:    po_imm_or_fail (-64,     63, FALSE);   break;
7465         case OP_I63:     po_imm_or_fail (  0,     63, FALSE);   break;
7466         case OP_I64:     po_imm_or_fail (  1,     64, FALSE);   break;
7467         case OP_I64z:    po_imm_or_fail (  0,     64, FALSE);   break;
7468         case OP_I255:    po_imm_or_fail (  0,    255, FALSE);   break;
7469
7470         case OP_I4b:     po_imm_or_fail (  1,      4, TRUE);    break;
7471         case OP_oI7b:
7472         case OP_I7b:     po_imm_or_fail (  0,      7, TRUE);    break;
7473         case OP_I15b:    po_imm_or_fail (  0,     15, TRUE);    break;
7474         case OP_oI31b:
7475         case OP_I31b:    po_imm_or_fail (  0,     31, TRUE);    break;
7476         case OP_oI32b:   po_imm_or_fail (  1,     32, TRUE);    break;
7477         case OP_oI32z:   po_imm_or_fail (  0,     32, TRUE);    break;
7478         case OP_oIffffb: po_imm_or_fail (  0, 0xffff, TRUE);    break;
7479
7480           /* Immediate variants */
7481         case OP_oI255c:
7482           po_char_or_fail ('{');
7483           po_imm_or_fail (0, 255, TRUE);
7484           po_char_or_fail ('}');
7485           break;
7486
7487         case OP_I31w:
7488           /* The expression parser chokes on a trailing !, so we have
7489              to find it first and zap it.  */
7490           {
7491             char *s = str;
7492             while (*s && *s != ',')
7493               s++;
7494             if (s[-1] == '!')
7495               {
7496                 s[-1] = '\0';
7497                 inst.operands[i].writeback = 1;
7498               }
7499             po_imm_or_fail (0, 31, TRUE);
7500             if (str == s - 1)
7501               str = s;
7502           }
7503           break;
7504
7505           /* Expressions */
7506         case OP_EXPi:   EXPi:
7507           po_misc_or_fail (my_get_expression (&inst.relocs[0].exp, &str,
7508                                               GE_OPT_PREFIX));
7509           break;
7510
7511         case OP_EXP:
7512           po_misc_or_fail (my_get_expression (&inst.relocs[0].exp, &str,
7513                                               GE_NO_PREFIX));
7514           break;
7515
7516         case OP_EXPr:   EXPr:
7517           po_misc_or_fail (my_get_expression (&inst.relocs[0].exp, &str,
7518                                               GE_NO_PREFIX));
7519           if (inst.relocs[0].exp.X_op == O_symbol)
7520             {
7521               val = parse_reloc (&str);
7522               if (val == -1)
7523                 {
7524                   inst.error = _("unrecognized relocation suffix");
7525                   goto failure;
7526                 }
7527               else if (val != BFD_RELOC_UNUSED)
7528                 {
7529                   inst.operands[i].imm = val;
7530                   inst.operands[i].hasreloc = 1;
7531                 }
7532             }
7533           break;
7534
7535         case OP_EXPs:
7536           po_misc_or_fail (my_get_expression (&inst.relocs[i].exp, &str,
7537                                               GE_NO_PREFIX));
7538           if (inst.relocs[i].exp.X_op == O_symbol)
7539             {
7540               inst.operands[i].hasreloc = 1;
7541             }
7542           else if (inst.relocs[i].exp.X_op == O_constant)
7543             {
7544               inst.operands[i].imm = inst.relocs[i].exp.X_add_number;
7545               inst.operands[i].hasreloc = 0;
7546             }
7547           break;
7548
7549           /* Operand for MOVW or MOVT.  */
7550         case OP_HALF:
7551           po_misc_or_fail (parse_half (&str));
7552           break;
7553
7554           /* Register or expression.  */
7555         case OP_RR_EXr:   po_reg_or_goto (REG_TYPE_RN, EXPr); break;
7556         case OP_RR_EXi:   po_reg_or_goto (REG_TYPE_RN, EXPi); break;
7557
7558           /* Register or immediate.  */
7559         case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0);   break;
7560         I0:               po_imm_or_fail (0, 0, FALSE);       break;
7561
7562         case OP_RF_IF:    po_reg_or_goto (REG_TYPE_FN, IF);   break;
7563         IF:
7564           if (!is_immediate_prefix (*str))
7565             goto bad_args;
7566           str++;
7567           val = parse_fpa_immediate (&str);
7568           if (val == FAIL)
7569             goto failure;
7570           /* FPA immediates are encoded as registers 8-15.
7571              parse_fpa_immediate has already applied the offset.  */
7572           inst.operands[i].reg = val;
7573           inst.operands[i].isreg = 1;
7574           break;
7575
7576         case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
7577         I32z:             po_imm_or_fail (0, 32, FALSE);          break;
7578
7579           /* Two kinds of register.  */
7580         case OP_RIWR_RIWC:
7581           {
7582             struct reg_entry *rege = arm_reg_parse_multi (&str);
7583             if (!rege
7584                 || (rege->type != REG_TYPE_MMXWR
7585                     && rege->type != REG_TYPE_MMXWC
7586                     && rege->type != REG_TYPE_MMXWCG))
7587               {
7588                 inst.error = _("iWMMXt data or control register expected");
7589                 goto failure;
7590               }
7591             inst.operands[i].reg = rege->number;
7592             inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
7593           }
7594           break;
7595
7596         case OP_RIWC_RIWG:
7597           {
7598             struct reg_entry *rege = arm_reg_parse_multi (&str);
7599             if (!rege
7600                 || (rege->type != REG_TYPE_MMXWC
7601                     && rege->type != REG_TYPE_MMXWCG))
7602               {
7603                 inst.error = _("iWMMXt control register expected");
7604                 goto failure;
7605               }
7606             inst.operands[i].reg = rege->number;
7607             inst.operands[i].isreg = 1;
7608           }
7609           break;
7610
7611           /* Misc */
7612         case OP_CPSF:    val = parse_cps_flags (&str);          break;
7613         case OP_ENDI:    val = parse_endian_specifier (&str);   break;
7614         case OP_oROR:    val = parse_ror (&str);                break;
7615         try_cond:
7616         case OP_COND:    val = parse_cond (&str);               break;
7617         case OP_oBARRIER_I15:
7618           po_barrier_or_imm (str); break;
7619           immediate:
7620           if (parse_immediate (&str, &val, 0, 15, TRUE) == FAIL)
7621             goto failure;
7622           break;
7623
7624         case OP_wPSR:
7625         case OP_rPSR:
7626           po_reg_or_goto (REG_TYPE_RNB, try_psr);
7627           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_virt))
7628             {
7629               inst.error = _("Banked registers are not available with this "
7630                              "architecture.");
7631               goto failure;
7632             }
7633           break;
7634           try_psr:
7635           val = parse_psr (&str, op_parse_code == OP_wPSR);
7636           break;
7637
7638         case OP_VLDR:
7639           po_reg_or_goto (REG_TYPE_VFSD, try_sysreg);
7640           break;
7641         try_sysreg:
7642           val = parse_sys_vldr_vstr (&str);
7643           break;
7644
7645         case OP_APSR_RR:
7646           po_reg_or_goto (REG_TYPE_RN, try_apsr);
7647           break;
7648           try_apsr:
7649           /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
7650              instruction).  */
7651           if (strncasecmp (str, "APSR_", 5) == 0)
7652             {
7653               unsigned found = 0;
7654               str += 5;
7655               while (found < 15)
7656                 switch (*str++)
7657                   {
7658                   case 'c': found = (found & 1) ? 16 : found | 1; break;
7659                   case 'n': found = (found & 2) ? 16 : found | 2; break;
7660                   case 'z': found = (found & 4) ? 16 : found | 4; break;
7661                   case 'v': found = (found & 8) ? 16 : found | 8; break;
7662                   default: found = 16;
7663                   }
7664               if (found != 15)
7665                 goto failure;
7666               inst.operands[i].isvec = 1;
7667               /* APSR_nzcv is encoded in instructions as if it were the REG_PC.  */
7668               inst.operands[i].reg = REG_PC;
7669             }
7670           else
7671             goto failure;
7672           break;
7673
7674         case OP_TB:
7675           po_misc_or_fail (parse_tb (&str));
7676           break;
7677
7678           /* Register lists.  */
7679         case OP_REGLST:
7680           val = parse_reg_list (&str, REGLIST_RN);
7681           if (*str == '^')
7682             {
7683               inst.operands[i].writeback = 1;
7684               str++;
7685             }
7686           break;
7687
7688         case OP_CLRMLST:
7689           val = parse_reg_list (&str, REGLIST_CLRM);
7690           break;
7691
7692         case OP_VRSLST:
7693           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S,
7694                                     &partial_match);
7695           break;
7696
7697         case OP_VRDLST:
7698           val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D,
7699                                     &partial_match);
7700           break;
7701
7702         case OP_VRSDLST:
7703           /* Allow Q registers too.  */
7704           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
7705                                     REGLIST_NEON_D, &partial_match);
7706           if (val == FAIL)
7707             {
7708               inst.error = NULL;
7709               val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
7710                                         REGLIST_VFP_S, &partial_match);
7711               inst.operands[i].issingle = 1;
7712             }
7713           break;
7714
7715         case OP_VRSDVLST:
7716           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
7717                                     REGLIST_VFP_D_VPR, &partial_match);
7718           if (val == FAIL && !partial_match)
7719             {
7720               inst.error = NULL;
7721               val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
7722                                         REGLIST_VFP_S_VPR, &partial_match);
7723               inst.operands[i].issingle = 1;
7724             }
7725           break;
7726
7727         case OP_NRDLST:
7728           val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
7729                                     REGLIST_NEON_D, &partial_match);
7730           break;
7731
7732         case OP_MSTRLST4:
7733         case OP_MSTRLST2:
7734           val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
7735                                            1, &inst.operands[i].vectype);
7736           if (val != (((op_parse_code == OP_MSTRLST2) ? 3 : 7) << 5 | 0xe))
7737             goto failure;
7738           break;
7739         case OP_NSTRLST:
7740           val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
7741                                            0, &inst.operands[i].vectype);
7742           break;
7743
7744           /* Addressing modes */
7745         case OP_ADDRMVE:
7746           po_misc_or_fail (parse_address_group_reloc (&str, i, GROUP_MVE));
7747           break;
7748
7749         case OP_ADDR:
7750           po_misc_or_fail (parse_address (&str, i));
7751           break;
7752
7753         case OP_ADDRGLDR:
7754           po_misc_or_fail_no_backtrack (
7755             parse_address_group_reloc (&str, i, GROUP_LDR));
7756           break;
7757
7758         case OP_ADDRGLDRS:
7759           po_misc_or_fail_no_backtrack (
7760             parse_address_group_reloc (&str, i, GROUP_LDRS));
7761           break;
7762
7763         case OP_ADDRGLDC:
7764           po_misc_or_fail_no_backtrack (
7765             parse_address_group_reloc (&str, i, GROUP_LDC));
7766           break;
7767
7768         case OP_SH:
7769           po_misc_or_fail (parse_shifter_operand (&str, i));
7770           break;
7771
7772         case OP_SHG:
7773           po_misc_or_fail_no_backtrack (
7774             parse_shifter_operand_group_reloc (&str, i));
7775           break;
7776
7777         case OP_oSHll:
7778           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
7779           break;
7780
7781         case OP_oSHar:
7782           po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
7783           break;
7784
7785         case OP_oSHllar:
7786           po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
7787           break;
7788
7789         case OP_RMQRZ:
7790         case OP_oRMQRZ:
7791           po_reg_or_goto (REG_TYPE_MQ, try_rr_zr);
7792           break;
7793         try_rr_zr:
7794           po_reg_or_goto (REG_TYPE_RN, ZR);
7795           break;
7796         ZR:
7797           po_reg_or_fail (REG_TYPE_ZR);
7798           break;
7799
7800         default:
7801           as_fatal (_("unhandled operand code %d"), op_parse_code);
7802         }
7803
7804       /* Various value-based sanity checks and shared operations.  We
7805          do not signal immediate failures for the register constraints;
7806          this allows a syntax error to take precedence.  */
7807       switch (op_parse_code)
7808         {
7809         case OP_oRRnpc:
7810         case OP_RRnpc:
7811         case OP_RRnpcb:
7812         case OP_RRw:
7813         case OP_oRRw:
7814         case OP_RRnpc_I0:
7815           if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
7816             inst.error = BAD_PC;
7817           break;
7818
7819         case OP_oRRnpcsp:
7820         case OP_RRnpcsp:
7821           if (inst.operands[i].isreg)
7822             {
7823               if (inst.operands[i].reg == REG_PC)
7824                 inst.error = BAD_PC;
7825               else if (inst.operands[i].reg == REG_SP
7826                        /* The restriction on Rd/Rt/Rt2 on Thumb mode has been
7827                           relaxed since ARMv8-A.  */
7828                        && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
7829                 {
7830                   gas_assert (thumb);
7831                   inst.error = BAD_SP;
7832                 }
7833             }
7834           break;
7835
7836         case OP_RRnpctw:
7837           if (inst.operands[i].isreg
7838               && inst.operands[i].reg == REG_PC
7839               && (inst.operands[i].writeback || thumb))
7840             inst.error = BAD_PC;
7841           break;
7842
7843         case OP_RVSD_COND:
7844         case OP_VLDR:
7845           if (inst.operands[i].isreg)
7846             break;
7847         /* fall through.  */
7848
7849         case OP_CPSF:
7850         case OP_ENDI:
7851         case OP_oROR:
7852         case OP_wPSR:
7853         case OP_rPSR:
7854         case OP_COND:
7855         case OP_oBARRIER_I15:
7856         case OP_REGLST:
7857         case OP_CLRMLST:
7858         case OP_VRSLST:
7859         case OP_VRDLST:
7860         case OP_VRSDLST:
7861         case OP_VRSDVLST:
7862         case OP_NRDLST:
7863         case OP_NSTRLST:
7864         case OP_MSTRLST2:
7865         case OP_MSTRLST4:
7866           if (val == FAIL)
7867             goto failure;
7868           inst.operands[i].imm = val;
7869           break;
7870
7871         case OP_LR:
7872         case OP_oLR:
7873           if (inst.operands[i].reg != REG_LR)
7874             inst.error = _("operand must be LR register");
7875           break;
7876
7877         case OP_RMQRZ:
7878         case OP_oRMQRZ:
7879           if (!inst.operands[i].iszr && inst.operands[i].reg == REG_PC)
7880             inst.error = BAD_PC;
7881           break;
7882
7883         case OP_RRe:
7884           if (inst.operands[i].isreg
7885               && (inst.operands[i].reg & 0x00000001) != 0)
7886             inst.error = BAD_ODD;
7887           break;
7888
7889         case OP_RRo:
7890           if (inst.operands[i].isreg)
7891             {
7892               if ((inst.operands[i].reg & 0x00000001) != 1)
7893                 inst.error = BAD_EVEN;
7894               else if (inst.operands[i].reg == REG_SP)
7895                 as_tsktsk (MVE_BAD_SP);
7896               else if (inst.operands[i].reg == REG_PC)
7897                 inst.error = BAD_PC;
7898             }
7899           break;
7900
7901         default:
7902           break;
7903         }
7904
7905       /* If we get here, this operand was successfully parsed.  */
7906       inst.operands[i].present = 1;
7907       continue;
7908
7909     bad_args:
7910       inst.error = BAD_ARGS;
7911
7912     failure:
7913       if (!backtrack_pos)
7914         {
7915           /* The parse routine should already have set inst.error, but set a
7916              default here just in case.  */
7917           if (!inst.error)
7918             inst.error = BAD_SYNTAX;
7919           return FAIL;
7920         }
7921
7922       /* Do not backtrack over a trailing optional argument that
7923          absorbed some text.  We will only fail again, with the
7924          'garbage following instruction' error message, which is
7925          probably less helpful than the current one.  */
7926       if (backtrack_index == i && backtrack_pos != str
7927           && upat[i+1] == OP_stop)
7928         {
7929           if (!inst.error)
7930             inst.error = BAD_SYNTAX;
7931           return FAIL;
7932         }
7933
7934       /* Try again, skipping the optional argument at backtrack_pos.  */
7935       str = backtrack_pos;
7936       inst.error = backtrack_error;
7937       inst.operands[backtrack_index].present = 0;
7938       i = backtrack_index;
7939       backtrack_pos = 0;
7940     }
7941
7942   /* Check that we have parsed all the arguments.  */
7943   if (*str != '\0' && !inst.error)
7944     inst.error = _("garbage following instruction");
7945
7946   return inst.error ? FAIL : SUCCESS;
7947 }
7948
7949 #undef po_char_or_fail
7950 #undef po_reg_or_fail
7951 #undef po_reg_or_goto
7952 #undef po_imm_or_fail
7953 #undef po_scalar_or_fail
7954 #undef po_barrier_or_imm
7955
7956 /* Shorthand macro for instruction encoding functions issuing errors.  */
7957 #define constraint(expr, err)                   \
7958   do                                            \
7959     {                                           \
7960       if (expr)                                 \
7961         {                                       \
7962           inst.error = err;                     \
7963           return;                               \
7964         }                                       \
7965     }                                           \
7966   while (0)
7967
7968 /* Reject "bad registers" for Thumb-2 instructions.  Many Thumb-2
7969    instructions are unpredictable if these registers are used.  This
7970    is the BadReg predicate in ARM's Thumb-2 documentation.
7971
7972    Before ARMv8-A, REG_PC and REG_SP were not allowed in quite a few
7973    places, while the restriction on REG_SP was relaxed since ARMv8-A.  */
7974 #define reject_bad_reg(reg)                                     \
7975   do                                                            \
7976    if (reg == REG_PC)                                           \
7977      {                                                          \
7978        inst.error = BAD_PC;                                     \
7979        return;                                                  \
7980      }                                                          \
7981    else if (reg == REG_SP                                       \
7982             && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))  \
7983      {                                                          \
7984        inst.error = BAD_SP;                                     \
7985        return;                                                  \
7986      }                                                          \
7987   while (0)
7988
7989 /* If REG is R13 (the stack pointer), warn that its use is
7990    deprecated.  */
7991 #define warn_deprecated_sp(reg)                 \
7992   do                                            \
7993     if (warn_on_deprecated && reg == REG_SP)    \
7994        as_tsktsk (_("use of r13 is deprecated"));       \
7995   while (0)
7996
7997 /* Functions for operand encoding.  ARM, then Thumb.  */
7998
7999 #define rotate_left(v, n) (v << (n & 31) | v >> ((32 - n) & 31))
8000
8001 /* If the current inst is scalar ARMv8.2 fp16 instruction, do special encoding.
8002
8003    The only binary encoding difference is the Coprocessor number.  Coprocessor
8004    9 is used for half-precision calculations or conversions.  The format of the
8005    instruction is the same as the equivalent Coprocessor 10 instruction that
8006    exists for Single-Precision operation.  */
8007
8008 static void
8009 do_scalar_fp16_v82_encode (void)
8010 {
8011   if (inst.cond < COND_ALWAYS)
8012     as_warn (_("ARMv8.2 scalar fp16 instruction cannot be conditional,"
8013                " the behaviour is UNPREDICTABLE"));
8014   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16),
8015               _(BAD_FP16));
8016
8017   inst.instruction = (inst.instruction & 0xfffff0ff) | 0x900;
8018   mark_feature_used (&arm_ext_fp16);
8019 }
8020
8021 /* If VAL can be encoded in the immediate field of an ARM instruction,
8022    return the encoded form.  Otherwise, return FAIL.  */
8023
8024 static unsigned int
8025 encode_arm_immediate (unsigned int val)
8026 {
8027   unsigned int a, i;
8028
8029   if (val <= 0xff)
8030     return val;
8031
8032   for (i = 2; i < 32; i += 2)
8033     if ((a = rotate_left (val, i)) <= 0xff)
8034       return a | (i << 7); /* 12-bit pack: [shift-cnt,const].  */
8035
8036   return FAIL;
8037 }
8038
8039 /* If VAL can be encoded in the immediate field of a Thumb32 instruction,
8040    return the encoded form.  Otherwise, return FAIL.  */
8041 static unsigned int
8042 encode_thumb32_immediate (unsigned int val)
8043 {
8044   unsigned int a, i;
8045
8046   if (val <= 0xff)
8047     return val;
8048
8049   for (i = 1; i <= 24; i++)
8050     {
8051       a = val >> i;
8052       if ((val & ~(0xff << i)) == 0)
8053         return ((val >> i) & 0x7f) | ((32 - i) << 7);
8054     }
8055
8056   a = val & 0xff;
8057   if (val == ((a << 16) | a))
8058     return 0x100 | a;
8059   if (val == ((a << 24) | (a << 16) | (a << 8) | a))
8060     return 0x300 | a;
8061
8062   a = val & 0xff00;
8063   if (val == ((a << 16) | a))
8064     return 0x200 | (a >> 8);
8065
8066   return FAIL;
8067 }
8068 /* Encode a VFP SP or DP register number into inst.instruction.  */
8069
8070 static void
8071 encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
8072 {
8073   if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
8074       && reg > 15)
8075     {
8076       if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
8077         {
8078           if (thumb_mode)
8079             ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
8080                                     fpu_vfp_ext_d32);
8081           else
8082             ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
8083                                     fpu_vfp_ext_d32);
8084         }
8085       else
8086         {
8087           first_error (_("D register out of range for selected VFP version"));
8088           return;
8089         }
8090     }
8091
8092   switch (pos)
8093     {
8094     case VFP_REG_Sd:
8095       inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
8096       break;
8097
8098     case VFP_REG_Sn:
8099       inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
8100       break;
8101
8102     case VFP_REG_Sm:
8103       inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
8104       break;
8105
8106     case VFP_REG_Dd:
8107       inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
8108       break;
8109
8110     case VFP_REG_Dn:
8111       inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
8112       break;
8113
8114     case VFP_REG_Dm:
8115       inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
8116       break;
8117
8118     default:
8119       abort ();
8120     }
8121 }
8122
8123 /* Encode a <shift> in an ARM-format instruction.  The immediate,
8124    if any, is handled by md_apply_fix.   */
8125 static void
8126 encode_arm_shift (int i)
8127 {
8128   /* register-shifted register.  */
8129   if (inst.operands[i].immisreg)
8130     {
8131       int op_index;
8132       for (op_index = 0; op_index <= i; ++op_index)
8133         {
8134           /* Check the operand only when it's presented.  In pre-UAL syntax,
8135              if the destination register is the same as the first operand, two
8136              register form of the instruction can be used.  */
8137           if (inst.operands[op_index].present && inst.operands[op_index].isreg
8138               && inst.operands[op_index].reg == REG_PC)
8139             as_warn (UNPRED_REG ("r15"));
8140         }
8141
8142       if (inst.operands[i].imm == REG_PC)
8143         as_warn (UNPRED_REG ("r15"));
8144     }
8145
8146   if (inst.operands[i].shift_kind == SHIFT_RRX)
8147     inst.instruction |= SHIFT_ROR << 5;
8148   else
8149     {
8150       inst.instruction |= inst.operands[i].shift_kind << 5;
8151       if (inst.operands[i].immisreg)
8152         {
8153           inst.instruction |= SHIFT_BY_REG;
8154           inst.instruction |= inst.operands[i].imm << 8;
8155         }
8156       else
8157         inst.relocs[0].type = BFD_RELOC_ARM_SHIFT_IMM;
8158     }
8159 }
8160
8161 static void
8162 encode_arm_shifter_operand (int i)
8163 {
8164   if (inst.operands[i].isreg)
8165     {
8166       inst.instruction |= inst.operands[i].reg;
8167       encode_arm_shift (i);
8168     }
8169   else
8170     {
8171       inst.instruction |= INST_IMMEDIATE;
8172       if (inst.relocs[0].type != BFD_RELOC_ARM_IMMEDIATE)
8173         inst.instruction |= inst.operands[i].imm;
8174     }
8175 }
8176
8177 /* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3.  */
8178 static void
8179 encode_arm_addr_mode_common (int i, bfd_boolean is_t)
8180 {
8181   /* PR 14260:
8182      Generate an error if the operand is not a register.  */
8183   constraint (!inst.operands[i].isreg,
8184               _("Instruction does not support =N addresses"));
8185
8186   inst.instruction |= inst.operands[i].reg << 16;
8187
8188   if (inst.operands[i].preind)
8189     {
8190       if (is_t)
8191         {
8192           inst.error = _("instruction does not accept preindexed addressing");
8193           return;
8194         }
8195       inst.instruction |= PRE_INDEX;
8196       if (inst.operands[i].writeback)
8197         inst.instruction |= WRITE_BACK;
8198
8199     }
8200   else if (inst.operands[i].postind)
8201     {
8202       gas_assert (inst.operands[i].writeback);
8203       if (is_t)
8204         inst.instruction |= WRITE_BACK;
8205     }
8206   else /* unindexed - only for coprocessor */
8207     {
8208       inst.error = _("instruction does not accept unindexed addressing");
8209       return;
8210     }
8211
8212   if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
8213       && (((inst.instruction & 0x000f0000) >> 16)
8214           == ((inst.instruction & 0x0000f000) >> 12)))
8215     as_warn ((inst.instruction & LOAD_BIT)
8216              ? _("destination register same as write-back base")
8217              : _("source register same as write-back base"));
8218 }
8219
8220 /* inst.operands[i] was set up by parse_address.  Encode it into an
8221    ARM-format mode 2 load or store instruction.  If is_t is true,
8222    reject forms that cannot be used with a T instruction (i.e. not
8223    post-indexed).  */
8224 static void
8225 encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
8226 {
8227   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
8228
8229   encode_arm_addr_mode_common (i, is_t);
8230
8231   if (inst.operands[i].immisreg)
8232     {
8233       constraint ((inst.operands[i].imm == REG_PC
8234                    || (is_pc && inst.operands[i].writeback)),
8235                   BAD_PC_ADDRESSING);
8236       inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
8237       inst.instruction |= inst.operands[i].imm;
8238       if (!inst.operands[i].negative)
8239         inst.instruction |= INDEX_UP;
8240       if (inst.operands[i].shifted)
8241         {
8242           if (inst.operands[i].shift_kind == SHIFT_RRX)
8243             inst.instruction |= SHIFT_ROR << 5;
8244           else
8245             {
8246               inst.instruction |= inst.operands[i].shift_kind << 5;
8247               inst.relocs[0].type = BFD_RELOC_ARM_SHIFT_IMM;
8248             }
8249         }
8250     }
8251   else /* immediate offset in inst.relocs[0] */
8252     {
8253       if (is_pc && !inst.relocs[0].pc_rel)
8254         {
8255           const bfd_boolean is_load = ((inst.instruction & LOAD_BIT) != 0);
8256
8257           /* If is_t is TRUE, it's called from do_ldstt.  ldrt/strt
8258              cannot use PC in addressing.
8259              PC cannot be used in writeback addressing, either.  */
8260           constraint ((is_t || inst.operands[i].writeback),
8261                       BAD_PC_ADDRESSING);
8262
8263           /* Use of PC in str is deprecated for ARMv7.  */
8264           if (warn_on_deprecated
8265               && !is_load
8266               && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
8267             as_tsktsk (_("use of PC in this instruction is deprecated"));
8268         }
8269
8270       if (inst.relocs[0].type == BFD_RELOC_UNUSED)
8271         {
8272           /* Prefer + for zero encoded value.  */
8273           if (!inst.operands[i].negative)
8274             inst.instruction |= INDEX_UP;
8275           inst.relocs[0].type = BFD_RELOC_ARM_OFFSET_IMM;
8276         }
8277     }
8278 }
8279
8280 /* inst.operands[i] was set up by parse_address.  Encode it into an
8281    ARM-format mode 3 load or store instruction.  Reject forms that
8282    cannot be used with such instructions.  If is_t is true, reject
8283    forms that cannot be used with a T instruction (i.e. not
8284    post-indexed).  */
8285 static void
8286 encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
8287 {
8288   if (inst.operands[i].immisreg && inst.operands[i].shifted)
8289     {
8290       inst.error = _("instruction does not accept scaled register index");
8291       return;
8292     }
8293
8294   encode_arm_addr_mode_common (i, is_t);
8295
8296   if (inst.operands[i].immisreg)
8297     {
8298       constraint ((inst.operands[i].imm == REG_PC
8299                    || (is_t && inst.operands[i].reg == REG_PC)),
8300                   BAD_PC_ADDRESSING);
8301       constraint (inst.operands[i].reg == REG_PC && inst.operands[i].writeback,
8302                   BAD_PC_WRITEBACK);
8303       inst.instruction |= inst.operands[i].imm;
8304       if (!inst.operands[i].negative)
8305         inst.instruction |= INDEX_UP;
8306     }
8307   else /* immediate offset in inst.relocs[0] */
8308     {
8309       constraint ((inst.operands[i].reg == REG_PC && !inst.relocs[0].pc_rel
8310                    && inst.operands[i].writeback),
8311                   BAD_PC_WRITEBACK);
8312       inst.instruction |= HWOFFSET_IMM;
8313       if (inst.relocs[0].type == BFD_RELOC_UNUSED)
8314         {
8315           /* Prefer + for zero encoded value.  */
8316           if (!inst.operands[i].negative)
8317             inst.instruction |= INDEX_UP;
8318
8319           inst.relocs[0].type = BFD_RELOC_ARM_OFFSET_IMM8;
8320         }
8321     }
8322 }
8323
8324 /* Write immediate bits [7:0] to the following locations:
8325
8326   |28/24|23     19|18 16|15                    4|3     0|
8327   |  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|
8328
8329   This function is used by VMOV/VMVN/VORR/VBIC.  */
8330
8331 static void
8332 neon_write_immbits (unsigned immbits)
8333 {
8334   inst.instruction |= immbits & 0xf;
8335   inst.instruction |= ((immbits >> 4) & 0x7) << 16;
8336   inst.instruction |= ((immbits >> 7) & 0x1) << (thumb_mode ? 28 : 24);
8337 }
8338
8339 /* Invert low-order SIZE bits of XHI:XLO.  */
8340
8341 static void
8342 neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
8343 {
8344   unsigned immlo = xlo ? *xlo : 0;
8345   unsigned immhi = xhi ? *xhi : 0;
8346
8347   switch (size)
8348     {
8349     case 8:
8350       immlo = (~immlo) & 0xff;
8351       break;
8352
8353     case 16:
8354       immlo = (~immlo) & 0xffff;
8355       break;
8356
8357     case 64:
8358       immhi = (~immhi) & 0xffffffff;
8359       /* fall through.  */
8360
8361     case 32:
8362       immlo = (~immlo) & 0xffffffff;
8363       break;
8364
8365     default:
8366       abort ();
8367     }
8368
8369   if (xlo)
8370     *xlo = immlo;
8371
8372   if (xhi)
8373     *xhi = immhi;
8374 }
8375
8376 /* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
8377    A, B, C, D.  */
8378
8379 static int
8380 neon_bits_same_in_bytes (unsigned imm)
8381 {
8382   return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
8383          && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
8384          && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
8385          && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
8386 }
8387
8388 /* For immediate of above form, return 0bABCD.  */
8389
8390 static unsigned
8391 neon_squash_bits (unsigned imm)
8392 {
8393   return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
8394          | ((imm & 0x01000000) >> 21);
8395 }
8396
8397 /* Compress quarter-float representation to 0b...000 abcdefgh.  */
8398
8399 static unsigned
8400 neon_qfloat_bits (unsigned imm)
8401 {
8402   return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
8403 }
8404
8405 /* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
8406    the instruction. *OP is passed as the initial value of the op field, and
8407    may be set to a different value depending on the constant (i.e.
8408    "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
8409    MVN).  If the immediate looks like a repeated pattern then also
8410    try smaller element sizes.  */
8411
8412 static int
8413 neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
8414                          unsigned *immbits, int *op, int size,
8415                          enum neon_el_type type)
8416 {
8417   /* Only permit float immediates (including 0.0/-0.0) if the operand type is
8418      float.  */
8419   if (type == NT_float && !float_p)
8420     return FAIL;
8421
8422   if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
8423     {
8424       if (size != 32 || *op == 1)
8425         return FAIL;
8426       *immbits = neon_qfloat_bits (immlo);
8427       return 0xf;
8428     }
8429
8430   if (size == 64)
8431     {
8432       if (neon_bits_same_in_bytes (immhi)
8433           && neon_bits_same_in_bytes (immlo))
8434         {
8435           if (*op == 1)
8436             return FAIL;
8437           *immbits = (neon_squash_bits (immhi) << 4)
8438                      | neon_squash_bits (immlo);
8439           *op = 1;
8440           return 0xe;
8441         }
8442
8443       if (immhi != immlo)
8444         return FAIL;
8445     }
8446
8447   if (size >= 32)
8448     {
8449       if (immlo == (immlo & 0x000000ff))
8450         {
8451           *immbits = immlo;
8452           return 0x0;
8453         }
8454       else if (immlo == (immlo & 0x0000ff00))
8455         {
8456           *immbits = immlo >> 8;
8457           return 0x2;
8458         }
8459       else if (immlo == (immlo & 0x00ff0000))
8460         {
8461           *immbits = immlo >> 16;
8462           return 0x4;
8463         }
8464       else if (immlo == (immlo & 0xff000000))
8465         {
8466           *immbits = immlo >> 24;
8467           return 0x6;
8468         }
8469       else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
8470         {
8471           *immbits = (immlo >> 8) & 0xff;
8472           return 0xc;
8473         }
8474       else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
8475         {
8476           *immbits = (immlo >> 16) & 0xff;
8477           return 0xd;
8478         }
8479
8480       if ((immlo & 0xffff) != (immlo >> 16))
8481         return FAIL;
8482       immlo &= 0xffff;
8483     }
8484
8485   if (size >= 16)
8486     {
8487       if (immlo == (immlo & 0x000000ff))
8488         {
8489           *immbits = immlo;
8490           return 0x8;
8491         }
8492       else if (immlo == (immlo & 0x0000ff00))
8493         {
8494           *immbits = immlo >> 8;
8495           return 0xa;
8496         }
8497
8498       if ((immlo & 0xff) != (immlo >> 8))
8499         return FAIL;
8500       immlo &= 0xff;
8501     }
8502
8503   if (immlo == (immlo & 0x000000ff))
8504     {
8505       /* Don't allow MVN with 8-bit immediate.  */
8506       if (*op == 1)
8507         return FAIL;
8508       *immbits = immlo;
8509       return 0xe;
8510     }
8511
8512   return FAIL;
8513 }
8514
8515 #if defined BFD_HOST_64_BIT
8516 /* Returns TRUE if double precision value V may be cast
8517    to single precision without loss of accuracy.  */
8518
8519 static bfd_boolean
8520 is_double_a_single (bfd_int64_t v)
8521 {
8522   int exp = (int)((v >> 52) & 0x7FF);
8523   bfd_int64_t mantissa = (v & (bfd_int64_t)0xFFFFFFFFFFFFFULL);
8524
8525   return (exp == 0 || exp == 0x7FF
8526           || (exp >= 1023 - 126 && exp <= 1023 + 127))
8527     && (mantissa & 0x1FFFFFFFl) == 0;
8528 }
8529
8530 /* Returns a double precision value casted to single precision
8531    (ignoring the least significant bits in exponent and mantissa).  */
8532
8533 static int
8534 double_to_single (bfd_int64_t v)
8535 {
8536   int sign = (int) ((v >> 63) & 1l);
8537   int exp = (int) ((v >> 52) & 0x7FF);
8538   bfd_int64_t mantissa = (v & (bfd_int64_t)0xFFFFFFFFFFFFFULL);
8539
8540   if (exp == 0x7FF)
8541     exp = 0xFF;
8542   else
8543     {
8544       exp = exp - 1023 + 127;
8545       if (exp >= 0xFF)
8546         {
8547           /* Infinity.  */
8548           exp = 0x7F;
8549           mantissa = 0;
8550         }
8551       else if (exp < 0)
8552         {
8553           /* No denormalized numbers.  */
8554           exp = 0;
8555           mantissa = 0;
8556         }
8557     }
8558   mantissa >>= 29;
8559   return (sign << 31) | (exp << 23) | mantissa;
8560 }
8561 #endif /* BFD_HOST_64_BIT */
8562
8563 enum lit_type
8564 {
8565   CONST_THUMB,
8566   CONST_ARM,
8567   CONST_VEC
8568 };
8569
8570 static void do_vfp_nsyn_opcode (const char *);
8571
8572 /* inst.relocs[0].exp describes an "=expr" load pseudo-operation.
8573    Determine whether it can be performed with a move instruction; if
8574    it can, convert inst.instruction to that move instruction and
8575    return TRUE; if it can't, convert inst.instruction to a literal-pool
8576    load and return FALSE.  If this is not a valid thing to do in the
8577    current context, set inst.error and return TRUE.
8578
8579    inst.operands[i] describes the destination register.  */
8580
8581 static bfd_boolean
8582 move_or_literal_pool (int i, enum lit_type t, bfd_boolean mode_3)
8583 {
8584   unsigned long tbit;
8585   bfd_boolean thumb_p = (t == CONST_THUMB);
8586   bfd_boolean arm_p   = (t == CONST_ARM);
8587
8588   if (thumb_p)
8589     tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
8590   else
8591     tbit = LOAD_BIT;
8592
8593   if ((inst.instruction & tbit) == 0)
8594     {
8595       inst.error = _("invalid pseudo operation");
8596       return TRUE;
8597     }
8598
8599   if (inst.relocs[0].exp.X_op != O_constant
8600       && inst.relocs[0].exp.X_op != O_symbol
8601       && inst.relocs[0].exp.X_op != O_big)
8602     {
8603       inst.error = _("constant expression expected");
8604       return TRUE;
8605     }
8606
8607   if (inst.relocs[0].exp.X_op == O_constant
8608       || inst.relocs[0].exp.X_op == O_big)
8609     {
8610 #if defined BFD_HOST_64_BIT
8611       bfd_int64_t v;
8612 #else
8613       offsetT v;
8614 #endif
8615       if (inst.relocs[0].exp.X_op == O_big)
8616         {
8617           LITTLENUM_TYPE w[X_PRECISION];
8618           LITTLENUM_TYPE * l;
8619
8620           if (inst.relocs[0].exp.X_add_number == -1)
8621             {
8622               gen_to_words (w, X_PRECISION, E_PRECISION);
8623               l = w;
8624               /* FIXME: Should we check words w[2..5] ?  */
8625             }
8626           else
8627             l = generic_bignum;
8628
8629 #if defined BFD_HOST_64_BIT
8630           v =
8631             ((((((((bfd_int64_t) l[3] & LITTLENUM_MASK)
8632                   << LITTLENUM_NUMBER_OF_BITS)
8633                  | ((bfd_int64_t) l[2] & LITTLENUM_MASK))
8634                 << LITTLENUM_NUMBER_OF_BITS)
8635                | ((bfd_int64_t) l[1] & LITTLENUM_MASK))
8636               << LITTLENUM_NUMBER_OF_BITS)
8637              | ((bfd_int64_t) l[0] & LITTLENUM_MASK));
8638 #else
8639           v = ((l[1] & LITTLENUM_MASK) << LITTLENUM_NUMBER_OF_BITS)
8640             |  (l[0] & LITTLENUM_MASK);
8641 #endif
8642         }
8643       else
8644         v = inst.relocs[0].exp.X_add_number;
8645
8646       if (!inst.operands[i].issingle)
8647         {
8648           if (thumb_p)
8649             {
8650               /* LDR should not use lead in a flag-setting instruction being
8651                  chosen so we do not check whether movs can be used.  */
8652
8653               if ((ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2)
8654                   || ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2_v8m))
8655                   && inst.operands[i].reg != 13
8656                   && inst.operands[i].reg != 15)
8657                 {
8658                   /* Check if on thumb2 it can be done with a mov.w, mvn or
8659                      movw instruction.  */
8660                   unsigned int newimm;
8661                   bfd_boolean isNegated;
8662
8663                   newimm = encode_thumb32_immediate (v);
8664                   if (newimm != (unsigned int) FAIL)
8665                     isNegated = FALSE;
8666                   else
8667                     {
8668                       newimm = encode_thumb32_immediate (~v);
8669                       if (newimm != (unsigned int) FAIL)
8670                         isNegated = TRUE;
8671                     }
8672
8673                   /* The number can be loaded with a mov.w or mvn
8674                      instruction.  */
8675                   if (newimm != (unsigned int) FAIL
8676                       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2))
8677                     {
8678                       inst.instruction = (0xf04f0000  /*  MOV.W.  */
8679                                           | (inst.operands[i].reg << 8));
8680                       /* Change to MOVN.  */
8681                       inst.instruction |= (isNegated ? 0x200000 : 0);
8682                       inst.instruction |= (newimm & 0x800) << 15;
8683                       inst.instruction |= (newimm & 0x700) << 4;
8684                       inst.instruction |= (newimm & 0x0ff);
8685                       return TRUE;
8686                     }
8687                   /* The number can be loaded with a movw instruction.  */
8688                   else if ((v & ~0xFFFF) == 0
8689                            && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2_v8m))
8690                     {
8691                       int imm = v & 0xFFFF;
8692
8693                       inst.instruction = 0xf2400000;  /* MOVW.  */
8694                       inst.instruction |= (inst.operands[i].reg << 8);
8695                       inst.instruction |= (imm & 0xf000) << 4;
8696                       inst.instruction |= (imm & 0x0800) << 15;
8697                       inst.instruction |= (imm & 0x0700) << 4;
8698                       inst.instruction |= (imm & 0x00ff);
8699                       return TRUE;
8700                     }
8701                 }
8702             }
8703           else if (arm_p)
8704             {
8705               int value = encode_arm_immediate (v);
8706
8707               if (value != FAIL)
8708                 {
8709                   /* This can be done with a mov instruction.  */
8710                   inst.instruction &= LITERAL_MASK;
8711                   inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
8712                   inst.instruction |= value & 0xfff;
8713                   return TRUE;
8714                 }
8715
8716               value = encode_arm_immediate (~ v);
8717               if (value != FAIL)
8718                 {
8719                   /* This can be done with a mvn instruction.  */
8720                   inst.instruction &= LITERAL_MASK;
8721                   inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
8722                   inst.instruction |= value & 0xfff;
8723                   return TRUE;
8724                 }
8725             }
8726           else if (t == CONST_VEC && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1))
8727             {
8728               int op = 0;
8729               unsigned immbits = 0;
8730               unsigned immlo = inst.operands[1].imm;
8731               unsigned immhi = inst.operands[1].regisimm
8732                 ? inst.operands[1].reg
8733                 : inst.relocs[0].exp.X_unsigned
8734                 ? 0
8735                 : ((bfd_int64_t)((int) immlo)) >> 32;
8736               int cmode = neon_cmode_for_move_imm (immlo, immhi, FALSE, &immbits,
8737                                                    &op, 64, NT_invtype);
8738
8739               if (cmode == FAIL)
8740                 {
8741                   neon_invert_size (&immlo, &immhi, 64);
8742                   op = !op;
8743                   cmode = neon_cmode_for_move_imm (immlo, immhi, FALSE, &immbits,
8744                                                    &op, 64, NT_invtype);
8745                 }
8746
8747               if (cmode != FAIL)
8748                 {
8749                   inst.instruction = (inst.instruction & VLDR_VMOV_SAME)
8750                     | (1 << 23)
8751                     | (cmode << 8)
8752                     | (op << 5)
8753                     | (1 << 4);
8754
8755                   /* Fill other bits in vmov encoding for both thumb and arm.  */
8756                   if (thumb_mode)
8757                     inst.instruction |= (0x7U << 29) | (0xF << 24);
8758                   else
8759                     inst.instruction |= (0xFU << 28) | (0x1 << 25);
8760                   neon_write_immbits (immbits);
8761                   return TRUE;
8762                 }
8763             }
8764         }
8765
8766       if (t == CONST_VEC)
8767         {
8768           /* Check if vldr Rx, =constant could be optimized to vmov Rx, #constant.  */
8769           if (inst.operands[i].issingle
8770               && is_quarter_float (inst.operands[1].imm)
8771               && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v3xd))
8772             {
8773               inst.operands[1].imm =
8774                 neon_qfloat_bits (v);
8775               do_vfp_nsyn_opcode ("fconsts");
8776               return TRUE;
8777             }
8778
8779           /* If our host does not support a 64-bit type then we cannot perform
8780              the following optimization.  This mean that there will be a
8781              discrepancy between the output produced by an assembler built for
8782              a 32-bit-only host and the output produced from a 64-bit host, but
8783              this cannot be helped.  */
8784 #if defined BFD_HOST_64_BIT
8785           else if (!inst.operands[1].issingle
8786                    && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v3))
8787             {
8788               if (is_double_a_single (v)
8789                   && is_quarter_float (double_to_single (v)))
8790                 {
8791                   inst.operands[1].imm =
8792                     neon_qfloat_bits (double_to_single (v));
8793                   do_vfp_nsyn_opcode ("fconstd");
8794                   return TRUE;
8795                 }
8796             }
8797 #endif
8798         }
8799     }
8800
8801   if (add_to_lit_pool ((!inst.operands[i].isvec
8802                         || inst.operands[i].issingle) ? 4 : 8) == FAIL)
8803     return TRUE;
8804
8805   inst.operands[1].reg = REG_PC;
8806   inst.operands[1].isreg = 1;
8807   inst.operands[1].preind = 1;
8808   inst.relocs[0].pc_rel = 1;
8809   inst.relocs[0].type = (thumb_p
8810                      ? BFD_RELOC_ARM_THUMB_OFFSET
8811                      : (mode_3
8812                         ? BFD_RELOC_ARM_HWLITERAL
8813                         : BFD_RELOC_ARM_LITERAL));
8814   return FALSE;
8815 }
8816
8817 /* inst.operands[i] was set up by parse_address.  Encode it into an
8818    ARM-format instruction.  Reject all forms which cannot be encoded
8819    into a coprocessor load/store instruction.  If wb_ok is false,
8820    reject use of writeback; if unind_ok is false, reject use of
8821    unindexed addressing.  If reloc_override is not 0, use it instead
8822    of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
8823    (in which case it is preserved).  */
8824
8825 static int
8826 encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
8827 {
8828   if (!inst.operands[i].isreg)
8829     {
8830       /* PR 18256 */
8831       if (! inst.operands[0].isvec)
8832         {
8833           inst.error = _("invalid co-processor operand");
8834           return FAIL;
8835         }
8836       if (move_or_literal_pool (0, CONST_VEC, /*mode_3=*/FALSE))
8837         return SUCCESS;
8838     }
8839
8840   inst.instruction |= inst.operands[i].reg << 16;
8841
8842   gas_assert (!(inst.operands[i].preind && inst.operands[i].postind));
8843
8844   if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
8845     {
8846       gas_assert (!inst.operands[i].writeback);
8847       if (!unind_ok)
8848         {
8849           inst.error = _("instruction does not support unindexed addressing");
8850           return FAIL;
8851         }
8852       inst.instruction |= inst.operands[i].imm;
8853       inst.instruction |= INDEX_UP;
8854       return SUCCESS;
8855     }
8856
8857   if (inst.operands[i].preind)
8858     inst.instruction |= PRE_INDEX;
8859
8860   if (inst.operands[i].writeback)
8861     {
8862       if (inst.operands[i].reg == REG_PC)
8863         {
8864           inst.error = _("pc may not be used with write-back");
8865           return FAIL;
8866         }
8867       if (!wb_ok)
8868         {
8869           inst.error = _("instruction does not support writeback");
8870           return FAIL;
8871         }
8872       inst.instruction |= WRITE_BACK;
8873     }
8874
8875   if (reloc_override)
8876     inst.relocs[0].type = (bfd_reloc_code_real_type) reloc_override;
8877   else if ((inst.relocs[0].type < BFD_RELOC_ARM_ALU_PC_G0_NC
8878             || inst.relocs[0].type > BFD_RELOC_ARM_LDC_SB_G2)
8879            && inst.relocs[0].type != BFD_RELOC_ARM_LDR_PC_G0)
8880     {
8881       if (thumb_mode)
8882         inst.relocs[0].type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
8883       else
8884         inst.relocs[0].type = BFD_RELOC_ARM_CP_OFF_IMM;
8885     }
8886
8887   /* Prefer + for zero encoded value.  */
8888   if (!inst.operands[i].negative)
8889     inst.instruction |= INDEX_UP;
8890
8891   return SUCCESS;
8892 }
8893
8894 /* Functions for instruction encoding, sorted by sub-architecture.
8895    First some generics; their names are taken from the conventional
8896    bit positions for register arguments in ARM format instructions.  */
8897
8898 static void
8899 do_noargs (void)
8900 {
8901 }
8902
8903 static void
8904 do_rd (void)
8905 {
8906   inst.instruction |= inst.operands[0].reg << 12;
8907 }
8908
8909 static void
8910 do_rn (void)
8911 {
8912   inst.instruction |= inst.operands[0].reg << 16;
8913 }
8914
8915 static void
8916 do_rd_rm (void)
8917 {
8918   inst.instruction |= inst.operands[0].reg << 12;
8919   inst.instruction |= inst.operands[1].reg;
8920 }
8921
8922 static void
8923 do_rm_rn (void)
8924 {
8925   inst.instruction |= inst.operands[0].reg;
8926   inst.instruction |= inst.operands[1].reg << 16;
8927 }
8928
8929 static void
8930 do_rd_rn (void)
8931 {
8932   inst.instruction |= inst.operands[0].reg << 12;
8933   inst.instruction |= inst.operands[1].reg << 16;
8934 }
8935
8936 static void
8937 do_rn_rd (void)
8938 {
8939   inst.instruction |= inst.operands[0].reg << 16;
8940   inst.instruction |= inst.operands[1].reg << 12;
8941 }
8942
8943 static void
8944 do_tt (void)
8945 {
8946   inst.instruction |= inst.operands[0].reg << 8;
8947   inst.instruction |= inst.operands[1].reg << 16;
8948 }
8949
8950 static bfd_boolean
8951 check_obsolete (const arm_feature_set *feature, const char *msg)
8952 {
8953   if (ARM_CPU_IS_ANY (cpu_variant))
8954     {
8955       as_tsktsk ("%s", msg);
8956       return TRUE;
8957     }
8958   else if (ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
8959     {
8960       as_bad ("%s", msg);
8961       return TRUE;
8962     }
8963
8964   return FALSE;
8965 }
8966
8967 static void
8968 do_rd_rm_rn (void)
8969 {
8970   unsigned Rn = inst.operands[2].reg;
8971   /* Enforce restrictions on SWP instruction.  */
8972   if ((inst.instruction & 0x0fbfffff) == 0x01000090)
8973     {
8974       constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
8975                   _("Rn must not overlap other operands"));
8976
8977       /* SWP{b} is obsolete for ARMv8-A, and deprecated for ARMv6* and ARMv7.
8978        */
8979       if (!check_obsolete (&arm_ext_v8,
8980                            _("swp{b} use is obsoleted for ARMv8 and later"))
8981           && warn_on_deprecated
8982           && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6))
8983         as_tsktsk (_("swp{b} use is deprecated for ARMv6 and ARMv7"));
8984     }
8985
8986   inst.instruction |= inst.operands[0].reg << 12;
8987   inst.instruction |= inst.operands[1].reg;
8988   inst.instruction |= Rn << 16;
8989 }
8990
8991 static void
8992 do_rd_rn_rm (void)
8993 {
8994   inst.instruction |= inst.operands[0].reg << 12;
8995   inst.instruction |= inst.operands[1].reg << 16;
8996   inst.instruction |= inst.operands[2].reg;
8997 }
8998
8999 static void
9000 do_rm_rd_rn (void)
9001 {
9002   constraint ((inst.operands[2].reg == REG_PC), BAD_PC);
9003   constraint (((inst.relocs[0].exp.X_op != O_constant
9004                 && inst.relocs[0].exp.X_op != O_illegal)
9005                || inst.relocs[0].exp.X_add_number != 0),
9006               BAD_ADDR_MODE);
9007   inst.instruction |= inst.operands[0].reg;
9008   inst.instruction |= inst.operands[1].reg << 12;
9009   inst.instruction |= inst.operands[2].reg << 16;
9010 }
9011
9012 static void
9013 do_imm0 (void)
9014 {
9015   inst.instruction |= inst.operands[0].imm;
9016 }
9017
9018 static void
9019 do_rd_cpaddr (void)
9020 {
9021   inst.instruction |= inst.operands[0].reg << 12;
9022   encode_arm_cp_address (1, TRUE, TRUE, 0);
9023 }
9024
9025 /* ARM instructions, in alphabetical order by function name (except
9026    that wrapper functions appear immediately after the function they
9027    wrap).  */
9028
9029 /* This is a pseudo-op of the form "adr rd, label" to be converted
9030    into a relative address of the form "add rd, pc, #label-.-8".  */
9031
9032 static void
9033 do_adr (void)
9034 {
9035   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
9036
9037   /* Frag hacking will turn this into a sub instruction if the offset turns
9038      out to be negative.  */
9039   inst.relocs[0].type = BFD_RELOC_ARM_IMMEDIATE;
9040   inst.relocs[0].pc_rel = 1;
9041   inst.relocs[0].exp.X_add_number -= 8;
9042
9043   if (support_interwork
9044       && inst.relocs[0].exp.X_op == O_symbol
9045       && inst.relocs[0].exp.X_add_symbol != NULL
9046       && S_IS_DEFINED (inst.relocs[0].exp.X_add_symbol)
9047       && THUMB_IS_FUNC (inst.relocs[0].exp.X_add_symbol))
9048     inst.relocs[0].exp.X_add_number |= 1;
9049 }
9050
9051 /* This is a pseudo-op of the form "adrl rd, label" to be converted
9052    into a relative address of the form:
9053    add rd, pc, #low(label-.-8)"
9054    add rd, rd, #high(label-.-8)"  */
9055
9056 static void
9057 do_adrl (void)
9058 {
9059   inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
9060
9061   /* Frag hacking will turn this into a sub instruction if the offset turns
9062      out to be negative.  */
9063   inst.relocs[0].type          = BFD_RELOC_ARM_ADRL_IMMEDIATE;
9064   inst.relocs[0].pc_rel        = 1;
9065   inst.size                    = INSN_SIZE * 2;
9066   inst.relocs[0].exp.X_add_number -= 8;
9067
9068   if (support_interwork
9069       && inst.relocs[0].exp.X_op == O_symbol
9070       && inst.relocs[0].exp.X_add_symbol != NULL
9071       && S_IS_DEFINED (inst.relocs[0].exp.X_add_symbol)
9072       && THUMB_IS_FUNC (inst.relocs[0].exp.X_add_symbol))
9073     inst.relocs[0].exp.X_add_number |= 1;
9074 }
9075
9076 static void
9077 do_arit (void)
9078 {
9079   constraint (inst.relocs[0].type >= BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC
9080               && inst.relocs[0].type <= BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC ,
9081               THUMB1_RELOC_ONLY);
9082   if (!inst.operands[1].present)
9083     inst.operands[1].reg = inst.operands[0].reg;
9084   inst.instruction |= inst.operands[0].reg << 12;
9085   inst.instruction |= inst.operands[1].reg << 16;
9086   encode_arm_shifter_operand (2);
9087 }
9088
9089 static void
9090 do_barrier (void)
9091 {
9092   if (inst.operands[0].present)
9093     inst.instruction |= inst.operands[0].imm;
9094   else
9095     inst.instruction |= 0xf;
9096 }
9097
9098 static void
9099 do_bfc (void)
9100 {
9101   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
9102   constraint (msb > 32, _("bit-field extends past end of register"));
9103   /* The instruction encoding stores the LSB and MSB,
9104      not the LSB and width.  */
9105   inst.instruction |= inst.operands[0].reg << 12;
9106   inst.instruction |= inst.operands[1].imm << 7;
9107   inst.instruction |= (msb - 1) << 16;
9108 }
9109
9110 static void
9111 do_bfi (void)
9112 {
9113   unsigned int msb;
9114
9115   /* #0 in second position is alternative syntax for bfc, which is
9116      the same instruction but with REG_PC in the Rm field.  */
9117   if (!inst.operands[1].isreg)
9118     inst.operands[1].reg = REG_PC;
9119
9120   msb = inst.operands[2].imm + inst.operands[3].imm;
9121   constraint (msb > 32, _("bit-field extends past end of register"));
9122   /* The instruction encoding stores the LSB and MSB,
9123      not the LSB and width.  */
9124   inst.instruction |= inst.operands[0].reg << 12;
9125   inst.instruction |= inst.operands[1].reg;
9126   inst.instruction |= inst.operands[2].imm << 7;
9127   inst.instruction |= (msb - 1) << 16;
9128 }
9129
9130 static void
9131 do_bfx (void)
9132 {
9133   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
9134               _("bit-field extends past end of register"));
9135   inst.instruction |= inst.operands[0].reg << 12;
9136   inst.instruction |= inst.operands[1].reg;
9137   inst.instruction |= inst.operands[2].imm << 7;
9138   inst.instruction |= (inst.operands[3].imm - 1) << 16;
9139 }
9140
9141 /* ARM V5 breakpoint instruction (argument parse)
9142      BKPT <16 bit unsigned immediate>
9143      Instruction is not conditional.
9144         The bit pattern given in insns[] has the COND_ALWAYS condition,
9145         and it is an error if the caller tried to override that.  */
9146
9147 static void
9148 do_bkpt (void)
9149 {
9150   /* Top 12 of 16 bits to bits 19:8.  */
9151   inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
9152
9153   /* Bottom 4 of 16 bits to bits 3:0.  */
9154   inst.instruction |= inst.operands[0].imm & 0xf;
9155 }
9156
9157 static void
9158 encode_branch (int default_reloc)
9159 {
9160   if (inst.operands[0].hasreloc)
9161     {
9162       constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32
9163                   && inst.operands[0].imm != BFD_RELOC_ARM_TLS_CALL,
9164                   _("the only valid suffixes here are '(plt)' and '(tlscall)'"));
9165       inst.relocs[0].type = inst.operands[0].imm == BFD_RELOC_ARM_PLT32
9166         ? BFD_RELOC_ARM_PLT32
9167         : thumb_mode ? BFD_RELOC_ARM_THM_TLS_CALL : BFD_RELOC_ARM_TLS_CALL;
9168     }
9169   else
9170     inst.relocs[0].type = (bfd_reloc_code_real_type) default_reloc;
9171   inst.relocs[0].pc_rel = 1;
9172 }
9173
9174 static void
9175 do_branch (void)
9176 {
9177 #ifdef OBJ_ELF
9178   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
9179     encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
9180   else
9181 #endif
9182     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
9183 }
9184
9185 static void
9186 do_bl (void)
9187 {
9188 #ifdef OBJ_ELF
9189   if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
9190     {
9191       if (inst.cond == COND_ALWAYS)
9192         encode_branch (BFD_RELOC_ARM_PCREL_CALL);
9193       else
9194         encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
9195     }
9196   else
9197 #endif
9198     encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
9199 }
9200
9201 /* ARM V5 branch-link-exchange instruction (argument parse)
9202      BLX <target_addr>          ie BLX(1)
9203      BLX{<condition>} <Rm>      ie BLX(2)
9204    Unfortunately, there are two different opcodes for this mnemonic.
9205    So, the insns[].value is not used, and the code here zaps values
9206         into inst.instruction.
9207    Also, the <target_addr> can be 25 bits, hence has its own reloc.  */
9208
9209 static void
9210 do_blx (void)
9211 {
9212   if (inst.operands[0].isreg)
9213     {
9214       /* Arg is a register; the opcode provided by insns[] is correct.
9215          It is not illegal to do "blx pc", just useless.  */
9216       if (inst.operands[0].reg == REG_PC)
9217         as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
9218
9219       inst.instruction |= inst.operands[0].reg;
9220     }
9221   else
9222     {
9223       /* Arg is an address; this instruction cannot be executed
9224          conditionally, and the opcode must be adjusted.
9225          We retain the BFD_RELOC_ARM_PCREL_BLX till the very end
9226          where we generate out a BFD_RELOC_ARM_PCREL_CALL instead.  */
9227       constraint (inst.cond != COND_ALWAYS, BAD_COND);
9228       inst.instruction = 0xfa000000;
9229       encode_branch (BFD_RELOC_ARM_PCREL_BLX);
9230     }
9231 }
9232
9233 static void
9234 do_bx (void)
9235 {
9236   bfd_boolean want_reloc;
9237
9238   if (inst.operands[0].reg == REG_PC)
9239     as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
9240
9241   inst.instruction |= inst.operands[0].reg;
9242   /* Output R_ARM_V4BX relocations if is an EABI object that looks like
9243      it is for ARMv4t or earlier.  */
9244   want_reloc = !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5);
9245   if (!ARM_FEATURE_ZERO (selected_object_arch)
9246       && !ARM_CPU_HAS_FEATURE (selected_object_arch, arm_ext_v5))
9247       want_reloc = TRUE;
9248
9249 #ifdef OBJ_ELF
9250   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
9251 #endif
9252     want_reloc = FALSE;
9253
9254   if (want_reloc)
9255     inst.relocs[0].type = BFD_RELOC_ARM_V4BX;
9256 }
9257
9258
9259 /* ARM v5TEJ.  Jump to Jazelle code.  */
9260
9261 static void
9262 do_bxj (void)
9263 {
9264   if (inst.operands[0].reg == REG_PC)
9265     as_tsktsk (_("use of r15 in bxj is not really useful"));
9266
9267   inst.instruction |= inst.operands[0].reg;
9268 }
9269
9270 /* Co-processor data operation:
9271       CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
9272       CDP2      <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}  */
9273 static void
9274 do_cdp (void)
9275 {
9276   inst.instruction |= inst.operands[0].reg << 8;
9277   inst.instruction |= inst.operands[1].imm << 20;
9278   inst.instruction |= inst.operands[2].reg << 12;
9279   inst.instruction |= inst.operands[3].reg << 16;
9280   inst.instruction |= inst.operands[4].reg;
9281   inst.instruction |= inst.operands[5].imm << 5;
9282 }
9283
9284 static void
9285 do_cmp (void)
9286 {
9287   inst.instruction |= inst.operands[0].reg << 16;
9288   encode_arm_shifter_operand (1);
9289 }
9290
9291 /* Transfer between coprocessor and ARM registers.
9292    MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
9293    MRC2
9294    MCR{cond}
9295    MCR2
9296
9297    No special properties.  */
9298
9299 struct deprecated_coproc_regs_s
9300 {
9301   unsigned cp;
9302   int opc1;
9303   unsigned crn;
9304   unsigned crm;
9305   int opc2;
9306   arm_feature_set deprecated;
9307   arm_feature_set obsoleted;
9308   const char *dep_msg;
9309   const char *obs_msg;
9310 };
9311
9312 #define DEPR_ACCESS_V8 \
9313   N_("This coprocessor register access is deprecated in ARMv8")
9314
9315 /* Table of all deprecated coprocessor registers.  */
9316 static struct deprecated_coproc_regs_s deprecated_coproc_regs[] =
9317 {
9318     {15, 0, 7, 10, 5,                                   /* CP15DMB.  */
9319      ARM_FEATURE_CORE_LOW (ARM_EXT_V8), ARM_ARCH_NONE,
9320      DEPR_ACCESS_V8, NULL},
9321     {15, 0, 7, 10, 4,                                   /* CP15DSB.  */
9322      ARM_FEATURE_CORE_LOW (ARM_EXT_V8), ARM_ARCH_NONE,
9323      DEPR_ACCESS_V8, NULL},
9324     {15, 0, 7,  5, 4,                                   /* CP15ISB.  */
9325      ARM_FEATURE_CORE_LOW (ARM_EXT_V8), ARM_ARCH_NONE,
9326      DEPR_ACCESS_V8, NULL},
9327     {14, 6, 1,  0, 0,                                   /* TEEHBR.  */
9328      ARM_FEATURE_CORE_LOW (ARM_EXT_V8), ARM_ARCH_NONE,
9329      DEPR_ACCESS_V8, NULL},
9330     {14, 6, 0,  0, 0,                                   /* TEECR.  */
9331      ARM_FEATURE_CORE_LOW (ARM_EXT_V8), ARM_ARCH_NONE,
9332      DEPR_ACCESS_V8, NULL},
9333 };
9334
9335 #undef DEPR_ACCESS_V8
9336
9337 static const size_t deprecated_coproc_reg_count =
9338   sizeof (deprecated_coproc_regs) / sizeof (deprecated_coproc_regs[0]);
9339
9340 static void
9341 do_co_reg (void)
9342 {
9343   unsigned Rd;
9344   size_t i;
9345
9346   Rd = inst.operands[2].reg;
9347   if (thumb_mode)
9348     {
9349       if (inst.instruction == 0xee000010
9350           || inst.instruction == 0xfe000010)
9351         /* MCR, MCR2  */
9352         reject_bad_reg (Rd);
9353       else if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
9354         /* MRC, MRC2  */
9355         constraint (Rd == REG_SP, BAD_SP);
9356     }
9357   else
9358     {
9359       /* MCR */
9360       if (inst.instruction == 0xe000010)
9361         constraint (Rd == REG_PC, BAD_PC);
9362     }
9363
9364     for (i = 0; i < deprecated_coproc_reg_count; ++i)
9365       {
9366         const struct deprecated_coproc_regs_s *r =
9367           deprecated_coproc_regs + i;
9368
9369         if (inst.operands[0].reg == r->cp
9370             && inst.operands[1].imm == r->opc1
9371             && inst.operands[3].reg == r->crn
9372             && inst.operands[4].reg == r->crm
9373             && inst.operands[5].imm == r->opc2)
9374           {
9375             if (! ARM_CPU_IS_ANY (cpu_variant)
9376                 && warn_on_deprecated
9377                 && ARM_CPU_HAS_FEATURE (cpu_variant, r->deprecated))
9378               as_tsktsk ("%s", r->dep_msg);
9379           }
9380       }
9381
9382   inst.instruction |= inst.operands[0].reg << 8;
9383   inst.instruction |= inst.operands[1].imm << 21;
9384   inst.instruction |= Rd << 12;
9385   inst.instruction |= inst.operands[3].reg << 16;
9386   inst.instruction |= inst.operands[4].reg;
9387   inst.instruction |= inst.operands[5].imm << 5;
9388 }
9389
9390 /* Transfer between coprocessor register and pair of ARM registers.
9391    MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
9392    MCRR2
9393    MRRC{cond}
9394    MRRC2
9395
9396    Two XScale instructions are special cases of these:
9397
9398      MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
9399      MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
9400
9401    Result unpredictable if Rd or Rn is R15.  */
9402
9403 static void
9404 do_co_reg2c (void)
9405 {
9406   unsigned Rd, Rn;
9407
9408   Rd = inst.operands[2].reg;
9409   Rn = inst.operands[3].reg;
9410
9411   if (thumb_mode)
9412     {
9413       reject_bad_reg (Rd);
9414       reject_bad_reg (Rn);
9415     }
9416   else
9417     {
9418       constraint (Rd == REG_PC, BAD_PC);
9419       constraint (Rn == REG_PC, BAD_PC);
9420     }
9421
9422   /* Only check the MRRC{2} variants.  */
9423   if ((inst.instruction & 0x0FF00000) == 0x0C500000)
9424     {
9425        /* If Rd == Rn, error that the operation is
9426           unpredictable (example MRRC p3,#1,r1,r1,c4).  */
9427        constraint (Rd == Rn, BAD_OVERLAP);
9428     }
9429
9430   inst.instruction |= inst.operands[0].reg << 8;
9431   inst.instruction |= inst.operands[1].imm << 4;
9432   inst.instruction |= Rd << 12;
9433   inst.instruction |= Rn << 16;
9434   inst.instruction |= inst.operands[4].reg;
9435 }
9436
9437 static void
9438 do_cpsi (void)
9439 {
9440   inst.instruction |= inst.operands[0].imm << 6;
9441   if (inst.operands[1].present)
9442     {
9443       inst.instruction |= CPSI_MMOD;
9444       inst.instruction |= inst.operands[1].imm;
9445     }
9446 }
9447
9448 static void
9449 do_dbg (void)
9450 {
9451   inst.instruction |= inst.operands[0].imm;
9452 }
9453
9454 static void
9455 do_div (void)
9456 {
9457   unsigned Rd, Rn, Rm;
9458
9459   Rd = inst.operands[0].reg;
9460   Rn = (inst.operands[1].present
9461         ? inst.operands[1].reg : Rd);
9462   Rm = inst.operands[2].reg;
9463
9464   constraint ((Rd == REG_PC), BAD_PC);
9465   constraint ((Rn == REG_PC), BAD_PC);
9466   constraint ((Rm == REG_PC), BAD_PC);
9467
9468   inst.instruction |= Rd << 16;
9469   inst.instruction |= Rn << 0;
9470   inst.instruction |= Rm << 8;
9471 }
9472
9473 static void
9474 do_it (void)
9475 {
9476   /* There is no IT instruction in ARM mode.  We
9477      process it to do the validation as if in
9478      thumb mode, just in case the code gets
9479      assembled for thumb using the unified syntax.  */
9480
9481   inst.size = 0;
9482   if (unified_syntax)
9483     {
9484       set_pred_insn_type (IT_INSN);
9485       now_pred.mask = (inst.instruction & 0xf) | 0x10;
9486       now_pred.cc = inst.operands[0].imm;
9487     }
9488 }
9489
9490 /* If there is only one register in the register list,
9491    then return its register number.  Otherwise return -1.  */
9492 static int
9493 only_one_reg_in_list (int range)
9494 {
9495   int i = ffs (range) - 1;
9496   return (i > 15 || range != (1 << i)) ? -1 : i;
9497 }
9498
9499 static void
9500 encode_ldmstm(int from_push_pop_mnem)
9501 {
9502   int base_reg = inst.operands[0].reg;
9503   int range = inst.operands[1].imm;
9504   int one_reg;
9505
9506   inst.instruction |= base_reg << 16;
9507   inst.instruction |= range;
9508
9509   if (inst.operands[1].writeback)
9510     inst.instruction |= LDM_TYPE_2_OR_3;
9511
9512   if (inst.operands[0].writeback)
9513     {
9514       inst.instruction |= WRITE_BACK;
9515       /* Check for unpredictable uses of writeback.  */
9516       if (inst.instruction & LOAD_BIT)
9517         {
9518           /* Not allowed in LDM type 2.  */
9519           if ((inst.instruction & LDM_TYPE_2_OR_3)
9520               && ((range & (1 << REG_PC)) == 0))
9521             as_warn (_("writeback of base register is UNPREDICTABLE"));
9522           /* Only allowed if base reg not in list for other types.  */
9523           else if (range & (1 << base_reg))
9524             as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
9525         }
9526       else /* STM.  */
9527         {
9528           /* Not allowed for type 2.  */
9529           if (inst.instruction & LDM_TYPE_2_OR_3)
9530             as_warn (_("writeback of base register is UNPREDICTABLE"));
9531           /* Only allowed if base reg not in list, or first in list.  */
9532           else if ((range & (1 << base_reg))
9533                    && (range & ((1 << base_reg) - 1)))
9534             as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
9535         }
9536     }
9537
9538   /* If PUSH/POP has only one register, then use the A2 encoding.  */
9539   one_reg = only_one_reg_in_list (range);
9540   if (from_push_pop_mnem && one_reg >= 0)
9541     {
9542       int is_push = (inst.instruction & A_PUSH_POP_OP_MASK) == A1_OPCODE_PUSH;
9543
9544       if (is_push && one_reg == 13 /* SP */)
9545         /* PR 22483: The A2 encoding cannot be used when
9546            pushing the stack pointer as this is UNPREDICTABLE.  */
9547         return;
9548
9549       inst.instruction &= A_COND_MASK;
9550       inst.instruction |= is_push ? A2_OPCODE_PUSH : A2_OPCODE_POP;
9551       inst.instruction |= one_reg << 12;
9552     }
9553 }
9554
9555 static void
9556 do_ldmstm (void)
9557 {
9558   encode_ldmstm (/*from_push_pop_mnem=*/FALSE);
9559 }
9560
9561 /* ARMv5TE load-consecutive (argument parse)
9562    Mode is like LDRH.
9563
9564      LDRccD R, mode
9565      STRccD R, mode.  */
9566
9567 static void
9568 do_ldrd (void)
9569 {
9570   constraint (inst.operands[0].reg % 2 != 0,
9571               _("first transfer register must be even"));
9572   constraint (inst.operands[1].present
9573               && inst.operands[1].reg != inst.operands[0].reg + 1,
9574               _("can only transfer two consecutive registers"));
9575   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
9576   constraint (!inst.operands[2].isreg, _("'[' expected"));
9577
9578   if (!inst.operands[1].present)
9579     inst.operands[1].reg = inst.operands[0].reg + 1;
9580
9581   /* encode_arm_addr_mode_3 will diagnose overlap between the base
9582      register and the first register written; we have to diagnose
9583      overlap between the base and the second register written here.  */
9584
9585   if (inst.operands[2].reg == inst.operands[1].reg
9586       && (inst.operands[2].writeback || inst.operands[2].postind))
9587     as_warn (_("base register written back, and overlaps "
9588                "second transfer register"));
9589
9590   if (!(inst.instruction & V4_STR_BIT))
9591     {
9592       /* For an index-register load, the index register must not overlap the
9593         destination (even if not write-back).  */
9594       if (inst.operands[2].immisreg
9595               && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
9596               || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
9597         as_warn (_("index register overlaps transfer register"));
9598     }
9599   inst.instruction |= inst.operands[0].reg << 12;
9600   encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
9601 }
9602
9603 static void
9604 do_ldrex (void)
9605 {
9606   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
9607               || inst.operands[1].postind || inst.operands[1].writeback
9608               || inst.operands[1].immisreg || inst.operands[1].shifted
9609               || inst.operands[1].negative
9610               /* This can arise if the programmer has written
9611                    strex rN, rM, foo
9612                  or if they have mistakenly used a register name as the last
9613                  operand,  eg:
9614                    strex rN, rM, rX
9615                  It is very difficult to distinguish between these two cases
9616                  because "rX" might actually be a label. ie the register
9617                  name has been occluded by a symbol of the same name. So we
9618                  just generate a general 'bad addressing mode' type error
9619                  message and leave it up to the programmer to discover the
9620                  true cause and fix their mistake.  */
9621               || (inst.operands[1].reg == REG_PC),
9622               BAD_ADDR_MODE);
9623
9624   constraint (inst.relocs[0].exp.X_op != O_constant
9625               || inst.relocs[0].exp.X_add_number != 0,
9626               _("offset must be zero in ARM encoding"));
9627
9628   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
9629
9630   inst.instruction |= inst.operands[0].reg << 12;
9631   inst.instruction |= inst.operands[1].reg << 16;
9632   inst.relocs[0].type = BFD_RELOC_UNUSED;
9633 }
9634
9635 static void
9636 do_ldrexd (void)
9637 {
9638   constraint (inst.operands[0].reg % 2 != 0,
9639               _("even register required"));
9640   constraint (inst.operands[1].present
9641               && inst.operands[1].reg != inst.operands[0].reg + 1,
9642               _("can only load two consecutive registers"));
9643   /* If op 1 were present and equal to PC, this function wouldn't
9644      have been called in the first place.  */
9645   constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
9646
9647   inst.instruction |= inst.operands[0].reg << 12;
9648   inst.instruction |= inst.operands[2].reg << 16;
9649 }
9650
9651 /* In both ARM and thumb state 'ldr pc, #imm'  with an immediate
9652    which is not a multiple of four is UNPREDICTABLE.  */
9653 static void
9654 check_ldr_r15_aligned (void)
9655 {
9656   constraint (!(inst.operands[1].immisreg)
9657               && (inst.operands[0].reg == REG_PC
9658               && inst.operands[1].reg == REG_PC
9659               && (inst.relocs[0].exp.X_add_number & 0x3)),
9660               _("ldr to register 15 must be 4-byte aligned"));
9661 }
9662
9663 static void
9664 do_ldst (void)
9665 {
9666   inst.instruction |= inst.operands[0].reg << 12;
9667   if (!inst.operands[1].isreg)
9668     if (move_or_literal_pool (0, CONST_ARM, /*mode_3=*/FALSE))
9669       return;
9670   encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
9671   check_ldr_r15_aligned ();
9672 }
9673
9674 static void
9675 do_ldstt (void)
9676 {
9677   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
9678      reject [Rn,...].  */
9679   if (inst.operands[1].preind)
9680     {
9681       constraint (inst.relocs[0].exp.X_op != O_constant
9682                   || inst.relocs[0].exp.X_add_number != 0,
9683                   _("this instruction requires a post-indexed address"));
9684
9685       inst.operands[1].preind = 0;
9686       inst.operands[1].postind = 1;
9687       inst.operands[1].writeback = 1;
9688     }
9689   inst.instruction |= inst.operands[0].reg << 12;
9690   encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
9691 }
9692
9693 /* Halfword and signed-byte load/store operations.  */
9694
9695 static void
9696 do_ldstv4 (void)
9697 {
9698   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
9699   inst.instruction |= inst.operands[0].reg << 12;
9700   if (!inst.operands[1].isreg)
9701     if (move_or_literal_pool (0, CONST_ARM, /*mode_3=*/TRUE))
9702       return;
9703   encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
9704 }
9705
9706 static void
9707 do_ldsttv4 (void)
9708 {
9709   /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
9710      reject [Rn,...].  */
9711   if (inst.operands[1].preind)
9712     {
9713       constraint (inst.relocs[0].exp.X_op != O_constant
9714                   || inst.relocs[0].exp.X_add_number != 0,
9715                   _("this instruction requires a post-indexed address"));
9716
9717       inst.operands[1].preind = 0;
9718       inst.operands[1].postind = 1;
9719       inst.operands[1].writeback = 1;
9720     }
9721   inst.instruction |= inst.operands[0].reg << 12;
9722   encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
9723 }
9724
9725 /* Co-processor register load/store.
9726    Format: <LDC|STC>{cond}[L] CP#,CRd,<address>  */
9727 static void
9728 do_lstc (void)
9729 {
9730   inst.instruction |= inst.operands[0].reg << 8;
9731   inst.instruction |= inst.operands[1].reg << 12;
9732   encode_arm_cp_address (2, TRUE, TRUE, 0);
9733 }
9734
9735 static void
9736 do_mlas (void)
9737 {
9738   /* This restriction does not apply to mls (nor to mla in v6 or later).  */
9739   if (inst.operands[0].reg == inst.operands[1].reg
9740       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
9741       && !(inst.instruction & 0x00400000))
9742     as_tsktsk (_("Rd and Rm should be different in mla"));
9743
9744   inst.instruction |= inst.operands[0].reg << 16;
9745   inst.instruction |= inst.operands[1].reg;
9746   inst.instruction |= inst.operands[2].reg << 8;
9747   inst.instruction |= inst.operands[3].reg << 12;
9748 }
9749
9750 static void
9751 do_mov (void)
9752 {
9753   constraint (inst.relocs[0].type >= BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC
9754               && inst.relocs[0].type <= BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC ,
9755               THUMB1_RELOC_ONLY);
9756   inst.instruction |= inst.operands[0].reg << 12;
9757   encode_arm_shifter_operand (1);
9758 }
9759
9760 /* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>.  */
9761 static void
9762 do_mov16 (void)
9763 {
9764   bfd_vma imm;
9765   bfd_boolean top;
9766
9767   top = (inst.instruction & 0x00400000) != 0;
9768   constraint (top && inst.relocs[0].type == BFD_RELOC_ARM_MOVW,
9769               _(":lower16: not allowed in this instruction"));
9770   constraint (!top && inst.relocs[0].type == BFD_RELOC_ARM_MOVT,
9771               _(":upper16: not allowed in this instruction"));
9772   inst.instruction |= inst.operands[0].reg << 12;
9773   if (inst.relocs[0].type == BFD_RELOC_UNUSED)
9774     {
9775       imm = inst.relocs[0].exp.X_add_number;
9776       /* The value is in two pieces: 0:11, 16:19.  */
9777       inst.instruction |= (imm & 0x00000fff);
9778       inst.instruction |= (imm & 0x0000f000) << 4;
9779     }
9780 }
9781
9782 static int
9783 do_vfp_nsyn_mrs (void)
9784 {
9785   if (inst.operands[0].isvec)
9786     {
9787       if (inst.operands[1].reg != 1)
9788         first_error (_("operand 1 must be FPSCR"));
9789       memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
9790       memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
9791       do_vfp_nsyn_opcode ("fmstat");
9792     }
9793   else if (inst.operands[1].isvec)
9794     do_vfp_nsyn_opcode ("fmrx");
9795   else
9796     return FAIL;
9797
9798   return SUCCESS;
9799 }
9800
9801 static int
9802 do_vfp_nsyn_msr (void)
9803 {
9804   if (inst.operands[0].isvec)
9805     do_vfp_nsyn_opcode ("fmxr");
9806   else
9807     return FAIL;
9808
9809   return SUCCESS;
9810 }
9811
9812 static void
9813 do_vmrs (void)
9814 {
9815   unsigned Rt = inst.operands[0].reg;
9816
9817   if (thumb_mode && Rt == REG_SP)
9818     {
9819       inst.error = BAD_SP;
9820       return;
9821     }
9822
9823   /* MVFR2 is only valid at ARMv8-A.  */
9824   if (inst.operands[1].reg == 5)
9825     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
9826                 _(BAD_FPU));
9827
9828   /* APSR_ sets isvec. All other refs to PC are illegal.  */
9829   if (!inst.operands[0].isvec && Rt == REG_PC)
9830     {
9831       inst.error = BAD_PC;
9832       return;
9833     }
9834
9835   /* If we get through parsing the register name, we just insert the number
9836      generated into the instruction without further validation.  */
9837   inst.instruction |= (inst.operands[1].reg << 16);
9838   inst.instruction |= (Rt << 12);
9839 }
9840
9841 static void
9842 do_vmsr (void)
9843 {
9844   unsigned Rt = inst.operands[1].reg;
9845
9846   if (thumb_mode)
9847     reject_bad_reg (Rt);
9848   else if (Rt == REG_PC)
9849     {
9850       inst.error = BAD_PC;
9851       return;
9852     }
9853
9854   /* MVFR2 is only valid for ARMv8-A.  */
9855   if (inst.operands[0].reg == 5)
9856     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
9857                 _(BAD_FPU));
9858
9859   /* If we get through parsing the register name, we just insert the number
9860      generated into the instruction without further validation.  */
9861   inst.instruction |= (inst.operands[0].reg << 16);
9862   inst.instruction |= (Rt << 12);
9863 }
9864
9865 static void
9866 do_mrs (void)
9867 {
9868   unsigned br;
9869
9870   if (do_vfp_nsyn_mrs () == SUCCESS)
9871     return;
9872
9873   constraint (inst.operands[0].reg == REG_PC, BAD_PC);
9874   inst.instruction |= inst.operands[0].reg << 12;
9875
9876   if (inst.operands[1].isreg)
9877     {
9878       br = inst.operands[1].reg;
9879       if (((br & 0x200) == 0) && ((br & 0xf0000) != 0xf0000))
9880         as_bad (_("bad register for mrs"));
9881     }
9882   else
9883     {
9884       /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
9885       constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
9886                   != (PSR_c|PSR_f),
9887                   _("'APSR', 'CPSR' or 'SPSR' expected"));
9888       br = (15<<16) | (inst.operands[1].imm & SPSR_BIT);
9889     }
9890
9891   inst.instruction |= br;
9892 }
9893
9894 /* Two possible forms:
9895       "{C|S}PSR_<field>, Rm",
9896       "{C|S}PSR_f, #expression".  */
9897
9898 static void
9899 do_msr (void)
9900 {
9901   if (do_vfp_nsyn_msr () == SUCCESS)
9902     return;
9903
9904   inst.instruction |= inst.operands[0].imm;
9905   if (inst.operands[1].isreg)
9906     inst.instruction |= inst.operands[1].reg;
9907   else
9908     {
9909       inst.instruction |= INST_IMMEDIATE;
9910       inst.relocs[0].type = BFD_RELOC_ARM_IMMEDIATE;
9911       inst.relocs[0].pc_rel = 0;
9912     }
9913 }
9914
9915 static void
9916 do_mul (void)
9917 {
9918   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
9919
9920   if (!inst.operands[2].present)
9921     inst.operands[2].reg = inst.operands[0].reg;
9922   inst.instruction |= inst.operands[0].reg << 16;
9923   inst.instruction |= inst.operands[1].reg;
9924   inst.instruction |= inst.operands[2].reg << 8;
9925
9926   if (inst.operands[0].reg == inst.operands[1].reg
9927       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
9928     as_tsktsk (_("Rd and Rm should be different in mul"));
9929 }
9930
9931 /* Long Multiply Parser
9932    UMULL RdLo, RdHi, Rm, Rs
9933    SMULL RdLo, RdHi, Rm, Rs
9934    UMLAL RdLo, RdHi, Rm, Rs
9935    SMLAL RdLo, RdHi, Rm, Rs.  */
9936
9937 static void
9938 do_mull (void)
9939 {
9940   inst.instruction |= inst.operands[0].reg << 12;
9941   inst.instruction |= inst.operands[1].reg << 16;
9942   inst.instruction |= inst.operands[2].reg;
9943   inst.instruction |= inst.operands[3].reg << 8;
9944
9945   /* rdhi and rdlo must be different.  */
9946   if (inst.operands[0].reg == inst.operands[1].reg)
9947     as_tsktsk (_("rdhi and rdlo must be different"));
9948
9949   /* rdhi, rdlo and rm must all be different before armv6.  */
9950   if ((inst.operands[0].reg == inst.operands[2].reg
9951       || inst.operands[1].reg == inst.operands[2].reg)
9952       && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
9953     as_tsktsk (_("rdhi, rdlo and rm must all be different"));
9954 }
9955
9956 static void
9957 do_nop (void)
9958 {
9959   if (inst.operands[0].present
9960       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k))
9961     {
9962       /* Architectural NOP hints are CPSR sets with no bits selected.  */
9963       inst.instruction &= 0xf0000000;
9964       inst.instruction |= 0x0320f000;
9965       if (inst.operands[0].present)
9966         inst.instruction |= inst.operands[0].imm;
9967     }
9968 }
9969
9970 /* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
9971    PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
9972    Condition defaults to COND_ALWAYS.
9973    Error if Rd, Rn or Rm are R15.  */
9974
9975 static void
9976 do_pkhbt (void)
9977 {
9978   inst.instruction |= inst.operands[0].reg << 12;
9979   inst.instruction |= inst.operands[1].reg << 16;
9980   inst.instruction |= inst.operands[2].reg;
9981   if (inst.operands[3].present)
9982     encode_arm_shift (3);
9983 }
9984
9985 /* ARM V6 PKHTB (Argument Parse).  */
9986
9987 static void
9988 do_pkhtb (void)
9989 {
9990   if (!inst.operands[3].present)
9991     {
9992       /* If the shift specifier is omitted, turn the instruction
9993          into pkhbt rd, rm, rn. */
9994       inst.instruction &= 0xfff00010;
9995       inst.instruction |= inst.operands[0].reg << 12;
9996       inst.instruction |= inst.operands[1].reg;
9997       inst.instruction |= inst.operands[2].reg << 16;
9998     }
9999   else
10000     {
10001       inst.instruction |= inst.operands[0].reg << 12;
10002       inst.instruction |= inst.operands[1].reg << 16;
10003       inst.instruction |= inst.operands[2].reg;
10004       encode_arm_shift (3);
10005     }
10006 }
10007
10008 /* ARMv5TE: Preload-Cache
10009    MP Extensions: Preload for write
10010
10011     PLD(W) <addr_mode>
10012
10013   Syntactically, like LDR with B=1, W=0, L=1.  */
10014
10015 static void
10016 do_pld (void)
10017 {
10018   constraint (!inst.operands[0].isreg,
10019               _("'[' expected after PLD mnemonic"));
10020   constraint (inst.operands[0].postind,
10021               _("post-indexed expression used in preload instruction"));
10022   constraint (inst.operands[0].writeback,
10023               _("writeback used in preload instruction"));
10024   constraint (!inst.operands[0].preind,
10025               _("unindexed addressing used in preload instruction"));
10026   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
10027 }
10028
10029 /* ARMv7: PLI <addr_mode>  */
10030 static void
10031 do_pli (void)
10032 {
10033   constraint (!inst.operands[0].isreg,
10034               _("'[' expected after PLI mnemonic"));
10035   constraint (inst.operands[0].postind,
10036               _("post-indexed expression used in preload instruction"));
10037   constraint (inst.operands[0].writeback,
10038               _("writeback used in preload instruction"));
10039   constraint (!inst.operands[0].preind,
10040               _("unindexed addressing used in preload instruction"));
10041   encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
10042   inst.instruction &= ~PRE_INDEX;
10043 }
10044
10045 static void
10046 do_push_pop (void)
10047 {
10048   constraint (inst.operands[0].writeback,
10049               _("push/pop do not support {reglist}^"));
10050   inst.operands[1] = inst.operands[0];
10051   memset (&inst.operands[0], 0, sizeof inst.operands[0]);
10052   inst.operands[0].isreg = 1;
10053   inst.operands[0].writeback = 1;
10054   inst.operands[0].reg = REG_SP;
10055   encode_ldmstm (/*from_push_pop_mnem=*/TRUE);
10056 }
10057
10058 /* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
10059    word at the specified address and the following word
10060    respectively.
10061    Unconditionally executed.
10062    Error if Rn is R15.  */
10063
10064 static void
10065 do_rfe (void)
10066 {
10067   inst.instruction |= inst.operands[0].reg << 16;
10068   if (inst.operands[0].writeback)
10069     inst.instruction |= WRITE_BACK;
10070 }
10071
10072 /* ARM V6 ssat (argument parse).  */
10073
10074 static void
10075 do_ssat (void)
10076 {
10077   inst.instruction |= inst.operands[0].reg << 12;
10078   inst.instruction |= (inst.operands[1].imm - 1) << 16;
10079   inst.instruction |= inst.operands[2].reg;
10080
10081   if (inst.operands[3].present)
10082     encode_arm_shift (3);
10083 }
10084
10085 /* ARM V6 usat (argument parse).  */
10086
10087 static void
10088 do_usat (void)
10089 {
10090   inst.instruction |= inst.operands[0].reg << 12;
10091   inst.instruction |= inst.operands[1].imm << 16;
10092   inst.instruction |= inst.operands[2].reg;
10093
10094   if (inst.operands[3].present)
10095     encode_arm_shift (3);
10096 }
10097
10098 /* ARM V6 ssat16 (argument parse).  */
10099
10100 static void
10101 do_ssat16 (void)
10102 {
10103   inst.instruction |= inst.operands[0].reg << 12;
10104   inst.instruction |= ((inst.operands[1].imm - 1) << 16);
10105   inst.instruction |= inst.operands[2].reg;
10106 }
10107
10108 static void
10109 do_usat16 (void)
10110 {
10111   inst.instruction |= inst.operands[0].reg << 12;
10112   inst.instruction |= inst.operands[1].imm << 16;
10113   inst.instruction |= inst.operands[2].reg;
10114 }
10115
10116 /* ARM V6 SETEND (argument parse).  Sets the E bit in the CPSR while
10117    preserving the other bits.
10118
10119    setend <endian_specifier>, where <endian_specifier> is either
10120    BE or LE.  */
10121
10122 static void
10123 do_setend (void)
10124 {
10125   if (warn_on_deprecated
10126       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
10127       as_tsktsk (_("setend use is deprecated for ARMv8"));
10128
10129   if (inst.operands[0].imm)
10130     inst.instruction |= 0x200;
10131 }
10132
10133 static void
10134 do_shift (void)
10135 {
10136   unsigned int Rm = (inst.operands[1].present
10137                      ? inst.operands[1].reg
10138                      : inst.operands[0].reg);
10139
10140   inst.instruction |= inst.operands[0].reg << 12;
10141   inst.instruction |= Rm;
10142   if (inst.operands[2].isreg)  /* Rd, {Rm,} Rs */
10143     {
10144       inst.instruction |= inst.operands[2].reg << 8;
10145       inst.instruction |= SHIFT_BY_REG;
10146       /* PR 12854: Error on extraneous shifts.  */
10147       constraint (inst.operands[2].shifted,
10148                   _("extraneous shift as part of operand to shift insn"));
10149     }
10150   else
10151     inst.relocs[0].type = BFD_RELOC_ARM_SHIFT_IMM;
10152 }
10153
10154 static void
10155 do_smc (void)
10156 {
10157   inst.relocs[0].type = BFD_RELOC_ARM_SMC;
10158   inst.relocs[0].pc_rel = 0;
10159 }
10160
10161 static void
10162 do_hvc (void)
10163 {
10164   inst.relocs[0].type = BFD_RELOC_ARM_HVC;
10165   inst.relocs[0].pc_rel = 0;
10166 }
10167
10168 static void
10169 do_swi (void)
10170 {
10171   inst.relocs[0].type = BFD_RELOC_ARM_SWI;
10172   inst.relocs[0].pc_rel = 0;
10173 }
10174
10175 static void
10176 do_setpan (void)
10177 {
10178   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_pan),
10179               _("selected processor does not support SETPAN instruction"));
10180
10181   inst.instruction |= ((inst.operands[0].imm & 1) << 9);
10182 }
10183
10184 static void
10185 do_t_setpan (void)
10186 {
10187   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_pan),
10188               _("selected processor does not support SETPAN instruction"));
10189
10190   inst.instruction |= (inst.operands[0].imm << 3);
10191 }
10192
10193 /* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
10194    SMLAxy{cond} Rd,Rm,Rs,Rn
10195    SMLAWy{cond} Rd,Rm,Rs,Rn
10196    Error if any register is R15.  */
10197
10198 static void
10199 do_smla (void)
10200 {
10201   inst.instruction |= inst.operands[0].reg << 16;
10202   inst.instruction |= inst.operands[1].reg;
10203   inst.instruction |= inst.operands[2].reg << 8;
10204   inst.instruction |= inst.operands[3].reg << 12;
10205 }
10206
10207 /* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
10208    SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
10209    Error if any register is R15.
10210    Warning if Rdlo == Rdhi.  */
10211
10212 static void
10213 do_smlal (void)
10214 {
10215   inst.instruction |= inst.operands[0].reg << 12;
10216   inst.instruction |= inst.operands[1].reg << 16;
10217   inst.instruction |= inst.operands[2].reg;
10218   inst.instruction |= inst.operands[3].reg << 8;
10219
10220   if (inst.operands[0].reg == inst.operands[1].reg)
10221     as_tsktsk (_("rdhi and rdlo must be different"));
10222 }
10223
10224 /* ARM V5E (El Segundo) signed-multiply (argument parse)
10225    SMULxy{cond} Rd,Rm,Rs
10226    Error if any register is R15.  */
10227
10228 static void
10229 do_smul (void)
10230 {
10231   inst.instruction |= inst.operands[0].reg << 16;
10232   inst.instruction |= inst.operands[1].reg;
10233   inst.instruction |= inst.operands[2].reg << 8;
10234 }
10235
10236 /* ARM V6 srs (argument parse).  The variable fields in the encoding are
10237    the same for both ARM and Thumb-2.  */
10238
10239 static void
10240 do_srs (void)
10241 {
10242   int reg;
10243
10244   if (inst.operands[0].present)
10245     {
10246       reg = inst.operands[0].reg;
10247       constraint (reg != REG_SP, _("SRS base register must be r13"));
10248     }
10249   else
10250     reg = REG_SP;
10251
10252   inst.instruction |= reg << 16;
10253   inst.instruction |= inst.operands[1].imm;
10254   if (inst.operands[0].writeback || inst.operands[1].writeback)
10255     inst.instruction |= WRITE_BACK;
10256 }
10257
10258 /* ARM V6 strex (argument parse).  */
10259
10260 static void
10261 do_strex (void)
10262 {
10263   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
10264               || inst.operands[2].postind || inst.operands[2].writeback
10265               || inst.operands[2].immisreg || inst.operands[2].shifted
10266               || inst.operands[2].negative
10267               /* See comment in do_ldrex().  */
10268               || (inst.operands[2].reg == REG_PC),
10269               BAD_ADDR_MODE);
10270
10271   constraint (inst.operands[0].reg == inst.operands[1].reg
10272               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
10273
10274   constraint (inst.relocs[0].exp.X_op != O_constant
10275               || inst.relocs[0].exp.X_add_number != 0,
10276               _("offset must be zero in ARM encoding"));
10277
10278   inst.instruction |= inst.operands[0].reg << 12;
10279   inst.instruction |= inst.operands[1].reg;
10280   inst.instruction |= inst.operands[2].reg << 16;
10281   inst.relocs[0].type = BFD_RELOC_UNUSED;
10282 }
10283
10284 static void
10285 do_t_strexbh (void)
10286 {
10287   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
10288               || inst.operands[2].postind || inst.operands[2].writeback
10289               || inst.operands[2].immisreg || inst.operands[2].shifted
10290               || inst.operands[2].negative,
10291               BAD_ADDR_MODE);
10292
10293   constraint (inst.operands[0].reg == inst.operands[1].reg
10294               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
10295
10296   do_rm_rd_rn ();
10297 }
10298
10299 static void
10300 do_strexd (void)
10301 {
10302   constraint (inst.operands[1].reg % 2 != 0,
10303               _("even register required"));
10304   constraint (inst.operands[2].present
10305               && inst.operands[2].reg != inst.operands[1].reg + 1,
10306               _("can only store two consecutive registers"));
10307   /* If op 2 were present and equal to PC, this function wouldn't
10308      have been called in the first place.  */
10309   constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
10310
10311   constraint (inst.operands[0].reg == inst.operands[1].reg
10312               || inst.operands[0].reg == inst.operands[1].reg + 1
10313               || inst.operands[0].reg == inst.operands[3].reg,
10314               BAD_OVERLAP);
10315
10316   inst.instruction |= inst.operands[0].reg << 12;
10317   inst.instruction |= inst.operands[1].reg;
10318   inst.instruction |= inst.operands[3].reg << 16;
10319 }
10320
10321 /* ARM V8 STRL.  */
10322 static void
10323 do_stlex (void)
10324 {
10325   constraint (inst.operands[0].reg == inst.operands[1].reg
10326               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
10327
10328   do_rd_rm_rn ();
10329 }
10330
10331 static void
10332 do_t_stlex (void)
10333 {
10334   constraint (inst.operands[0].reg == inst.operands[1].reg
10335               || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
10336
10337   do_rm_rd_rn ();
10338 }
10339
10340 /* ARM V6 SXTAH extracts a 16-bit value from a register, sign
10341    extends it to 32-bits, and adds the result to a value in another
10342    register.  You can specify a rotation by 0, 8, 16, or 24 bits
10343    before extracting the 16-bit value.
10344    SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
10345    Condition defaults to COND_ALWAYS.
10346    Error if any register uses R15.  */
10347
10348 static void
10349 do_sxtah (void)
10350 {
10351   inst.instruction |= inst.operands[0].reg << 12;
10352   inst.instruction |= inst.operands[1].reg << 16;
10353   inst.instruction |= inst.operands[2].reg;
10354   inst.instruction |= inst.operands[3].imm << 10;
10355 }
10356
10357 /* ARM V6 SXTH.
10358
10359    SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
10360    Condition defaults to COND_ALWAYS.
10361    Error if any register uses R15.  */
10362
10363 static void
10364 do_sxth (void)
10365 {
10366   inst.instruction |= inst.operands[0].reg << 12;
10367   inst.instruction |= inst.operands[1].reg;
10368   inst.instruction |= inst.operands[2].imm << 10;
10369 }
10370 \f
10371 /* VFP instructions.  In a logical order: SP variant first, monad
10372    before dyad, arithmetic then move then load/store.  */
10373
10374 static void
10375 do_vfp_sp_monadic (void)
10376 {
10377   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1xd)
10378               && !ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext),
10379               _(BAD_FPU));
10380
10381   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
10382   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
10383 }
10384
10385 static void
10386 do_vfp_sp_dyadic (void)
10387 {
10388   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
10389   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
10390   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
10391 }
10392
10393 static void
10394 do_vfp_sp_compare_z (void)
10395 {
10396   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
10397 }
10398
10399 static void
10400 do_vfp_dp_sp_cvt (void)
10401 {
10402   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
10403   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
10404 }
10405
10406 static void
10407 do_vfp_sp_dp_cvt (void)
10408 {
10409   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
10410   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
10411 }
10412
10413 static void
10414 do_vfp_reg_from_sp (void)
10415 {
10416   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1xd)
10417              && !ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext),
10418              _(BAD_FPU));
10419
10420   inst.instruction |= inst.operands[0].reg << 12;
10421   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
10422 }
10423
10424 static void
10425 do_vfp_reg2_from_sp2 (void)
10426 {
10427   constraint (inst.operands[2].imm != 2,
10428               _("only two consecutive VFP SP registers allowed here"));
10429   inst.instruction |= inst.operands[0].reg << 12;
10430   inst.instruction |= inst.operands[1].reg << 16;
10431   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
10432 }
10433
10434 static void
10435 do_vfp_sp_from_reg (void)
10436 {
10437   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1xd)
10438              && !ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext),
10439              _(BAD_FPU));
10440
10441   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
10442   inst.instruction |= inst.operands[1].reg << 12;
10443 }
10444
10445 static void
10446 do_vfp_sp2_from_reg2 (void)
10447 {
10448   constraint (inst.operands[0].imm != 2,
10449               _("only two consecutive VFP SP registers allowed here"));
10450   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
10451   inst.instruction |= inst.operands[1].reg << 12;
10452   inst.instruction |= inst.operands[2].reg << 16;
10453 }
10454
10455 static void
10456 do_vfp_sp_ldst (void)
10457 {
10458   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
10459   encode_arm_cp_address (1, FALSE, TRUE, 0);
10460 }
10461
10462 static void
10463 do_vfp_dp_ldst (void)
10464 {
10465   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
10466   encode_arm_cp_address (1, FALSE, TRUE, 0);
10467 }
10468
10469
10470 static void
10471 vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
10472 {
10473   if (inst.operands[0].writeback)
10474     inst.instruction |= WRITE_BACK;
10475   else
10476     constraint (ldstm_type != VFP_LDSTMIA,
10477                 _("this addressing mode requires base-register writeback"));
10478   inst.instruction |= inst.operands[0].reg << 16;
10479   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
10480   inst.instruction |= inst.operands[1].imm;
10481 }
10482
10483 static void
10484 vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
10485 {
10486   int count;
10487
10488   if (inst.operands[0].writeback)
10489     inst.instruction |= WRITE_BACK;
10490   else
10491     constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
10492                 _("this addressing mode requires base-register writeback"));
10493
10494   inst.instruction |= inst.operands[0].reg << 16;
10495   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
10496
10497   count = inst.operands[1].imm << 1;
10498   if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
10499     count += 1;
10500
10501   inst.instruction |= count;
10502 }
10503
10504 static void
10505 do_vfp_sp_ldstmia (void)
10506 {
10507   vfp_sp_ldstm (VFP_LDSTMIA);
10508 }
10509
10510 static void
10511 do_vfp_sp_ldstmdb (void)
10512 {
10513   vfp_sp_ldstm (VFP_LDSTMDB);
10514 }
10515
10516 static void
10517 do_vfp_dp_ldstmia (void)
10518 {
10519   vfp_dp_ldstm (VFP_LDSTMIA);
10520 }
10521
10522 static void
10523 do_vfp_dp_ldstmdb (void)
10524 {
10525   vfp_dp_ldstm (VFP_LDSTMDB);
10526 }
10527
10528 static void
10529 do_vfp_xp_ldstmia (void)
10530 {
10531   vfp_dp_ldstm (VFP_LDSTMIAX);
10532 }
10533
10534 static void
10535 do_vfp_xp_ldstmdb (void)
10536 {
10537   vfp_dp_ldstm (VFP_LDSTMDBX);
10538 }
10539
10540 static void
10541 do_vfp_dp_rd_rm (void)
10542 {
10543   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1)
10544               && !ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext),
10545               _(BAD_FPU));
10546
10547   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
10548   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
10549 }
10550
10551 static void
10552 do_vfp_dp_rn_rd (void)
10553 {
10554   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
10555   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
10556 }
10557
10558 static void
10559 do_vfp_dp_rd_rn (void)
10560 {
10561   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
10562   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
10563 }
10564
10565 static void
10566 do_vfp_dp_rd_rn_rm (void)
10567 {
10568   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2)
10569               && !ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext),
10570               _(BAD_FPU));
10571
10572   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
10573   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
10574   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
10575 }
10576
10577 static void
10578 do_vfp_dp_rd (void)
10579 {
10580   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
10581 }
10582
10583 static void
10584 do_vfp_dp_rm_rd_rn (void)
10585 {
10586   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2)
10587               && !ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext),
10588               _(BAD_FPU));
10589
10590   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
10591   encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
10592   encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
10593 }
10594
10595 /* VFPv3 instructions.  */
10596 static void
10597 do_vfp_sp_const (void)
10598 {
10599   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
10600   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
10601   inst.instruction |= (inst.operands[1].imm & 0x0f);
10602 }
10603
10604 static void
10605 do_vfp_dp_const (void)
10606 {
10607   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
10608   inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
10609   inst.instruction |= (inst.operands[1].imm & 0x0f);
10610 }
10611
10612 static void
10613 vfp_conv (int srcsize)
10614 {
10615   int immbits = srcsize - inst.operands[1].imm;
10616
10617   if (srcsize == 16 && !(immbits >= 0 && immbits <= srcsize))
10618     {
10619       /* If srcsize is 16, inst.operands[1].imm must be in the range 0-16.
10620          i.e. immbits must be in range 0 - 16.  */
10621       inst.error = _("immediate value out of range, expected range [0, 16]");
10622       return;
10623     }
10624   else if (srcsize == 32 && !(immbits >= 0 && immbits < srcsize))
10625     {
10626       /* If srcsize is 32, inst.operands[1].imm must be in the range 1-32.
10627          i.e. immbits must be in range 0 - 31.  */
10628       inst.error = _("immediate value out of range, expected range [1, 32]");
10629       return;
10630     }
10631
10632   inst.instruction |= (immbits & 1) << 5;
10633   inst.instruction |= (immbits >> 1);
10634 }
10635
10636 static void
10637 do_vfp_sp_conv_16 (void)
10638 {
10639   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
10640   vfp_conv (16);
10641 }
10642
10643 static void
10644 do_vfp_dp_conv_16 (void)
10645 {
10646   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
10647   vfp_conv (16);
10648 }
10649
10650 static void
10651 do_vfp_sp_conv_32 (void)
10652 {
10653   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
10654   vfp_conv (32);
10655 }
10656
10657 static void
10658 do_vfp_dp_conv_32 (void)
10659 {
10660   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
10661   vfp_conv (32);
10662 }
10663 \f
10664 /* FPA instructions.  Also in a logical order.  */
10665
10666 static void
10667 do_fpa_cmp (void)
10668 {
10669   inst.instruction |= inst.operands[0].reg << 16;
10670   inst.instruction |= inst.operands[1].reg;
10671 }
10672
10673 static void
10674 do_fpa_ldmstm (void)
10675 {
10676   inst.instruction |= inst.operands[0].reg << 12;
10677   switch (inst.operands[1].imm)
10678     {
10679     case 1: inst.instruction |= CP_T_X;          break;
10680     case 2: inst.instruction |= CP_T_Y;          break;
10681     case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
10682     case 4:                                      break;
10683     default: abort ();
10684     }
10685
10686   if (inst.instruction & (PRE_INDEX | INDEX_UP))
10687     {
10688       /* The instruction specified "ea" or "fd", so we can only accept
10689          [Rn]{!}.  The instruction does not really support stacking or
10690          unstacking, so we have to emulate these by setting appropriate
10691          bits and offsets.  */
10692       constraint (inst.relocs[0].exp.X_op != O_constant
10693                   || inst.relocs[0].exp.X_add_number != 0,
10694                   _("this instruction does not support indexing"));
10695
10696       if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
10697         inst.relocs[0].exp.X_add_number = 12 * inst.operands[1].imm;
10698
10699       if (!(inst.instruction & INDEX_UP))
10700         inst.relocs[0].exp.X_add_number = -inst.relocs[0].exp.X_add_number;
10701
10702       if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
10703         {
10704           inst.operands[2].preind = 0;
10705           inst.operands[2].postind = 1;
10706         }
10707     }
10708
10709   encode_arm_cp_address (2, TRUE, TRUE, 0);
10710 }
10711 \f
10712 /* iWMMXt instructions: strictly in alphabetical order.  */
10713
10714 static void
10715 do_iwmmxt_tandorc (void)
10716 {
10717   constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
10718 }
10719
10720 static void
10721 do_iwmmxt_textrc (void)
10722 {
10723   inst.instruction |= inst.operands[0].reg << 12;
10724   inst.instruction |= inst.operands[1].imm;
10725 }
10726
10727 static void
10728 do_iwmmxt_textrm (void)
10729 {
10730   inst.instruction |= inst.operands[0].reg << 12;
10731   inst.instruction |= inst.operands[1].reg << 16;
10732   inst.instruction |= inst.operands[2].imm;
10733 }
10734
10735 static void
10736 do_iwmmxt_tinsr (void)
10737 {
10738   inst.instruction |= inst.operands[0].reg << 16;
10739   inst.instruction |= inst.operands[1].reg << 12;
10740   inst.instruction |= inst.operands[2].imm;
10741 }
10742
10743 static void
10744 do_iwmmxt_tmia (void)
10745 {
10746   inst.instruction |= inst.operands[0].reg << 5;
10747   inst.instruction |= inst.operands[1].reg;
10748   inst.instruction |= inst.operands[2].reg << 12;
10749 }
10750
10751 static void
10752 do_iwmmxt_waligni (void)
10753 {
10754   inst.instruction |= inst.operands[0].reg << 12;
10755   inst.instruction |= inst.operands[1].reg << 16;
10756   inst.instruction |= inst.operands[2].reg;
10757   inst.instruction |= inst.operands[3].imm << 20;
10758 }
10759
10760 static void
10761 do_iwmmxt_wmerge (void)
10762 {
10763   inst.instruction |= inst.operands[0].reg << 12;
10764   inst.instruction |= inst.operands[1].reg << 16;
10765   inst.instruction |= inst.operands[2].reg;
10766   inst.instruction |= inst.operands[3].imm << 21;
10767 }
10768
10769 static void
10770 do_iwmmxt_wmov (void)
10771 {
10772   /* WMOV rD, rN is an alias for WOR rD, rN, rN.  */
10773   inst.instruction |= inst.operands[0].reg << 12;
10774   inst.instruction |= inst.operands[1].reg << 16;
10775   inst.instruction |= inst.operands[1].reg;
10776 }
10777
10778 static void
10779 do_iwmmxt_wldstbh (void)
10780 {
10781   int reloc;
10782   inst.instruction |= inst.operands[0].reg << 12;
10783   if (thumb_mode)
10784     reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
10785   else
10786     reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
10787   encode_arm_cp_address (1, TRUE, FALSE, reloc);
10788 }
10789
10790 static void
10791 do_iwmmxt_wldstw (void)
10792 {
10793   /* RIWR_RIWC clears .isreg for a control register.  */
10794   if (!inst.operands[0].isreg)
10795     {
10796       constraint (inst.cond != COND_ALWAYS, BAD_COND);
10797       inst.instruction |= 0xf0000000;
10798     }
10799
10800   inst.instruction |= inst.operands[0].reg << 12;
10801   encode_arm_cp_address (1, TRUE, TRUE, 0);
10802 }
10803
10804 static void
10805 do_iwmmxt_wldstd (void)
10806 {
10807   inst.instruction |= inst.operands[0].reg << 12;
10808   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
10809       && inst.operands[1].immisreg)
10810     {
10811       inst.instruction &= ~0x1a000ff;
10812       inst.instruction |= (0xfU << 28);
10813       if (inst.operands[1].preind)
10814         inst.instruction |= PRE_INDEX;
10815       if (!inst.operands[1].negative)
10816         inst.instruction |= INDEX_UP;
10817       if (inst.operands[1].writeback)
10818         inst.instruction |= WRITE_BACK;
10819       inst.instruction |= inst.operands[1].reg << 16;
10820       inst.instruction |= inst.relocs[0].exp.X_add_number << 4;
10821       inst.instruction |= inst.operands[1].imm;
10822     }
10823   else
10824     encode_arm_cp_address (1, TRUE, FALSE, 0);
10825 }
10826
10827 static void
10828 do_iwmmxt_wshufh (void)
10829 {
10830   inst.instruction |= inst.operands[0].reg << 12;
10831   inst.instruction |= inst.operands[1].reg << 16;
10832   inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
10833   inst.instruction |= (inst.operands[2].imm & 0x0f);
10834 }
10835
10836 static void
10837 do_iwmmxt_wzero (void)
10838 {
10839   /* WZERO reg is an alias for WANDN reg, reg, reg.  */
10840   inst.instruction |= inst.operands[0].reg;
10841   inst.instruction |= inst.operands[0].reg << 12;
10842   inst.instruction |= inst.operands[0].reg << 16;
10843 }
10844
10845 static void
10846 do_iwmmxt_wrwrwr_or_imm5 (void)
10847 {
10848   if (inst.operands[2].isreg)
10849     do_rd_rn_rm ();
10850   else {
10851     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
10852                 _("immediate operand requires iWMMXt2"));
10853     do_rd_rn ();
10854     if (inst.operands[2].imm == 0)
10855       {
10856         switch ((inst.instruction >> 20) & 0xf)
10857           {
10858           case 4:
10859           case 5:
10860           case 6:
10861           case 7:
10862             /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16.  */
10863             inst.operands[2].imm = 16;
10864             inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
10865             break;
10866           case 8:
10867           case 9:
10868           case 10:
10869           case 11:
10870             /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32.  */
10871             inst.operands[2].imm = 32;
10872             inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
10873             break;
10874           case 12:
10875           case 13:
10876           case 14:
10877           case 15:
10878             {
10879               /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn.  */
10880               unsigned long wrn;
10881               wrn = (inst.instruction >> 16) & 0xf;
10882               inst.instruction &= 0xff0fff0f;
10883               inst.instruction |= wrn;
10884               /* Bail out here; the instruction is now assembled.  */
10885               return;
10886             }
10887           }
10888       }
10889     /* Map 32 -> 0, etc.  */
10890     inst.operands[2].imm &= 0x1f;
10891     inst.instruction |= (0xfU << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
10892   }
10893 }
10894 \f
10895 /* Cirrus Maverick instructions.  Simple 2-, 3-, and 4-register
10896    operations first, then control, shift, and load/store.  */
10897
10898 /* Insns like "foo X,Y,Z".  */
10899
10900 static void
10901 do_mav_triple (void)
10902 {
10903   inst.instruction |= inst.operands[0].reg << 16;
10904   inst.instruction |= inst.operands[1].reg;
10905   inst.instruction |= inst.operands[2].reg << 12;
10906 }
10907
10908 /* Insns like "foo W,X,Y,Z".
10909     where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
10910
10911 static void
10912 do_mav_quad (void)
10913 {
10914   inst.instruction |= inst.operands[0].reg << 5;
10915   inst.instruction |= inst.operands[1].reg << 12;
10916   inst.instruction |= inst.operands[2].reg << 16;
10917   inst.instruction |= inst.operands[3].reg;
10918 }
10919
10920 /* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
10921 static void
10922 do_mav_dspsc (void)
10923 {
10924   inst.instruction |= inst.operands[1].reg << 12;
10925 }
10926
10927 /* Maverick shift immediate instructions.
10928    cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
10929    cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0].  */
10930
10931 static void
10932 do_mav_shift (void)
10933 {
10934   int imm = inst.operands[2].imm;
10935
10936   inst.instruction |= inst.operands[0].reg << 12;
10937   inst.instruction |= inst.operands[1].reg << 16;
10938
10939   /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
10940      Bits 5-7 of the insn should have bits 4-6 of the immediate.
10941      Bit 4 should be 0.  */
10942   imm = (imm & 0xf) | ((imm & 0x70) << 1);
10943
10944   inst.instruction |= imm;
10945 }
10946 \f
10947 /* XScale instructions.  Also sorted arithmetic before move.  */
10948
10949 /* Xscale multiply-accumulate (argument parse)
10950      MIAcc   acc0,Rm,Rs
10951      MIAPHcc acc0,Rm,Rs
10952      MIAxycc acc0,Rm,Rs.  */
10953
10954 static void
10955 do_xsc_mia (void)
10956 {
10957   inst.instruction |= inst.operands[1].reg;
10958   inst.instruction |= inst.operands[2].reg << 12;
10959 }
10960
10961 /* Xscale move-accumulator-register (argument parse)
10962
10963      MARcc   acc0,RdLo,RdHi.  */
10964
10965 static void
10966 do_xsc_mar (void)
10967 {
10968   inst.instruction |= inst.operands[1].reg << 12;
10969   inst.instruction |= inst.operands[2].reg << 16;
10970 }
10971
10972 /* Xscale move-register-accumulator (argument parse)
10973
10974      MRAcc   RdLo,RdHi,acc0.  */
10975
10976 static void
10977 do_xsc_mra (void)
10978 {
10979   constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
10980   inst.instruction |= inst.operands[0].reg << 12;
10981   inst.instruction |= inst.operands[1].reg << 16;
10982 }
10983 \f
10984 /* Encoding functions relevant only to Thumb.  */
10985
10986 /* inst.operands[i] is a shifted-register operand; encode
10987    it into inst.instruction in the format used by Thumb32.  */
10988
10989 static void
10990 encode_thumb32_shifted_operand (int i)
10991 {
10992   unsigned int value = inst.relocs[0].exp.X_add_number;
10993   unsigned int shift = inst.operands[i].shift_kind;
10994
10995   constraint (inst.operands[i].immisreg,
10996               _("shift by register not allowed in thumb mode"));
10997   inst.instruction |= inst.operands[i].reg;
10998   if (shift == SHIFT_RRX)
10999     inst.instruction |= SHIFT_ROR << 4;
11000   else
11001     {
11002       constraint (inst.relocs[0].exp.X_op != O_constant,
11003                   _("expression too complex"));
11004
11005       constraint (value > 32
11006                   || (value == 32 && (shift == SHIFT_LSL
11007                                       || shift == SHIFT_ROR)),
11008                   _("shift expression is too large"));
11009
11010       if (value == 0)
11011         shift = SHIFT_LSL;
11012       else if (value == 32)
11013         value = 0;
11014
11015       inst.instruction |= shift << 4;
11016       inst.instruction |= (value & 0x1c) << 10;
11017       inst.instruction |= (value & 0x03) << 6;
11018     }
11019 }
11020
11021
11022 /* inst.operands[i] was set up by parse_address.  Encode it into a
11023    Thumb32 format load or store instruction.  Reject forms that cannot
11024    be used with such instructions.  If is_t is true, reject forms that
11025    cannot be used with a T instruction; if is_d is true, reject forms
11026    that cannot be used with a D instruction.  If it is a store insn,
11027    reject PC in Rn.  */
11028
11029 static void
11030 encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
11031 {
11032   const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
11033
11034   constraint (!inst.operands[i].isreg,
11035               _("Instruction does not support =N addresses"));
11036
11037   inst.instruction |= inst.operands[i].reg << 16;
11038   if (inst.operands[i].immisreg)
11039     {
11040       constraint (is_pc, BAD_PC_ADDRESSING);
11041       constraint (is_t || is_d, _("cannot use register index with this instruction"));
11042       constraint (inst.operands[i].negative,
11043                   _("Thumb does not support negative register indexing"));
11044       constraint (inst.operands[i].postind,
11045                   _("Thumb does not support register post-indexing"));
11046       constraint (inst.operands[i].writeback,
11047                   _("Thumb does not support register indexing with writeback"));
11048       constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
11049                   _("Thumb supports only LSL in shifted register indexing"));
11050
11051       inst.instruction |= inst.operands[i].imm;
11052       if (inst.operands[i].shifted)
11053         {
11054           constraint (inst.relocs[0].exp.X_op != O_constant,
11055                       _("expression too complex"));
11056           constraint (inst.relocs[0].exp.X_add_number < 0
11057                       || inst.relocs[0].exp.X_add_number > 3,
11058                       _("shift out of range"));
11059           inst.instruction |= inst.relocs[0].exp.X_add_number << 4;
11060         }
11061       inst.relocs[0].type = BFD_RELOC_UNUSED;
11062     }
11063   else if (inst.operands[i].preind)
11064     {
11065       constraint (is_pc && inst.operands[i].writeback, BAD_PC_WRITEBACK);
11066       constraint (is_t && inst.operands[i].writeback,
11067                   _("cannot use writeback with this instruction"));
11068       constraint (is_pc && ((inst.instruction & THUMB2_LOAD_BIT) == 0),
11069                   BAD_PC_ADDRESSING);
11070
11071       if (is_d)
11072         {
11073           inst.instruction |= 0x01000000;
11074           if (inst.operands[i].writeback)
11075             inst.instruction |= 0x00200000;
11076         }
11077       else
11078         {
11079           inst.instruction |= 0x00000c00;
11080           if (inst.operands[i].writeback)
11081             inst.instruction |= 0x00000100;
11082         }
11083       inst.relocs[0].type = BFD_RELOC_ARM_T32_OFFSET_IMM;
11084     }
11085   else if (inst.operands[i].postind)
11086     {
11087       gas_assert (inst.operands[i].writeback);
11088       constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
11089       constraint (is_t, _("cannot use post-indexing with this instruction"));
11090
11091       if (is_d)
11092         inst.instruction |= 0x00200000;
11093       else
11094         inst.instruction |= 0x00000900;
11095       inst.relocs[0].type = BFD_RELOC_ARM_T32_OFFSET_IMM;
11096     }
11097   else /* unindexed - only for coprocessor */
11098     inst.error = _("instruction does not accept unindexed addressing");
11099 }
11100
11101 /* Table of Thumb instructions which exist in both 16- and 32-bit
11102    encodings (the latter only in post-V6T2 cores).  The index is the
11103    value used in the insns table below.  When there is more than one
11104    possible 16-bit encoding for the instruction, this table always
11105    holds variant (1).
11106    Also contains several pseudo-instructions used during relaxation.  */
11107 #define T16_32_TAB                              \
11108   X(_adc,   4140, eb400000),                    \
11109   X(_adcs,  4140, eb500000),                    \
11110   X(_add,   1c00, eb000000),                    \
11111   X(_adds,  1c00, eb100000),                    \
11112   X(_addi,  0000, f1000000),                    \
11113   X(_addis, 0000, f1100000),                    \
11114   X(_add_pc,000f, f20f0000),                    \
11115   X(_add_sp,000d, f10d0000),                    \
11116   X(_adr,   000f, f20f0000),                    \
11117   X(_and,   4000, ea000000),                    \
11118   X(_ands,  4000, ea100000),                    \
11119   X(_asr,   1000, fa40f000),                    \
11120   X(_asrs,  1000, fa50f000),                    \
11121   X(_b,     e000, f000b000),                    \
11122   X(_bcond, d000, f0008000),                    \
11123   X(_bf,    0000, f040e001),                    \
11124   X(_bfcsel,0000, f000e001),                    \
11125   X(_bfx,   0000, f060e001),                    \
11126   X(_bfl,   0000, f000c001),                    \
11127   X(_bflx,  0000, f070e001),                    \
11128   X(_bic,   4380, ea200000),                    \
11129   X(_bics,  4380, ea300000),                    \
11130   X(_cmn,   42c0, eb100f00),                    \
11131   X(_cmp,   2800, ebb00f00),                    \
11132   X(_cpsie, b660, f3af8400),                    \
11133   X(_cpsid, b670, f3af8600),                    \
11134   X(_cpy,   4600, ea4f0000),                    \
11135   X(_dec_sp,80dd, f1ad0d00),                    \
11136   X(_dls,   0000, f040e001),                    \
11137   X(_eor,   4040, ea800000),                    \
11138   X(_eors,  4040, ea900000),                    \
11139   X(_inc_sp,00dd, f10d0d00),                    \
11140   X(_ldmia, c800, e8900000),                    \
11141   X(_ldr,   6800, f8500000),                    \
11142   X(_ldrb,  7800, f8100000),                    \
11143   X(_ldrh,  8800, f8300000),                    \
11144   X(_ldrsb, 5600, f9100000),                    \
11145   X(_ldrsh, 5e00, f9300000),                    \
11146   X(_ldr_pc,4800, f85f0000),                    \
11147   X(_ldr_pc2,4800, f85f0000),                   \
11148   X(_ldr_sp,9800, f85d0000),                    \
11149   X(_le,    0000, f00fc001),                    \
11150   X(_lsl,   0000, fa00f000),                    \
11151   X(_lsls,  0000, fa10f000),                    \
11152   X(_lsr,   0800, fa20f000),                    \
11153   X(_lsrs,  0800, fa30f000),                    \
11154   X(_mov,   2000, ea4f0000),                    \
11155   X(_movs,  2000, ea5f0000),                    \
11156   X(_mul,   4340, fb00f000),                     \
11157   X(_muls,  4340, ffffffff), /* no 32b muls */  \
11158   X(_mvn,   43c0, ea6f0000),                    \
11159   X(_mvns,  43c0, ea7f0000),                    \
11160   X(_neg,   4240, f1c00000), /* rsb #0 */       \
11161   X(_negs,  4240, f1d00000), /* rsbs #0 */      \
11162   X(_orr,   4300, ea400000),                    \
11163   X(_orrs,  4300, ea500000),                    \
11164   X(_pop,   bc00, e8bd0000), /* ldmia sp!,... */        \
11165   X(_push,  b400, e92d0000), /* stmdb sp!,... */        \
11166   X(_rev,   ba00, fa90f080),                    \
11167   X(_rev16, ba40, fa90f090),                    \
11168   X(_revsh, bac0, fa90f0b0),                    \
11169   X(_ror,   41c0, fa60f000),                    \
11170   X(_rors,  41c0, fa70f000),                    \
11171   X(_sbc,   4180, eb600000),                    \
11172   X(_sbcs,  4180, eb700000),                    \
11173   X(_stmia, c000, e8800000),                    \
11174   X(_str,   6000, f8400000),                    \
11175   X(_strb,  7000, f8000000),                    \
11176   X(_strh,  8000, f8200000),                    \
11177   X(_str_sp,9000, f84d0000),                    \
11178   X(_sub,   1e00, eba00000),                    \
11179   X(_subs,  1e00, ebb00000),                    \
11180   X(_subi,  8000, f1a00000),                    \
11181   X(_subis, 8000, f1b00000),                    \
11182   X(_sxtb,  b240, fa4ff080),                    \
11183   X(_sxth,  b200, fa0ff080),                    \
11184   X(_tst,   4200, ea100f00),                    \
11185   X(_uxtb,  b2c0, fa5ff080),                    \
11186   X(_uxth,  b280, fa1ff080),                    \
11187   X(_nop,   bf00, f3af8000),                    \
11188   X(_yield, bf10, f3af8001),                    \
11189   X(_wfe,   bf20, f3af8002),                    \
11190   X(_wfi,   bf30, f3af8003),                    \
11191   X(_wls,   0000, f040c001),                    \
11192   X(_sev,   bf40, f3af8004),                    \
11193   X(_sevl,  bf50, f3af8005),                    \
11194   X(_udf,   de00, f7f0a000)
11195
11196 /* To catch errors in encoding functions, the codes are all offset by
11197    0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
11198    as 16-bit instructions.  */
11199 #define X(a,b,c) T_MNEM##a
11200 enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
11201 #undef X
11202
11203 #define X(a,b,c) 0x##b
11204 static const unsigned short thumb_op16[] = { T16_32_TAB };
11205 #define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
11206 #undef X
11207
11208 #define X(a,b,c) 0x##c
11209 static const unsigned int thumb_op32[] = { T16_32_TAB };
11210 #define THUMB_OP32(n)        (thumb_op32[(n) - (T16_32_OFFSET + 1)])
11211 #define THUMB_SETS_FLAGS(n)  (THUMB_OP32 (n) & 0x00100000)
11212 #undef X
11213 #undef T16_32_TAB
11214
11215 /* Thumb instruction encoders, in alphabetical order.  */
11216
11217 /* ADDW or SUBW.  */
11218
11219 static void
11220 do_t_add_sub_w (void)
11221 {
11222   int Rd, Rn;
11223
11224   Rd = inst.operands[0].reg;
11225   Rn = inst.operands[1].reg;
11226
11227   /* If Rn is REG_PC, this is ADR; if Rn is REG_SP, then this
11228      is the SP-{plus,minus}-immediate form of the instruction.  */
11229   if (Rn == REG_SP)
11230     constraint (Rd == REG_PC, BAD_PC);
11231   else
11232     reject_bad_reg (Rd);
11233
11234   inst.instruction |= (Rn << 16) | (Rd << 8);
11235   inst.relocs[0].type = BFD_RELOC_ARM_T32_IMM12;
11236 }
11237
11238 /* Parse an add or subtract instruction.  We get here with inst.instruction
11239    equaling any of THUMB_OPCODE_add, adds, sub, or subs.  */
11240
11241 static void
11242 do_t_add_sub (void)
11243 {
11244   int Rd, Rs, Rn;
11245
11246   Rd = inst.operands[0].reg;
11247   Rs = (inst.operands[1].present
11248         ? inst.operands[1].reg    /* Rd, Rs, foo */
11249         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
11250
11251   if (Rd == REG_PC)
11252     set_pred_insn_type_last ();
11253
11254   if (unified_syntax)
11255     {
11256       bfd_boolean flags;
11257       bfd_boolean narrow;
11258       int opcode;
11259
11260       flags = (inst.instruction == T_MNEM_adds
11261                || inst.instruction == T_MNEM_subs);
11262       if (flags)
11263         narrow = !in_pred_block ();
11264       else
11265         narrow = in_pred_block ();
11266       if (!inst.operands[2].isreg)
11267         {
11268           int add;
11269
11270           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
11271             constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
11272
11273           add = (inst.instruction == T_MNEM_add
11274                  || inst.instruction == T_MNEM_adds);
11275           opcode = 0;
11276           if (inst.size_req != 4)
11277             {
11278               /* Attempt to use a narrow opcode, with relaxation if
11279                  appropriate.  */
11280               if (Rd == REG_SP && Rs == REG_SP && !flags)
11281                 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
11282               else if (Rd <= 7 && Rs == REG_SP && add && !flags)
11283                 opcode = T_MNEM_add_sp;
11284               else if (Rd <= 7 && Rs == REG_PC && add && !flags)
11285                 opcode = T_MNEM_add_pc;
11286               else if (Rd <= 7 && Rs <= 7 && narrow)
11287                 {
11288                   if (flags)
11289                     opcode = add ? T_MNEM_addis : T_MNEM_subis;
11290                   else
11291                     opcode = add ? T_MNEM_addi : T_MNEM_subi;
11292                 }
11293               if (opcode)
11294                 {
11295                   inst.instruction = THUMB_OP16(opcode);
11296                   inst.instruction |= (Rd << 4) | Rs;
11297                   if (inst.relocs[0].type < BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC
11298                       || (inst.relocs[0].type
11299                           > BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC))
11300                   {
11301                     if (inst.size_req == 2)
11302                       inst.relocs[0].type = BFD_RELOC_ARM_THUMB_ADD;
11303                     else
11304                       inst.relax = opcode;
11305                   }
11306                 }
11307               else
11308                 constraint (inst.size_req == 2, BAD_HIREG);
11309             }
11310           if (inst.size_req == 4
11311               || (inst.size_req != 2 && !opcode))
11312             {
11313               constraint ((inst.relocs[0].type
11314                            >= BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC)
11315                           && (inst.relocs[0].type
11316                               <= BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC) ,
11317                           THUMB1_RELOC_ONLY);
11318               if (Rd == REG_PC)
11319                 {
11320                   constraint (add, BAD_PC);
11321                   constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
11322                              _("only SUBS PC, LR, #const allowed"));
11323                   constraint (inst.relocs[0].exp.X_op != O_constant,
11324                               _("expression too complex"));
11325                   constraint (inst.relocs[0].exp.X_add_number < 0
11326                               || inst.relocs[0].exp.X_add_number > 0xff,
11327                              _("immediate value out of range"));
11328                   inst.instruction = T2_SUBS_PC_LR
11329                                      | inst.relocs[0].exp.X_add_number;
11330                   inst.relocs[0].type = BFD_RELOC_UNUSED;
11331                   return;
11332                 }
11333               else if (Rs == REG_PC)
11334                 {
11335                   /* Always use addw/subw.  */
11336                   inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
11337                   inst.relocs[0].type = BFD_RELOC_ARM_T32_IMM12;
11338                 }
11339               else
11340                 {
11341                   inst.instruction = THUMB_OP32 (inst.instruction);
11342                   inst.instruction = (inst.instruction & 0xe1ffffff)
11343                                      | 0x10000000;
11344                   if (flags)
11345                     inst.relocs[0].type = BFD_RELOC_ARM_T32_IMMEDIATE;
11346                   else
11347                     inst.relocs[0].type = BFD_RELOC_ARM_T32_ADD_IMM;
11348                 }
11349               inst.instruction |= Rd << 8;
11350               inst.instruction |= Rs << 16;
11351             }
11352         }
11353       else
11354         {
11355           unsigned int value = inst.relocs[0].exp.X_add_number;
11356           unsigned int shift = inst.operands[2].shift_kind;
11357
11358           Rn = inst.operands[2].reg;
11359           /* See if we can do this with a 16-bit instruction.  */
11360           if (!inst.operands[2].shifted && inst.size_req != 4)
11361             {
11362               if (Rd > 7 || Rs > 7 || Rn > 7)
11363                 narrow = FALSE;
11364
11365               if (narrow)
11366                 {
11367                   inst.instruction = ((inst.instruction == T_MNEM_adds
11368                                        || inst.instruction == T_MNEM_add)
11369                                       ? T_OPCODE_ADD_R3
11370                                       : T_OPCODE_SUB_R3);
11371                   inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
11372                   return;
11373                 }
11374
11375               if (inst.instruction == T_MNEM_add && (Rd == Rs || Rd == Rn))
11376                 {
11377                   /* Thumb-1 cores (except v6-M) require at least one high
11378                      register in a narrow non flag setting add.  */
11379                   if (Rd > 7 || Rn > 7
11380                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)
11381                       || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_msr))
11382                     {
11383                       if (Rd == Rn)
11384                         {
11385                           Rn = Rs;
11386                           Rs = Rd;
11387                         }
11388                       inst.instruction = T_OPCODE_ADD_HI;
11389                       inst.instruction |= (Rd & 8) << 4;
11390                       inst.instruction |= (Rd & 7);
11391                       inst.instruction |= Rn << 3;
11392                       return;
11393                     }
11394                 }
11395             }
11396
11397           constraint (Rd == REG_PC, BAD_PC);
11398           if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
11399             constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
11400           constraint (Rs == REG_PC, BAD_PC);
11401           reject_bad_reg (Rn);
11402
11403           /* If we get here, it can't be done in 16 bits.  */
11404           constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
11405                       _("shift must be constant"));
11406           inst.instruction = THUMB_OP32 (inst.instruction);
11407           inst.instruction |= Rd << 8;
11408           inst.instruction |= Rs << 16;
11409           constraint (Rd == REG_SP && Rs == REG_SP && value > 3,
11410                       _("shift value over 3 not allowed in thumb mode"));
11411           constraint (Rd == REG_SP && Rs == REG_SP && shift != SHIFT_LSL,
11412                       _("only LSL shift allowed in thumb mode"));
11413           encode_thumb32_shifted_operand (2);
11414         }
11415     }
11416   else
11417     {
11418       constraint (inst.instruction == T_MNEM_adds
11419                   || inst.instruction == T_MNEM_subs,
11420                   BAD_THUMB32);
11421
11422       if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
11423         {
11424           constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
11425                       || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
11426                       BAD_HIREG);
11427
11428           inst.instruction = (inst.instruction == T_MNEM_add
11429                               ? 0x0000 : 0x8000);
11430           inst.instruction |= (Rd << 4) | Rs;
11431           inst.relocs[0].type = BFD_RELOC_ARM_THUMB_ADD;
11432           return;
11433         }
11434
11435       Rn = inst.operands[2].reg;
11436       constraint (inst.operands[2].shifted, _("unshifted register required"));
11437
11438       /* We now have Rd, Rs, and Rn set to registers.  */
11439       if (Rd > 7 || Rs > 7 || Rn > 7)
11440         {
11441           /* Can't do this for SUB.      */
11442           constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
11443           inst.instruction = T_OPCODE_ADD_HI;
11444           inst.instruction |= (Rd & 8) << 4;
11445           inst.instruction |= (Rd & 7);
11446           if (Rs == Rd)
11447             inst.instruction |= Rn << 3;
11448           else if (Rn == Rd)
11449             inst.instruction |= Rs << 3;
11450           else
11451             constraint (1, _("dest must overlap one source register"));
11452         }
11453       else
11454         {
11455           inst.instruction = (inst.instruction == T_MNEM_add
11456                               ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
11457           inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
11458         }
11459     }
11460 }
11461
11462 static void
11463 do_t_adr (void)
11464 {
11465   unsigned Rd;
11466
11467   Rd = inst.operands[0].reg;
11468   reject_bad_reg (Rd);
11469
11470   if (unified_syntax && inst.size_req == 0 && Rd <= 7)
11471     {
11472       /* Defer to section relaxation.  */
11473       inst.relax = inst.instruction;
11474       inst.instruction = THUMB_OP16 (inst.instruction);
11475       inst.instruction |= Rd << 4;
11476     }
11477   else if (unified_syntax && inst.size_req != 2)
11478     {
11479       /* Generate a 32-bit opcode.  */
11480       inst.instruction = THUMB_OP32 (inst.instruction);
11481       inst.instruction |= Rd << 8;
11482       inst.relocs[0].type = BFD_RELOC_ARM_T32_ADD_PC12;
11483       inst.relocs[0].pc_rel = 1;
11484     }
11485   else
11486     {
11487       /* Generate a 16-bit opcode.  */
11488       inst.instruction = THUMB_OP16 (inst.instruction);
11489       inst.relocs[0].type = BFD_RELOC_ARM_THUMB_ADD;
11490       inst.relocs[0].exp.X_add_number -= 4; /* PC relative adjust.  */
11491       inst.relocs[0].pc_rel = 1;
11492       inst.instruction |= Rd << 4;
11493     }
11494
11495   if (inst.relocs[0].exp.X_op == O_symbol
11496       && inst.relocs[0].exp.X_add_symbol != NULL
11497       && S_IS_DEFINED (inst.relocs[0].exp.X_add_symbol)
11498       && THUMB_IS_FUNC (inst.relocs[0].exp.X_add_symbol))
11499     inst.relocs[0].exp.X_add_number += 1;
11500 }
11501
11502 /* Arithmetic instructions for which there is just one 16-bit
11503    instruction encoding, and it allows only two low registers.
11504    For maximal compatibility with ARM syntax, we allow three register
11505    operands even when Thumb-32 instructions are not available, as long
11506    as the first two are identical.  For instance, both "sbc r0,r1" and
11507    "sbc r0,r0,r1" are allowed.  */
11508 static void
11509 do_t_arit3 (void)
11510 {
11511   int Rd, Rs, Rn;
11512
11513   Rd = inst.operands[0].reg;
11514   Rs = (inst.operands[1].present
11515         ? inst.operands[1].reg    /* Rd, Rs, foo */
11516         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
11517   Rn = inst.operands[2].reg;
11518
11519   reject_bad_reg (Rd);
11520   reject_bad_reg (Rs);
11521   if (inst.operands[2].isreg)
11522     reject_bad_reg (Rn);
11523
11524   if (unified_syntax)
11525     {
11526       if (!inst.operands[2].isreg)
11527         {
11528           /* For an immediate, we always generate a 32-bit opcode;
11529              section relaxation will shrink it later if possible.  */
11530           inst.instruction = THUMB_OP32 (inst.instruction);
11531           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11532           inst.instruction |= Rd << 8;
11533           inst.instruction |= Rs << 16;
11534           inst.relocs[0].type = BFD_RELOC_ARM_T32_IMMEDIATE;
11535         }
11536       else
11537         {
11538           bfd_boolean narrow;
11539
11540           /* See if we can do this with a 16-bit instruction.  */
11541           if (THUMB_SETS_FLAGS (inst.instruction))
11542             narrow = !in_pred_block ();
11543           else
11544             narrow = in_pred_block ();
11545
11546           if (Rd > 7 || Rn > 7 || Rs > 7)
11547             narrow = FALSE;
11548           if (inst.operands[2].shifted)
11549             narrow = FALSE;
11550           if (inst.size_req == 4)
11551             narrow = FALSE;
11552
11553           if (narrow
11554               && Rd == Rs)
11555             {
11556               inst.instruction = THUMB_OP16 (inst.instruction);
11557               inst.instruction |= Rd;
11558               inst.instruction |= Rn << 3;
11559               return;
11560             }
11561
11562           /* If we get here, it can't be done in 16 bits.  */
11563           constraint (inst.operands[2].shifted
11564                       && inst.operands[2].immisreg,
11565                       _("shift must be constant"));
11566           inst.instruction = THUMB_OP32 (inst.instruction);
11567           inst.instruction |= Rd << 8;
11568           inst.instruction |= Rs << 16;
11569           encode_thumb32_shifted_operand (2);
11570         }
11571     }
11572   else
11573     {
11574       /* On its face this is a lie - the instruction does set the
11575          flags.  However, the only supported mnemonic in this mode
11576          says it doesn't.  */
11577       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11578
11579       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
11580                   _("unshifted register required"));
11581       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
11582       constraint (Rd != Rs,
11583                   _("dest and source1 must be the same register"));
11584
11585       inst.instruction = THUMB_OP16 (inst.instruction);
11586       inst.instruction |= Rd;
11587       inst.instruction |= Rn << 3;
11588     }
11589 }
11590
11591 /* Similarly, but for instructions where the arithmetic operation is
11592    commutative, so we can allow either of them to be different from
11593    the destination operand in a 16-bit instruction.  For instance, all
11594    three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
11595    accepted.  */
11596 static void
11597 do_t_arit3c (void)
11598 {
11599   int Rd, Rs, Rn;
11600
11601   Rd = inst.operands[0].reg;
11602   Rs = (inst.operands[1].present
11603         ? inst.operands[1].reg    /* Rd, Rs, foo */
11604         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
11605   Rn = inst.operands[2].reg;
11606
11607   reject_bad_reg (Rd);
11608   reject_bad_reg (Rs);
11609   if (inst.operands[2].isreg)
11610     reject_bad_reg (Rn);
11611
11612   if (unified_syntax)
11613     {
11614       if (!inst.operands[2].isreg)
11615         {
11616           /* For an immediate, we always generate a 32-bit opcode;
11617              section relaxation will shrink it later if possible.  */
11618           inst.instruction = THUMB_OP32 (inst.instruction);
11619           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11620           inst.instruction |= Rd << 8;
11621           inst.instruction |= Rs << 16;
11622           inst.relocs[0].type = BFD_RELOC_ARM_T32_IMMEDIATE;
11623         }
11624       else
11625         {
11626           bfd_boolean narrow;
11627
11628           /* See if we can do this with a 16-bit instruction.  */
11629           if (THUMB_SETS_FLAGS (inst.instruction))
11630             narrow = !in_pred_block ();
11631           else
11632             narrow = in_pred_block ();
11633
11634           if (Rd > 7 || Rn > 7 || Rs > 7)
11635             narrow = FALSE;
11636           if (inst.operands[2].shifted)
11637             narrow = FALSE;
11638           if (inst.size_req == 4)
11639             narrow = FALSE;
11640
11641           if (narrow)
11642             {
11643               if (Rd == Rs)
11644                 {
11645                   inst.instruction = THUMB_OP16 (inst.instruction);
11646                   inst.instruction |= Rd;
11647                   inst.instruction |= Rn << 3;
11648                   return;
11649                 }
11650               if (Rd == Rn)
11651                 {
11652                   inst.instruction = THUMB_OP16 (inst.instruction);
11653                   inst.instruction |= Rd;
11654                   inst.instruction |= Rs << 3;
11655                   return;
11656                 }
11657             }
11658
11659           /* If we get here, it can't be done in 16 bits.  */
11660           constraint (inst.operands[2].shifted
11661                       && inst.operands[2].immisreg,
11662                       _("shift must be constant"));
11663           inst.instruction = THUMB_OP32 (inst.instruction);
11664           inst.instruction |= Rd << 8;
11665           inst.instruction |= Rs << 16;
11666           encode_thumb32_shifted_operand (2);
11667         }
11668     }
11669   else
11670     {
11671       /* On its face this is a lie - the instruction does set the
11672          flags.  However, the only supported mnemonic in this mode
11673          says it doesn't.  */
11674       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11675
11676       constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
11677                   _("unshifted register required"));
11678       constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
11679
11680       inst.instruction = THUMB_OP16 (inst.instruction);
11681       inst.instruction |= Rd;
11682
11683       if (Rd == Rs)
11684         inst.instruction |= Rn << 3;
11685       else if (Rd == Rn)
11686         inst.instruction |= Rs << 3;
11687       else
11688         constraint (1, _("dest must overlap one source register"));
11689     }
11690 }
11691
11692 static void
11693 do_t_bfc (void)
11694 {
11695   unsigned Rd;
11696   unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
11697   constraint (msb > 32, _("bit-field extends past end of register"));
11698   /* The instruction encoding stores the LSB and MSB,
11699      not the LSB and width.  */
11700   Rd = inst.operands[0].reg;
11701   reject_bad_reg (Rd);
11702   inst.instruction |= Rd << 8;
11703   inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
11704   inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
11705   inst.instruction |= msb - 1;
11706 }
11707
11708 static void
11709 do_t_bfi (void)
11710 {
11711   int Rd, Rn;
11712   unsigned int msb;
11713
11714   Rd = inst.operands[0].reg;
11715   reject_bad_reg (Rd);
11716
11717   /* #0 in second position is alternative syntax for bfc, which is
11718      the same instruction but with REG_PC in the Rm field.  */
11719   if (!inst.operands[1].isreg)
11720     Rn = REG_PC;
11721   else
11722     {
11723       Rn = inst.operands[1].reg;
11724       reject_bad_reg (Rn);
11725     }
11726
11727   msb = inst.operands[2].imm + inst.operands[3].imm;
11728   constraint (msb > 32, _("bit-field extends past end of register"));
11729   /* The instruction encoding stores the LSB and MSB,
11730      not the LSB and width.  */
11731   inst.instruction |= Rd << 8;
11732   inst.instruction |= Rn << 16;
11733   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
11734   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
11735   inst.instruction |= msb - 1;
11736 }
11737
11738 static void
11739 do_t_bfx (void)
11740 {
11741   unsigned Rd, Rn;
11742
11743   Rd = inst.operands[0].reg;
11744   Rn = inst.operands[1].reg;
11745
11746   reject_bad_reg (Rd);
11747   reject_bad_reg (Rn);
11748
11749   constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
11750               _("bit-field extends past end of register"));
11751   inst.instruction |= Rd << 8;
11752   inst.instruction |= Rn << 16;
11753   inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
11754   inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
11755   inst.instruction |= inst.operands[3].imm - 1;
11756 }
11757
11758 /* ARM V5 Thumb BLX (argument parse)
11759         BLX <target_addr>       which is BLX(1)
11760         BLX <Rm>                which is BLX(2)
11761    Unfortunately, there are two different opcodes for this mnemonic.
11762    So, the insns[].value is not used, and the code here zaps values
11763         into inst.instruction.
11764
11765    ??? How to take advantage of the additional two bits of displacement
11766    available in Thumb32 mode?  Need new relocation?  */
11767
11768 static void
11769 do_t_blx (void)
11770 {
11771   set_pred_insn_type_last ();
11772
11773   if (inst.operands[0].isreg)
11774     {
11775       constraint (inst.operands[0].reg == REG_PC, BAD_PC);
11776       /* We have a register, so this is BLX(2).  */
11777       inst.instruction |= inst.operands[0].reg << 3;
11778     }
11779   else
11780     {
11781       /* No register.  This must be BLX(1).  */
11782       inst.instruction = 0xf000e800;
11783       encode_branch (BFD_RELOC_THUMB_PCREL_BLX);
11784     }
11785 }
11786
11787 static void
11788 do_t_branch (void)
11789 {
11790   int opcode;
11791   int cond;
11792   bfd_reloc_code_real_type reloc;
11793
11794   cond = inst.cond;
11795   set_pred_insn_type (IF_INSIDE_IT_LAST_INSN);
11796
11797   if (in_pred_block ())
11798     {
11799       /* Conditional branches inside IT blocks are encoded as unconditional
11800          branches.  */
11801       cond = COND_ALWAYS;
11802     }
11803   else
11804     cond = inst.cond;
11805
11806   if (cond != COND_ALWAYS)
11807     opcode = T_MNEM_bcond;
11808   else
11809     opcode = inst.instruction;
11810
11811   if (unified_syntax
11812       && (inst.size_req == 4
11813           || (inst.size_req != 2
11814               && (inst.operands[0].hasreloc
11815                   || inst.relocs[0].exp.X_op == O_constant))))
11816     {
11817       inst.instruction = THUMB_OP32(opcode);
11818       if (cond == COND_ALWAYS)
11819         reloc = BFD_RELOC_THUMB_PCREL_BRANCH25;
11820       else
11821         {
11822           constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2),
11823                       _("selected architecture does not support "
11824                         "wide conditional branch instruction"));
11825
11826           gas_assert (cond != 0xF);
11827           inst.instruction |= cond << 22;
11828           reloc = BFD_RELOC_THUMB_PCREL_BRANCH20;
11829         }
11830     }
11831   else
11832     {
11833       inst.instruction = THUMB_OP16(opcode);
11834       if (cond == COND_ALWAYS)
11835         reloc = BFD_RELOC_THUMB_PCREL_BRANCH12;
11836       else
11837         {
11838           inst.instruction |= cond << 8;
11839           reloc = BFD_RELOC_THUMB_PCREL_BRANCH9;
11840         }
11841       /* Allow section relaxation.  */
11842       if (unified_syntax && inst.size_req != 2)
11843         inst.relax = opcode;
11844     }
11845   inst.relocs[0].type = reloc;
11846   inst.relocs[0].pc_rel = 1;
11847 }
11848
11849 /* Actually do the work for Thumb state bkpt and hlt.  The only difference
11850    between the two is the maximum immediate allowed - which is passed in
11851    RANGE.  */
11852 static void
11853 do_t_bkpt_hlt1 (int range)
11854 {
11855   constraint (inst.cond != COND_ALWAYS,
11856               _("instruction is always unconditional"));
11857   if (inst.operands[0].present)
11858     {
11859       constraint (inst.operands[0].imm > range,
11860                   _("immediate value out of range"));
11861       inst.instruction |= inst.operands[0].imm;
11862     }
11863
11864   set_pred_insn_type (NEUTRAL_IT_INSN);
11865 }
11866
11867 static void
11868 do_t_hlt (void)
11869 {
11870   do_t_bkpt_hlt1 (63);
11871 }
11872
11873 static void
11874 do_t_bkpt (void)
11875 {
11876   do_t_bkpt_hlt1 (255);
11877 }
11878
11879 static void
11880 do_t_branch23 (void)
11881 {
11882   set_pred_insn_type_last ();
11883   encode_branch (BFD_RELOC_THUMB_PCREL_BRANCH23);
11884
11885   /* md_apply_fix blows up with 'bl foo(PLT)' where foo is defined in
11886      this file.  We used to simply ignore the PLT reloc type here --
11887      the branch encoding is now needed to deal with TLSCALL relocs.
11888      So if we see a PLT reloc now, put it back to how it used to be to
11889      keep the preexisting behaviour.  */
11890   if (inst.relocs[0].type == BFD_RELOC_ARM_PLT32)
11891     inst.relocs[0].type = BFD_RELOC_THUMB_PCREL_BRANCH23;
11892
11893 #if defined(OBJ_COFF)
11894   /* If the destination of the branch is a defined symbol which does not have
11895      the THUMB_FUNC attribute, then we must be calling a function which has
11896      the (interfacearm) attribute.  We look for the Thumb entry point to that
11897      function and change the branch to refer to that function instead.  */
11898   if (   inst.relocs[0].exp.X_op == O_symbol
11899       && inst.relocs[0].exp.X_add_symbol != NULL
11900       && S_IS_DEFINED (inst.relocs[0].exp.X_add_symbol)
11901       && ! THUMB_IS_FUNC (inst.relocs[0].exp.X_add_symbol))
11902     inst.relocs[0].exp.X_add_symbol
11903       = find_real_start (inst.relocs[0].exp.X_add_symbol);
11904 #endif
11905 }
11906
11907 static void
11908 do_t_bx (void)
11909 {
11910   set_pred_insn_type_last ();
11911   inst.instruction |= inst.operands[0].reg << 3;
11912   /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC.  The reloc
11913      should cause the alignment to be checked once it is known.  This is
11914      because BX PC only works if the instruction is word aligned.  */
11915 }
11916
11917 static void
11918 do_t_bxj (void)
11919 {
11920   int Rm;
11921
11922   set_pred_insn_type_last ();
11923   Rm = inst.operands[0].reg;
11924   reject_bad_reg (Rm);
11925   inst.instruction |= Rm << 16;
11926 }
11927
11928 static void
11929 do_t_clz (void)
11930 {
11931   unsigned Rd;
11932   unsigned Rm;
11933
11934   Rd = inst.operands[0].reg;
11935   Rm = inst.operands[1].reg;
11936
11937   reject_bad_reg (Rd);
11938   reject_bad_reg (Rm);
11939
11940   inst.instruction |= Rd << 8;
11941   inst.instruction |= Rm << 16;
11942   inst.instruction |= Rm;
11943 }
11944
11945 static void
11946 do_t_csdb (void)
11947 {
11948   set_pred_insn_type (OUTSIDE_PRED_INSN);
11949 }
11950
11951 static void
11952 do_t_cps (void)
11953 {
11954   set_pred_insn_type (OUTSIDE_PRED_INSN);
11955   inst.instruction |= inst.operands[0].imm;
11956 }
11957
11958 static void
11959 do_t_cpsi (void)
11960 {
11961   set_pred_insn_type (OUTSIDE_PRED_INSN);
11962   if (unified_syntax
11963       && (inst.operands[1].present || inst.size_req == 4)
11964       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
11965     {
11966       unsigned int imod = (inst.instruction & 0x0030) >> 4;
11967       inst.instruction = 0xf3af8000;
11968       inst.instruction |= imod << 9;
11969       inst.instruction |= inst.operands[0].imm << 5;
11970       if (inst.operands[1].present)
11971         inst.instruction |= 0x100 | inst.operands[1].imm;
11972     }
11973   else
11974     {
11975       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
11976                   && (inst.operands[0].imm & 4),
11977                   _("selected processor does not support 'A' form "
11978                     "of this instruction"));
11979       constraint (inst.operands[1].present || inst.size_req == 4,
11980                   _("Thumb does not support the 2-argument "
11981                     "form of this instruction"));
11982       inst.instruction |= inst.operands[0].imm;
11983     }
11984 }
11985
11986 /* THUMB CPY instruction (argument parse).  */
11987
11988 static void
11989 do_t_cpy (void)
11990 {
11991   if (inst.size_req == 4)
11992     {
11993       inst.instruction = THUMB_OP32 (T_MNEM_mov);
11994       inst.instruction |= inst.operands[0].reg << 8;
11995       inst.instruction |= inst.operands[1].reg;
11996     }
11997   else
11998     {
11999       inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
12000       inst.instruction |= (inst.operands[0].reg & 0x7);
12001       inst.instruction |= inst.operands[1].reg << 3;
12002     }
12003 }
12004
12005 static void
12006 do_t_cbz (void)
12007 {
12008   set_pred_insn_type (OUTSIDE_PRED_INSN);
12009   constraint (inst.operands[0].reg > 7, BAD_HIREG);
12010   inst.instruction |= inst.operands[0].reg;
12011   inst.relocs[0].pc_rel = 1;
12012   inst.relocs[0].type = BFD_RELOC_THUMB_PCREL_BRANCH7;
12013 }
12014
12015 static void
12016 do_t_dbg (void)
12017 {
12018   inst.instruction |= inst.operands[0].imm;
12019 }
12020
12021 static void
12022 do_t_div (void)
12023 {
12024   unsigned Rd, Rn, Rm;
12025
12026   Rd = inst.operands[0].reg;
12027   Rn = (inst.operands[1].present
12028         ? inst.operands[1].reg : Rd);
12029   Rm = inst.operands[2].reg;
12030
12031   reject_bad_reg (Rd);
12032   reject_bad_reg (Rn);
12033   reject_bad_reg (Rm);
12034
12035   inst.instruction |= Rd << 8;
12036   inst.instruction |= Rn << 16;
12037   inst.instruction |= Rm;
12038 }
12039
12040 static void
12041 do_t_hint (void)
12042 {
12043   if (unified_syntax && inst.size_req == 4)
12044     inst.instruction = THUMB_OP32 (inst.instruction);
12045   else
12046     inst.instruction = THUMB_OP16 (inst.instruction);
12047 }
12048
12049 static void
12050 do_t_it (void)
12051 {
12052   unsigned int cond = inst.operands[0].imm;
12053
12054   set_pred_insn_type (IT_INSN);
12055   now_pred.mask = (inst.instruction & 0xf) | 0x10;
12056   now_pred.cc = cond;
12057   now_pred.warn_deprecated = FALSE;
12058   now_pred.type = SCALAR_PRED;
12059
12060   /* If the condition is a negative condition, invert the mask.  */
12061   if ((cond & 0x1) == 0x0)
12062     {
12063       unsigned int mask = inst.instruction & 0x000f;
12064
12065       if ((mask & 0x7) == 0)
12066         {
12067           /* No conversion needed.  */
12068           now_pred.block_length = 1;
12069         }
12070       else if ((mask & 0x3) == 0)
12071         {
12072           mask ^= 0x8;
12073           now_pred.block_length = 2;
12074         }
12075       else if ((mask & 0x1) == 0)
12076         {
12077           mask ^= 0xC;
12078           now_pred.block_length = 3;
12079         }
12080       else
12081         {
12082           mask ^= 0xE;
12083           now_pred.block_length = 4;
12084         }
12085
12086       inst.instruction &= 0xfff0;
12087       inst.instruction |= mask;
12088     }
12089
12090   inst.instruction |= cond << 4;
12091 }
12092
12093 /* Helper function used for both push/pop and ldm/stm.  */
12094 static void
12095 encode_thumb2_multi (bfd_boolean do_io, int base, unsigned mask,
12096                      bfd_boolean writeback)
12097 {
12098   bfd_boolean load, store;
12099
12100   gas_assert (base != -1 || !do_io);
12101   load = do_io && ((inst.instruction & (1 << 20)) != 0);
12102   store = do_io && !load;
12103
12104   if (mask & (1 << 13))
12105     inst.error =  _("SP not allowed in register list");
12106
12107   if (do_io && (mask & (1 << base)) != 0
12108       && writeback)
12109     inst.error = _("having the base register in the register list when "
12110                    "using write back is UNPREDICTABLE");
12111
12112   if (load)
12113     {
12114       if (mask & (1 << 15))
12115         {
12116           if (mask & (1 << 14))
12117             inst.error = _("LR and PC should not both be in register list");
12118           else
12119             set_pred_insn_type_last ();
12120         }
12121     }
12122   else if (store)
12123     {
12124       if (mask & (1 << 15))
12125         inst.error = _("PC not allowed in register list");
12126     }
12127
12128   if (do_io && ((mask & (mask - 1)) == 0))
12129     {
12130       /* Single register transfers implemented as str/ldr.  */
12131       if (writeback)
12132         {
12133           if (inst.instruction & (1 << 23))
12134             inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
12135           else
12136             inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
12137         }
12138       else
12139         {
12140           if (inst.instruction & (1 << 23))
12141             inst.instruction = 0x00800000; /* ia -> [base] */
12142           else
12143             inst.instruction = 0x00000c04; /* db -> [base, #-4] */
12144         }
12145
12146       inst.instruction |= 0xf8400000;
12147       if (load)
12148         inst.instruction |= 0x00100000;
12149
12150       mask = ffs (mask) - 1;
12151       mask <<= 12;
12152     }
12153   else if (writeback)
12154     inst.instruction |= WRITE_BACK;
12155
12156   inst.instruction |= mask;
12157   if (do_io)
12158     inst.instruction |= base << 16;
12159 }
12160
12161 static void
12162 do_t_ldmstm (void)
12163 {
12164   /* This really doesn't seem worth it.  */
12165   constraint (inst.relocs[0].type != BFD_RELOC_UNUSED,
12166               _("expression too complex"));
12167   constraint (inst.operands[1].writeback,
12168               _("Thumb load/store multiple does not support {reglist}^"));
12169
12170   if (unified_syntax)
12171     {
12172       bfd_boolean narrow;
12173       unsigned mask;
12174
12175       narrow = FALSE;
12176       /* See if we can use a 16-bit instruction.  */
12177       if (inst.instruction < 0xffff /* not ldmdb/stmdb */
12178           && inst.size_req != 4
12179           && !(inst.operands[1].imm & ~0xff))
12180         {
12181           mask = 1 << inst.operands[0].reg;
12182
12183           if (inst.operands[0].reg <= 7)
12184             {
12185               if (inst.instruction == T_MNEM_stmia
12186                   ? inst.operands[0].writeback
12187                   : (inst.operands[0].writeback
12188                      == !(inst.operands[1].imm & mask)))
12189                 {
12190                   if (inst.instruction == T_MNEM_stmia
12191                       && (inst.operands[1].imm & mask)
12192                       && (inst.operands[1].imm & (mask - 1)))
12193                     as_warn (_("value stored for r%d is UNKNOWN"),
12194                              inst.operands[0].reg);
12195
12196                   inst.instruction = THUMB_OP16 (inst.instruction);
12197                   inst.instruction |= inst.operands[0].reg << 8;
12198                   inst.instruction |= inst.operands[1].imm;
12199                   narrow = TRUE;
12200                 }
12201               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
12202                 {
12203                   /* This means 1 register in reg list one of 3 situations:
12204                      1. Instruction is stmia, but without writeback.
12205                      2. lmdia without writeback, but with Rn not in
12206                         reglist.
12207                      3. ldmia with writeback, but with Rn in reglist.
12208                      Case 3 is UNPREDICTABLE behaviour, so we handle
12209                      case 1 and 2 which can be converted into a 16-bit
12210                      str or ldr. The SP cases are handled below.  */
12211                   unsigned long opcode;
12212                   /* First, record an error for Case 3.  */
12213                   if (inst.operands[1].imm & mask
12214                       && inst.operands[0].writeback)
12215                     inst.error =
12216                         _("having the base register in the register list when "
12217                           "using write back is UNPREDICTABLE");
12218
12219                   opcode = (inst.instruction == T_MNEM_stmia ? T_MNEM_str
12220                                                              : T_MNEM_ldr);
12221                   inst.instruction = THUMB_OP16 (opcode);
12222                   inst.instruction |= inst.operands[0].reg << 3;
12223                   inst.instruction |= (ffs (inst.operands[1].imm)-1);
12224                   narrow = TRUE;
12225                 }
12226             }
12227           else if (inst.operands[0] .reg == REG_SP)
12228             {
12229               if (inst.operands[0].writeback)
12230                 {
12231                   inst.instruction =
12232                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
12233                                     ? T_MNEM_push : T_MNEM_pop);
12234                   inst.instruction |= inst.operands[1].imm;
12235                   narrow = TRUE;
12236                 }
12237               else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
12238                 {
12239                   inst.instruction =
12240                         THUMB_OP16 (inst.instruction == T_MNEM_stmia
12241                                     ? T_MNEM_str_sp : T_MNEM_ldr_sp);
12242                   inst.instruction |= ((ffs (inst.operands[1].imm)-1) << 8);
12243                   narrow = TRUE;
12244                 }
12245             }
12246         }
12247
12248       if (!narrow)
12249         {
12250           if (inst.instruction < 0xffff)
12251             inst.instruction = THUMB_OP32 (inst.instruction);
12252
12253           encode_thumb2_multi (TRUE /* do_io */, inst.operands[0].reg,
12254                                inst.operands[1].imm,
12255                                inst.operands[0].writeback);
12256         }
12257     }
12258   else
12259     {
12260       constraint (inst.operands[0].reg > 7
12261                   || (inst.operands[1].imm & ~0xff), BAD_HIREG);
12262       constraint (inst.instruction != T_MNEM_ldmia
12263                   && inst.instruction != T_MNEM_stmia,
12264                   _("Thumb-2 instruction only valid in unified syntax"));
12265       if (inst.instruction == T_MNEM_stmia)
12266         {
12267           if (!inst.operands[0].writeback)
12268             as_warn (_("this instruction will write back the base register"));
12269           if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
12270               && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
12271             as_warn (_("value stored for r%d is UNKNOWN"),
12272                      inst.operands[0].reg);
12273         }
12274       else
12275         {
12276           if (!inst.operands[0].writeback
12277               && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
12278             as_warn (_("this instruction will write back the base register"));
12279           else if (inst.operands[0].writeback
12280                    && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
12281             as_warn (_("this instruction will not write back the base register"));
12282         }
12283
12284       inst.instruction = THUMB_OP16 (inst.instruction);
12285       inst.instruction |= inst.operands[0].reg << 8;
12286       inst.instruction |= inst.operands[1].imm;
12287     }
12288 }
12289
12290 static void
12291 do_t_ldrex (void)
12292 {
12293   constraint (!inst.operands[1].isreg || !inst.operands[1].preind
12294               || inst.operands[1].postind || inst.operands[1].writeback
12295               || inst.operands[1].immisreg || inst.operands[1].shifted
12296               || inst.operands[1].negative,
12297               BAD_ADDR_MODE);
12298
12299   constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
12300
12301   inst.instruction |= inst.operands[0].reg << 12;
12302   inst.instruction |= inst.operands[1].reg << 16;
12303   inst.relocs[0].type = BFD_RELOC_ARM_T32_OFFSET_U8;
12304 }
12305
12306 static void
12307 do_t_ldrexd (void)
12308 {
12309   if (!inst.operands[1].present)
12310     {
12311       constraint (inst.operands[0].reg == REG_LR,
12312                   _("r14 not allowed as first register "
12313                     "when second register is omitted"));
12314       inst.operands[1].reg = inst.operands[0].reg + 1;
12315     }
12316   constraint (inst.operands[0].reg == inst.operands[1].reg,
12317               BAD_OVERLAP);
12318
12319   inst.instruction |= inst.operands[0].reg << 12;
12320   inst.instruction |= inst.operands[1].reg << 8;
12321   inst.instruction |= inst.operands[2].reg << 16;
12322 }
12323
12324 static void
12325 do_t_ldst (void)
12326 {
12327   unsigned long opcode;
12328   int Rn;
12329
12330   if (inst.operands[0].isreg
12331       && !inst.operands[0].preind
12332       && inst.operands[0].reg == REG_PC)
12333     set_pred_insn_type_last ();
12334
12335   opcode = inst.instruction;
12336   if (unified_syntax)
12337     {
12338       if (!inst.operands[1].isreg)
12339         {
12340           if (opcode <= 0xffff)
12341             inst.instruction = THUMB_OP32 (opcode);
12342           if (move_or_literal_pool (0, CONST_THUMB, /*mode_3=*/FALSE))
12343             return;
12344         }
12345       if (inst.operands[1].isreg
12346           && !inst.operands[1].writeback
12347           && !inst.operands[1].shifted && !inst.operands[1].postind
12348           && !inst.operands[1].negative && inst.operands[0].reg <= 7
12349           && opcode <= 0xffff
12350           && inst.size_req != 4)
12351         {
12352           /* Insn may have a 16-bit form.  */
12353           Rn = inst.operands[1].reg;
12354           if (inst.operands[1].immisreg)
12355             {
12356               inst.instruction = THUMB_OP16 (opcode);
12357               /* [Rn, Rik] */
12358               if (Rn <= 7 && inst.operands[1].imm <= 7)
12359                 goto op16;
12360               else if (opcode != T_MNEM_ldr && opcode != T_MNEM_str)
12361                 reject_bad_reg (inst.operands[1].imm);
12362             }
12363           else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
12364                     && opcode != T_MNEM_ldrsb)
12365                    || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
12366                    || (Rn == REG_SP && opcode == T_MNEM_str))
12367             {
12368               /* [Rn, #const] */
12369               if (Rn > 7)
12370                 {
12371                   if (Rn == REG_PC)
12372                     {
12373                       if (inst.relocs[0].pc_rel)
12374                         opcode = T_MNEM_ldr_pc2;
12375                       else
12376                         opcode = T_MNEM_ldr_pc;
12377                     }
12378                   else
12379                     {
12380                       if (opcode == T_MNEM_ldr)
12381                         opcode = T_MNEM_ldr_sp;
12382                       else
12383                         opcode = T_MNEM_str_sp;
12384                     }
12385                   inst.instruction = inst.operands[0].reg << 8;
12386                 }
12387               else
12388                 {
12389                   inst.instruction = inst.operands[0].reg;
12390                   inst.instruction |= inst.operands[1].reg << 3;
12391                 }
12392               inst.instruction |= THUMB_OP16 (opcode);
12393               if (inst.size_req == 2)
12394                 inst.relocs[0].type = BFD_RELOC_ARM_THUMB_OFFSET;
12395               else
12396                 inst.relax = opcode;
12397               return;
12398             }
12399         }
12400       /* Definitely a 32-bit variant.  */
12401
12402       /* Warning for Erratum 752419.  */
12403       if (opcode == T_MNEM_ldr
12404           && inst.operands[0].reg == REG_SP
12405           && inst.operands[1].writeback == 1
12406           && !inst.operands[1].immisreg)
12407         {
12408           if (no_cpu_selected ()
12409               || (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7)
12410                   && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a)
12411                   && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7r)))
12412             as_warn (_("This instruction may be unpredictable "
12413                        "if executed on M-profile cores "
12414                        "with interrupts enabled."));
12415         }
12416
12417       /* Do some validations regarding addressing modes.  */
12418       if (inst.operands[1].immisreg)
12419         reject_bad_reg (inst.operands[1].imm);
12420
12421       constraint (inst.operands[1].writeback == 1
12422                   && inst.operands[0].reg == inst.operands[1].reg,
12423                   BAD_OVERLAP);
12424
12425       inst.instruction = THUMB_OP32 (opcode);
12426       inst.instruction |= inst.operands[0].reg << 12;
12427       encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
12428       check_ldr_r15_aligned ();
12429       return;
12430     }
12431
12432   constraint (inst.operands[0].reg > 7, BAD_HIREG);
12433
12434   if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
12435     {
12436       /* Only [Rn,Rm] is acceptable.  */
12437       constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
12438       constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
12439                   || inst.operands[1].postind || inst.operands[1].shifted
12440                   || inst.operands[1].negative,
12441                   _("Thumb does not support this addressing mode"));
12442       inst.instruction = THUMB_OP16 (inst.instruction);
12443       goto op16;
12444     }
12445
12446   inst.instruction = THUMB_OP16 (inst.instruction);
12447   if (!inst.operands[1].isreg)
12448     if (move_or_literal_pool (0, CONST_THUMB, /*mode_3=*/FALSE))
12449       return;
12450
12451   constraint (!inst.operands[1].preind
12452               || inst.operands[1].shifted
12453               || inst.operands[1].writeback,
12454               _("Thumb does not support this addressing mode"));
12455   if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
12456     {
12457       constraint (inst.instruction & 0x0600,
12458                   _("byte or halfword not valid for base register"));
12459       constraint (inst.operands[1].reg == REG_PC
12460                   && !(inst.instruction & THUMB_LOAD_BIT),
12461                   _("r15 based store not allowed"));
12462       constraint (inst.operands[1].immisreg,
12463                   _("invalid base register for register offset"));
12464
12465       if (inst.operands[1].reg == REG_PC)
12466         inst.instruction = T_OPCODE_LDR_PC;
12467       else if (inst.instruction & THUMB_LOAD_BIT)
12468         inst.instruction = T_OPCODE_LDR_SP;
12469       else
12470         inst.instruction = T_OPCODE_STR_SP;
12471
12472       inst.instruction |= inst.operands[0].reg << 8;
12473       inst.relocs[0].type = BFD_RELOC_ARM_THUMB_OFFSET;
12474       return;
12475     }
12476
12477   constraint (inst.operands[1].reg > 7, BAD_HIREG);
12478   if (!inst.operands[1].immisreg)
12479     {
12480       /* Immediate offset.  */
12481       inst.instruction |= inst.operands[0].reg;
12482       inst.instruction |= inst.operands[1].reg << 3;
12483       inst.relocs[0].type = BFD_RELOC_ARM_THUMB_OFFSET;
12484       return;
12485     }
12486
12487   /* Register offset.  */
12488   constraint (inst.operands[1].imm > 7, BAD_HIREG);
12489   constraint (inst.operands[1].negative,
12490               _("Thumb does not support this addressing mode"));
12491
12492  op16:
12493   switch (inst.instruction)
12494     {
12495     case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
12496     case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
12497     case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
12498     case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
12499     case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
12500     case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
12501     case 0x5600 /* ldrsb */:
12502     case 0x5e00 /* ldrsh */: break;
12503     default: abort ();
12504     }
12505
12506   inst.instruction |= inst.operands[0].reg;
12507   inst.instruction |= inst.operands[1].reg << 3;
12508   inst.instruction |= inst.operands[1].imm << 6;
12509 }
12510
12511 static void
12512 do_t_ldstd (void)
12513 {
12514   if (!inst.operands[1].present)
12515     {
12516       inst.operands[1].reg = inst.operands[0].reg + 1;
12517       constraint (inst.operands[0].reg == REG_LR,
12518                   _("r14 not allowed here"));
12519       constraint (inst.operands[0].reg == REG_R12,
12520                   _("r12 not allowed here"));
12521     }
12522
12523   if (inst.operands[2].writeback
12524       && (inst.operands[0].reg == inst.operands[2].reg
12525       || inst.operands[1].reg == inst.operands[2].reg))
12526     as_warn (_("base register written back, and overlaps "
12527                "one of transfer registers"));
12528
12529   inst.instruction |= inst.operands[0].reg << 12;
12530   inst.instruction |= inst.operands[1].reg << 8;
12531   encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
12532 }
12533
12534 static void
12535 do_t_ldstt (void)
12536 {
12537   inst.instruction |= inst.operands[0].reg << 12;
12538   encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
12539 }
12540
12541 static void
12542 do_t_mla (void)
12543 {
12544   unsigned Rd, Rn, Rm, Ra;
12545
12546   Rd = inst.operands[0].reg;
12547   Rn = inst.operands[1].reg;
12548   Rm = inst.operands[2].reg;
12549   Ra = inst.operands[3].reg;
12550
12551   reject_bad_reg (Rd);
12552   reject_bad_reg (Rn);
12553   reject_bad_reg (Rm);
12554   reject_bad_reg (Ra);
12555
12556   inst.instruction |= Rd << 8;
12557   inst.instruction |= Rn << 16;
12558   inst.instruction |= Rm;
12559   inst.instruction |= Ra << 12;
12560 }
12561
12562 static void
12563 do_t_mlal (void)
12564 {
12565   unsigned RdLo, RdHi, Rn, Rm;
12566
12567   RdLo = inst.operands[0].reg;
12568   RdHi = inst.operands[1].reg;
12569   Rn = inst.operands[2].reg;
12570   Rm = inst.operands[3].reg;
12571
12572   reject_bad_reg (RdLo);
12573   reject_bad_reg (RdHi);
12574   reject_bad_reg (Rn);
12575   reject_bad_reg (Rm);
12576
12577   inst.instruction |= RdLo << 12;
12578   inst.instruction |= RdHi << 8;
12579   inst.instruction |= Rn << 16;
12580   inst.instruction |= Rm;
12581 }
12582
12583 static void
12584 do_t_mov_cmp (void)
12585 {
12586   unsigned Rn, Rm;
12587
12588   Rn = inst.operands[0].reg;
12589   Rm = inst.operands[1].reg;
12590
12591   if (Rn == REG_PC)
12592     set_pred_insn_type_last ();
12593
12594   if (unified_syntax)
12595     {
12596       int r0off = (inst.instruction == T_MNEM_mov
12597                    || inst.instruction == T_MNEM_movs) ? 8 : 16;
12598       unsigned long opcode;
12599       bfd_boolean narrow;
12600       bfd_boolean low_regs;
12601
12602       low_regs = (Rn <= 7 && Rm <= 7);
12603       opcode = inst.instruction;
12604       if (in_pred_block ())
12605         narrow = opcode != T_MNEM_movs;
12606       else
12607         narrow = opcode != T_MNEM_movs || low_regs;
12608       if (inst.size_req == 4
12609           || inst.operands[1].shifted)
12610         narrow = FALSE;
12611
12612       /* MOVS PC, LR is encoded as SUBS PC, LR, #0.  */
12613       if (opcode == T_MNEM_movs && inst.operands[1].isreg
12614           && !inst.operands[1].shifted
12615           && Rn == REG_PC
12616           && Rm == REG_LR)
12617         {
12618           inst.instruction = T2_SUBS_PC_LR;
12619           return;
12620         }
12621
12622       if (opcode == T_MNEM_cmp)
12623         {
12624           constraint (Rn == REG_PC, BAD_PC);
12625           if (narrow)
12626             {
12627               /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
12628                  but valid.  */
12629               warn_deprecated_sp (Rm);
12630               /* R15 was documented as a valid choice for Rm in ARMv6,
12631                  but as UNPREDICTABLE in ARMv7.  ARM's proprietary
12632                  tools reject R15, so we do too.  */
12633               constraint (Rm == REG_PC, BAD_PC);
12634             }
12635           else
12636             reject_bad_reg (Rm);
12637         }
12638       else if (opcode == T_MNEM_mov
12639                || opcode == T_MNEM_movs)
12640         {
12641           if (inst.operands[1].isreg)
12642             {
12643               if (opcode == T_MNEM_movs)
12644                 {
12645                   reject_bad_reg (Rn);
12646                   reject_bad_reg (Rm);
12647                 }
12648               else if (narrow)
12649                 {
12650                   /* This is mov.n.  */
12651                   if ((Rn == REG_SP || Rn == REG_PC)
12652                       && (Rm == REG_SP || Rm == REG_PC))
12653                     {
12654                       as_tsktsk (_("Use of r%u as a source register is "
12655                                  "deprecated when r%u is the destination "
12656                                  "register."), Rm, Rn);
12657                     }
12658                 }
12659               else
12660                 {
12661                   /* This is mov.w.  */
12662                   constraint (Rn == REG_PC, BAD_PC);
12663                   constraint (Rm == REG_PC, BAD_PC);
12664                   if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
12665                     constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP);
12666                 }
12667             }
12668           else
12669             reject_bad_reg (Rn);
12670         }
12671
12672       if (!inst.operands[1].isreg)
12673         {
12674           /* Immediate operand.  */
12675           if (!in_pred_block () && opcode == T_MNEM_mov)
12676             narrow = 0;
12677           if (low_regs && narrow)
12678             {
12679               inst.instruction = THUMB_OP16 (opcode);
12680               inst.instruction |= Rn << 8;
12681               if (inst.relocs[0].type < BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC
12682                   || inst.relocs[0].type > BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC)
12683                 {
12684                   if (inst.size_req == 2)
12685                     inst.relocs[0].type = BFD_RELOC_ARM_THUMB_IMM;
12686                   else
12687                     inst.relax = opcode;
12688                 }
12689             }
12690           else
12691             {
12692               constraint ((inst.relocs[0].type
12693                            >= BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC)
12694                           && (inst.relocs[0].type
12695                               <= BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC) ,
12696                           THUMB1_RELOC_ONLY);
12697
12698               inst.instruction = THUMB_OP32 (inst.instruction);
12699               inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
12700               inst.instruction |= Rn << r0off;
12701               inst.relocs[0].type = BFD_RELOC_ARM_T32_IMMEDIATE;
12702             }
12703         }
12704       else if (inst.operands[1].shifted && inst.operands[1].immisreg
12705                && (inst.instruction == T_MNEM_mov
12706                    || inst.instruction == T_MNEM_movs))
12707         {
12708           /* Register shifts are encoded as separate shift instructions.  */
12709           bfd_boolean flags = (inst.instruction == T_MNEM_movs);
12710
12711           if (in_pred_block ())
12712             narrow = !flags;
12713           else
12714             narrow = flags;
12715
12716           if (inst.size_req == 4)
12717             narrow = FALSE;
12718
12719           if (!low_regs || inst.operands[1].imm > 7)
12720             narrow = FALSE;
12721
12722           if (Rn != Rm)
12723             narrow = FALSE;
12724
12725           switch (inst.operands[1].shift_kind)
12726             {
12727             case SHIFT_LSL:
12728               opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
12729               break;
12730             case SHIFT_ASR:
12731               opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
12732               break;
12733             case SHIFT_LSR:
12734               opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
12735               break;
12736             case SHIFT_ROR:
12737               opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
12738               break;
12739             default:
12740               abort ();
12741             }
12742
12743           inst.instruction = opcode;
12744           if (narrow)
12745             {
12746               inst.instruction |= Rn;
12747               inst.instruction |= inst.operands[1].imm << 3;
12748             }
12749           else
12750             {
12751               if (flags)
12752                 inst.instruction |= CONDS_BIT;
12753
12754               inst.instruction |= Rn << 8;
12755               inst.instruction |= Rm << 16;
12756               inst.instruction |= inst.operands[1].imm;
12757             }
12758         }
12759       else if (!narrow)
12760         {
12761           /* Some mov with immediate shift have narrow variants.
12762              Register shifts are handled above.  */
12763           if (low_regs && inst.operands[1].shifted
12764               && (inst.instruction == T_MNEM_mov
12765                   || inst.instruction == T_MNEM_movs))
12766             {
12767               if (in_pred_block ())
12768                 narrow = (inst.instruction == T_MNEM_mov);
12769               else
12770                 narrow = (inst.instruction == T_MNEM_movs);
12771             }
12772
12773           if (narrow)
12774             {
12775               switch (inst.operands[1].shift_kind)
12776                 {
12777                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
12778                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
12779                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
12780                 default: narrow = FALSE; break;
12781                 }
12782             }
12783
12784           if (narrow)
12785             {
12786               inst.instruction |= Rn;
12787               inst.instruction |= Rm << 3;
12788               inst.relocs[0].type = BFD_RELOC_ARM_THUMB_SHIFT;
12789             }
12790           else
12791             {
12792               inst.instruction = THUMB_OP32 (inst.instruction);
12793               inst.instruction |= Rn << r0off;
12794               encode_thumb32_shifted_operand (1);
12795             }
12796         }
12797       else
12798         switch (inst.instruction)
12799           {
12800           case T_MNEM_mov:
12801             /* In v4t or v5t a move of two lowregs produces unpredictable
12802                results. Don't allow this.  */
12803             if (low_regs)
12804               {
12805                 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6),
12806                             "MOV Rd, Rs with two low registers is not "
12807                             "permitted on this architecture");
12808                 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
12809                                         arm_ext_v6);
12810               }
12811
12812             inst.instruction = T_OPCODE_MOV_HR;
12813             inst.instruction |= (Rn & 0x8) << 4;
12814             inst.instruction |= (Rn & 0x7);
12815             inst.instruction |= Rm << 3;
12816             break;
12817
12818           case T_MNEM_movs:
12819             /* We know we have low registers at this point.
12820                Generate LSLS Rd, Rs, #0.  */
12821             inst.instruction = T_OPCODE_LSL_I;
12822             inst.instruction |= Rn;
12823             inst.instruction |= Rm << 3;
12824             break;
12825
12826           case T_MNEM_cmp:
12827             if (low_regs)
12828               {
12829                 inst.instruction = T_OPCODE_CMP_LR;
12830                 inst.instruction |= Rn;
12831                 inst.instruction |= Rm << 3;
12832               }
12833             else
12834               {
12835                 inst.instruction = T_OPCODE_CMP_HR;
12836                 inst.instruction |= (Rn & 0x8) << 4;
12837                 inst.instruction |= (Rn & 0x7);
12838                 inst.instruction |= Rm << 3;
12839               }
12840             break;
12841           }
12842       return;
12843     }
12844
12845   inst.instruction = THUMB_OP16 (inst.instruction);
12846
12847   /* PR 10443: Do not silently ignore shifted operands.  */
12848   constraint (inst.operands[1].shifted,
12849               _("shifts in CMP/MOV instructions are only supported in unified syntax"));
12850
12851   if (inst.operands[1].isreg)
12852     {
12853       if (Rn < 8 && Rm < 8)
12854         {
12855           /* A move of two lowregs is encoded as ADD Rd, Rs, #0
12856              since a MOV instruction produces unpredictable results.  */
12857           if (inst.instruction == T_OPCODE_MOV_I8)
12858             inst.instruction = T_OPCODE_ADD_I3;
12859           else
12860             inst.instruction = T_OPCODE_CMP_LR;
12861
12862           inst.instruction |= Rn;
12863           inst.instruction |= Rm << 3;
12864         }
12865       else
12866         {
12867           if (inst.instruction == T_OPCODE_MOV_I8)
12868             inst.instruction = T_OPCODE_MOV_HR;
12869           else
12870             inst.instruction = T_OPCODE_CMP_HR;
12871           do_t_cpy ();
12872         }
12873     }
12874   else
12875     {
12876       constraint (Rn > 7,
12877                   _("only lo regs allowed with immediate"));
12878       inst.instruction |= Rn << 8;
12879       inst.relocs[0].type = BFD_RELOC_ARM_THUMB_IMM;
12880     }
12881 }
12882
12883 static void
12884 do_t_mov16 (void)
12885 {
12886   unsigned Rd;
12887   bfd_vma imm;
12888   bfd_boolean top;
12889
12890   top = (inst.instruction & 0x00800000) != 0;
12891   if (inst.relocs[0].type == BFD_RELOC_ARM_MOVW)
12892     {
12893       constraint (top, _(":lower16: not allowed in this instruction"));
12894       inst.relocs[0].type = BFD_RELOC_ARM_THUMB_MOVW;
12895     }
12896   else if (inst.relocs[0].type == BFD_RELOC_ARM_MOVT)
12897     {
12898       constraint (!top, _(":upper16: not allowed in this instruction"));
12899       inst.relocs[0].type = BFD_RELOC_ARM_THUMB_MOVT;
12900     }
12901
12902   Rd = inst.operands[0].reg;
12903   reject_bad_reg (Rd);
12904
12905   inst.instruction |= Rd << 8;
12906   if (inst.relocs[0].type == BFD_RELOC_UNUSED)
12907     {
12908       imm = inst.relocs[0].exp.X_add_number;
12909       inst.instruction |= (imm & 0xf000) << 4;
12910       inst.instruction |= (imm & 0x0800) << 15;
12911       inst.instruction |= (imm & 0x0700) << 4;
12912       inst.instruction |= (imm & 0x00ff);
12913     }
12914 }
12915
12916 static void
12917 do_t_mvn_tst (void)
12918 {
12919   unsigned Rn, Rm;
12920
12921   Rn = inst.operands[0].reg;
12922   Rm = inst.operands[1].reg;
12923
12924   if (inst.instruction == T_MNEM_cmp
12925       || inst.instruction == T_MNEM_cmn)
12926     constraint (Rn == REG_PC, BAD_PC);
12927   else
12928     reject_bad_reg (Rn);
12929   reject_bad_reg (Rm);
12930
12931   if (unified_syntax)
12932     {
12933       int r0off = (inst.instruction == T_MNEM_mvn
12934                    || inst.instruction == T_MNEM_mvns) ? 8 : 16;
12935       bfd_boolean narrow;
12936
12937       if (inst.size_req == 4
12938           || inst.instruction > 0xffff
12939           || inst.operands[1].shifted
12940           || Rn > 7 || Rm > 7)
12941         narrow = FALSE;
12942       else if (inst.instruction == T_MNEM_cmn
12943                || inst.instruction == T_MNEM_tst)
12944         narrow = TRUE;
12945       else if (THUMB_SETS_FLAGS (inst.instruction))
12946         narrow = !in_pred_block ();
12947       else
12948         narrow = in_pred_block ();
12949
12950       if (!inst.operands[1].isreg)
12951         {
12952           /* For an immediate, we always generate a 32-bit opcode;
12953              section relaxation will shrink it later if possible.  */
12954           if (inst.instruction < 0xffff)
12955             inst.instruction = THUMB_OP32 (inst.instruction);
12956           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
12957           inst.instruction |= Rn << r0off;
12958           inst.relocs[0].type = BFD_RELOC_ARM_T32_IMMEDIATE;
12959         }
12960       else
12961         {
12962           /* See if we can do this with a 16-bit instruction.  */
12963           if (narrow)
12964             {
12965               inst.instruction = THUMB_OP16 (inst.instruction);
12966               inst.instruction |= Rn;
12967               inst.instruction |= Rm << 3;
12968             }
12969           else
12970             {
12971               constraint (inst.operands[1].shifted
12972                           && inst.operands[1].immisreg,
12973                           _("shift must be constant"));
12974               if (inst.instruction < 0xffff)
12975                 inst.instruction = THUMB_OP32 (inst.instruction);
12976               inst.instruction |= Rn << r0off;
12977               encode_thumb32_shifted_operand (1);
12978             }
12979         }
12980     }
12981   else
12982     {
12983       constraint (inst.instruction > 0xffff
12984                   || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
12985       constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
12986                   _("unshifted register required"));
12987       constraint (Rn > 7 || Rm > 7,
12988                   BAD_HIREG);
12989
12990       inst.instruction = THUMB_OP16 (inst.instruction);
12991       inst.instruction |= Rn;
12992       inst.instruction |= Rm << 3;
12993     }
12994 }
12995
12996 static void
12997 do_t_mrs (void)
12998 {
12999   unsigned Rd;
13000
13001   if (do_vfp_nsyn_mrs () == SUCCESS)
13002     return;
13003
13004   Rd = inst.operands[0].reg;
13005   reject_bad_reg (Rd);
13006   inst.instruction |= Rd << 8;
13007
13008   if (inst.operands[1].isreg)
13009     {
13010       unsigned br = inst.operands[1].reg;
13011       if (((br & 0x200) == 0) && ((br & 0xf000) != 0xf000))
13012         as_bad (_("bad register for mrs"));
13013
13014       inst.instruction |= br & (0xf << 16);
13015       inst.instruction |= (br & 0x300) >> 4;
13016       inst.instruction |= (br & SPSR_BIT) >> 2;
13017     }
13018   else
13019     {
13020       int flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
13021
13022       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
13023         {
13024           /* PR gas/12698:  The constraint is only applied for m_profile.
13025              If the user has specified -march=all, we want to ignore it as
13026              we are building for any CPU type, including non-m variants.  */
13027           bfd_boolean m_profile =
13028             !ARM_FEATURE_CORE_EQUAL (selected_cpu, arm_arch_any);
13029           constraint ((flags != 0) && m_profile, _("selected processor does "
13030                                                    "not support requested special purpose register"));
13031         }
13032       else
13033         /* mrs only accepts APSR/CPSR/SPSR/CPSR_all/SPSR_all (for non-M profile
13034            devices).  */
13035         constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
13036                     _("'APSR', 'CPSR' or 'SPSR' expected"));
13037
13038       inst.instruction |= (flags & SPSR_BIT) >> 2;
13039       inst.instruction |= inst.operands[1].imm & 0xff;
13040       inst.instruction |= 0xf0000;
13041     }
13042 }
13043
13044 static void
13045 do_t_msr (void)
13046 {
13047   int flags;
13048   unsigned Rn;
13049
13050   if (do_vfp_nsyn_msr () == SUCCESS)
13051     return;
13052
13053   constraint (!inst.operands[1].isreg,
13054               _("Thumb encoding does not support an immediate here"));
13055
13056   if (inst.operands[0].isreg)
13057     flags = (int)(inst.operands[0].reg);
13058   else
13059     flags = inst.operands[0].imm;
13060
13061   if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
13062     {
13063       int bits = inst.operands[0].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
13064
13065       /* PR gas/12698:  The constraint is only applied for m_profile.
13066          If the user has specified -march=all, we want to ignore it as
13067          we are building for any CPU type, including non-m variants.  */
13068       bfd_boolean m_profile =
13069         !ARM_FEATURE_CORE_EQUAL (selected_cpu, arm_arch_any);
13070       constraint (((ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
13071            && (bits & ~(PSR_s | PSR_f)) != 0)
13072           || (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
13073               && bits != PSR_f)) && m_profile,
13074           _("selected processor does not support requested special "
13075             "purpose register"));
13076     }
13077   else
13078      constraint ((flags & 0xff) != 0, _("selected processor does not support "
13079                  "requested special purpose register"));
13080
13081   Rn = inst.operands[1].reg;
13082   reject_bad_reg (Rn);
13083
13084   inst.instruction |= (flags & SPSR_BIT) >> 2;
13085   inst.instruction |= (flags & 0xf0000) >> 8;
13086   inst.instruction |= (flags & 0x300) >> 4;
13087   inst.instruction |= (flags & 0xff);
13088   inst.instruction |= Rn << 16;
13089 }
13090
13091 static void
13092 do_t_mul (void)
13093 {
13094   bfd_boolean narrow;
13095   unsigned Rd, Rn, Rm;
13096
13097   if (!inst.operands[2].present)
13098     inst.operands[2].reg = inst.operands[0].reg;
13099
13100   Rd = inst.operands[0].reg;
13101   Rn = inst.operands[1].reg;
13102   Rm = inst.operands[2].reg;
13103
13104   if (unified_syntax)
13105     {
13106       if (inst.size_req == 4
13107           || (Rd != Rn
13108               && Rd != Rm)
13109           || Rn > 7
13110           || Rm > 7)
13111         narrow = FALSE;
13112       else if (inst.instruction == T_MNEM_muls)
13113         narrow = !in_pred_block ();
13114       else
13115         narrow = in_pred_block ();
13116     }
13117   else
13118     {
13119       constraint (inst.instruction == T_MNEM_muls, BAD_THUMB32);
13120       constraint (Rn > 7 || Rm > 7,
13121                   BAD_HIREG);
13122       narrow = TRUE;
13123     }
13124
13125   if (narrow)
13126     {
13127       /* 16-bit MULS/Conditional MUL.  */
13128       inst.instruction = THUMB_OP16 (inst.instruction);
13129       inst.instruction |= Rd;
13130
13131       if (Rd == Rn)
13132         inst.instruction |= Rm << 3;
13133       else if (Rd == Rm)
13134         inst.instruction |= Rn << 3;
13135       else
13136         constraint (1, _("dest must overlap one source register"));
13137     }
13138   else
13139     {
13140       constraint (inst.instruction != T_MNEM_mul,
13141                   _("Thumb-2 MUL must not set flags"));
13142       /* 32-bit MUL.  */
13143       inst.instruction = THUMB_OP32 (inst.instruction);
13144       inst.instruction |= Rd << 8;
13145       inst.instruction |= Rn << 16;
13146       inst.instruction |= Rm << 0;
13147
13148       reject_bad_reg (Rd);
13149       reject_bad_reg (Rn);
13150       reject_bad_reg (Rm);
13151     }
13152 }
13153
13154 static void
13155 do_t_mull (void)
13156 {
13157   unsigned RdLo, RdHi, Rn, Rm;
13158
13159   RdLo = inst.operands[0].reg;
13160   RdHi = inst.operands[1].reg;
13161   Rn = inst.operands[2].reg;
13162   Rm = inst.operands[3].reg;
13163
13164   reject_bad_reg (RdLo);
13165   reject_bad_reg (RdHi);
13166   reject_bad_reg (Rn);
13167   reject_bad_reg (Rm);
13168
13169   inst.instruction |= RdLo << 12;
13170   inst.instruction |= RdHi << 8;
13171   inst.instruction |= Rn << 16;
13172   inst.instruction |= Rm;
13173
13174  if (RdLo == RdHi)
13175     as_tsktsk (_("rdhi and rdlo must be different"));
13176 }
13177
13178 static void
13179 do_t_nop (void)
13180 {
13181   set_pred_insn_type (NEUTRAL_IT_INSN);
13182
13183   if (unified_syntax)
13184     {
13185       if (inst.size_req == 4 || inst.operands[0].imm > 15)
13186         {
13187           inst.instruction = THUMB_OP32 (inst.instruction);
13188           inst.instruction |= inst.operands[0].imm;
13189         }
13190       else
13191         {
13192           /* PR9722: Check for Thumb2 availability before
13193              generating a thumb2 nop instruction.  */
13194           if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
13195             {
13196               inst.instruction = THUMB_OP16 (inst.instruction);
13197               inst.instruction |= inst.operands[0].imm << 4;
13198             }
13199           else
13200             inst.instruction = 0x46c0;
13201         }
13202     }
13203   else
13204     {
13205       constraint (inst.operands[0].present,
13206                   _("Thumb does not support NOP with hints"));
13207       inst.instruction = 0x46c0;
13208     }
13209 }
13210
13211 static void
13212 do_t_neg (void)
13213 {
13214   if (unified_syntax)
13215     {
13216       bfd_boolean narrow;
13217
13218       if (THUMB_SETS_FLAGS (inst.instruction))
13219         narrow = !in_pred_block ();
13220       else
13221         narrow = in_pred_block ();
13222       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
13223         narrow = FALSE;
13224       if (inst.size_req == 4)
13225         narrow = FALSE;
13226
13227       if (!narrow)
13228         {
13229           inst.instruction = THUMB_OP32 (inst.instruction);
13230           inst.instruction |= inst.operands[0].reg << 8;
13231           inst.instruction |= inst.operands[1].reg << 16;
13232         }
13233       else
13234         {
13235           inst.instruction = THUMB_OP16 (inst.instruction);
13236           inst.instruction |= inst.operands[0].reg;
13237           inst.instruction |= inst.operands[1].reg << 3;
13238         }
13239     }
13240   else
13241     {
13242       constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
13243                   BAD_HIREG);
13244       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
13245
13246       inst.instruction = THUMB_OP16 (inst.instruction);
13247       inst.instruction |= inst.operands[0].reg;
13248       inst.instruction |= inst.operands[1].reg << 3;
13249     }
13250 }
13251
13252 static void
13253 do_t_orn (void)
13254 {
13255   unsigned Rd, Rn;
13256
13257   Rd = inst.operands[0].reg;
13258   Rn = inst.operands[1].present ? inst.operands[1].reg : Rd;
13259
13260   reject_bad_reg (Rd);
13261   /* Rn == REG_SP is unpredictable; Rn == REG_PC is MVN.  */
13262   reject_bad_reg (Rn);
13263
13264   inst.instruction |= Rd << 8;
13265   inst.instruction |= Rn << 16;
13266
13267   if (!inst.operands[2].isreg)
13268     {
13269       inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
13270       inst.relocs[0].type = BFD_RELOC_ARM_T32_IMMEDIATE;
13271     }
13272   else
13273     {
13274       unsigned Rm;
13275
13276       Rm = inst.operands[2].reg;
13277       reject_bad_reg (Rm);
13278
13279       constraint (inst.operands[2].shifted
13280                   && inst.operands[2].immisreg,
13281                   _("shift must be constant"));
13282       encode_thumb32_shifted_operand (2);
13283     }
13284 }
13285
13286 static void
13287 do_t_pkhbt (void)
13288 {
13289   unsigned Rd, Rn, Rm;
13290
13291   Rd = inst.operands[0].reg;
13292   Rn = inst.operands[1].reg;
13293   Rm = inst.operands[2].reg;
13294
13295   reject_bad_reg (Rd);
13296   reject_bad_reg (Rn);
13297   reject_bad_reg (Rm);
13298
13299   inst.instruction |= Rd << 8;
13300   inst.instruction |= Rn << 16;
13301   inst.instruction |= Rm;
13302   if (inst.operands[3].present)
13303     {
13304       unsigned int val = inst.relocs[0].exp.X_add_number;
13305       constraint (inst.relocs[0].exp.X_op != O_constant,
13306                   _("expression too complex"));
13307       inst.instruction |= (val & 0x1c) << 10;
13308       inst.instruction |= (val & 0x03) << 6;
13309     }
13310 }
13311
13312 static void
13313 do_t_pkhtb (void)
13314 {
13315   if (!inst.operands[3].present)
13316     {
13317       unsigned Rtmp;
13318
13319       inst.instruction &= ~0x00000020;
13320
13321       /* PR 10168.  Swap the Rm and Rn registers.  */
13322       Rtmp = inst.operands[1].reg;
13323       inst.operands[1].reg = inst.operands[2].reg;
13324       inst.operands[2].reg = Rtmp;
13325     }
13326   do_t_pkhbt ();
13327 }
13328
13329 static void
13330 do_t_pld (void)
13331 {
13332   if (inst.operands[0].immisreg)
13333     reject_bad_reg (inst.operands[0].imm);
13334
13335   encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
13336 }
13337
13338 static void
13339 do_t_push_pop (void)
13340 {
13341   unsigned mask;
13342
13343   constraint (inst.operands[0].writeback,
13344               _("push/pop do not support {reglist}^"));
13345   constraint (inst.relocs[0].type != BFD_RELOC_UNUSED,
13346               _("expression too complex"));
13347
13348   mask = inst.operands[0].imm;
13349   if (inst.size_req != 4 && (mask & ~0xff) == 0)
13350     inst.instruction = THUMB_OP16 (inst.instruction) | mask;
13351   else if (inst.size_req != 4
13352            && (mask & ~0xff) == (1U << (inst.instruction == T_MNEM_push
13353                                        ? REG_LR : REG_PC)))
13354     {
13355       inst.instruction = THUMB_OP16 (inst.instruction);
13356       inst.instruction |= THUMB_PP_PC_LR;
13357       inst.instruction |= mask & 0xff;
13358     }
13359   else if (unified_syntax)
13360     {
13361       inst.instruction = THUMB_OP32 (inst.instruction);
13362       encode_thumb2_multi (TRUE /* do_io */, 13, mask, TRUE);
13363     }
13364   else
13365     {
13366       inst.error = _("invalid register list to push/pop instruction");
13367       return;
13368     }
13369 }
13370
13371 static void
13372 do_t_clrm (void)
13373 {
13374   if (unified_syntax)
13375     encode_thumb2_multi (FALSE /* do_io */, -1, inst.operands[0].imm, FALSE);
13376   else
13377     {
13378       inst.error = _("invalid register list to push/pop instruction");
13379       return;
13380     }
13381 }
13382
13383 static void
13384 do_t_vscclrm (void)
13385 {
13386   if (inst.operands[0].issingle)
13387     {
13388       inst.instruction |= (inst.operands[0].reg & 0x1) << 22;
13389       inst.instruction |= (inst.operands[0].reg & 0x1e) << 11;
13390       inst.instruction |= inst.operands[0].imm;
13391     }
13392   else
13393     {
13394       inst.instruction |= (inst.operands[0].reg & 0x10) << 18;
13395       inst.instruction |= (inst.operands[0].reg & 0xf) << 12;
13396       inst.instruction |= 1 << 8;
13397       inst.instruction |= inst.operands[0].imm << 1;
13398     }
13399 }
13400
13401 static void
13402 do_t_rbit (void)
13403 {
13404   unsigned Rd, Rm;
13405
13406   Rd = inst.operands[0].reg;
13407   Rm = inst.operands[1].reg;
13408
13409   reject_bad_reg (Rd);
13410   reject_bad_reg (Rm);
13411
13412   inst.instruction |= Rd << 8;
13413   inst.instruction |= Rm << 16;
13414   inst.instruction |= Rm;
13415 }
13416
13417 static void
13418 do_t_rev (void)
13419 {
13420   unsigned Rd, Rm;
13421
13422   Rd = inst.operands[0].reg;
13423   Rm = inst.operands[1].reg;
13424
13425   reject_bad_reg (Rd);
13426   reject_bad_reg (Rm);
13427
13428   if (Rd <= 7 && Rm <= 7
13429       && inst.size_req != 4)
13430     {
13431       inst.instruction = THUMB_OP16 (inst.instruction);
13432       inst.instruction |= Rd;
13433       inst.instruction |= Rm << 3;
13434     }
13435   else if (unified_syntax)
13436     {
13437       inst.instruction = THUMB_OP32 (inst.instruction);
13438       inst.instruction |= Rd << 8;
13439       inst.instruction |= Rm << 16;
13440       inst.instruction |= Rm;
13441     }
13442   else
13443     inst.error = BAD_HIREG;
13444 }
13445
13446 static void
13447 do_t_rrx (void)
13448 {
13449   unsigned Rd, Rm;
13450
13451   Rd = inst.operands[0].reg;
13452   Rm = inst.operands[1].reg;
13453
13454   reject_bad_reg (Rd);
13455   reject_bad_reg (Rm);
13456
13457   inst.instruction |= Rd << 8;
13458   inst.instruction |= Rm;
13459 }
13460
13461 static void
13462 do_t_rsb (void)
13463 {
13464   unsigned Rd, Rs;
13465
13466   Rd = inst.operands[0].reg;
13467   Rs = (inst.operands[1].present
13468         ? inst.operands[1].reg    /* Rd, Rs, foo */
13469         : inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
13470
13471   reject_bad_reg (Rd);
13472   reject_bad_reg (Rs);
13473   if (inst.operands[2].isreg)
13474     reject_bad_reg (inst.operands[2].reg);
13475
13476   inst.instruction |= Rd << 8;
13477   inst.instruction |= Rs << 16;
13478   if (!inst.operands[2].isreg)
13479     {
13480       bfd_boolean narrow;
13481
13482       if ((inst.instruction & 0x00100000) != 0)
13483         narrow = !in_pred_block ();
13484       else
13485         narrow = in_pred_block ();
13486
13487       if (Rd > 7 || Rs > 7)
13488         narrow = FALSE;
13489
13490       if (inst.size_req == 4 || !unified_syntax)
13491         narrow = FALSE;
13492
13493       if (inst.relocs[0].exp.X_op != O_constant
13494           || inst.relocs[0].exp.X_add_number != 0)
13495         narrow = FALSE;
13496
13497       /* Turn rsb #0 into 16-bit neg.  We should probably do this via
13498          relaxation, but it doesn't seem worth the hassle.  */
13499       if (narrow)
13500         {
13501           inst.relocs[0].type = BFD_RELOC_UNUSED;
13502           inst.instruction = THUMB_OP16 (T_MNEM_negs);
13503           inst.instruction |= Rs << 3;
13504           inst.instruction |= Rd;
13505         }
13506       else
13507         {
13508           inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
13509           inst.relocs[0].type = BFD_RELOC_ARM_T32_IMMEDIATE;
13510         }
13511     }
13512   else
13513     encode_thumb32_shifted_operand (2);
13514 }
13515
13516 static void
13517 do_t_setend (void)
13518 {
13519   if (warn_on_deprecated
13520       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
13521       as_tsktsk (_("setend use is deprecated for ARMv8"));
13522
13523   set_pred_insn_type (OUTSIDE_PRED_INSN);
13524   if (inst.operands[0].imm)
13525     inst.instruction |= 0x8;
13526 }
13527
13528 static void
13529 do_t_shift (void)
13530 {
13531   if (!inst.operands[1].present)
13532     inst.operands[1].reg = inst.operands[0].reg;
13533
13534   if (unified_syntax)
13535     {
13536       bfd_boolean narrow;
13537       int shift_kind;
13538
13539       switch (inst.instruction)
13540         {
13541         case T_MNEM_asr:
13542         case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
13543         case T_MNEM_lsl:
13544         case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
13545         case T_MNEM_lsr:
13546         case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
13547         case T_MNEM_ror:
13548         case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
13549         default: abort ();
13550         }
13551
13552       if (THUMB_SETS_FLAGS (inst.instruction))
13553         narrow = !in_pred_block ();
13554       else
13555         narrow = in_pred_block ();
13556       if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
13557         narrow = FALSE;
13558       if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
13559         narrow = FALSE;
13560       if (inst.operands[2].isreg
13561           && (inst.operands[1].reg != inst.operands[0].reg
13562               || inst.operands[2].reg > 7))
13563         narrow = FALSE;
13564       if (inst.size_req == 4)
13565         narrow = FALSE;
13566
13567       reject_bad_reg (inst.operands[0].reg);
13568       reject_bad_reg (inst.operands[1].reg);
13569
13570       if (!narrow)
13571         {
13572           if (inst.operands[2].isreg)
13573             {
13574               reject_bad_reg (inst.operands[2].reg);
13575               inst.instruction = THUMB_OP32 (inst.instruction);
13576               inst.instruction |= inst.operands[0].reg << 8;
13577               inst.instruction |= inst.operands[1].reg << 16;
13578               inst.instruction |= inst.operands[2].reg;
13579
13580               /* PR 12854: Error on extraneous shifts.  */
13581               constraint (inst.operands[2].shifted,
13582                           _("extraneous shift as part of operand to shift insn"));
13583             }
13584           else
13585             {
13586               inst.operands[1].shifted = 1;
13587               inst.operands[1].shift_kind = shift_kind;
13588               inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
13589                                              ? T_MNEM_movs : T_MNEM_mov);
13590               inst.instruction |= inst.operands[0].reg << 8;
13591               encode_thumb32_shifted_operand (1);
13592               /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup.  */
13593               inst.relocs[0].type = BFD_RELOC_UNUSED;
13594             }
13595         }
13596       else
13597         {
13598           if (inst.operands[2].isreg)
13599             {
13600               switch (shift_kind)
13601                 {
13602                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
13603                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
13604                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
13605                 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
13606                 default: abort ();
13607                 }
13608
13609               inst.instruction |= inst.operands[0].reg;
13610               inst.instruction |= inst.operands[2].reg << 3;
13611
13612               /* PR 12854: Error on extraneous shifts.  */
13613               constraint (inst.operands[2].shifted,
13614                           _("extraneous shift as part of operand to shift insn"));
13615             }
13616           else
13617             {
13618               switch (shift_kind)
13619                 {
13620                 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
13621                 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
13622                 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
13623                 default: abort ();
13624                 }
13625               inst.relocs[0].type = BFD_RELOC_ARM_THUMB_SHIFT;
13626               inst.instruction |= inst.operands[0].reg;
13627               inst.instruction |= inst.operands[1].reg << 3;
13628             }
13629         }
13630     }
13631   else
13632     {
13633       constraint (inst.operands[0].reg > 7
13634                   || inst.operands[1].reg > 7, BAD_HIREG);
13635       constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
13636
13637       if (inst.operands[2].isreg)  /* Rd, {Rs,} Rn */
13638         {
13639           constraint (inst.operands[2].reg > 7, BAD_HIREG);
13640           constraint (inst.operands[0].reg != inst.operands[1].reg,
13641                       _("source1 and dest must be same register"));
13642
13643           switch (inst.instruction)
13644             {
13645             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
13646             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
13647             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
13648             case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
13649             default: abort ();
13650             }
13651
13652           inst.instruction |= inst.operands[0].reg;
13653           inst.instruction |= inst.operands[2].reg << 3;
13654
13655           /* PR 12854: Error on extraneous shifts.  */
13656           constraint (inst.operands[2].shifted,
13657                       _("extraneous shift as part of operand to shift insn"));
13658         }
13659       else
13660         {
13661           switch (inst.instruction)
13662             {
13663             case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
13664             case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
13665             case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
13666             case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
13667             default: abort ();
13668             }
13669           inst.relocs[0].type = BFD_RELOC_ARM_THUMB_SHIFT;
13670           inst.instruction |= inst.operands[0].reg;
13671           inst.instruction |= inst.operands[1].reg << 3;
13672         }
13673     }
13674 }
13675
13676 static void
13677 do_t_simd (void)
13678 {
13679   unsigned Rd, Rn, Rm;
13680
13681   Rd = inst.operands[0].reg;
13682   Rn = inst.operands[1].reg;
13683   Rm = inst.operands[2].reg;
13684
13685   reject_bad_reg (Rd);
13686   reject_bad_reg (Rn);
13687   reject_bad_reg (Rm);
13688
13689   inst.instruction |= Rd << 8;
13690   inst.instruction |= Rn << 16;
13691   inst.instruction |= Rm;
13692 }
13693
13694 static void
13695 do_t_simd2 (void)
13696 {
13697   unsigned Rd, Rn, Rm;
13698
13699   Rd = inst.operands[0].reg;
13700   Rm = inst.operands[1].reg;
13701   Rn = inst.operands[2].reg;
13702
13703   reject_bad_reg (Rd);
13704   reject_bad_reg (Rn);
13705   reject_bad_reg (Rm);
13706
13707   inst.instruction |= Rd << 8;
13708   inst.instruction |= Rn << 16;
13709   inst.instruction |= Rm;
13710 }
13711
13712 static void
13713 do_t_smc (void)
13714 {
13715   unsigned int value = inst.relocs[0].exp.X_add_number;
13716   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a),
13717               _("SMC is not permitted on this architecture"));
13718   constraint (inst.relocs[0].exp.X_op != O_constant,
13719               _("expression too complex"));
13720   inst.relocs[0].type = BFD_RELOC_UNUSED;
13721   inst.instruction |= (value & 0xf000) >> 12;
13722   inst.instruction |= (value & 0x0ff0);
13723   inst.instruction |= (value & 0x000f) << 16;
13724   /* PR gas/15623: SMC instructions must be last in an IT block.  */
13725   set_pred_insn_type_last ();
13726 }
13727
13728 static void
13729 do_t_hvc (void)
13730 {
13731   unsigned int value = inst.relocs[0].exp.X_add_number;
13732
13733   inst.relocs[0].type = BFD_RELOC_UNUSED;
13734   inst.instruction |= (value & 0x0fff);
13735   inst.instruction |= (value & 0xf000) << 4;
13736 }
13737
13738 static void
13739 do_t_ssat_usat (int bias)
13740 {
13741   unsigned Rd, Rn;
13742
13743   Rd = inst.operands[0].reg;
13744   Rn = inst.operands[2].reg;
13745
13746   reject_bad_reg (Rd);
13747   reject_bad_reg (Rn);
13748
13749   inst.instruction |= Rd << 8;
13750   inst.instruction |= inst.operands[1].imm - bias;
13751   inst.instruction |= Rn << 16;
13752
13753   if (inst.operands[3].present)
13754     {
13755       offsetT shift_amount = inst.relocs[0].exp.X_add_number;
13756
13757       inst.relocs[0].type = BFD_RELOC_UNUSED;
13758
13759       constraint (inst.relocs[0].exp.X_op != O_constant,
13760                   _("expression too complex"));
13761
13762       if (shift_amount != 0)
13763         {
13764           constraint (shift_amount > 31,
13765                       _("shift expression is too large"));
13766
13767           if (inst.operands[3].shift_kind == SHIFT_ASR)
13768             inst.instruction |= 0x00200000;  /* sh bit.  */
13769
13770           inst.instruction |= (shift_amount & 0x1c) << 10;
13771           inst.instruction |= (shift_amount & 0x03) << 6;
13772         }
13773     }
13774 }
13775
13776 static void
13777 do_t_ssat (void)
13778 {
13779   do_t_ssat_usat (1);
13780 }
13781
13782 static void
13783 do_t_ssat16 (void)
13784 {
13785   unsigned Rd, Rn;
13786
13787   Rd = inst.operands[0].reg;
13788   Rn = inst.operands[2].reg;
13789
13790   reject_bad_reg (Rd);
13791   reject_bad_reg (Rn);
13792
13793   inst.instruction |= Rd << 8;
13794   inst.instruction |= inst.operands[1].imm - 1;
13795   inst.instruction |= Rn << 16;
13796 }
13797
13798 static void
13799 do_t_strex (void)
13800 {
13801   constraint (!inst.operands[2].isreg || !inst.operands[2].preind
13802               || inst.operands[2].postind || inst.operands[2].writeback
13803               || inst.operands[2].immisreg || inst.operands[2].shifted
13804               || inst.operands[2].negative,
13805               BAD_ADDR_MODE);
13806
13807   constraint (inst.operands[2].reg == REG_PC, BAD_PC);
13808
13809   inst.instruction |= inst.operands[0].reg << 8;
13810   inst.instruction |= inst.operands[1].reg << 12;
13811   inst.instruction |= inst.operands[2].reg << 16;
13812   inst.relocs[0].type = BFD_RELOC_ARM_T32_OFFSET_U8;
13813 }
13814
13815 static void
13816 do_t_strexd (void)
13817 {
13818   if (!inst.operands[2].present)
13819     inst.operands[2].reg = inst.operands[1].reg + 1;
13820
13821   constraint (inst.operands[0].reg == inst.operands[1].reg
13822               || inst.operands[0].reg == inst.operands[2].reg
13823               || inst.operands[0].reg == inst.operands[3].reg,
13824               BAD_OVERLAP);
13825
13826   inst.instruction |= inst.operands[0].reg;
13827   inst.instruction |= inst.operands[1].reg << 12;
13828   inst.instruction |= inst.operands[2].reg << 8;
13829   inst.instruction |= inst.operands[3].reg << 16;
13830 }
13831
13832 static void
13833 do_t_sxtah (void)
13834 {
13835   unsigned Rd, Rn, Rm;
13836
13837   Rd = inst.operands[0].reg;
13838   Rn = inst.operands[1].reg;
13839   Rm = inst.operands[2].reg;
13840
13841   reject_bad_reg (Rd);
13842   reject_bad_reg (Rn);
13843   reject_bad_reg (Rm);
13844
13845   inst.instruction |= Rd << 8;
13846   inst.instruction |= Rn << 16;
13847   inst.instruction |= Rm;
13848   inst.instruction |= inst.operands[3].imm << 4;
13849 }
13850
13851 static void
13852 do_t_sxth (void)
13853 {
13854   unsigned Rd, Rm;
13855
13856   Rd = inst.operands[0].reg;
13857   Rm = inst.operands[1].reg;
13858
13859   reject_bad_reg (Rd);
13860   reject_bad_reg (Rm);
13861
13862   if (inst.instruction <= 0xffff
13863       && inst.size_req != 4
13864       && Rd <= 7 && Rm <= 7
13865       && (!inst.operands[2].present || inst.operands[2].imm == 0))
13866     {
13867       inst.instruction = THUMB_OP16 (inst.instruction);
13868       inst.instruction |= Rd;
13869       inst.instruction |= Rm << 3;
13870     }
13871   else if (unified_syntax)
13872     {
13873       if (inst.instruction <= 0xffff)
13874         inst.instruction = THUMB_OP32 (inst.instruction);
13875       inst.instruction |= Rd << 8;
13876       inst.instruction |= Rm;
13877       inst.instruction |= inst.operands[2].imm << 4;
13878     }
13879   else
13880     {
13881       constraint (inst.operands[2].present && inst.operands[2].imm != 0,
13882                   _("Thumb encoding does not support rotation"));
13883       constraint (1, BAD_HIREG);
13884     }
13885 }
13886
13887 static void
13888 do_t_swi (void)
13889 {
13890   inst.relocs[0].type = BFD_RELOC_ARM_SWI;
13891 }
13892
13893 static void
13894 do_t_tb (void)
13895 {
13896   unsigned Rn, Rm;
13897   int half;
13898
13899   half = (inst.instruction & 0x10) != 0;
13900   set_pred_insn_type_last ();
13901   constraint (inst.operands[0].immisreg,
13902               _("instruction requires register index"));
13903
13904   Rn = inst.operands[0].reg;
13905   Rm = inst.operands[0].imm;
13906
13907   if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
13908     constraint (Rn == REG_SP, BAD_SP);
13909   reject_bad_reg (Rm);
13910
13911   constraint (!half && inst.operands[0].shifted,
13912               _("instruction does not allow shifted index"));
13913   inst.instruction |= (Rn << 16) | Rm;
13914 }
13915
13916 static void
13917 do_t_udf (void)
13918 {
13919   if (!inst.operands[0].present)
13920     inst.operands[0].imm = 0;
13921
13922   if ((unsigned int) inst.operands[0].imm > 255 || inst.size_req == 4)
13923     {
13924       constraint (inst.size_req == 2,
13925                   _("immediate value out of range"));
13926       inst.instruction = THUMB_OP32 (inst.instruction);
13927       inst.instruction |= (inst.operands[0].imm & 0xf000u) << 4;
13928       inst.instruction |= (inst.operands[0].imm & 0x0fffu) << 0;
13929     }
13930   else
13931     {
13932       inst.instruction = THUMB_OP16 (inst.instruction);
13933       inst.instruction |= inst.operands[0].imm;
13934     }
13935
13936   set_pred_insn_type (NEUTRAL_IT_INSN);
13937 }
13938
13939
13940 static void
13941 do_t_usat (void)
13942 {
13943   do_t_ssat_usat (0);
13944 }
13945
13946 static void
13947 do_t_usat16 (void)
13948 {
13949   unsigned Rd, Rn;
13950
13951   Rd = inst.operands[0].reg;
13952   Rn = inst.operands[2].reg;
13953
13954   reject_bad_reg (Rd);
13955   reject_bad_reg (Rn);
13956
13957   inst.instruction |= Rd << 8;
13958   inst.instruction |= inst.operands[1].imm;
13959   inst.instruction |= Rn << 16;
13960 }
13961
13962 /* Checking the range of the branch offset (VAL) with NBITS bits
13963    and IS_SIGNED signedness.  Also checks the LSB to be 0.  */
13964 static int
13965 v8_1_branch_value_check (int val, int nbits, int is_signed)
13966 {
13967   gas_assert (nbits > 0 && nbits <= 32);
13968   if (is_signed)
13969     {
13970       int cmp = (1 << (nbits - 1));
13971       if ((val < -cmp) || (val >= cmp) || (val & 0x01))
13972         return FAIL;
13973     }
13974   else
13975     {
13976       if ((val <= 0) || (val >= (1 << nbits)) || (val & 0x1))
13977         return FAIL;
13978     }
13979     return SUCCESS;
13980 }
13981
13982 /* For branches in Armv8.1-M Mainline.  */
13983 static void
13984 do_t_branch_future (void)
13985 {
13986   unsigned long insn = inst.instruction;
13987
13988   inst.instruction = THUMB_OP32 (inst.instruction);
13989   if (inst.operands[0].hasreloc == 0)
13990     {
13991       if (v8_1_branch_value_check (inst.operands[0].imm, 5, FALSE) == FAIL)
13992         as_bad (BAD_BRANCH_OFF);
13993
13994       inst.instruction |= ((inst.operands[0].imm & 0x1f) >> 1) << 23;
13995     }
13996   else
13997     {
13998       inst.relocs[0].type = BFD_RELOC_THUMB_PCREL_BRANCH5;
13999       inst.relocs[0].pc_rel = 1;
14000     }
14001
14002   switch (insn)
14003     {
14004       case T_MNEM_bf:
14005         if (inst.operands[1].hasreloc == 0)
14006           {
14007             int val = inst.operands[1].imm;
14008             if (v8_1_branch_value_check (inst.operands[1].imm, 17, TRUE) == FAIL)
14009               as_bad (BAD_BRANCH_OFF);
14010
14011             int immA = (val & 0x0001f000) >> 12;
14012             int immB = (val & 0x00000ffc) >> 2;
14013             int immC = (val & 0x00000002) >> 1;
14014             inst.instruction |= (immA << 16) | (immB << 1) | (immC << 11);
14015           }
14016         else
14017           {
14018             inst.relocs[1].type = BFD_RELOC_ARM_THUMB_BF17;
14019             inst.relocs[1].pc_rel = 1;
14020           }
14021         break;
14022
14023       case T_MNEM_bfl:
14024         if (inst.operands[1].hasreloc == 0)
14025           {
14026             int val = inst.operands[1].imm;
14027             if (v8_1_branch_value_check (inst.operands[1].imm, 19, TRUE) == FAIL)
14028               as_bad (BAD_BRANCH_OFF);
14029
14030             int immA = (val & 0x0007f000) >> 12;
14031             int immB = (val & 0x00000ffc) >> 2;
14032             int immC = (val & 0x00000002) >> 1;
14033             inst.instruction |= (immA << 16) | (immB << 1) | (immC << 11);
14034           }
14035           else
14036           {
14037             inst.relocs[1].type = BFD_RELOC_ARM_THUMB_BF19;
14038             inst.relocs[1].pc_rel = 1;
14039           }
14040         break;
14041
14042       case T_MNEM_bfcsel:
14043         /* Operand 1.  */
14044         if (inst.operands[1].hasreloc == 0)
14045           {
14046             int val = inst.operands[1].imm;
14047             int immA = (val & 0x00001000) >> 12;
14048             int immB = (val & 0x00000ffc) >> 2;
14049             int immC = (val & 0x00000002) >> 1;
14050             inst.instruction |= (immA << 16) | (immB << 1) | (immC << 11);
14051           }
14052           else
14053           {
14054             inst.relocs[1].type = BFD_RELOC_ARM_THUMB_BF13;
14055             inst.relocs[1].pc_rel = 1;
14056           }
14057
14058         /* Operand 2.  */
14059         if (inst.operands[2].hasreloc == 0)
14060           {
14061               constraint ((inst.operands[0].hasreloc != 0), BAD_ARGS);
14062               int val2 = inst.operands[2].imm;
14063               int val0 = inst.operands[0].imm & 0x1f;
14064               int diff = val2 - val0;
14065               if (diff == 4)
14066                 inst.instruction |= 1 << 17; /* T bit.  */
14067               else if (diff != 2)
14068                 as_bad (_("out of range label-relative fixup value"));
14069           }
14070         else
14071           {
14072               constraint ((inst.operands[0].hasreloc == 0), BAD_ARGS);
14073               inst.relocs[2].type = BFD_RELOC_THUMB_PCREL_BFCSEL;
14074               inst.relocs[2].pc_rel = 1;
14075           }
14076
14077         /* Operand 3.  */
14078         constraint (inst.cond != COND_ALWAYS, BAD_COND);
14079         inst.instruction |= (inst.operands[3].imm & 0xf) << 18;
14080         break;
14081
14082       case T_MNEM_bfx:
14083       case T_MNEM_bflx:
14084         inst.instruction |= inst.operands[1].reg << 16;
14085         break;
14086
14087       default: abort ();
14088     }
14089 }
14090
14091 /* Helper function for do_t_loloop to handle relocations.  */
14092 static void
14093 v8_1_loop_reloc (int is_le)
14094 {
14095   if (inst.relocs[0].exp.X_op == O_constant)
14096     {
14097       int value = inst.relocs[0].exp.X_add_number;
14098       value = (is_le) ? -value : value;
14099
14100       if (v8_1_branch_value_check (value, 12, FALSE) == FAIL)
14101         as_bad (BAD_BRANCH_OFF);
14102
14103       int imml, immh;
14104
14105       immh = (value & 0x00000ffc) >> 2;
14106       imml = (value & 0x00000002) >> 1;
14107
14108       inst.instruction |= (imml << 11) | (immh << 1);
14109     }
14110   else
14111     {
14112       inst.relocs[0].type = BFD_RELOC_ARM_THUMB_LOOP12;
14113       inst.relocs[0].pc_rel = 1;
14114     }
14115 }
14116
14117 /* To handle the Scalar Low Overhead Loop instructions
14118    in Armv8.1-M Mainline.  */
14119 static void
14120 do_t_loloop (void)
14121 {
14122   unsigned long insn = inst.instruction;
14123
14124   set_pred_insn_type (OUTSIDE_PRED_INSN);
14125   inst.instruction = THUMB_OP32 (inst.instruction);
14126
14127   switch (insn)
14128     {
14129     case T_MNEM_le:
14130       /* le <label>.  */
14131       if (!inst.operands[0].present)
14132         inst.instruction |= 1 << 21;
14133
14134       v8_1_loop_reloc (TRUE);
14135       break;
14136
14137     case T_MNEM_wls:
14138       v8_1_loop_reloc (FALSE);
14139       /* Fall through.  */
14140     case T_MNEM_dls:
14141       constraint (inst.operands[1].isreg != 1, BAD_ARGS);
14142       inst.instruction |= (inst.operands[1].reg << 16);
14143       break;
14144
14145     default: abort();
14146     }
14147 }
14148
14149 /* MVE instruction encoder helpers.  */
14150 #define M_MNEM_vabav    0xee800f01
14151 #define M_MNEM_vmladav    0xeef00e00
14152 #define M_MNEM_vmladava   0xeef00e20
14153 #define M_MNEM_vmladavx   0xeef01e00
14154 #define M_MNEM_vmladavax  0xeef01e20
14155 #define M_MNEM_vmlsdav    0xeef00e01
14156 #define M_MNEM_vmlsdava   0xeef00e21
14157 #define M_MNEM_vmlsdavx   0xeef01e01
14158 #define M_MNEM_vmlsdavax  0xeef01e21
14159 #define M_MNEM_vmullt   0xee011e00
14160 #define M_MNEM_vmullb   0xee010e00
14161 #define M_MNEM_vst20    0xfc801e00
14162 #define M_MNEM_vst21    0xfc801e20
14163 #define M_MNEM_vst40    0xfc801e01
14164 #define M_MNEM_vst41    0xfc801e21
14165 #define M_MNEM_vst42    0xfc801e41
14166 #define M_MNEM_vst43    0xfc801e61
14167 #define M_MNEM_vld20    0xfc901e00
14168 #define M_MNEM_vld21    0xfc901e20
14169 #define M_MNEM_vld40    0xfc901e01
14170 #define M_MNEM_vld41    0xfc901e21
14171 #define M_MNEM_vld42    0xfc901e41
14172 #define M_MNEM_vld43    0xfc901e61
14173 #define M_MNEM_vstrb    0xec000e00
14174 #define M_MNEM_vstrh    0xec000e10
14175 #define M_MNEM_vstrw    0xec000e40
14176 #define M_MNEM_vstrd    0xec000e50
14177 #define M_MNEM_vldrb    0xec100e00
14178 #define M_MNEM_vldrh    0xec100e10
14179 #define M_MNEM_vldrw    0xec100e40
14180 #define M_MNEM_vldrd    0xec100e50
14181 #define M_MNEM_vmovlt   0xeea01f40
14182 #define M_MNEM_vmovlb   0xeea00f40
14183 #define M_MNEM_vmovnt   0xfe311e81
14184 #define M_MNEM_vmovnb   0xfe310e81
14185 #define M_MNEM_vadc     0xee300f00
14186 #define M_MNEM_vadci    0xee301f00
14187 #define M_MNEM_vbrsr    0xfe011e60
14188 #define M_MNEM_vaddlv   0xee890f00
14189 #define M_MNEM_vaddlva  0xee890f20
14190 #define M_MNEM_vaddv    0xeef10f00
14191 #define M_MNEM_vaddva   0xeef10f20
14192 #define M_MNEM_vddup    0xee011f6e
14193 #define M_MNEM_vdwdup   0xee011f60
14194 #define M_MNEM_vidup    0xee010f6e
14195 #define M_MNEM_viwdup   0xee010f60
14196 #define M_MNEM_vmaxv    0xeee20f00
14197 #define M_MNEM_vmaxav   0xeee00f00
14198 #define M_MNEM_vminv    0xeee20f80
14199 #define M_MNEM_vminav   0xeee00f80
14200 #define M_MNEM_vmlaldav   0xee800e00
14201 #define M_MNEM_vmlaldava  0xee800e20
14202 #define M_MNEM_vmlaldavx  0xee801e00
14203 #define M_MNEM_vmlaldavax 0xee801e20
14204 #define M_MNEM_vmlsldav   0xee800e01
14205 #define M_MNEM_vmlsldava  0xee800e21
14206 #define M_MNEM_vmlsldavx  0xee801e01
14207 #define M_MNEM_vmlsldavax 0xee801e21
14208 #define M_MNEM_vrmlaldavhx  0xee801f00
14209 #define M_MNEM_vrmlaldavhax 0xee801f20
14210 #define M_MNEM_vrmlsldavh   0xfe800e01
14211 #define M_MNEM_vrmlsldavha  0xfe800e21
14212 #define M_MNEM_vrmlsldavhx  0xfe801e01
14213 #define M_MNEM_vrmlsldavhax 0xfe801e21
14214 #define M_MNEM_vqmovnt    0xee331e01
14215 #define M_MNEM_vqmovnb    0xee330e01
14216 #define M_MNEM_vqmovunt   0xee311e81
14217 #define M_MNEM_vqmovunb   0xee310e81
14218 #define M_MNEM_vshrnt       0xee801fc1
14219 #define M_MNEM_vshrnb       0xee800fc1
14220 #define M_MNEM_vrshrnt      0xfe801fc1
14221 #define M_MNEM_vqshrnt      0xee801f40
14222 #define M_MNEM_vqshrnb      0xee800f40
14223 #define M_MNEM_vqshrunt     0xee801fc0
14224 #define M_MNEM_vqshrunb     0xee800fc0
14225 #define M_MNEM_vrshrnb      0xfe800fc1
14226 #define M_MNEM_vqrshrnt     0xee801f41
14227 #define M_MNEM_vqrshrnb     0xee800f41
14228 #define M_MNEM_vqrshrunt    0xfe801fc0
14229 #define M_MNEM_vqrshrunb    0xfe800fc0
14230
14231 /* Neon instruction encoder helpers.  */
14232
14233 /* Encodings for the different types for various Neon opcodes.  */
14234
14235 /* An "invalid" code for the following tables.  */
14236 #define N_INV -1u
14237
14238 struct neon_tab_entry
14239 {
14240   unsigned integer;
14241   unsigned float_or_poly;
14242   unsigned scalar_or_imm;
14243 };
14244
14245 /* Map overloaded Neon opcodes to their respective encodings.  */
14246 #define NEON_ENC_TAB                                    \
14247   X(vabd,       0x0000700, 0x1200d00, N_INV),           \
14248   X(vabdl,      0x0800700, N_INV,     N_INV),           \
14249   X(vmax,       0x0000600, 0x0000f00, N_INV),           \
14250   X(vmin,       0x0000610, 0x0200f00, N_INV),           \
14251   X(vpadd,      0x0000b10, 0x1000d00, N_INV),           \
14252   X(vpmax,      0x0000a00, 0x1000f00, N_INV),           \
14253   X(vpmin,      0x0000a10, 0x1200f00, N_INV),           \
14254   X(vadd,       0x0000800, 0x0000d00, N_INV),           \
14255   X(vaddl,      0x0800000, N_INV,     N_INV),           \
14256   X(vsub,       0x1000800, 0x0200d00, N_INV),           \
14257   X(vsubl,      0x0800200, N_INV,     N_INV),           \
14258   X(vceq,       0x1000810, 0x0000e00, 0x1b10100),       \
14259   X(vcge,       0x0000310, 0x1000e00, 0x1b10080),       \
14260   X(vcgt,       0x0000300, 0x1200e00, 0x1b10000),       \
14261   /* Register variants of the following two instructions are encoded as
14262      vcge / vcgt with the operands reversed.  */        \
14263   X(vclt,       0x0000300, 0x1200e00, 0x1b10200),       \
14264   X(vcle,       0x0000310, 0x1000e00, 0x1b10180),       \
14265   X(vfma,       N_INV, 0x0000c10, N_INV),               \
14266   X(vfms,       N_INV, 0x0200c10, N_INV),               \
14267   X(vmla,       0x0000900, 0x0000d10, 0x0800040),       \
14268   X(vmls,       0x1000900, 0x0200d10, 0x0800440),       \
14269   X(vmul,       0x0000910, 0x1000d10, 0x0800840),       \
14270   X(vmull,      0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float.  */ \
14271   X(vmlal,      0x0800800, N_INV,     0x0800240),       \
14272   X(vmlsl,      0x0800a00, N_INV,     0x0800640),       \
14273   X(vqdmlal,    0x0800900, N_INV,     0x0800340),       \
14274   X(vqdmlsl,    0x0800b00, N_INV,     0x0800740),       \
14275   X(vqdmull,    0x0800d00, N_INV,     0x0800b40),       \
14276   X(vqdmulh,    0x0000b00, N_INV,     0x0800c40),       \
14277   X(vqrdmulh,   0x1000b00, N_INV,     0x0800d40),       \
14278   X(vqrdmlah,   0x3000b10, N_INV,     0x0800e40),       \
14279   X(vqrdmlsh,   0x3000c10, N_INV,     0x0800f40),       \
14280   X(vshl,       0x0000400, N_INV,     0x0800510),       \
14281   X(vqshl,      0x0000410, N_INV,     0x0800710),       \
14282   X(vand,       0x0000110, N_INV,     0x0800030),       \
14283   X(vbic,       0x0100110, N_INV,     0x0800030),       \
14284   X(veor,       0x1000110, N_INV,     N_INV),           \
14285   X(vorn,       0x0300110, N_INV,     0x0800010),       \
14286   X(vorr,       0x0200110, N_INV,     0x0800010),       \
14287   X(vmvn,       0x1b00580, N_INV,     0x0800030),       \
14288   X(vshll,      0x1b20300, N_INV,     0x0800a10), /* max shift, immediate.  */ \
14289   X(vcvt,       0x1b30600, N_INV,     0x0800e10), /* integer, fixed-point.  */ \
14290   X(vdup,       0xe800b10, N_INV,     0x1b00c00), /* arm, scalar.  */ \
14291   X(vld1,       0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup.  */ \
14292   X(vst1,       0x0000000, 0x0800000, N_INV),           \
14293   X(vld2,       0x0200100, 0x0a00100, 0x0a00d00),       \
14294   X(vst2,       0x0000100, 0x0800100, N_INV),           \
14295   X(vld3,       0x0200200, 0x0a00200, 0x0a00e00),       \
14296   X(vst3,       0x0000200, 0x0800200, N_INV),           \
14297   X(vld4,       0x0200300, 0x0a00300, 0x0a00f00),       \
14298   X(vst4,       0x0000300, 0x0800300, N_INV),           \
14299   X(vmovn,      0x1b20200, N_INV,     N_INV),           \
14300   X(vtrn,       0x1b20080, N_INV,     N_INV),           \
14301   X(vqmovn,     0x1b20200, N_INV,     N_INV),           \
14302   X(vqmovun,    0x1b20240, N_INV,     N_INV),           \
14303   X(vnmul,      0xe200a40, 0xe200b40, N_INV),           \
14304   X(vnmla,      0xe100a40, 0xe100b40, N_INV),           \
14305   X(vnmls,      0xe100a00, 0xe100b00, N_INV),           \
14306   X(vfnma,      0xe900a40, 0xe900b40, N_INV),           \
14307   X(vfnms,      0xe900a00, 0xe900b00, N_INV),           \
14308   X(vcmp,       0xeb40a40, 0xeb40b40, N_INV),           \
14309   X(vcmpz,      0xeb50a40, 0xeb50b40, N_INV),           \
14310   X(vcmpe,      0xeb40ac0, 0xeb40bc0, N_INV),           \
14311   X(vcmpez,     0xeb50ac0, 0xeb50bc0, N_INV),           \
14312   X(vseleq,     0xe000a00, N_INV,     N_INV),           \
14313   X(vselvs,     0xe100a00, N_INV,     N_INV),           \
14314   X(vselge,     0xe200a00, N_INV,     N_INV),           \
14315   X(vselgt,     0xe300a00, N_INV,     N_INV),           \
14316   X(vmaxnm,     0xe800a00, 0x3000f10, N_INV),           \
14317   X(vminnm,     0xe800a40, 0x3200f10, N_INV),           \
14318   X(vcvta,      0xebc0a40, 0x3bb0000, N_INV),           \
14319   X(vrintr,     0xeb60a40, 0x3ba0400, N_INV),           \
14320   X(vrinta,     0xeb80a40, 0x3ba0400, N_INV),           \
14321   X(aes,        0x3b00300, N_INV,     N_INV),           \
14322   X(sha3op,     0x2000c00, N_INV,     N_INV),           \
14323   X(sha1h,      0x3b902c0, N_INV,     N_INV),           \
14324   X(sha2op,     0x3ba0380, N_INV,     N_INV)
14325
14326 enum neon_opc
14327 {
14328 #define X(OPC,I,F,S) N_MNEM_##OPC
14329 NEON_ENC_TAB
14330 #undef X
14331 };
14332
14333 static const struct neon_tab_entry neon_enc_tab[] =
14334 {
14335 #define X(OPC,I,F,S) { (I), (F), (S) }
14336 NEON_ENC_TAB
14337 #undef X
14338 };
14339
14340 /* Do not use these macros; instead, use NEON_ENCODE defined below.  */
14341 #define NEON_ENC_INTEGER_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
14342 #define NEON_ENC_ARMREG_(X)  (neon_enc_tab[(X) & 0x0fffffff].integer)
14343 #define NEON_ENC_POLY_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
14344 #define NEON_ENC_FLOAT_(X)   (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
14345 #define NEON_ENC_SCALAR_(X)  (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
14346 #define NEON_ENC_IMMED_(X)   (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
14347 #define NEON_ENC_INTERLV_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
14348 #define NEON_ENC_LANE_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
14349 #define NEON_ENC_DUP_(X)     (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
14350 #define NEON_ENC_SINGLE_(X) \
14351   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
14352 #define NEON_ENC_DOUBLE_(X) \
14353   ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
14354 #define NEON_ENC_FPV8_(X) \
14355   ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf000000))
14356
14357 #define NEON_ENCODE(type, inst)                                 \
14358   do                                                            \
14359     {                                                           \
14360       inst.instruction = NEON_ENC_##type##_ (inst.instruction); \
14361       inst.is_neon = 1;                                         \
14362     }                                                           \
14363   while (0)
14364
14365 #define check_neon_suffixes                                             \
14366   do                                                                    \
14367     {                                                                   \
14368       if (!inst.error && inst.vectype.elems > 0 && !inst.is_neon)       \
14369         {                                                               \
14370           as_bad (_("invalid neon suffix for non neon instruction"));   \
14371           return;                                                       \
14372         }                                                               \
14373     }                                                                   \
14374   while (0)
14375
14376 /* Define shapes for instruction operands. The following mnemonic characters
14377    are used in this table:
14378
14379      F - VFP S<n> register
14380      D - Neon D<n> register
14381      Q - Neon Q<n> register
14382      I - Immediate
14383      S - Scalar
14384      R - ARM register
14385      L - D<n> register list
14386
14387    This table is used to generate various data:
14388      - enumerations of the form NS_DDR to be used as arguments to
14389        neon_select_shape.
14390      - a table classifying shapes into single, double, quad, mixed.
14391      - a table used to drive neon_select_shape.  */
14392
14393 #define NEON_SHAPE_DEF                  \
14394   X(4, (R, R, Q, Q), QUAD),             \
14395   X(4, (Q, R, R, I), QUAD),             \
14396   X(4, (R, R, S, S), QUAD),             \
14397   X(4, (S, S, R, R), QUAD),             \
14398   X(3, (Q, R, I), QUAD),                \
14399   X(3, (I, Q, Q), QUAD),                \
14400   X(3, (I, Q, R), QUAD),                \
14401   X(3, (R, Q, Q), QUAD),                \
14402   X(3, (D, D, D), DOUBLE),              \
14403   X(3, (Q, Q, Q), QUAD),                \
14404   X(3, (D, D, I), DOUBLE),              \
14405   X(3, (Q, Q, I), QUAD),                \
14406   X(3, (D, D, S), DOUBLE),              \
14407   X(3, (Q, Q, S), QUAD),                \
14408   X(3, (Q, Q, R), QUAD),                \
14409   X(3, (R, R, Q), QUAD),                \
14410   X(2, (R, Q),    QUAD),                \
14411   X(2, (D, D), DOUBLE),                 \
14412   X(2, (Q, Q), QUAD),                   \
14413   X(2, (D, S), DOUBLE),                 \
14414   X(2, (Q, S), QUAD),                   \
14415   X(2, (D, R), DOUBLE),                 \
14416   X(2, (Q, R), QUAD),                   \
14417   X(2, (D, I), DOUBLE),                 \
14418   X(2, (Q, I), QUAD),                   \
14419   X(3, (D, L, D), DOUBLE),              \
14420   X(2, (D, Q), MIXED),                  \
14421   X(2, (Q, D), MIXED),                  \
14422   X(3, (D, Q, I), MIXED),               \
14423   X(3, (Q, D, I), MIXED),               \
14424   X(3, (Q, D, D), MIXED),               \
14425   X(3, (D, Q, Q), MIXED),               \
14426   X(3, (Q, Q, D), MIXED),               \
14427   X(3, (Q, D, S), MIXED),               \
14428   X(3, (D, Q, S), MIXED),               \
14429   X(4, (D, D, D, I), DOUBLE),           \
14430   X(4, (Q, Q, Q, I), QUAD),             \
14431   X(4, (D, D, S, I), DOUBLE),           \
14432   X(4, (Q, Q, S, I), QUAD),             \
14433   X(2, (F, F), SINGLE),                 \
14434   X(3, (F, F, F), SINGLE),              \
14435   X(2, (F, I), SINGLE),                 \
14436   X(2, (F, D), MIXED),                  \
14437   X(2, (D, F), MIXED),                  \
14438   X(3, (F, F, I), MIXED),               \
14439   X(4, (R, R, F, F), SINGLE),           \
14440   X(4, (F, F, R, R), SINGLE),           \
14441   X(3, (D, R, R), DOUBLE),              \
14442   X(3, (R, R, D), DOUBLE),              \
14443   X(2, (S, R), SINGLE),                 \
14444   X(2, (R, S), SINGLE),                 \
14445   X(2, (F, R), SINGLE),                 \
14446   X(2, (R, F), SINGLE),                 \
14447 /* Half float shape supported so far.  */\
14448   X (2, (H, D), MIXED),                 \
14449   X (2, (D, H), MIXED),                 \
14450   X (2, (H, F), MIXED),                 \
14451   X (2, (F, H), MIXED),                 \
14452   X (2, (H, H), HALF),                  \
14453   X (2, (H, R), HALF),                  \
14454   X (2, (R, H), HALF),                  \
14455   X (2, (H, I), HALF),                  \
14456   X (3, (H, H, H), HALF),               \
14457   X (3, (H, F, I), MIXED),              \
14458   X (3, (F, H, I), MIXED),              \
14459   X (3, (D, H, H), MIXED),              \
14460   X (3, (D, H, S), MIXED)
14461
14462 #define S2(A,B)         NS_##A##B
14463 #define S3(A,B,C)       NS_##A##B##C
14464 #define S4(A,B,C,D)     NS_##A##B##C##D
14465
14466 #define X(N, L, C) S##N L
14467
14468 enum neon_shape
14469 {
14470   NEON_SHAPE_DEF,
14471   NS_NULL
14472 };
14473
14474 #undef X
14475 #undef S2
14476 #undef S3
14477 #undef S4
14478
14479 enum neon_shape_class
14480 {
14481   SC_HALF,
14482   SC_SINGLE,
14483   SC_DOUBLE,
14484   SC_QUAD,
14485   SC_MIXED
14486 };
14487
14488 #define X(N, L, C) SC_##C
14489
14490 static enum neon_shape_class neon_shape_class[] =
14491 {
14492   NEON_SHAPE_DEF
14493 };
14494
14495 #undef X
14496
14497 enum neon_shape_el
14498 {
14499   SE_H,
14500   SE_F,
14501   SE_D,
14502   SE_Q,
14503   SE_I,
14504   SE_S,
14505   SE_R,
14506   SE_L
14507 };
14508
14509 /* Register widths of above.  */
14510 static unsigned neon_shape_el_size[] =
14511 {
14512   16,
14513   32,
14514   64,
14515   128,
14516   0,
14517   32,
14518   32,
14519   0
14520 };
14521
14522 struct neon_shape_info
14523 {
14524   unsigned els;
14525   enum neon_shape_el el[NEON_MAX_TYPE_ELS];
14526 };
14527
14528 #define S2(A,B)         { SE_##A, SE_##B }
14529 #define S3(A,B,C)       { SE_##A, SE_##B, SE_##C }
14530 #define S4(A,B,C,D)     { SE_##A, SE_##B, SE_##C, SE_##D }
14531
14532 #define X(N, L, C) { N, S##N L }
14533
14534 static struct neon_shape_info neon_shape_tab[] =
14535 {
14536   NEON_SHAPE_DEF
14537 };
14538
14539 #undef X
14540 #undef S2
14541 #undef S3
14542 #undef S4
14543
14544 /* Bit masks used in type checking given instructions.
14545   'N_EQK' means the type must be the same as (or based on in some way) the key
14546    type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
14547    set, various other bits can be set as well in order to modify the meaning of
14548    the type constraint.  */
14549
14550 enum neon_type_mask
14551 {
14552   N_S8   = 0x0000001,
14553   N_S16  = 0x0000002,
14554   N_S32  = 0x0000004,
14555   N_S64  = 0x0000008,
14556   N_U8   = 0x0000010,
14557   N_U16  = 0x0000020,
14558   N_U32  = 0x0000040,
14559   N_U64  = 0x0000080,
14560   N_I8   = 0x0000100,
14561   N_I16  = 0x0000200,
14562   N_I32  = 0x0000400,
14563   N_I64  = 0x0000800,
14564   N_8    = 0x0001000,
14565   N_16   = 0x0002000,
14566   N_32   = 0x0004000,
14567   N_64   = 0x0008000,
14568   N_P8   = 0x0010000,
14569   N_P16  = 0x0020000,
14570   N_F16  = 0x0040000,
14571   N_F32  = 0x0080000,
14572   N_F64  = 0x0100000,
14573   N_P64  = 0x0200000,
14574   N_KEY  = 0x1000000, /* Key element (main type specifier).  */
14575   N_EQK  = 0x2000000, /* Given operand has the same type & size as the key.  */
14576   N_VFP  = 0x4000000, /* VFP mode: operand size must match register width.  */
14577   N_UNT  = 0x8000000, /* Must be explicitly untyped.  */
14578   N_DBL  = 0x0000001, /* If N_EQK, this operand is twice the size.  */
14579   N_HLF  = 0x0000002, /* If N_EQK, this operand is half the size.  */
14580   N_SGN  = 0x0000004, /* If N_EQK, this operand is forced to be signed.  */
14581   N_UNS  = 0x0000008, /* If N_EQK, this operand is forced to be unsigned.  */
14582   N_INT  = 0x0000010, /* If N_EQK, this operand is forced to be integer.  */
14583   N_FLT  = 0x0000020, /* If N_EQK, this operand is forced to be float.  */
14584   N_SIZ  = 0x0000040, /* If N_EQK, this operand is forced to be size-only.  */
14585   N_UTYP = 0,
14586   N_MAX_NONSPECIAL = N_P64
14587 };
14588
14589 #define N_ALLMODS  (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
14590
14591 #define N_SU_ALL   (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
14592 #define N_SU_32    (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
14593 #define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
14594 #define N_S_32     (N_S8 | N_S16 | N_S32)
14595 #define N_F_16_32  (N_F16 | N_F32)
14596 #define N_SUF_32   (N_SU_32 | N_F_16_32)
14597 #define N_I_ALL    (N_I8 | N_I16 | N_I32 | N_I64)
14598 #define N_IF_32    (N_I8 | N_I16 | N_I32 | N_F16 | N_F32)
14599 #define N_F_ALL    (N_F16 | N_F32 | N_F64)
14600 #define N_I_MVE    (N_I8 | N_I16 | N_I32)
14601 #define N_F_MVE    (N_F16 | N_F32)
14602 #define N_SU_MVE   (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
14603
14604 /* Pass this as the first type argument to neon_check_type to ignore types
14605    altogether.  */
14606 #define N_IGNORE_TYPE (N_KEY | N_EQK)
14607
14608 /* Select a "shape" for the current instruction (describing register types or
14609    sizes) from a list of alternatives. Return NS_NULL if the current instruction
14610    doesn't fit. For non-polymorphic shapes, checking is usually done as a
14611    function of operand parsing, so this function doesn't need to be called.
14612    Shapes should be listed in order of decreasing length.  */
14613
14614 static enum neon_shape
14615 neon_select_shape (enum neon_shape shape, ...)
14616 {
14617   va_list ap;
14618   enum neon_shape first_shape = shape;
14619
14620   /* Fix missing optional operands. FIXME: we don't know at this point how
14621      many arguments we should have, so this makes the assumption that we have
14622      > 1. This is true of all current Neon opcodes, I think, but may not be
14623      true in the future.  */
14624   if (!inst.operands[1].present)
14625     inst.operands[1] = inst.operands[0];
14626
14627   va_start (ap, shape);
14628
14629   for (; shape != NS_NULL; shape = (enum neon_shape) va_arg (ap, int))
14630     {
14631       unsigned j;
14632       int matches = 1;
14633
14634       for (j = 0; j < neon_shape_tab[shape].els; j++)
14635         {
14636           if (!inst.operands[j].present)
14637             {
14638               matches = 0;
14639               break;
14640             }
14641
14642           switch (neon_shape_tab[shape].el[j])
14643             {
14644               /* If a  .f16,  .16,  .u16,  .s16 type specifier is given over
14645                  a VFP single precision register operand, it's essentially
14646                  means only half of the register is used.
14647
14648                  If the type specifier is given after the mnemonics, the
14649                  information is stored in inst.vectype.  If the type specifier
14650                  is given after register operand, the information is stored
14651                  in inst.operands[].vectype.
14652
14653                  When there is only one type specifier, and all the register
14654                  operands are the same type of hardware register, the type
14655                  specifier applies to all register operands.
14656
14657                  If no type specifier is given, the shape is inferred from
14658                  operand information.
14659
14660                  for example:
14661                  vadd.f16 s0, s1, s2:           NS_HHH
14662                  vabs.f16 s0, s1:               NS_HH
14663                  vmov.f16 s0, r1:               NS_HR
14664                  vmov.f16 r0, s1:               NS_RH
14665                  vcvt.f16 r0, s1:               NS_RH
14666                  vcvt.f16.s32   s2, s2, #29:    NS_HFI
14667                  vcvt.f16.s32   s2, s2:         NS_HF
14668               */
14669             case SE_H:
14670               if (!(inst.operands[j].isreg
14671                     && inst.operands[j].isvec
14672                     && inst.operands[j].issingle
14673                     && !inst.operands[j].isquad
14674                     && ((inst.vectype.elems == 1
14675                          && inst.vectype.el[0].size == 16)
14676                         || (inst.vectype.elems > 1
14677                             && inst.vectype.el[j].size == 16)
14678                         || (inst.vectype.elems == 0
14679                             && inst.operands[j].vectype.type != NT_invtype
14680                             && inst.operands[j].vectype.size == 16))))
14681                 matches = 0;
14682               break;
14683
14684             case SE_F:
14685               if (!(inst.operands[j].isreg
14686                     && inst.operands[j].isvec
14687                     && inst.operands[j].issingle
14688                     && !inst.operands[j].isquad
14689                     && ((inst.vectype.elems == 1 && inst.vectype.el[0].size == 32)
14690                         || (inst.vectype.elems > 1 && inst.vectype.el[j].size == 32)
14691                         || (inst.vectype.elems == 0
14692                             && (inst.operands[j].vectype.size == 32
14693                                 || inst.operands[j].vectype.type == NT_invtype)))))
14694                 matches = 0;
14695               break;
14696
14697             case SE_D:
14698               if (!(inst.operands[j].isreg
14699                     && inst.operands[j].isvec
14700                     && !inst.operands[j].isquad
14701                     && !inst.operands[j].issingle))
14702                 matches = 0;
14703               break;
14704
14705             case SE_R:
14706               if (!(inst.operands[j].isreg
14707                     && !inst.operands[j].isvec))
14708                 matches = 0;
14709               break;
14710
14711             case SE_Q:
14712               if (!(inst.operands[j].isreg
14713                     && inst.operands[j].isvec
14714                     && inst.operands[j].isquad
14715                     && !inst.operands[j].issingle))
14716                 matches = 0;
14717               break;
14718
14719             case SE_I:
14720               if (!(!inst.operands[j].isreg
14721                     && !inst.operands[j].isscalar))
14722                 matches = 0;
14723               break;
14724
14725             case SE_S:
14726               if (!(!inst.operands[j].isreg
14727                     && inst.operands[j].isscalar))
14728                 matches = 0;
14729               break;
14730
14731             case SE_L:
14732               break;
14733             }
14734           if (!matches)
14735             break;
14736         }
14737       if (matches && (j >= ARM_IT_MAX_OPERANDS || !inst.operands[j].present))
14738         /* We've matched all the entries in the shape table, and we don't
14739            have any left over operands which have not been matched.  */
14740         break;
14741     }
14742
14743   va_end (ap);
14744
14745   if (shape == NS_NULL && first_shape != NS_NULL)
14746     first_error (_("invalid instruction shape"));
14747
14748   return shape;
14749 }
14750
14751 /* True if SHAPE is predominantly a quadword operation (most of the time, this
14752    means the Q bit should be set).  */
14753
14754 static int
14755 neon_quad (enum neon_shape shape)
14756 {
14757   return neon_shape_class[shape] == SC_QUAD;
14758 }
14759
14760 static void
14761 neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
14762                        unsigned *g_size)
14763 {
14764   /* Allow modification to be made to types which are constrained to be
14765      based on the key element, based on bits set alongside N_EQK.  */
14766   if ((typebits & N_EQK) != 0)
14767     {
14768       if ((typebits & N_HLF) != 0)
14769         *g_size /= 2;
14770       else if ((typebits & N_DBL) != 0)
14771         *g_size *= 2;
14772       if ((typebits & N_SGN) != 0)
14773         *g_type = NT_signed;
14774       else if ((typebits & N_UNS) != 0)
14775         *g_type = NT_unsigned;
14776       else if ((typebits & N_INT) != 0)
14777         *g_type = NT_integer;
14778       else if ((typebits & N_FLT) != 0)
14779         *g_type = NT_float;
14780       else if ((typebits & N_SIZ) != 0)
14781         *g_type = NT_untyped;
14782     }
14783 }
14784
14785 /* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
14786    operand type, i.e. the single type specified in a Neon instruction when it
14787    is the only one given.  */
14788
14789 static struct neon_type_el
14790 neon_type_promote (struct neon_type_el *key, unsigned thisarg)
14791 {
14792   struct neon_type_el dest = *key;
14793
14794   gas_assert ((thisarg & N_EQK) != 0);
14795
14796   neon_modify_type_size (thisarg, &dest.type, &dest.size);
14797
14798   return dest;
14799 }
14800
14801 /* Convert Neon type and size into compact bitmask representation.  */
14802
14803 static enum neon_type_mask
14804 type_chk_of_el_type (enum neon_el_type type, unsigned size)
14805 {
14806   switch (type)
14807     {
14808     case NT_untyped:
14809       switch (size)
14810         {
14811         case 8:  return N_8;
14812         case 16: return N_16;
14813         case 32: return N_32;
14814         case 64: return N_64;
14815         default: ;
14816         }
14817       break;
14818
14819     case NT_integer:
14820       switch (size)
14821         {
14822         case 8:  return N_I8;
14823         case 16: return N_I16;
14824         case 32: return N_I32;
14825         case 64: return N_I64;
14826         default: ;
14827         }
14828       break;
14829
14830     case NT_float:
14831       switch (size)
14832         {
14833         case 16: return N_F16;
14834         case 32: return N_F32;
14835         case 64: return N_F64;
14836         default: ;
14837         }
14838       break;
14839
14840     case NT_poly:
14841       switch (size)
14842         {
14843         case 8:  return N_P8;
14844         case 16: return N_P16;
14845         case 64: return N_P64;
14846         default: ;
14847         }
14848       break;
14849
14850     case NT_signed:
14851       switch (size)
14852         {
14853         case 8:  return N_S8;
14854         case 16: return N_S16;
14855         case 32: return N_S32;
14856         case 64: return N_S64;
14857         default: ;
14858         }
14859       break;
14860
14861     case NT_unsigned:
14862       switch (size)
14863         {
14864         case 8:  return N_U8;
14865         case 16: return N_U16;
14866         case 32: return N_U32;
14867         case 64: return N_U64;
14868         default: ;
14869         }
14870       break;
14871
14872     default: ;
14873     }
14874
14875   return N_UTYP;
14876 }
14877
14878 /* Convert compact Neon bitmask type representation to a type and size. Only
14879    handles the case where a single bit is set in the mask.  */
14880
14881 static int
14882 el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
14883                      enum neon_type_mask mask)
14884 {
14885   if ((mask & N_EQK) != 0)
14886     return FAIL;
14887
14888   if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
14889     *size = 8;
14890   else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_F16 | N_P16)) != 0)
14891     *size = 16;
14892   else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
14893     *size = 32;
14894   else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64 | N_P64)) != 0)
14895     *size = 64;
14896   else
14897     return FAIL;
14898
14899   if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
14900     *type = NT_signed;
14901   else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
14902     *type = NT_unsigned;
14903   else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
14904     *type = NT_integer;
14905   else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
14906     *type = NT_untyped;
14907   else if ((mask & (N_P8 | N_P16 | N_P64)) != 0)
14908     *type = NT_poly;
14909   else if ((mask & (N_F_ALL)) != 0)
14910     *type = NT_float;
14911   else
14912     return FAIL;
14913
14914   return SUCCESS;
14915 }
14916
14917 /* Modify a bitmask of allowed types. This is only needed for type
14918    relaxation.  */
14919
14920 static unsigned
14921 modify_types_allowed (unsigned allowed, unsigned mods)
14922 {
14923   unsigned size;
14924   enum neon_el_type type;
14925   unsigned destmask;
14926   int i;
14927
14928   destmask = 0;
14929
14930   for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
14931     {
14932       if (el_type_of_type_chk (&type, &size,
14933                                (enum neon_type_mask) (allowed & i)) == SUCCESS)
14934         {
14935           neon_modify_type_size (mods, &type, &size);
14936           destmask |= type_chk_of_el_type (type, size);
14937         }
14938     }
14939
14940   return destmask;
14941 }
14942
14943 /* Check type and return type classification.
14944    The manual states (paraphrase): If one datatype is given, it indicates the
14945    type given in:
14946     - the second operand, if there is one
14947     - the operand, if there is no second operand
14948     - the result, if there are no operands.
14949    This isn't quite good enough though, so we use a concept of a "key" datatype
14950    which is set on a per-instruction basis, which is the one which matters when
14951    only one data type is written.
14952    Note: this function has side-effects (e.g. filling in missing operands). All
14953    Neon instructions should call it before performing bit encoding.  */
14954
14955 static struct neon_type_el
14956 neon_check_type (unsigned els, enum neon_shape ns, ...)
14957 {
14958   va_list ap;
14959   unsigned i, pass, key_el = 0;
14960   unsigned types[NEON_MAX_TYPE_ELS];
14961   enum neon_el_type k_type = NT_invtype;
14962   unsigned k_size = -1u;
14963   struct neon_type_el badtype = {NT_invtype, -1};
14964   unsigned key_allowed = 0;
14965
14966   /* Optional registers in Neon instructions are always (not) in operand 1.
14967      Fill in the missing operand here, if it was omitted.  */
14968   if (els > 1 && !inst.operands[1].present)
14969     inst.operands[1] = inst.operands[0];
14970
14971   /* Suck up all the varargs.  */
14972   va_start (ap, ns);
14973   for (i = 0; i < els; i++)
14974     {
14975       unsigned thisarg = va_arg (ap, unsigned);
14976       if (thisarg == N_IGNORE_TYPE)
14977         {
14978           va_end (ap);
14979           return badtype;
14980         }
14981       types[i] = thisarg;
14982       if ((thisarg & N_KEY) != 0)
14983         key_el = i;
14984     }
14985   va_end (ap);
14986
14987   if (inst.vectype.elems > 0)
14988     for (i = 0; i < els; i++)
14989       if (inst.operands[i].vectype.type != NT_invtype)
14990         {
14991           first_error (_("types specified in both the mnemonic and operands"));
14992           return badtype;
14993         }
14994
14995   /* Duplicate inst.vectype elements here as necessary.
14996      FIXME: No idea if this is exactly the same as the ARM assembler,
14997      particularly when an insn takes one register and one non-register
14998      operand. */
14999   if (inst.vectype.elems == 1 && els > 1)
15000     {
15001       unsigned j;
15002       inst.vectype.elems = els;
15003       inst.vectype.el[key_el] = inst.vectype.el[0];
15004       for (j = 0; j < els; j++)
15005         if (j != key_el)
15006           inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
15007                                                   types[j]);
15008     }
15009   else if (inst.vectype.elems == 0 && els > 0)
15010     {
15011       unsigned j;
15012       /* No types were given after the mnemonic, so look for types specified
15013          after each operand. We allow some flexibility here; as long as the
15014          "key" operand has a type, we can infer the others.  */
15015       for (j = 0; j < els; j++)
15016         if (inst.operands[j].vectype.type != NT_invtype)
15017           inst.vectype.el[j] = inst.operands[j].vectype;
15018
15019       if (inst.operands[key_el].vectype.type != NT_invtype)
15020         {
15021           for (j = 0; j < els; j++)
15022             if (inst.operands[j].vectype.type == NT_invtype)
15023               inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
15024                                                       types[j]);
15025         }
15026       else
15027         {
15028           first_error (_("operand types can't be inferred"));
15029           return badtype;
15030         }
15031     }
15032   else if (inst.vectype.elems != els)
15033     {
15034       first_error (_("type specifier has the wrong number of parts"));
15035       return badtype;
15036     }
15037
15038   for (pass = 0; pass < 2; pass++)
15039     {
15040       for (i = 0; i < els; i++)
15041         {
15042           unsigned thisarg = types[i];
15043           unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
15044             ? modify_types_allowed (key_allowed, thisarg) : thisarg;
15045           enum neon_el_type g_type = inst.vectype.el[i].type;
15046           unsigned g_size = inst.vectype.el[i].size;
15047
15048           /* Decay more-specific signed & unsigned types to sign-insensitive
15049              integer types if sign-specific variants are unavailable.  */
15050           if ((g_type == NT_signed || g_type == NT_unsigned)
15051               && (types_allowed & N_SU_ALL) == 0)
15052             g_type = NT_integer;
15053
15054           /* If only untyped args are allowed, decay any more specific types to
15055              them. Some instructions only care about signs for some element
15056              sizes, so handle that properly.  */
15057           if (((types_allowed & N_UNT) == 0)
15058               && ((g_size == 8 && (types_allowed & N_8) != 0)
15059                   || (g_size == 16 && (types_allowed & N_16) != 0)
15060                   || (g_size == 32 && (types_allowed & N_32) != 0)
15061                   || (g_size == 64 && (types_allowed & N_64) != 0)))
15062             g_type = NT_untyped;
15063
15064           if (pass == 0)
15065             {
15066               if ((thisarg & N_KEY) != 0)
15067                 {
15068                   k_type = g_type;
15069                   k_size = g_size;
15070                   key_allowed = thisarg & ~N_KEY;
15071
15072                   /* Check architecture constraint on FP16 extension.  */
15073                   if (k_size == 16
15074                       && k_type == NT_float
15075                       && ! ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16))
15076                     {
15077                       inst.error = _(BAD_FP16);
15078                       return badtype;
15079                     }
15080                 }
15081             }
15082           else
15083             {
15084               if ((thisarg & N_VFP) != 0)
15085                 {
15086                   enum neon_shape_el regshape;
15087                   unsigned regwidth, match;
15088
15089                   /* PR 11136: Catch the case where we are passed a shape of NS_NULL.  */
15090                   if (ns == NS_NULL)
15091                     {
15092                       first_error (_("invalid instruction shape"));
15093                       return badtype;
15094                     }
15095                   regshape = neon_shape_tab[ns].el[i];
15096                   regwidth = neon_shape_el_size[regshape];
15097
15098                   /* In VFP mode, operands must match register widths. If we
15099                      have a key operand, use its width, else use the width of
15100                      the current operand.  */
15101                   if (k_size != -1u)
15102                     match = k_size;
15103                   else
15104                     match = g_size;
15105
15106                   /* FP16 will use a single precision register.  */
15107                   if (regwidth == 32 && match == 16)
15108                     {
15109                       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16))
15110                         match = regwidth;
15111                       else
15112                         {
15113                           inst.error = _(BAD_FP16);
15114                           return badtype;
15115                         }
15116                     }
15117
15118                   if (regwidth != match)
15119                     {
15120                       first_error (_("operand size must match register width"));
15121                       return badtype;
15122                     }
15123                 }
15124
15125               if ((thisarg & N_EQK) == 0)
15126                 {
15127                   unsigned given_type = type_chk_of_el_type (g_type, g_size);
15128
15129                   if ((given_type & types_allowed) == 0)
15130                     {
15131                       first_error (BAD_SIMD_TYPE);
15132                       return badtype;
15133                     }
15134                 }
15135               else
15136                 {
15137                   enum neon_el_type mod_k_type = k_type;
15138                   unsigned mod_k_size = k_size;
15139                   neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
15140                   if (g_type != mod_k_type || g_size != mod_k_size)
15141                     {
15142                       first_error (_("inconsistent types in Neon instruction"));
15143                       return badtype;
15144                     }
15145                 }
15146             }
15147         }
15148     }
15149
15150   return inst.vectype.el[key_el];
15151 }
15152
15153 /* Neon-style VFP instruction forwarding.  */
15154
15155 /* Thumb VFP instructions have 0xE in the condition field.  */
15156
15157 static void
15158 do_vfp_cond_or_thumb (void)
15159 {
15160   inst.is_neon = 1;
15161
15162   if (thumb_mode)
15163     inst.instruction |= 0xe0000000;
15164   else
15165     inst.instruction |= inst.cond << 28;
15166 }
15167
15168 /* Look up and encode a simple mnemonic, for use as a helper function for the
15169    Neon-style VFP syntax.  This avoids duplication of bits of the insns table,
15170    etc.  It is assumed that operand parsing has already been done, and that the
15171    operands are in the form expected by the given opcode (this isn't necessarily
15172    the same as the form in which they were parsed, hence some massaging must
15173    take place before this function is called).
15174    Checks current arch version against that in the looked-up opcode.  */
15175
15176 static void
15177 do_vfp_nsyn_opcode (const char *opname)
15178 {
15179   const struct asm_opcode *opcode;
15180
15181   opcode = (const struct asm_opcode *) hash_find (arm_ops_hsh, opname);
15182
15183   if (!opcode)
15184     abort ();
15185
15186   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
15187                 thumb_mode ? *opcode->tvariant : *opcode->avariant),
15188               _(BAD_FPU));
15189
15190   inst.is_neon = 1;
15191
15192   if (thumb_mode)
15193     {
15194       inst.instruction = opcode->tvalue;
15195       opcode->tencode ();
15196     }
15197   else
15198     {
15199       inst.instruction = (inst.cond << 28) | opcode->avalue;
15200       opcode->aencode ();
15201     }
15202 }
15203
15204 static void
15205 do_vfp_nsyn_add_sub (enum neon_shape rs)
15206 {
15207   int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
15208
15209   if (rs == NS_FFF || rs == NS_HHH)
15210     {
15211       if (is_add)
15212         do_vfp_nsyn_opcode ("fadds");
15213       else
15214         do_vfp_nsyn_opcode ("fsubs");
15215
15216       /* ARMv8.2 fp16 instruction.  */
15217       if (rs == NS_HHH)
15218         do_scalar_fp16_v82_encode ();
15219     }
15220   else
15221     {
15222       if (is_add)
15223         do_vfp_nsyn_opcode ("faddd");
15224       else
15225         do_vfp_nsyn_opcode ("fsubd");
15226     }
15227 }
15228
15229 /* Check operand types to see if this is a VFP instruction, and if so call
15230    PFN ().  */
15231
15232 static int
15233 try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
15234 {
15235   enum neon_shape rs;
15236   struct neon_type_el et;
15237
15238   switch (args)
15239     {
15240     case 2:
15241       rs = neon_select_shape (NS_HH, NS_FF, NS_DD, NS_NULL);
15242       et = neon_check_type (2, rs, N_EQK | N_VFP, N_F_ALL | N_KEY | N_VFP);
15243       break;
15244
15245     case 3:
15246       rs = neon_select_shape (NS_HHH, NS_FFF, NS_DDD, NS_NULL);
15247       et = neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
15248                             N_F_ALL | N_KEY | N_VFP);
15249       break;
15250
15251     default:
15252       abort ();
15253     }
15254
15255   if (et.type != NT_invtype)
15256     {
15257       pfn (rs);
15258       return SUCCESS;
15259     }
15260
15261   inst.error = NULL;
15262   return FAIL;
15263 }
15264
15265 static void
15266 do_vfp_nsyn_mla_mls (enum neon_shape rs)
15267 {
15268   int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
15269
15270   if (rs == NS_FFF || rs == NS_HHH)
15271     {
15272       if (is_mla)
15273         do_vfp_nsyn_opcode ("fmacs");
15274       else
15275         do_vfp_nsyn_opcode ("fnmacs");
15276
15277       /* ARMv8.2 fp16 instruction.  */
15278       if (rs == NS_HHH)
15279         do_scalar_fp16_v82_encode ();
15280     }
15281   else
15282     {
15283       if (is_mla)
15284         do_vfp_nsyn_opcode ("fmacd");
15285       else
15286         do_vfp_nsyn_opcode ("fnmacd");
15287     }
15288 }
15289
15290 static void
15291 do_vfp_nsyn_fma_fms (enum neon_shape rs)
15292 {
15293   int is_fma = (inst.instruction & 0x0fffffff) == N_MNEM_vfma;
15294
15295   if (rs == NS_FFF || rs == NS_HHH)
15296     {
15297       if (is_fma)
15298         do_vfp_nsyn_opcode ("ffmas");
15299       else
15300         do_vfp_nsyn_opcode ("ffnmas");
15301
15302       /* ARMv8.2 fp16 instruction.  */
15303       if (rs == NS_HHH)
15304         do_scalar_fp16_v82_encode ();
15305     }
15306   else
15307     {
15308       if (is_fma)
15309         do_vfp_nsyn_opcode ("ffmad");
15310       else
15311         do_vfp_nsyn_opcode ("ffnmad");
15312     }
15313 }
15314
15315 static void
15316 do_vfp_nsyn_mul (enum neon_shape rs)
15317 {
15318   if (rs == NS_FFF || rs == NS_HHH)
15319     {
15320       do_vfp_nsyn_opcode ("fmuls");
15321
15322       /* ARMv8.2 fp16 instruction.  */
15323       if (rs == NS_HHH)
15324         do_scalar_fp16_v82_encode ();
15325     }
15326   else
15327     do_vfp_nsyn_opcode ("fmuld");
15328 }
15329
15330 static void
15331 do_vfp_nsyn_abs_neg (enum neon_shape rs)
15332 {
15333   int is_neg = (inst.instruction & 0x80) != 0;
15334   neon_check_type (2, rs, N_EQK | N_VFP, N_F_ALL | N_VFP | N_KEY);
15335
15336   if (rs == NS_FF || rs == NS_HH)
15337     {
15338       if (is_neg)
15339         do_vfp_nsyn_opcode ("fnegs");
15340       else
15341         do_vfp_nsyn_opcode ("fabss");
15342
15343       /* ARMv8.2 fp16 instruction.  */
15344       if (rs == NS_HH)
15345         do_scalar_fp16_v82_encode ();
15346     }
15347   else
15348     {
15349       if (is_neg)
15350         do_vfp_nsyn_opcode ("fnegd");
15351       else
15352         do_vfp_nsyn_opcode ("fabsd");
15353     }
15354 }
15355
15356 /* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
15357    insns belong to Neon, and are handled elsewhere.  */
15358
15359 static void
15360 do_vfp_nsyn_ldm_stm (int is_dbmode)
15361 {
15362   int is_ldm = (inst.instruction & (1 << 20)) != 0;
15363   if (is_ldm)
15364     {
15365       if (is_dbmode)
15366         do_vfp_nsyn_opcode ("fldmdbs");
15367       else
15368         do_vfp_nsyn_opcode ("fldmias");
15369     }
15370   else
15371     {
15372       if (is_dbmode)
15373         do_vfp_nsyn_opcode ("fstmdbs");
15374       else
15375         do_vfp_nsyn_opcode ("fstmias");
15376     }
15377 }
15378
15379 static void
15380 do_vfp_nsyn_sqrt (void)
15381 {
15382   enum neon_shape rs = neon_select_shape (NS_HH, NS_FF, NS_DD, NS_NULL);
15383   neon_check_type (2, rs, N_EQK | N_VFP, N_F_ALL | N_KEY | N_VFP);
15384
15385   if (rs == NS_FF || rs == NS_HH)
15386     {
15387       do_vfp_nsyn_opcode ("fsqrts");
15388
15389       /* ARMv8.2 fp16 instruction.  */
15390       if (rs == NS_HH)
15391         do_scalar_fp16_v82_encode ();
15392     }
15393   else
15394     do_vfp_nsyn_opcode ("fsqrtd");
15395 }
15396
15397 static void
15398 do_vfp_nsyn_div (void)
15399 {
15400   enum neon_shape rs = neon_select_shape (NS_HHH, NS_FFF, NS_DDD, NS_NULL);
15401   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
15402                    N_F_ALL | N_KEY | N_VFP);
15403
15404   if (rs == NS_FFF || rs == NS_HHH)
15405     {
15406       do_vfp_nsyn_opcode ("fdivs");
15407
15408       /* ARMv8.2 fp16 instruction.  */
15409       if (rs == NS_HHH)
15410         do_scalar_fp16_v82_encode ();
15411     }
15412   else
15413     do_vfp_nsyn_opcode ("fdivd");
15414 }
15415
15416 static void
15417 do_vfp_nsyn_nmul (void)
15418 {
15419   enum neon_shape rs = neon_select_shape (NS_HHH, NS_FFF, NS_DDD, NS_NULL);
15420   neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
15421                    N_F_ALL | N_KEY | N_VFP);
15422
15423   if (rs == NS_FFF || rs == NS_HHH)
15424     {
15425       NEON_ENCODE (SINGLE, inst);
15426       do_vfp_sp_dyadic ();
15427
15428       /* ARMv8.2 fp16 instruction.  */
15429       if (rs == NS_HHH)
15430         do_scalar_fp16_v82_encode ();
15431     }
15432   else
15433     {
15434       NEON_ENCODE (DOUBLE, inst);
15435       do_vfp_dp_rd_rn_rm ();
15436     }
15437   do_vfp_cond_or_thumb ();
15438
15439 }
15440
15441 /* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
15442    (0, 1, 2, 3).  */
15443
15444 static unsigned
15445 neon_logbits (unsigned x)
15446 {
15447   return ffs (x) - 4;
15448 }
15449
15450 #define LOW4(R) ((R) & 0xf)
15451 #define HI1(R) (((R) >> 4) & 1)
15452
15453 static unsigned
15454 mve_get_vcmp_vpt_cond (struct neon_type_el et)
15455 {
15456   switch (et.type)
15457     {
15458     default:
15459       first_error (BAD_EL_TYPE);
15460       return 0;
15461     case NT_float:
15462       switch (inst.operands[0].imm)
15463         {
15464         default:
15465           first_error (_("invalid condition"));
15466           return 0;
15467         case 0x0:
15468           /* eq.  */
15469           return 0;
15470         case 0x1:
15471           /* ne.  */
15472           return 1;
15473         case 0xa:
15474           /* ge/  */
15475           return 4;
15476         case 0xb:
15477           /* lt.  */
15478           return 5;
15479         case 0xc:
15480           /* gt.  */
15481           return 6;
15482         case 0xd:
15483           /* le.  */
15484           return 7;
15485         }
15486     case NT_integer:
15487       /* only accept eq and ne.  */
15488       if (inst.operands[0].imm > 1)
15489         {
15490           first_error (_("invalid condition"));
15491           return 0;
15492         }
15493       return inst.operands[0].imm;
15494     case NT_unsigned:
15495       if (inst.operands[0].imm == 0x2)
15496         return 2;
15497       else if (inst.operands[0].imm == 0x8)
15498         return 3;
15499       else
15500         {
15501           first_error (_("invalid condition"));
15502           return 0;
15503         }
15504     case NT_signed:
15505       switch (inst.operands[0].imm)
15506         {
15507           default:
15508             first_error (_("invalid condition"));
15509             return 0;
15510           case 0xa:
15511             /* ge.  */
15512             return 4;
15513           case 0xb:
15514             /* lt.  */
15515             return 5;
15516           case 0xc:
15517             /* gt.  */
15518             return 6;
15519           case 0xd:
15520             /* le.  */
15521             return 7;
15522         }
15523     }
15524   /* Should be unreachable.  */
15525   abort ();
15526 }
15527
15528 static void
15529 do_mve_vpt (void)
15530 {
15531   /* We are dealing with a vector predicated block.  */
15532   if (inst.operands[0].present)
15533     {
15534       enum neon_shape rs = neon_select_shape (NS_IQQ, NS_IQR, NS_NULL);
15535       struct neon_type_el et
15536         = neon_check_type (3, rs, N_EQK, N_KEY | N_F_MVE | N_I_MVE | N_SU_32,
15537                            N_EQK);
15538
15539       unsigned fcond = mve_get_vcmp_vpt_cond (et);
15540
15541       constraint (inst.operands[1].reg > 14, MVE_BAD_QREG);
15542
15543       if (et.type == NT_invtype)
15544         return;
15545
15546       if (et.type == NT_float)
15547         {
15548           constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_fp_ext),
15549                       BAD_FPU);
15550           constraint (et.size != 16 && et.size != 32, BAD_EL_TYPE);
15551           inst.instruction |= (et.size == 16) << 28;
15552           inst.instruction |= 0x3 << 20;
15553         }
15554       else
15555         {
15556           constraint (et.size != 8 && et.size != 16 && et.size != 32,
15557                       BAD_EL_TYPE);
15558           inst.instruction |= 1 << 28;
15559           inst.instruction |= neon_logbits (et.size) << 20;
15560         }
15561
15562       if (inst.operands[2].isquad)
15563         {
15564           inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15565           inst.instruction |= LOW4 (inst.operands[2].reg);
15566           inst.instruction |= (fcond & 0x2) >> 1;
15567         }
15568       else
15569         {
15570           if (inst.operands[2].reg == REG_SP)
15571             as_tsktsk (MVE_BAD_SP);
15572           inst.instruction |= 1 << 6;
15573           inst.instruction |= (fcond & 0x2) << 4;
15574           inst.instruction |= inst.operands[2].reg;
15575         }
15576       inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15577       inst.instruction |= (fcond & 0x4) << 10;
15578       inst.instruction |= (fcond & 0x1) << 7;
15579
15580     }
15581     set_pred_insn_type (VPT_INSN);
15582     now_pred.cc = 0;
15583     now_pred.mask = ((inst.instruction & 0x00400000) >> 19)
15584                     | ((inst.instruction & 0xe000) >> 13);
15585     now_pred.warn_deprecated = FALSE;
15586     now_pred.type = VECTOR_PRED;
15587     inst.is_neon = 1;
15588 }
15589
15590 static void
15591 do_mve_vcmp (void)
15592 {
15593   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext), BAD_FPU);
15594   if (!inst.operands[1].isreg || !inst.operands[1].isquad)
15595     first_error (_(reg_expected_msgs[REG_TYPE_MQ]));
15596   if (!inst.operands[2].present)
15597     first_error (_("MVE vector or ARM register expected"));
15598   constraint (inst.operands[1].reg > 14, MVE_BAD_QREG);
15599
15600   /* Deal with 'else' conditional MVE's vcmp, it will be parsed as vcmpe.  */
15601   if ((inst.instruction & 0xffffffff) == N_MNEM_vcmpe
15602       && inst.operands[1].isquad)
15603     {
15604       inst.instruction = N_MNEM_vcmp;
15605       inst.cond = 0x10;
15606     }
15607
15608   if (inst.cond > COND_ALWAYS)
15609     inst.pred_insn_type = INSIDE_VPT_INSN;
15610   else
15611     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15612
15613   enum neon_shape rs = neon_select_shape (NS_IQQ, NS_IQR, NS_NULL);
15614   struct neon_type_el et
15615     = neon_check_type (3, rs, N_EQK, N_KEY | N_F_MVE | N_I_MVE | N_SU_32,
15616                        N_EQK);
15617
15618   constraint (rs == NS_IQR && inst.operands[2].reg == REG_PC
15619               && !inst.operands[2].iszr, BAD_PC);
15620
15621   unsigned fcond = mve_get_vcmp_vpt_cond (et);
15622
15623   inst.instruction = 0xee010f00;
15624   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15625   inst.instruction |= (fcond & 0x4) << 10;
15626   inst.instruction |= (fcond & 0x1) << 7;
15627   if (et.type == NT_float)
15628     {
15629       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_fp_ext),
15630                   BAD_FPU);
15631       inst.instruction |= (et.size == 16) << 28;
15632       inst.instruction |= 0x3 << 20;
15633     }
15634   else
15635     {
15636       inst.instruction |= 1 << 28;
15637       inst.instruction |= neon_logbits (et.size) << 20;
15638     }
15639   if (inst.operands[2].isquad)
15640     {
15641       inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15642       inst.instruction |= (fcond & 0x2) >> 1;
15643       inst.instruction |= LOW4 (inst.operands[2].reg);
15644     }
15645   else
15646     {
15647       if (inst.operands[2].reg == REG_SP)
15648         as_tsktsk (MVE_BAD_SP);
15649       inst.instruction |= 1 << 6;
15650       inst.instruction |= (fcond & 0x2) << 4;
15651       inst.instruction |= inst.operands[2].reg;
15652     }
15653
15654   inst.is_neon = 1;
15655   return;
15656 }
15657
15658 static void
15659 do_mve_vmaxa_vmina (void)
15660 {
15661   if (inst.cond > COND_ALWAYS)
15662     inst.pred_insn_type = INSIDE_VPT_INSN;
15663   else
15664     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15665
15666   enum neon_shape rs = neon_select_shape (NS_QQ, NS_NULL);
15667   struct neon_type_el et
15668     = neon_check_type (2, rs, N_EQK, N_KEY | N_S8 | N_S16 | N_S32);
15669
15670   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15671   inst.instruction |= neon_logbits (et.size) << 18;
15672   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15673   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15674   inst.instruction |= LOW4 (inst.operands[1].reg);
15675   inst.is_neon = 1;
15676 }
15677
15678 static void
15679 do_mve_vfmas (void)
15680 {
15681   enum neon_shape rs = neon_select_shape (NS_QQR, NS_NULL);
15682   struct neon_type_el et
15683     = neon_check_type (3, rs, N_F_MVE | N_KEY, N_EQK, N_EQK);
15684
15685   if (inst.cond > COND_ALWAYS)
15686     inst.pred_insn_type = INSIDE_VPT_INSN;
15687   else
15688     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15689
15690   if (inst.operands[2].reg == REG_SP)
15691     as_tsktsk (MVE_BAD_SP);
15692   else if (inst.operands[2].reg == REG_PC)
15693     as_tsktsk (MVE_BAD_PC);
15694
15695   inst.instruction |= (et.size == 16) << 28;
15696   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15697   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15698   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15699   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15700   inst.instruction |= inst.operands[2].reg;
15701   inst.is_neon = 1;
15702 }
15703
15704 static void
15705 do_mve_viddup (void)
15706 {
15707   if (inst.cond > COND_ALWAYS)
15708     inst.pred_insn_type = INSIDE_VPT_INSN;
15709   else
15710     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15711
15712   unsigned imm = inst.relocs[0].exp.X_add_number;
15713   constraint (imm != 1 && imm != 2 && imm != 4 && imm != 8,
15714               _("immediate must be either 1, 2, 4 or 8"));
15715
15716   enum neon_shape rs;
15717   struct neon_type_el et;
15718   unsigned Rm;
15719   if (inst.instruction == M_MNEM_vddup || inst.instruction == M_MNEM_vidup)
15720     {
15721       rs = neon_select_shape (NS_QRI, NS_NULL);
15722       et = neon_check_type (2, rs, N_KEY | N_U8 | N_U16 | N_U32, N_EQK);
15723       Rm = 7;
15724     }
15725   else
15726     {
15727       constraint ((inst.operands[2].reg % 2) != 1, BAD_EVEN);
15728       if (inst.operands[2].reg == REG_SP)
15729         as_tsktsk (MVE_BAD_SP);
15730       else if (inst.operands[2].reg == REG_PC)
15731         first_error (BAD_PC);
15732
15733       rs = neon_select_shape (NS_QRRI, NS_NULL);
15734       et = neon_check_type (3, rs, N_KEY | N_U8 | N_U16 | N_U32, N_EQK, N_EQK);
15735       Rm = inst.operands[2].reg >> 1;
15736     }
15737   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15738   inst.instruction |= neon_logbits (et.size) << 20;
15739   inst.instruction |= inst.operands[1].reg << 16;
15740   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15741   inst.instruction |= (imm > 2) << 7;
15742   inst.instruction |= Rm << 1;
15743   inst.instruction |= (imm == 2 || imm == 8);
15744   inst.is_neon = 1;
15745 }
15746
15747 static void
15748 do_mve_vmlas (void)
15749 {
15750   enum neon_shape rs = neon_select_shape (NS_QQR, NS_NULL);
15751   struct neon_type_el et
15752     = neon_check_type (3, rs, N_EQK, N_EQK, N_SU_MVE | N_KEY);
15753
15754   if (inst.operands[2].reg == REG_PC)
15755     as_tsktsk (MVE_BAD_PC);
15756   else if (inst.operands[2].reg == REG_SP)
15757     as_tsktsk (MVE_BAD_SP);
15758
15759   if (inst.cond > COND_ALWAYS)
15760     inst.pred_insn_type = INSIDE_VPT_INSN;
15761   else
15762     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15763
15764   inst.instruction |= (et.type == NT_unsigned) << 28;
15765   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15766   inst.instruction |= neon_logbits (et.size) << 20;
15767   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15768   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15769   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15770   inst.instruction |= inst.operands[2].reg;
15771   inst.is_neon = 1;
15772 }
15773
15774 static void
15775 do_mve_vshll (void)
15776 {
15777   struct neon_type_el et
15778     = neon_check_type (2, NS_QQI, N_EQK, N_S8 | N_U8 | N_S16 | N_U16 | N_KEY);
15779
15780   if (inst.cond > COND_ALWAYS)
15781     inst.pred_insn_type = INSIDE_VPT_INSN;
15782   else
15783     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15784
15785   int imm = inst.operands[2].imm;
15786   constraint (imm < 1 || (unsigned)imm > et.size,
15787               _("immediate value out of range"));
15788
15789   if ((unsigned)imm == et.size)
15790     {
15791       inst.instruction |= neon_logbits (et.size) << 18;
15792       inst.instruction |= 0x110001;
15793     }
15794   else
15795     {
15796       inst.instruction |= (et.size + imm) << 16;
15797       inst.instruction |= 0x800140;
15798     }
15799
15800   inst.instruction |= (et.type == NT_unsigned) << 28;
15801   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15802   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15803   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15804   inst.instruction |= LOW4 (inst.operands[1].reg);
15805   inst.is_neon = 1;
15806 }
15807
15808 static void
15809 do_mve_vshlc (void)
15810 {
15811   if (inst.cond > COND_ALWAYS)
15812     inst.pred_insn_type = INSIDE_VPT_INSN;
15813   else
15814     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15815
15816   if (inst.operands[1].reg == REG_PC)
15817     as_tsktsk (MVE_BAD_PC);
15818   else if (inst.operands[1].reg == REG_SP)
15819     as_tsktsk (MVE_BAD_SP);
15820
15821   int imm = inst.operands[2].imm;
15822   constraint (imm < 1 || imm > 32, _("immediate value out of range"));
15823
15824   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15825   inst.instruction |= (imm & 0x1f) << 16;
15826   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15827   inst.instruction |= inst.operands[1].reg;
15828   inst.is_neon = 1;
15829 }
15830
15831 static void
15832 do_mve_vshrn (void)
15833 {
15834   unsigned types;
15835   switch (inst.instruction)
15836     {
15837     case M_MNEM_vshrnt:
15838     case M_MNEM_vshrnb:
15839     case M_MNEM_vrshrnt:
15840     case M_MNEM_vrshrnb:
15841       types = N_I16 | N_I32;
15842       break;
15843     case M_MNEM_vqshrnt:
15844     case M_MNEM_vqshrnb:
15845     case M_MNEM_vqrshrnt:
15846     case M_MNEM_vqrshrnb:
15847       types = N_U16 | N_U32 | N_S16 | N_S32;
15848       break;
15849     case M_MNEM_vqshrunt:
15850     case M_MNEM_vqshrunb:
15851     case M_MNEM_vqrshrunt:
15852     case M_MNEM_vqrshrunb:
15853       types = N_S16 | N_S32;
15854       break;
15855     default:
15856       abort ();
15857     }
15858
15859   struct neon_type_el et = neon_check_type (2, NS_QQI, N_EQK, types | N_KEY);
15860
15861   if (inst.cond > COND_ALWAYS)
15862     inst.pred_insn_type = INSIDE_VPT_INSN;
15863   else
15864     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15865
15866   unsigned Qd = inst.operands[0].reg;
15867   unsigned Qm = inst.operands[1].reg;
15868   unsigned imm = inst.operands[2].imm;
15869   constraint (imm < 1 || ((unsigned) imm) > (et.size / 2),
15870               et.size == 16
15871               ? _("immediate operand expected in the range [1,8]")
15872               : _("immediate operand expected in the range [1,16]"));
15873
15874   inst.instruction |= (et.type == NT_unsigned) << 28;
15875   inst.instruction |= HI1 (Qd) << 22;
15876   inst.instruction |= (et.size - imm) << 16;
15877   inst.instruction |= LOW4 (Qd) << 12;
15878   inst.instruction |= HI1 (Qm) << 5;
15879   inst.instruction |= LOW4 (Qm);
15880   inst.is_neon = 1;
15881 }
15882
15883 static void
15884 do_mve_vqmovn (void)
15885 {
15886   struct neon_type_el et;
15887   if (inst.instruction == M_MNEM_vqmovnt
15888      || inst.instruction == M_MNEM_vqmovnb)
15889     et = neon_check_type (2, NS_QQ, N_EQK,
15890                           N_U16 | N_U32 | N_S16 | N_S32 | N_KEY);
15891   else
15892     et = neon_check_type (2, NS_QQ, N_EQK, N_S16 | N_S32 | N_KEY);
15893
15894   if (inst.cond > COND_ALWAYS)
15895     inst.pred_insn_type = INSIDE_VPT_INSN;
15896   else
15897     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15898
15899   inst.instruction |= (et.type == NT_unsigned) << 28;
15900   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15901   inst.instruction |= (et.size == 32) << 18;
15902   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15903   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15904   inst.instruction |= LOW4 (inst.operands[1].reg);
15905   inst.is_neon = 1;
15906 }
15907
15908 static void
15909 do_mve_vpsel (void)
15910 {
15911   neon_select_shape (NS_QQQ, NS_NULL);
15912
15913   if (inst.cond > COND_ALWAYS)
15914     inst.pred_insn_type = INSIDE_VPT_INSN;
15915   else
15916     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15917
15918   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15919   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15920   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15921   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15922   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15923   inst.instruction |= LOW4 (inst.operands[2].reg);
15924   inst.is_neon = 1;
15925 }
15926
15927 static void
15928 do_mve_vpnot (void)
15929 {
15930   if (inst.cond > COND_ALWAYS)
15931     inst.pred_insn_type = INSIDE_VPT_INSN;
15932   else
15933     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15934 }
15935
15936 static void
15937 do_mve_vmaxnma_vminnma (void)
15938 {
15939   enum neon_shape rs = neon_select_shape (NS_QQ, NS_NULL);
15940   struct neon_type_el et
15941     = neon_check_type (2, rs, N_EQK, N_F_MVE | N_KEY);
15942
15943   if (inst.cond > COND_ALWAYS)
15944     inst.pred_insn_type = INSIDE_VPT_INSN;
15945   else
15946     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15947
15948   inst.instruction |= (et.size == 16) << 28;
15949   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15950   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15951   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15952   inst.instruction |= LOW4 (inst.operands[1].reg);
15953   inst.is_neon = 1;
15954 }
15955
15956 static void
15957 do_mve_vcmul (void)
15958 {
15959   enum neon_shape rs = neon_select_shape (NS_QQQI, NS_NULL);
15960   struct neon_type_el et
15961     = neon_check_type (3, rs, N_EQK, N_EQK, N_F_MVE | N_KEY);
15962
15963   if (inst.cond > COND_ALWAYS)
15964     inst.pred_insn_type = INSIDE_VPT_INSN;
15965   else
15966     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
15967
15968   unsigned rot = inst.relocs[0].exp.X_add_number;
15969   constraint (rot != 0 && rot != 90 && rot != 180 && rot != 270,
15970               _("immediate out of range"));
15971
15972   if (et.size == 32 && (inst.operands[0].reg == inst.operands[1].reg
15973                         || inst.operands[0].reg == inst.operands[2].reg))
15974     as_tsktsk (BAD_MVE_SRCDEST);
15975
15976   inst.instruction |= (et.size == 32) << 28;
15977   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15978   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15979   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15980   inst.instruction |= (rot > 90) << 12;
15981   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15982   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15983   inst.instruction |= LOW4 (inst.operands[2].reg);
15984   inst.instruction |= (rot == 90 || rot == 270);
15985   inst.is_neon = 1;
15986 }
15987
15988 static void
15989 do_vfp_nsyn_cmp (void)
15990 {
15991   enum neon_shape rs;
15992   if (!inst.operands[0].isreg)
15993     {
15994       do_mve_vcmp ();
15995       return;
15996     }
15997   else
15998     {
15999       constraint (inst.operands[2].present, BAD_SYNTAX);
16000       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1xd),
16001                   BAD_FPU);
16002     }
16003
16004   if (inst.operands[1].isreg)
16005     {
16006       rs = neon_select_shape (NS_HH, NS_FF, NS_DD, NS_NULL);
16007       neon_check_type (2, rs, N_EQK | N_VFP, N_F_ALL | N_KEY | N_VFP);
16008
16009       if (rs == NS_FF || rs == NS_HH)
16010         {
16011           NEON_ENCODE (SINGLE, inst);
16012           do_vfp_sp_monadic ();
16013         }
16014       else
16015         {
16016           NEON_ENCODE (DOUBLE, inst);
16017           do_vfp_dp_rd_rm ();
16018         }
16019     }
16020   else
16021     {
16022       rs = neon_select_shape (NS_HI, NS_FI, NS_DI, NS_NULL);
16023       neon_check_type (2, rs, N_F_ALL | N_KEY | N_VFP, N_EQK);
16024
16025       switch (inst.instruction & 0x0fffffff)
16026         {
16027         case N_MNEM_vcmp:
16028           inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
16029           break;
16030         case N_MNEM_vcmpe:
16031           inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
16032           break;
16033         default:
16034           abort ();
16035         }
16036
16037       if (rs == NS_FI || rs == NS_HI)
16038         {
16039           NEON_ENCODE (SINGLE, inst);
16040           do_vfp_sp_compare_z ();
16041         }
16042       else
16043         {
16044           NEON_ENCODE (DOUBLE, inst);
16045           do_vfp_dp_rd ();
16046         }
16047     }
16048   do_vfp_cond_or_thumb ();
16049
16050   /* ARMv8.2 fp16 instruction.  */
16051   if (rs == NS_HI || rs == NS_HH)
16052     do_scalar_fp16_v82_encode ();
16053 }
16054
16055 static void
16056 nsyn_insert_sp (void)
16057 {
16058   inst.operands[1] = inst.operands[0];
16059   memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
16060   inst.operands[0].reg = REG_SP;
16061   inst.operands[0].isreg = 1;
16062   inst.operands[0].writeback = 1;
16063   inst.operands[0].present = 1;
16064 }
16065
16066 static void
16067 do_vfp_nsyn_push (void)
16068 {
16069   nsyn_insert_sp ();
16070
16071   constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
16072               _("register list must contain at least 1 and at most 16 "
16073                 "registers"));
16074
16075   if (inst.operands[1].issingle)
16076     do_vfp_nsyn_opcode ("fstmdbs");
16077   else
16078     do_vfp_nsyn_opcode ("fstmdbd");
16079 }
16080
16081 static void
16082 do_vfp_nsyn_pop (void)
16083 {
16084   nsyn_insert_sp ();
16085
16086   constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
16087               _("register list must contain at least 1 and at most 16 "
16088                 "registers"));
16089
16090   if (inst.operands[1].issingle)
16091     do_vfp_nsyn_opcode ("fldmias");
16092   else
16093     do_vfp_nsyn_opcode ("fldmiad");
16094 }
16095
16096 /* Fix up Neon data-processing instructions, ORing in the correct bits for
16097    ARM mode or Thumb mode and moving the encoded bit 24 to bit 28.  */
16098
16099 static void
16100 neon_dp_fixup (struct arm_it* insn)
16101 {
16102   unsigned int i = insn->instruction;
16103   insn->is_neon = 1;
16104
16105   if (thumb_mode)
16106     {
16107       /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode.  */
16108       if (i & (1 << 24))
16109         i |= 1 << 28;
16110
16111       i &= ~(1 << 24);
16112
16113       i |= 0xef000000;
16114     }
16115   else
16116     i |= 0xf2000000;
16117
16118   insn->instruction = i;
16119 }
16120
16121 static void
16122 mve_encode_qqr (int size, int U, int fp)
16123 {
16124   if (inst.operands[2].reg == REG_SP)
16125     as_tsktsk (MVE_BAD_SP);
16126   else if (inst.operands[2].reg == REG_PC)
16127     as_tsktsk (MVE_BAD_PC);
16128
16129   if (fp)
16130     {
16131       /* vadd.  */
16132       if (((unsigned)inst.instruction) == 0xd00)
16133         inst.instruction = 0xee300f40;
16134       /* vsub.  */
16135       else if (((unsigned)inst.instruction) == 0x200d00)
16136         inst.instruction = 0xee301f40;
16137       /* vmul.  */
16138       else if (((unsigned)inst.instruction) == 0x1000d10)
16139         inst.instruction = 0xee310e60;
16140
16141       /* Setting size which is 1 for F16 and 0 for F32.  */
16142       inst.instruction |= (size == 16) << 28;
16143     }
16144   else
16145     {
16146       /* vadd.  */
16147       if (((unsigned)inst.instruction) == 0x800)
16148         inst.instruction = 0xee010f40;
16149       /* vsub.  */
16150       else if (((unsigned)inst.instruction) == 0x1000800)
16151         inst.instruction = 0xee011f40;
16152       /* vhadd.  */
16153       else if (((unsigned)inst.instruction) == 0)
16154         inst.instruction = 0xee000f40;
16155       /* vhsub.  */
16156       else if (((unsigned)inst.instruction) == 0x200)
16157         inst.instruction = 0xee001f40;
16158       /* vmla.  */
16159       else if (((unsigned)inst.instruction) == 0x900)
16160         inst.instruction = 0xee010e40;
16161       /* vmul.  */
16162       else if (((unsigned)inst.instruction) == 0x910)
16163         inst.instruction = 0xee011e60;
16164       /* vqadd.  */
16165       else if (((unsigned)inst.instruction) == 0x10)
16166         inst.instruction = 0xee000f60;
16167       /* vqsub.  */
16168       else if (((unsigned)inst.instruction) == 0x210)
16169         inst.instruction = 0xee001f60;
16170       /* vqrdmlah.  */
16171       else if (((unsigned)inst.instruction) == 0x3000b10)
16172         inst.instruction = 0xee000e40;
16173       /* vqdmulh.  */
16174       else if (((unsigned)inst.instruction) == 0x0000b00)
16175         inst.instruction = 0xee010e60;
16176       /* vqrdmulh.  */
16177       else if (((unsigned)inst.instruction) == 0x1000b00)
16178         inst.instruction = 0xfe010e60;
16179
16180       /* Set U-bit.  */
16181       inst.instruction |= U << 28;
16182
16183       /* Setting bits for size.  */
16184       inst.instruction |= neon_logbits (size) << 20;
16185     }
16186   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16187   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16188   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
16189   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
16190   inst.instruction |= inst.operands[2].reg;
16191   inst.is_neon = 1;
16192 }
16193
16194 static void
16195 mve_encode_rqq (unsigned bit28, unsigned size)
16196 {
16197   inst.instruction |= bit28 << 28;
16198   inst.instruction |= neon_logbits (size) << 20;
16199   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
16200   inst.instruction |= inst.operands[0].reg << 12;
16201   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
16202   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
16203   inst.instruction |= LOW4 (inst.operands[2].reg);
16204   inst.is_neon = 1;
16205 }
16206
16207 static void
16208 mve_encode_qqq (int ubit, int size)
16209 {
16210
16211   inst.instruction |= (ubit != 0) << 28;
16212   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16213   inst.instruction |= neon_logbits (size) << 20;
16214   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
16215   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16216   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
16217   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
16218   inst.instruction |= LOW4 (inst.operands[2].reg);
16219
16220   inst.is_neon = 1;
16221 }
16222
16223 static void
16224 mve_encode_rq (unsigned bit28, unsigned size)
16225 {
16226   inst.instruction |= bit28 << 28;
16227   inst.instruction |= neon_logbits (size) << 18;
16228   inst.instruction |= inst.operands[0].reg << 12;
16229   inst.instruction |= LOW4 (inst.operands[1].reg);
16230   inst.is_neon = 1;
16231 }
16232
16233 static void
16234 mve_encode_rrqq (unsigned U, unsigned size)
16235 {
16236   constraint (inst.operands[3].reg > 14, MVE_BAD_QREG);
16237
16238   inst.instruction |= U << 28;
16239   inst.instruction |= (inst.operands[1].reg >> 1) << 20;
16240   inst.instruction |= LOW4 (inst.operands[2].reg) << 16;
16241   inst.instruction |= (size == 32) << 16;
16242   inst.instruction |= inst.operands[0].reg << 12;
16243   inst.instruction |= HI1 (inst.operands[2].reg) << 7;
16244   inst.instruction |= inst.operands[3].reg;
16245   inst.is_neon = 1;
16246 }
16247
16248 /* Encode insns with bit pattern:
16249
16250   |28/24|23|22 |21 20|19 16|15 12|11    8|7|6|5|4|3  0|
16251   |  U  |x |D  |size | Rn  | Rd  |x x x x|N|Q|M|x| Rm |
16252
16253   SIZE is passed in bits. -1 means size field isn't changed, in case it has a
16254   different meaning for some instruction.  */
16255
16256 static void
16257 neon_three_same (int isquad, int ubit, int size)
16258 {
16259   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16260   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16261   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
16262   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
16263   inst.instruction |= LOW4 (inst.operands[2].reg);
16264   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
16265   inst.instruction |= (isquad != 0) << 6;
16266   inst.instruction |= (ubit != 0) << 24;
16267   if (size != -1)
16268     inst.instruction |= neon_logbits (size) << 20;
16269
16270   neon_dp_fixup (&inst);
16271 }
16272
16273 /* Encode instructions of the form:
16274
16275   |28/24|23|22|21 20|19 18|17 16|15 12|11      7|6|5|4|3  0|
16276   |  U  |x |D |x  x |size |x  x | Rd  |x x x x x|Q|M|x| Rm |
16277
16278   Don't write size if SIZE == -1.  */
16279
16280 static void
16281 neon_two_same (int qbit, int ubit, int size)
16282 {
16283   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16284   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16285   inst.instruction |= LOW4 (inst.operands[1].reg);
16286   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
16287   inst.instruction |= (qbit != 0) << 6;
16288   inst.instruction |= (ubit != 0) << 24;
16289
16290   if (size != -1)
16291     inst.instruction |= neon_logbits (size) << 18;
16292
16293   neon_dp_fixup (&inst);
16294 }
16295
16296 enum vfp_or_neon_is_neon_bits
16297 {
16298 NEON_CHECK_CC = 1,
16299 NEON_CHECK_ARCH = 2,
16300 NEON_CHECK_ARCH8 = 4
16301 };
16302
16303 /* Call this function if an instruction which may have belonged to the VFP or
16304  Neon instruction sets, but turned out to be a Neon instruction (due to the
16305  operand types involved, etc.). We have to check and/or fix-up a couple of
16306  things:
16307
16308    - Make sure the user hasn't attempted to make a Neon instruction
16309      conditional.
16310    - Alter the value in the condition code field if necessary.
16311    - Make sure that the arch supports Neon instructions.
16312
16313  Which of these operations take place depends on bits from enum
16314  vfp_or_neon_is_neon_bits.
16315
16316  WARNING: This function has side effects! If NEON_CHECK_CC is used and the
16317  current instruction's condition is COND_ALWAYS, the condition field is
16318  changed to inst.uncond_value.  This is necessary because instructions shared
16319  between VFP and Neon may be conditional for the VFP variants only, and the
16320  unconditional Neon version must have, e.g., 0xF in the condition field.  */
16321
16322 static int
16323 vfp_or_neon_is_neon (unsigned check)
16324 {
16325 /* Conditions are always legal in Thumb mode (IT blocks).  */
16326 if (!thumb_mode && (check & NEON_CHECK_CC))
16327   {
16328     if (inst.cond != COND_ALWAYS)
16329       {
16330         first_error (_(BAD_COND));
16331         return FAIL;
16332       }
16333     if (inst.uncond_value != -1)
16334       inst.instruction |= inst.uncond_value << 28;
16335   }
16336
16337
16338   if (((check & NEON_CHECK_ARCH) && !mark_feature_used (&fpu_neon_ext_v1))
16339       || ((check & NEON_CHECK_ARCH8)
16340           && !mark_feature_used (&fpu_neon_ext_armv8)))
16341     {
16342       first_error (_(BAD_FPU));
16343       return FAIL;
16344     }
16345
16346 return SUCCESS;
16347 }
16348
16349 static int
16350 check_simd_pred_availability (int fp, unsigned check)
16351 {
16352 if (inst.cond > COND_ALWAYS)
16353   {
16354     if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
16355       {
16356         inst.error = BAD_FPU;
16357         return 1;
16358       }
16359     inst.pred_insn_type = INSIDE_VPT_INSN;
16360   }
16361 else if (inst.cond < COND_ALWAYS)
16362   {
16363     if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
16364       inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
16365     else if (vfp_or_neon_is_neon (check) == FAIL)
16366       return 2;
16367   }
16368 else
16369   {
16370     if (!ARM_CPU_HAS_FEATURE (cpu_variant, fp ? mve_fp_ext : mve_ext)
16371         && vfp_or_neon_is_neon (check) == FAIL)
16372       return 3;
16373
16374     if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
16375       inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
16376   }
16377 return 0;
16378 }
16379
16380 /* Neon instruction encoders, in approximate order of appearance.  */
16381
16382 static void
16383 do_neon_dyadic_i_su (void)
16384 {
16385   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
16386    return;
16387
16388   enum neon_shape rs;
16389   struct neon_type_el et;
16390   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
16391     rs = neon_select_shape (NS_QQQ, NS_QQR, NS_NULL);
16392   else
16393     rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
16394
16395   et = neon_check_type (3, rs, N_EQK, N_EQK, N_SU_32 | N_KEY);
16396
16397
16398   if (rs != NS_QQR)
16399     neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
16400   else
16401     mve_encode_qqr (et.size, et.type == NT_unsigned, 0);
16402 }
16403
16404 static void
16405 do_neon_dyadic_i64_su (void)
16406 {
16407   if (check_simd_pred_availability (0, NEON_CHECK_CC | NEON_CHECK_ARCH))
16408     return;
16409   enum neon_shape rs;
16410   struct neon_type_el et;
16411   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
16412     {
16413       rs = neon_select_shape (NS_QQR, NS_QQQ, NS_NULL);
16414       et = neon_check_type (3, rs, N_EQK, N_EQK, N_SU_MVE | N_KEY);
16415     }
16416   else
16417     {
16418       rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
16419       et = neon_check_type (3, rs, N_EQK, N_EQK, N_SU_ALL | N_KEY);
16420     }
16421   if (rs == NS_QQR)
16422     mve_encode_qqr (et.size, et.type == NT_unsigned, 0);
16423   else
16424     neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
16425 }
16426
16427 static void
16428 neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
16429                 unsigned immbits)
16430 {
16431   unsigned size = et.size >> 3;
16432   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16433   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16434   inst.instruction |= LOW4 (inst.operands[1].reg);
16435   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
16436   inst.instruction |= (isquad != 0) << 6;
16437   inst.instruction |= immbits << 16;
16438   inst.instruction |= (size >> 3) << 7;
16439   inst.instruction |= (size & 0x7) << 19;
16440   if (write_ubit)
16441     inst.instruction |= (uval != 0) << 24;
16442
16443   neon_dp_fixup (&inst);
16444 }
16445
16446 static void
16447 do_neon_shl (void)
16448 {
16449   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
16450    return;
16451
16452   if (!inst.operands[2].isreg)
16453     {
16454       enum neon_shape rs;
16455       struct neon_type_el et;
16456       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
16457         {
16458           rs = neon_select_shape (NS_QQI, NS_NULL);
16459           et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_MVE);
16460         }
16461       else
16462         {
16463           rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
16464           et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
16465         }
16466       int imm = inst.operands[2].imm;
16467
16468       constraint (imm < 0 || (unsigned)imm >= et.size,
16469                   _("immediate out of range for shift"));
16470       NEON_ENCODE (IMMED, inst);
16471       neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
16472     }
16473   else
16474     {
16475       enum neon_shape rs;
16476       struct neon_type_el et;
16477       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
16478         {
16479           rs = neon_select_shape (NS_QQQ, NS_QQR, NS_NULL);
16480           et = neon_check_type (3, rs, N_EQK, N_SU_MVE | N_KEY, N_EQK | N_EQK);
16481         }
16482       else
16483         {
16484           rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
16485           et = neon_check_type (3, rs, N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
16486         }
16487
16488
16489       if (rs == NS_QQR)
16490         {
16491           constraint (inst.operands[0].reg != inst.operands[1].reg,
16492                        _("invalid instruction shape"));
16493           if (inst.operands[2].reg == REG_SP)
16494             as_tsktsk (MVE_BAD_SP);
16495           else if (inst.operands[2].reg == REG_PC)
16496             as_tsktsk (MVE_BAD_PC);
16497
16498           inst.instruction = 0xee311e60;
16499           inst.instruction |= (et.type == NT_unsigned) << 28;
16500           inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16501           inst.instruction |= neon_logbits (et.size) << 18;
16502           inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16503           inst.instruction |= inst.operands[2].reg;
16504           inst.is_neon = 1;
16505         }
16506       else
16507         {
16508           unsigned int tmp;
16509
16510           /* VSHL/VQSHL 3-register variants have syntax such as:
16511                vshl.xx Dd, Dm, Dn
16512              whereas other 3-register operations encoded by neon_three_same have
16513              syntax like:
16514                vadd.xx Dd, Dn, Dm
16515              (i.e. with Dn & Dm reversed). Swap operands[1].reg and
16516              operands[2].reg here.  */
16517           tmp = inst.operands[2].reg;
16518           inst.operands[2].reg = inst.operands[1].reg;
16519           inst.operands[1].reg = tmp;
16520           NEON_ENCODE (INTEGER, inst);
16521           neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
16522         }
16523     }
16524 }
16525
16526 static void
16527 do_neon_qshl (void)
16528 {
16529   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
16530    return;
16531
16532   if (!inst.operands[2].isreg)
16533     {
16534       enum neon_shape rs;
16535       struct neon_type_el et;
16536       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
16537         {
16538           rs = neon_select_shape (NS_QQI, NS_NULL);
16539           et = neon_check_type (2, rs, N_EQK, N_KEY | N_SU_MVE);
16540         }
16541       else
16542         {
16543           rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
16544           et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
16545         }
16546       int imm = inst.operands[2].imm;
16547
16548       constraint (imm < 0 || (unsigned)imm >= et.size,
16549                   _("immediate out of range for shift"));
16550       NEON_ENCODE (IMMED, inst);
16551       neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et, imm);
16552     }
16553   else
16554     {
16555       enum neon_shape rs;
16556       struct neon_type_el et;
16557
16558       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
16559         {
16560           rs = neon_select_shape (NS_QQQ, NS_QQR, NS_NULL);
16561           et = neon_check_type (3, rs, N_EQK, N_SU_MVE | N_KEY, N_EQK | N_EQK);
16562         }
16563       else
16564         {
16565           rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
16566           et = neon_check_type (3, rs, N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
16567         }
16568
16569       if (rs == NS_QQR)
16570         {
16571           constraint (inst.operands[0].reg != inst.operands[1].reg,
16572                        _("invalid instruction shape"));
16573           if (inst.operands[2].reg == REG_SP)
16574             as_tsktsk (MVE_BAD_SP);
16575           else if (inst.operands[2].reg == REG_PC)
16576             as_tsktsk (MVE_BAD_PC);
16577
16578           inst.instruction = 0xee311ee0;
16579           inst.instruction |= (et.type == NT_unsigned) << 28;
16580           inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16581           inst.instruction |= neon_logbits (et.size) << 18;
16582           inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16583           inst.instruction |= inst.operands[2].reg;
16584           inst.is_neon = 1;
16585         }
16586       else
16587         {
16588           unsigned int tmp;
16589
16590           /* See note in do_neon_shl.  */
16591           tmp = inst.operands[2].reg;
16592           inst.operands[2].reg = inst.operands[1].reg;
16593           inst.operands[1].reg = tmp;
16594           NEON_ENCODE (INTEGER, inst);
16595           neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
16596         }
16597     }
16598 }
16599
16600 static void
16601 do_neon_rshl (void)
16602 {
16603   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
16604    return;
16605
16606   enum neon_shape rs;
16607   struct neon_type_el et;
16608   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
16609     {
16610       rs = neon_select_shape (NS_QQR, NS_QQQ, NS_NULL);
16611       et = neon_check_type (3, rs, N_EQK, N_EQK, N_SU_MVE | N_KEY);
16612     }
16613   else
16614     {
16615       rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
16616       et = neon_check_type (3, rs, N_EQK, N_EQK, N_SU_ALL | N_KEY);
16617     }
16618
16619   unsigned int tmp;
16620
16621   if (rs == NS_QQR)
16622     {
16623       if (inst.operands[2].reg == REG_PC)
16624         as_tsktsk (MVE_BAD_PC);
16625       else if (inst.operands[2].reg == REG_SP)
16626         as_tsktsk (MVE_BAD_SP);
16627
16628       constraint (inst.operands[0].reg != inst.operands[1].reg,
16629                   _("invalid instruction shape"));
16630
16631       if (inst.instruction == 0x0000510)
16632         /* We are dealing with vqrshl.  */
16633         inst.instruction = 0xee331ee0;
16634       else
16635         /* We are dealing with vrshl.  */
16636         inst.instruction = 0xee331e60;
16637
16638       inst.instruction |= (et.type == NT_unsigned) << 28;
16639       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16640       inst.instruction |= neon_logbits (et.size) << 18;
16641       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16642       inst.instruction |= inst.operands[2].reg;
16643       inst.is_neon = 1;
16644     }
16645   else
16646     {
16647       tmp = inst.operands[2].reg;
16648       inst.operands[2].reg = inst.operands[1].reg;
16649       inst.operands[1].reg = tmp;
16650       neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
16651     }
16652 }
16653
16654 static int
16655 neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
16656 {
16657   /* Handle .I8 pseudo-instructions.  */
16658   if (size == 8)
16659     {
16660       /* Unfortunately, this will make everything apart from zero out-of-range.
16661          FIXME is this the intended semantics? There doesn't seem much point in
16662          accepting .I8 if so.  */
16663       immediate |= immediate << 8;
16664       size = 16;
16665     }
16666
16667   if (size >= 32)
16668     {
16669       if (immediate == (immediate & 0x000000ff))
16670         {
16671           *immbits = immediate;
16672           return 0x1;
16673         }
16674       else if (immediate == (immediate & 0x0000ff00))
16675         {
16676           *immbits = immediate >> 8;
16677           return 0x3;
16678         }
16679       else if (immediate == (immediate & 0x00ff0000))
16680         {
16681           *immbits = immediate >> 16;
16682           return 0x5;
16683         }
16684       else if (immediate == (immediate & 0xff000000))
16685         {
16686           *immbits = immediate >> 24;
16687           return 0x7;
16688         }
16689       if ((immediate & 0xffff) != (immediate >> 16))
16690         goto bad_immediate;
16691       immediate &= 0xffff;
16692     }
16693
16694   if (immediate == (immediate & 0x000000ff))
16695     {
16696       *immbits = immediate;
16697       return 0x9;
16698     }
16699   else if (immediate == (immediate & 0x0000ff00))
16700     {
16701       *immbits = immediate >> 8;
16702       return 0xb;
16703     }
16704
16705   bad_immediate:
16706   first_error (_("immediate value out of range"));
16707   return FAIL;
16708 }
16709
16710 static void
16711 do_neon_logic (void)
16712 {
16713   if (inst.operands[2].present && inst.operands[2].isreg)
16714     {
16715       enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
16716       if (rs == NS_QQQ
16717           && check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC)
16718           == FAIL)
16719         return;
16720       else if (rs != NS_QQQ
16721                && !ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1))
16722         first_error (BAD_FPU);
16723
16724       neon_check_type (3, rs, N_IGNORE_TYPE);
16725       /* U bit and size field were set as part of the bitmask.  */
16726       NEON_ENCODE (INTEGER, inst);
16727       neon_three_same (neon_quad (rs), 0, -1);
16728     }
16729   else
16730     {
16731       const int three_ops_form = (inst.operands[2].present
16732                                   && !inst.operands[2].isreg);
16733       const int immoperand = (three_ops_form ? 2 : 1);
16734       enum neon_shape rs = (three_ops_form
16735                             ? neon_select_shape (NS_DDI, NS_QQI, NS_NULL)
16736                             : neon_select_shape (NS_DI, NS_QI, NS_NULL));
16737       /* Because neon_select_shape makes the second operand a copy of the first
16738          if the second operand is not present.  */
16739       if (rs == NS_QQI
16740           && check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC)
16741           == FAIL)
16742         return;
16743       else if (rs != NS_QQI
16744                && !ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1))
16745         first_error (BAD_FPU);
16746
16747       struct neon_type_el et;
16748       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
16749         et = neon_check_type (2, rs, N_I32 | N_I16 | N_KEY, N_EQK);
16750       else
16751         et = neon_check_type (2, rs, N_I8 | N_I16 | N_I32 | N_I64 | N_F32
16752                               | N_KEY, N_EQK);
16753
16754       if (et.type == NT_invtype)
16755         return;
16756       enum neon_opc opcode = (enum neon_opc) inst.instruction & 0x0fffffff;
16757       unsigned immbits;
16758       int cmode;
16759
16760
16761       if (three_ops_form)
16762         constraint (inst.operands[0].reg != inst.operands[1].reg,
16763                     _("first and second operands shall be the same register"));
16764
16765       NEON_ENCODE (IMMED, inst);
16766
16767       immbits = inst.operands[immoperand].imm;
16768       if (et.size == 64)
16769         {
16770           /* .i64 is a pseudo-op, so the immediate must be a repeating
16771              pattern.  */
16772           if (immbits != (inst.operands[immoperand].regisimm ?
16773                           inst.operands[immoperand].reg : 0))
16774             {
16775               /* Set immbits to an invalid constant.  */
16776               immbits = 0xdeadbeef;
16777             }
16778         }
16779
16780       switch (opcode)
16781         {
16782         case N_MNEM_vbic:
16783           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
16784           break;
16785
16786         case N_MNEM_vorr:
16787           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
16788           break;
16789
16790         case N_MNEM_vand:
16791           /* Pseudo-instruction for VBIC.  */
16792           neon_invert_size (&immbits, 0, et.size);
16793           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
16794           break;
16795
16796         case N_MNEM_vorn:
16797           /* Pseudo-instruction for VORR.  */
16798           neon_invert_size (&immbits, 0, et.size);
16799           cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
16800           break;
16801
16802         default:
16803           abort ();
16804         }
16805
16806       if (cmode == FAIL)
16807         return;
16808
16809       inst.instruction |= neon_quad (rs) << 6;
16810       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16811       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16812       inst.instruction |= cmode << 8;
16813       neon_write_immbits (immbits);
16814
16815       neon_dp_fixup (&inst);
16816     }
16817 }
16818
16819 static void
16820 do_neon_bitfield (void)
16821 {
16822   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
16823   neon_check_type (3, rs, N_IGNORE_TYPE);
16824   neon_three_same (neon_quad (rs), 0, -1);
16825 }
16826
16827 static void
16828 neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
16829                   unsigned destbits)
16830 {
16831   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_QQR, NS_NULL);
16832   struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
16833                                             types | N_KEY);
16834   if (et.type == NT_float)
16835     {
16836       NEON_ENCODE (FLOAT, inst);
16837       if (rs == NS_QQR)
16838         mve_encode_qqr (et.size, 0, 1);
16839       else
16840         neon_three_same (neon_quad (rs), 0, et.size == 16 ? (int) et.size : -1);
16841     }
16842   else
16843     {
16844       NEON_ENCODE (INTEGER, inst);
16845       if (rs == NS_QQR)
16846         mve_encode_qqr (et.size, et.type == ubit_meaning, 0);
16847       else
16848         neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
16849     }
16850 }
16851
16852
16853 static void
16854 do_neon_dyadic_if_su_d (void)
16855 {
16856   /* This version only allow D registers, but that constraint is enforced during
16857      operand parsing so we don't need to do anything extra here.  */
16858   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
16859 }
16860
16861 static void
16862 do_neon_dyadic_if_i_d (void)
16863 {
16864   /* The "untyped" case can't happen. Do this to stop the "U" bit being
16865      affected if we specify unsigned args.  */
16866   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
16867 }
16868
16869 static void
16870 do_mve_vstr_vldr_QI (int size, int elsize, int load)
16871 {
16872   constraint (size < 32, BAD_ADDR_MODE);
16873   constraint (size != elsize, BAD_EL_TYPE);
16874   constraint (inst.operands[1].immisreg, BAD_ADDR_MODE);
16875   constraint (!inst.operands[1].preind, BAD_ADDR_MODE);
16876   constraint (load && inst.operands[0].reg == inst.operands[1].reg,
16877               _("destination register and offset register may not be the"
16878                 " same"));
16879
16880   int imm = inst.relocs[0].exp.X_add_number;
16881   int add = 1;
16882   if (imm < 0)
16883     {
16884       add = 0;
16885       imm = -imm;
16886     }
16887   constraint ((imm % (size / 8) != 0)
16888               || imm > (0x7f << neon_logbits (size)),
16889               (size == 32) ? _("immediate must be a multiple of 4 in the"
16890                                " range of +/-[0,508]")
16891                            : _("immediate must be a multiple of 8 in the"
16892                                " range of +/-[0,1016]"));
16893   inst.instruction |= 0x11 << 24;
16894   inst.instruction |= add << 23;
16895   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16896   inst.instruction |= inst.operands[1].writeback << 21;
16897   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
16898   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16899   inst.instruction |= 1 << 12;
16900   inst.instruction |= (size == 64) << 8;
16901   inst.instruction &= 0xffffff00;
16902   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
16903   inst.instruction |= imm >> neon_logbits (size);
16904 }
16905
16906 static void
16907 do_mve_vstr_vldr_RQ (int size, int elsize, int load)
16908 {
16909     unsigned os = inst.operands[1].imm >> 5;
16910     constraint (os != 0 && size == 8,
16911                 _("can not shift offsets when accessing less than half-word"));
16912     constraint (os && os != neon_logbits (size),
16913                 _("shift immediate must be 1, 2 or 3 for half-word, word"
16914                   " or double-word accesses respectively"));
16915     if (inst.operands[1].reg == REG_PC)
16916       as_tsktsk (MVE_BAD_PC);
16917
16918     switch (size)
16919       {
16920       case 8:
16921         constraint (elsize >= 64, BAD_EL_TYPE);
16922         break;
16923       case 16:
16924         constraint (elsize < 16 || elsize >= 64, BAD_EL_TYPE);
16925         break;
16926       case 32:
16927       case 64:
16928         constraint (elsize != size, BAD_EL_TYPE);
16929         break;
16930       default:
16931         break;
16932       }
16933     constraint (inst.operands[1].writeback || !inst.operands[1].preind,
16934                 BAD_ADDR_MODE);
16935     if (load)
16936       {
16937         constraint (inst.operands[0].reg == (inst.operands[1].imm & 0x1f),
16938                     _("destination register and offset register may not be"
16939                     " the same"));
16940         constraint (size == elsize && inst.vectype.el[0].type != NT_unsigned,
16941                     BAD_EL_TYPE);
16942         constraint (inst.vectype.el[0].type != NT_unsigned
16943                     && inst.vectype.el[0].type != NT_signed, BAD_EL_TYPE);
16944         inst.instruction |= (inst.vectype.el[0].type == NT_unsigned) << 28;
16945       }
16946     else
16947       {
16948         constraint (inst.vectype.el[0].type != NT_untyped, BAD_EL_TYPE);
16949       }
16950
16951     inst.instruction |= 1 << 23;
16952     inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16953     inst.instruction |= inst.operands[1].reg << 16;
16954     inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16955     inst.instruction |= neon_logbits (elsize) << 7;
16956     inst.instruction |= HI1 (inst.operands[1].imm) << 5;
16957     inst.instruction |= LOW4 (inst.operands[1].imm);
16958     inst.instruction |= !!os;
16959 }
16960
16961 static void
16962 do_mve_vstr_vldr_RI (int size, int elsize, int load)
16963 {
16964   enum neon_el_type type = inst.vectype.el[0].type;
16965
16966   constraint (size >= 64, BAD_ADDR_MODE);
16967   switch (size)
16968     {
16969     case 16:
16970       constraint (elsize < 16 || elsize >= 64, BAD_EL_TYPE);
16971       break;
16972     case 32:
16973       constraint (elsize != size, BAD_EL_TYPE);
16974       break;
16975     default:
16976       break;
16977     }
16978   if (load)
16979     {
16980       constraint (elsize != size && type != NT_unsigned
16981                   && type != NT_signed, BAD_EL_TYPE);
16982     }
16983   else
16984     {
16985       constraint (elsize != size && type != NT_untyped, BAD_EL_TYPE);
16986     }
16987
16988   int imm = inst.relocs[0].exp.X_add_number;
16989   int add = 1;
16990   if (imm < 0)
16991     {
16992       add = 0;
16993       imm = -imm;
16994     }
16995
16996   if ((imm % (size / 8) != 0) || imm > (0x7f << neon_logbits (size)))
16997     {
16998       switch (size)
16999         {
17000         case 8:
17001           constraint (1, _("immediate must be in the range of +/-[0,127]"));
17002           break;
17003         case 16:
17004           constraint (1, _("immediate must be a multiple of 2 in the"
17005                            " range of +/-[0,254]"));
17006           break;
17007         case 32:
17008           constraint (1, _("immediate must be a multiple of 4 in the"
17009                            " range of +/-[0,508]"));
17010           break;
17011         }
17012     }
17013
17014   if (size != elsize)
17015     {
17016       constraint (inst.operands[1].reg > 7, BAD_HIREG);
17017       constraint (inst.operands[0].reg > 14,
17018                   _("MVE vector register in the range [Q0..Q7] expected"));
17019       inst.instruction |= (load && type == NT_unsigned) << 28;
17020       inst.instruction |= (size == 16) << 19;
17021       inst.instruction |= neon_logbits (elsize) << 7;
17022     }
17023   else
17024     {
17025       if (inst.operands[1].reg == REG_PC)
17026         as_tsktsk (MVE_BAD_PC);
17027       else if (inst.operands[1].reg == REG_SP && inst.operands[1].writeback)
17028         as_tsktsk (MVE_BAD_SP);
17029       inst.instruction |= 1 << 12;
17030       inst.instruction |= neon_logbits (size) << 7;
17031     }
17032   inst.instruction |= inst.operands[1].preind << 24;
17033   inst.instruction |= add << 23;
17034   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
17035   inst.instruction |= inst.operands[1].writeback << 21;
17036   inst.instruction |= inst.operands[1].reg << 16;
17037   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
17038   inst.instruction &= 0xffffff80;
17039   inst.instruction |= imm >> neon_logbits (size);
17040
17041 }
17042
17043 static void
17044 do_mve_vstr_vldr (void)
17045 {
17046   unsigned size;
17047   int load = 0;
17048
17049   if (inst.cond > COND_ALWAYS)
17050     inst.pred_insn_type = INSIDE_VPT_INSN;
17051   else
17052     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17053
17054   switch (inst.instruction)
17055     {
17056     default:
17057       gas_assert (0);
17058       break;
17059     case M_MNEM_vldrb:
17060       load = 1;
17061       /* fall through.  */
17062     case M_MNEM_vstrb:
17063       size = 8;
17064       break;
17065     case M_MNEM_vldrh:
17066       load = 1;
17067       /* fall through.  */
17068     case M_MNEM_vstrh:
17069       size = 16;
17070       break;
17071     case M_MNEM_vldrw:
17072       load = 1;
17073       /* fall through.  */
17074     case M_MNEM_vstrw:
17075       size = 32;
17076       break;
17077     case M_MNEM_vldrd:
17078       load = 1;
17079       /* fall through.  */
17080     case M_MNEM_vstrd:
17081       size = 64;
17082       break;
17083     }
17084   unsigned elsize = inst.vectype.el[0].size;
17085
17086   if (inst.operands[1].isquad)
17087     {
17088       /* We are dealing with [Q, imm]{!} cases.  */
17089       do_mve_vstr_vldr_QI (size, elsize, load);
17090     }
17091   else
17092     {
17093       if (inst.operands[1].immisreg == 2)
17094         {
17095           /* We are dealing with [R, Q, {UXTW #os}] cases.  */
17096           do_mve_vstr_vldr_RQ (size, elsize, load);
17097         }
17098       else if (!inst.operands[1].immisreg)
17099         {
17100           /* We are dealing with [R, Imm]{!}/[R], Imm cases.  */
17101           do_mve_vstr_vldr_RI (size, elsize, load);
17102         }
17103       else
17104         constraint (1, BAD_ADDR_MODE);
17105     }
17106
17107   inst.is_neon = 1;
17108 }
17109
17110 static void
17111 do_mve_vst_vld (void)
17112 {
17113   if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
17114     return;
17115
17116   constraint (!inst.operands[1].preind || inst.relocs[0].exp.X_add_symbol != 0
17117               || inst.relocs[0].exp.X_add_number != 0
17118               || inst.operands[1].immisreg != 0,
17119               BAD_ADDR_MODE);
17120   constraint (inst.vectype.el[0].size > 32, BAD_EL_TYPE);
17121   if (inst.operands[1].reg == REG_PC)
17122     as_tsktsk (MVE_BAD_PC);
17123   else if (inst.operands[1].reg == REG_SP && inst.operands[1].writeback)
17124     as_tsktsk (MVE_BAD_SP);
17125
17126
17127   /* These instructions are one of the "exceptions" mentioned in
17128      handle_pred_state.  They are MVE instructions that are not VPT compatible
17129      and do not accept a VPT code, thus appending such a code is a syntax
17130      error.  */
17131   if (inst.cond > COND_ALWAYS)
17132     first_error (BAD_SYNTAX);
17133   /* If we append a scalar condition code we can set this to
17134      MVE_OUTSIDE_PRED_INSN as it will also lead to a syntax error.  */
17135   else if (inst.cond < COND_ALWAYS)
17136     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17137   else
17138     inst.pred_insn_type = MVE_UNPREDICABLE_INSN;
17139
17140   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
17141   inst.instruction |= inst.operands[1].writeback << 21;
17142   inst.instruction |= inst.operands[1].reg << 16;
17143   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
17144   inst.instruction |= neon_logbits (inst.vectype.el[0].size) << 7;
17145   inst.is_neon = 1;
17146 }
17147
17148 static void
17149 do_mve_vaddlv (void)
17150 {
17151   enum neon_shape rs = neon_select_shape (NS_RRQ, NS_NULL);
17152   struct neon_type_el et
17153     = neon_check_type (3, rs, N_EQK, N_EQK, N_S32 | N_U32 | N_KEY);
17154
17155   if (et.type == NT_invtype)
17156     first_error (BAD_EL_TYPE);
17157
17158   if (inst.cond > COND_ALWAYS)
17159     inst.pred_insn_type = INSIDE_VPT_INSN;
17160   else
17161     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17162
17163   constraint (inst.operands[1].reg > 14, MVE_BAD_QREG);
17164
17165   inst.instruction |= (et.type == NT_unsigned) << 28;
17166   inst.instruction |= inst.operands[1].reg << 19;
17167   inst.instruction |= inst.operands[0].reg << 12;
17168   inst.instruction |= inst.operands[2].reg;
17169   inst.is_neon = 1;
17170 }
17171
17172 static void
17173 do_neon_dyadic_if_su (void)
17174 {
17175   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_QQR, NS_NULL);
17176   struct neon_type_el et = neon_check_type (3, rs, N_EQK , N_EQK,
17177                                             N_SUF_32 | N_KEY);
17178
17179   constraint ((inst.instruction == ((unsigned) N_MNEM_vmax)
17180                || inst.instruction == ((unsigned) N_MNEM_vmin))
17181               && et.type == NT_float
17182               && !ARM_CPU_HAS_FEATURE (cpu_variant,fpu_neon_ext_v1), BAD_FPU);
17183
17184   if (check_simd_pred_availability (et.type == NT_float,
17185                                     NEON_CHECK_ARCH | NEON_CHECK_CC))
17186     return;
17187
17188   neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
17189 }
17190
17191 static void
17192 do_neon_addsub_if_i (void)
17193 {
17194   if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1xd)
17195       && try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
17196     return;
17197
17198   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_QQR, NS_NULL);
17199   struct neon_type_el et = neon_check_type (3, rs, N_EQK,
17200                                             N_EQK, N_IF_32 | N_I64 | N_KEY);
17201
17202   constraint (rs == NS_QQR && et.size == 64, BAD_FPU);
17203   /* If we are parsing Q registers and the element types match MVE, which NEON
17204      also supports, then we must check whether this is an instruction that can
17205      be used by both MVE/NEON.  This distinction can be made based on whether
17206      they are predicated or not.  */
17207   if ((rs == NS_QQQ || rs == NS_QQR) && et.size != 64)
17208     {
17209       if (check_simd_pred_availability (et.type == NT_float,
17210                                         NEON_CHECK_ARCH | NEON_CHECK_CC))
17211         return;
17212     }
17213   else
17214     {
17215       /* If they are either in a D register or are using an unsupported.  */
17216       if (rs != NS_QQR
17217           && vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
17218         return;
17219     }
17220
17221   /* The "untyped" case can't happen. Do this to stop the "U" bit being
17222      affected if we specify unsigned args.  */
17223   neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
17224 }
17225
17226 /* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
17227    result to be:
17228      V<op> A,B     (A is operand 0, B is operand 2)
17229    to mean:
17230      V<op> A,B,A
17231    not:
17232      V<op> A,B,B
17233    so handle that case specially.  */
17234
17235 static void
17236 neon_exchange_operands (void)
17237 {
17238   if (inst.operands[1].present)
17239     {
17240       void *scratch = xmalloc (sizeof (inst.operands[0]));
17241
17242       /* Swap operands[1] and operands[2].  */
17243       memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
17244       inst.operands[1] = inst.operands[2];
17245       memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
17246       free (scratch);
17247     }
17248   else
17249     {
17250       inst.operands[1] = inst.operands[2];
17251       inst.operands[2] = inst.operands[0];
17252     }
17253 }
17254
17255 static void
17256 neon_compare (unsigned regtypes, unsigned immtypes, int invert)
17257 {
17258   if (inst.operands[2].isreg)
17259     {
17260       if (invert)
17261         neon_exchange_operands ();
17262       neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
17263     }
17264   else
17265     {
17266       enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
17267       struct neon_type_el et = neon_check_type (2, rs,
17268         N_EQK | N_SIZ, immtypes | N_KEY);
17269
17270       NEON_ENCODE (IMMED, inst);
17271       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
17272       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
17273       inst.instruction |= LOW4 (inst.operands[1].reg);
17274       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
17275       inst.instruction |= neon_quad (rs) << 6;
17276       inst.instruction |= (et.type == NT_float) << 10;
17277       inst.instruction |= neon_logbits (et.size) << 18;
17278
17279       neon_dp_fixup (&inst);
17280     }
17281 }
17282
17283 static void
17284 do_neon_cmp (void)
17285 {
17286   neon_compare (N_SUF_32, N_S_32 | N_F_16_32, FALSE);
17287 }
17288
17289 static void
17290 do_neon_cmp_inv (void)
17291 {
17292   neon_compare (N_SUF_32, N_S_32 | N_F_16_32, TRUE);
17293 }
17294
17295 static void
17296 do_neon_ceq (void)
17297 {
17298   neon_compare (N_IF_32, N_IF_32, FALSE);
17299 }
17300
17301 /* For multiply instructions, we have the possibility of 16-bit or 32-bit
17302    scalars, which are encoded in 5 bits, M : Rm.
17303    For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
17304    M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
17305    index in M.
17306
17307    Dot Product instructions are similar to multiply instructions except elsize
17308    should always be 32.
17309
17310    This function translates SCALAR, which is GAS's internal encoding of indexed
17311    scalar register, to raw encoding.  There is also register and index range
17312    check based on ELSIZE.  */
17313
17314 static unsigned
17315 neon_scalar_for_mul (unsigned scalar, unsigned elsize)
17316 {
17317   unsigned regno = NEON_SCALAR_REG (scalar);
17318   unsigned elno = NEON_SCALAR_INDEX (scalar);
17319
17320   switch (elsize)
17321     {
17322     case 16:
17323       if (regno > 7 || elno > 3)
17324         goto bad_scalar;
17325       return regno | (elno << 3);
17326
17327     case 32:
17328       if (regno > 15 || elno > 1)
17329         goto bad_scalar;
17330       return regno | (elno << 4);
17331
17332     default:
17333     bad_scalar:
17334       first_error (_("scalar out of range for multiply instruction"));
17335     }
17336
17337   return 0;
17338 }
17339
17340 /* Encode multiply / multiply-accumulate scalar instructions.  */
17341
17342 static void
17343 neon_mul_mac (struct neon_type_el et, int ubit)
17344 {
17345   unsigned scalar;
17346
17347   /* Give a more helpful error message if we have an invalid type.  */
17348   if (et.type == NT_invtype)
17349     return;
17350
17351   scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
17352   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
17353   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
17354   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
17355   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
17356   inst.instruction |= LOW4 (scalar);
17357   inst.instruction |= HI1 (scalar) << 5;
17358   inst.instruction |= (et.type == NT_float) << 8;
17359   inst.instruction |= neon_logbits (et.size) << 20;
17360   inst.instruction |= (ubit != 0) << 24;
17361
17362   neon_dp_fixup (&inst);
17363 }
17364
17365 static void
17366 do_neon_mac_maybe_scalar (void)
17367 {
17368   if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
17369     return;
17370
17371   if (check_simd_pred_availability (0, NEON_CHECK_CC | NEON_CHECK_ARCH))
17372     return;
17373
17374   if (inst.operands[2].isscalar)
17375     {
17376       constraint (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext), BAD_FPU);
17377       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
17378       struct neon_type_el et = neon_check_type (3, rs,
17379         N_EQK, N_EQK, N_I16 | N_I32 | N_F_16_32 | N_KEY);
17380       NEON_ENCODE (SCALAR, inst);
17381       neon_mul_mac (et, neon_quad (rs));
17382     }
17383   else if (!inst.operands[2].isvec)
17384     {
17385       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext), BAD_FPU);
17386
17387       enum neon_shape rs = neon_select_shape (NS_QQR, NS_NULL);
17388       neon_check_type (3, rs, N_EQK, N_EQK, N_SU_MVE | N_KEY);
17389
17390       neon_dyadic_misc (NT_unsigned, N_SU_MVE, 0);
17391     }
17392   else
17393     {
17394       constraint (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext), BAD_FPU);
17395       /* The "untyped" case can't happen.  Do this to stop the "U" bit being
17396          affected if we specify unsigned args.  */
17397       neon_dyadic_misc (NT_untyped, N_IF_32, 0);
17398     }
17399 }
17400
17401 static void
17402 do_neon_fmac (void)
17403 {
17404   if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_fma)
17405       && try_vfp_nsyn (3, do_vfp_nsyn_fma_fms) == SUCCESS)
17406     return;
17407
17408   if (check_simd_pred_availability (1, NEON_CHECK_CC | NEON_CHECK_ARCH))
17409     return;
17410
17411   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_fp_ext))
17412     {
17413       enum neon_shape rs = neon_select_shape (NS_QQQ, NS_QQR, NS_NULL);
17414       struct neon_type_el et = neon_check_type (3, rs, N_F_MVE | N_KEY, N_EQK,
17415                                                 N_EQK);
17416
17417       if (rs == NS_QQR)
17418         {
17419           if (inst.operands[2].reg == REG_SP)
17420             as_tsktsk (MVE_BAD_SP);
17421           else if (inst.operands[2].reg == REG_PC)
17422             as_tsktsk (MVE_BAD_PC);
17423
17424           inst.instruction = 0xee310e40;
17425           inst.instruction |= (et.size == 16) << 28;
17426           inst.instruction |= HI1 (inst.operands[0].reg) << 22;
17427           inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
17428           inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
17429           inst.instruction |= HI1 (inst.operands[1].reg) << 6;
17430           inst.instruction |= inst.operands[2].reg;
17431           inst.is_neon = 1;
17432           return;
17433         }
17434     }
17435   else
17436     {
17437       constraint (!inst.operands[2].isvec, BAD_FPU);
17438     }
17439
17440   neon_dyadic_misc (NT_untyped, N_IF_32, 0);
17441 }
17442
17443 static void
17444 do_neon_tst (void)
17445 {
17446   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
17447   struct neon_type_el et = neon_check_type (3, rs,
17448     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
17449   neon_three_same (neon_quad (rs), 0, et.size);
17450 }
17451
17452 /* VMUL with 3 registers allows the P8 type. The scalar version supports the
17453    same types as the MAC equivalents. The polynomial type for this instruction
17454    is encoded the same as the integer type.  */
17455
17456 static void
17457 do_neon_mul (void)
17458 {
17459   if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
17460     return;
17461
17462   if (check_simd_pred_availability (0, NEON_CHECK_CC | NEON_CHECK_ARCH))
17463     return;
17464
17465   if (inst.operands[2].isscalar)
17466     {
17467       constraint (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext), BAD_FPU);
17468       do_neon_mac_maybe_scalar ();
17469     }
17470   else
17471     {
17472       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
17473         {
17474           enum neon_shape rs = neon_select_shape (NS_QQR, NS_QQQ, NS_NULL);
17475           struct neon_type_el et
17476             = neon_check_type (3, rs, N_EQK, N_EQK, N_I_MVE | N_F_MVE | N_KEY);
17477           if (et.type == NT_float)
17478             constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_fp_ext),
17479                         BAD_FPU);
17480
17481           neon_dyadic_misc (NT_float, N_I_MVE | N_F_MVE, 0);
17482         }
17483       else
17484         {
17485           constraint (!inst.operands[2].isvec, BAD_FPU);
17486           neon_dyadic_misc (NT_poly,
17487                             N_I8 | N_I16 | N_I32 | N_F16 | N_F32 | N_P8, 0);
17488         }
17489     }
17490 }
17491
17492 static void
17493 do_neon_qdmulh (void)
17494 {
17495   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
17496    return;
17497
17498   if (inst.operands[2].isscalar)
17499     {
17500       constraint (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext), BAD_FPU);
17501       enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
17502       struct neon_type_el et = neon_check_type (3, rs,
17503         N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
17504       NEON_ENCODE (SCALAR, inst);
17505       neon_mul_mac (et, neon_quad (rs));
17506     }
17507   else
17508     {
17509       enum neon_shape rs;
17510       struct neon_type_el et;
17511       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
17512         {
17513           rs = neon_select_shape (NS_QQR, NS_QQQ, NS_NULL);
17514           et = neon_check_type (3, rs,
17515             N_EQK, N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
17516         }
17517       else
17518         {
17519           rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
17520           et = neon_check_type (3, rs,
17521             N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
17522         }
17523
17524       NEON_ENCODE (INTEGER, inst);
17525       if (rs == NS_QQR)
17526         mve_encode_qqr (et.size, 0, 0);
17527       else
17528         /* The U bit (rounding) comes from bit mask.  */
17529         neon_three_same (neon_quad (rs), 0, et.size);
17530     }
17531 }
17532
17533 static void
17534 do_mve_vaddv (void)
17535 {
17536   enum neon_shape rs = neon_select_shape (NS_RQ, NS_NULL);
17537   struct neon_type_el et
17538     = neon_check_type (2, rs, N_EQK,  N_SU_32 | N_KEY);
17539
17540   if (et.type == NT_invtype)
17541     first_error (BAD_EL_TYPE);
17542
17543   if (inst.cond > COND_ALWAYS)
17544     inst.pred_insn_type = INSIDE_VPT_INSN;
17545   else
17546     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17547
17548   constraint (inst.operands[1].reg > 14, MVE_BAD_QREG);
17549
17550   mve_encode_rq (et.type == NT_unsigned, et.size);
17551 }
17552
17553 static void
17554 do_mve_vhcadd (void)
17555 {
17556   enum neon_shape rs = neon_select_shape (NS_QQQI, NS_NULL);
17557   struct neon_type_el et
17558     = neon_check_type (3, rs, N_EQK, N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
17559
17560   if (inst.cond > COND_ALWAYS)
17561     inst.pred_insn_type = INSIDE_VPT_INSN;
17562   else
17563     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17564
17565   unsigned rot = inst.relocs[0].exp.X_add_number;
17566   constraint (rot != 90 && rot != 270, _("immediate out of range"));
17567
17568   if (et.size == 32 && inst.operands[0].reg == inst.operands[2].reg)
17569     as_tsktsk (_("Warning: 32-bit element size and same first and third "
17570                  "operand makes instruction UNPREDICTABLE"));
17571
17572   mve_encode_qqq (0, et.size);
17573   inst.instruction |= (rot == 270) << 12;
17574   inst.is_neon = 1;
17575 }
17576
17577 static void
17578 do_mve_vqdmull (void)
17579 {
17580   enum neon_shape rs = neon_select_shape (NS_QQQ, NS_QQR, NS_NULL);
17581   struct neon_type_el et
17582     = neon_check_type (3, rs, N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
17583
17584   if (et.size == 32
17585       && (inst.operands[0].reg == inst.operands[1].reg
17586           || (rs == NS_QQQ && inst.operands[0].reg == inst.operands[2].reg)))
17587     as_tsktsk (BAD_MVE_SRCDEST);
17588
17589   if (inst.cond > COND_ALWAYS)
17590     inst.pred_insn_type = INSIDE_VPT_INSN;
17591   else
17592     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17593
17594   if (rs == NS_QQQ)
17595     {
17596       mve_encode_qqq (et.size == 32, 64);
17597       inst.instruction |= 1;
17598     }
17599   else
17600     {
17601       mve_encode_qqr (64, et.size == 32, 0);
17602       inst.instruction |= 0x3 << 5;
17603     }
17604 }
17605
17606 static void
17607 do_mve_vadc (void)
17608 {
17609   enum neon_shape rs = neon_select_shape (NS_QQQ, NS_NULL);
17610   struct neon_type_el et
17611     = neon_check_type (3, rs, N_KEY | N_I32, N_EQK, N_EQK);
17612
17613   if (et.type == NT_invtype)
17614     first_error (BAD_EL_TYPE);
17615
17616   if (inst.cond > COND_ALWAYS)
17617     inst.pred_insn_type = INSIDE_VPT_INSN;
17618   else
17619     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17620
17621   mve_encode_qqq (0, 64);
17622 }
17623
17624 static void
17625 do_mve_vbrsr (void)
17626 {
17627   enum neon_shape rs = neon_select_shape (NS_QQR, NS_NULL);
17628   struct neon_type_el et
17629     = neon_check_type (3, rs, N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
17630
17631   if (inst.cond > COND_ALWAYS)
17632     inst.pred_insn_type = INSIDE_VPT_INSN;
17633   else
17634     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17635
17636   mve_encode_qqr (et.size, 0, 0);
17637 }
17638
17639 static void
17640 do_mve_vsbc (void)
17641 {
17642   neon_check_type (3, NS_QQQ, N_EQK, N_EQK, N_I32 | N_KEY);
17643
17644   if (inst.cond > COND_ALWAYS)
17645     inst.pred_insn_type = INSIDE_VPT_INSN;
17646   else
17647     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17648
17649   mve_encode_qqq (1, 64);
17650 }
17651
17652 static void
17653 do_mve_vmulh (void)
17654 {
17655   enum neon_shape rs = neon_select_shape (NS_QQQ, NS_NULL);
17656   struct neon_type_el et
17657     = neon_check_type (3, rs, N_EQK, N_EQK, N_SU_MVE | N_KEY);
17658
17659   if (inst.cond > COND_ALWAYS)
17660     inst.pred_insn_type = INSIDE_VPT_INSN;
17661   else
17662     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17663
17664   mve_encode_qqq (et.type == NT_unsigned, et.size);
17665 }
17666
17667 static void
17668 do_mve_vqdmlah (void)
17669 {
17670   enum neon_shape rs = neon_select_shape (NS_QQR, NS_NULL);
17671   struct neon_type_el et
17672     = neon_check_type (3, rs, N_EQK, N_EQK, N_SU_MVE | N_KEY);
17673
17674   if (inst.cond > COND_ALWAYS)
17675     inst.pred_insn_type = INSIDE_VPT_INSN;
17676   else
17677     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17678
17679   mve_encode_qqr (et.size, et.type == NT_unsigned, 0);
17680 }
17681
17682 static void
17683 do_mve_vqdmladh (void)
17684 {
17685   enum neon_shape rs = neon_select_shape (NS_QQQ, NS_NULL);
17686   struct neon_type_el et
17687     = neon_check_type (3, rs, N_EQK, N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
17688
17689   if (inst.cond > COND_ALWAYS)
17690     inst.pred_insn_type = INSIDE_VPT_INSN;
17691   else
17692     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17693
17694   if (et.size == 32
17695       && (inst.operands[0].reg == inst.operands[1].reg
17696           || inst.operands[0].reg == inst.operands[2].reg))
17697     as_tsktsk (BAD_MVE_SRCDEST);
17698
17699   mve_encode_qqq (0, et.size);
17700 }
17701
17702
17703 static void
17704 do_mve_vmull (void)
17705 {
17706
17707   enum neon_shape rs = neon_select_shape (NS_HHH, NS_FFF, NS_DDD, NS_DDS,
17708                                           NS_QQS, NS_QQQ, NS_QQR, NS_NULL);
17709   if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext)
17710       && inst.cond == COND_ALWAYS
17711       && ((unsigned)inst.instruction) == M_MNEM_vmullt)
17712     {
17713       if (rs == NS_QQQ)
17714         {
17715
17716           struct neon_type_el et = neon_check_type (3, rs, N_EQK , N_EQK,
17717                                                     N_SUF_32 | N_F64 | N_P8
17718                                                     | N_P16 | N_I_MVE | N_KEY);
17719           if (((et.type == NT_poly) && et.size == 8
17720                && ARM_CPU_IS_ANY (cpu_variant))
17721               || (et.type == NT_integer) || (et.type == NT_float))
17722             goto neon_vmul;
17723         }
17724       else
17725         goto neon_vmul;
17726     }
17727
17728   constraint (rs != NS_QQQ, BAD_FPU);
17729   struct neon_type_el et = neon_check_type (3, rs, N_EQK , N_EQK,
17730                                             N_SU_32 | N_P8 | N_P16 | N_KEY);
17731
17732   /* We are dealing with MVE's vmullt.  */
17733   if (et.size == 32
17734       && (inst.operands[0].reg == inst.operands[1].reg
17735           || inst.operands[0].reg == inst.operands[2].reg))
17736     as_tsktsk (BAD_MVE_SRCDEST);
17737
17738   if (inst.cond > COND_ALWAYS)
17739     inst.pred_insn_type = INSIDE_VPT_INSN;
17740   else
17741     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17742
17743   if (et.type == NT_poly)
17744     mve_encode_qqq (neon_logbits (et.size), 64);
17745   else
17746     mve_encode_qqq (et.type == NT_unsigned, et.size);
17747
17748   return;
17749
17750 neon_vmul:
17751   inst.instruction = N_MNEM_vmul;
17752   inst.cond = 0xb;
17753   if (thumb_mode)
17754     inst.pred_insn_type = INSIDE_IT_INSN;
17755   do_neon_mul ();
17756 }
17757
17758 static void
17759 do_mve_vabav (void)
17760 {
17761   enum neon_shape rs = neon_select_shape (NS_RQQ, NS_NULL);
17762
17763   if (rs == NS_NULL)
17764     return;
17765
17766   if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
17767     return;
17768
17769   struct neon_type_el et = neon_check_type (2, NS_NULL, N_EQK, N_KEY | N_S8
17770                                             | N_S16 | N_S32 | N_U8 | N_U16
17771                                             | N_U32);
17772
17773   if (inst.cond > COND_ALWAYS)
17774     inst.pred_insn_type = INSIDE_VPT_INSN;
17775   else
17776     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17777
17778   mve_encode_rqq (et.type == NT_unsigned, et.size);
17779 }
17780
17781 static void
17782 do_mve_vmladav (void)
17783 {
17784   enum neon_shape rs = neon_select_shape (NS_RQQ, NS_NULL);
17785   struct neon_type_el et = neon_check_type (3, rs,
17786                                             N_EQK, N_EQK, N_SU_MVE | N_KEY);
17787
17788   if (et.type == NT_unsigned
17789       && (inst.instruction == M_MNEM_vmladavx
17790           || inst.instruction == M_MNEM_vmladavax
17791           || inst.instruction == M_MNEM_vmlsdav
17792           || inst.instruction == M_MNEM_vmlsdava
17793           || inst.instruction == M_MNEM_vmlsdavx
17794           || inst.instruction == M_MNEM_vmlsdavax))
17795     first_error (BAD_SIMD_TYPE);
17796
17797   constraint (inst.operands[2].reg > 14,
17798               _("MVE vector register in the range [Q0..Q7] expected"));
17799
17800   if (inst.cond > COND_ALWAYS)
17801     inst.pred_insn_type = INSIDE_VPT_INSN;
17802   else
17803     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17804
17805   if (inst.instruction == M_MNEM_vmlsdav
17806       || inst.instruction == M_MNEM_vmlsdava
17807       || inst.instruction == M_MNEM_vmlsdavx
17808       || inst.instruction == M_MNEM_vmlsdavax)
17809     inst.instruction |= (et.size == 8) << 28;
17810   else
17811     inst.instruction |= (et.size == 8) << 8;
17812
17813   mve_encode_rqq (et.type == NT_unsigned, 64);
17814   inst.instruction |= (et.size == 32) << 16;
17815 }
17816
17817 static void
17818 do_mve_vmlaldav (void)
17819 {
17820   enum neon_shape rs = neon_select_shape (NS_RRQQ, NS_NULL);
17821   struct neon_type_el et
17822     = neon_check_type (4, rs, N_EQK, N_EQK, N_EQK,
17823                        N_S16 | N_S32 | N_U16 | N_U32 | N_KEY);
17824
17825   if (et.type == NT_unsigned
17826       && (inst.instruction == M_MNEM_vmlsldav
17827           || inst.instruction == M_MNEM_vmlsldava
17828           || inst.instruction == M_MNEM_vmlsldavx
17829           || inst.instruction == M_MNEM_vmlsldavax))
17830     first_error (BAD_SIMD_TYPE);
17831
17832   if (inst.cond > COND_ALWAYS)
17833     inst.pred_insn_type = INSIDE_VPT_INSN;
17834   else
17835     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17836
17837   mve_encode_rrqq (et.type == NT_unsigned, et.size);
17838 }
17839
17840 static void
17841 do_mve_vrmlaldavh (void)
17842 {
17843   struct neon_type_el et;
17844   if (inst.instruction == M_MNEM_vrmlsldavh
17845      || inst.instruction == M_MNEM_vrmlsldavha
17846      || inst.instruction == M_MNEM_vrmlsldavhx
17847      || inst.instruction == M_MNEM_vrmlsldavhax)
17848     {
17849       et = neon_check_type (4, NS_RRQQ, N_EQK, N_EQK, N_EQK, N_S32 | N_KEY);
17850       if (inst.operands[1].reg == REG_SP)
17851         as_tsktsk (MVE_BAD_SP);
17852     }
17853   else
17854     {
17855       if (inst.instruction == M_MNEM_vrmlaldavhx
17856           || inst.instruction == M_MNEM_vrmlaldavhax)
17857         et = neon_check_type (4, NS_RRQQ, N_EQK, N_EQK, N_EQK, N_S32 | N_KEY);
17858       else
17859         et = neon_check_type (4, NS_RRQQ, N_EQK, N_EQK, N_EQK,
17860                               N_U32 | N_S32 | N_KEY);
17861       /* vrmlaldavh's encoding with SP as the second, odd, GPR operand may alias
17862          with vmax/min instructions, making the use of SP in assembly really
17863          nonsensical, so instead of issuing a warning like we do for other uses
17864          of SP for the odd register operand we error out.  */
17865       constraint (inst.operands[1].reg == REG_SP, BAD_SP);
17866     }
17867
17868   /* Make sure we still check the second operand is an odd one and that PC is
17869      disallowed.  This because we are parsing for any GPR operand, to be able
17870      to distinguish between giving a warning or an error for SP as described
17871      above.  */
17872   constraint ((inst.operands[1].reg % 2) != 1, BAD_EVEN);
17873   constraint (inst.operands[1].reg == REG_PC, BAD_PC);
17874
17875   if (inst.cond > COND_ALWAYS)
17876     inst.pred_insn_type = INSIDE_VPT_INSN;
17877   else
17878     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17879
17880   mve_encode_rrqq (et.type == NT_unsigned, 0);
17881 }
17882
17883
17884 static void
17885 do_mve_vmaxnmv (void)
17886 {
17887   enum neon_shape rs = neon_select_shape (NS_RQ, NS_NULL);
17888   struct neon_type_el et
17889     = neon_check_type (2, rs, N_EQK, N_F_MVE | N_KEY);
17890
17891   if (inst.cond > COND_ALWAYS)
17892     inst.pred_insn_type = INSIDE_VPT_INSN;
17893   else
17894     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17895
17896   if (inst.operands[0].reg == REG_SP)
17897     as_tsktsk (MVE_BAD_SP);
17898   else if (inst.operands[0].reg == REG_PC)
17899     as_tsktsk (MVE_BAD_PC);
17900
17901   mve_encode_rq (et.size == 16, 64);
17902 }
17903
17904 static void
17905 do_mve_vmaxv (void)
17906 {
17907   enum neon_shape rs = neon_select_shape (NS_RQ, NS_NULL);
17908   struct neon_type_el et;
17909
17910   if (inst.instruction == M_MNEM_vmaxv || inst.instruction == M_MNEM_vminv)
17911     et = neon_check_type (2, rs, N_EQK, N_SU_MVE | N_KEY);
17912   else
17913     et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
17914
17915   if (inst.cond > COND_ALWAYS)
17916     inst.pred_insn_type = INSIDE_VPT_INSN;
17917   else
17918     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
17919
17920   if (inst.operands[0].reg == REG_SP)
17921     as_tsktsk (MVE_BAD_SP);
17922   else if (inst.operands[0].reg == REG_PC)
17923     as_tsktsk (MVE_BAD_PC);
17924
17925   mve_encode_rq (et.type == NT_unsigned, et.size);
17926 }
17927
17928
17929 static void
17930 do_neon_qrdmlah (void)
17931 {
17932   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
17933    return;
17934   if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
17935     {
17936       /* Check we're on the correct architecture.  */
17937       if (!mark_feature_used (&fpu_neon_ext_armv8))
17938         inst.error
17939           = _("instruction form not available on this architecture.");
17940       else if (!mark_feature_used (&fpu_neon_ext_v8_1))
17941         {
17942           as_warn (_("this instruction implies use of ARMv8.1 AdvSIMD."));
17943           record_feature_use (&fpu_neon_ext_v8_1);
17944         }
17945         if (inst.operands[2].isscalar)
17946           {
17947             enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
17948             struct neon_type_el et = neon_check_type (3, rs,
17949               N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
17950             NEON_ENCODE (SCALAR, inst);
17951             neon_mul_mac (et, neon_quad (rs));
17952           }
17953         else
17954           {
17955             enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
17956             struct neon_type_el et = neon_check_type (3, rs,
17957               N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
17958             NEON_ENCODE (INTEGER, inst);
17959             /* The U bit (rounding) comes from bit mask.  */
17960             neon_three_same (neon_quad (rs), 0, et.size);
17961           }
17962     }
17963   else
17964     {
17965       enum neon_shape rs = neon_select_shape (NS_QQR, NS_NULL);
17966       struct neon_type_el et
17967         = neon_check_type (3, rs, N_EQK, N_EQK, N_SU_MVE | N_KEY);
17968
17969       NEON_ENCODE (INTEGER, inst);
17970       mve_encode_qqr (et.size, et.type == NT_unsigned, 0);
17971     }
17972 }
17973
17974 static void
17975 do_neon_fcmp_absolute (void)
17976 {
17977   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
17978   struct neon_type_el et = neon_check_type (3, rs, N_EQK, N_EQK,
17979                                             N_F_16_32 | N_KEY);
17980   /* Size field comes from bit mask.  */
17981   neon_three_same (neon_quad (rs), 1, et.size == 16 ? (int) et.size : -1);
17982 }
17983
17984 static void
17985 do_neon_fcmp_absolute_inv (void)
17986 {
17987   neon_exchange_operands ();
17988   do_neon_fcmp_absolute ();
17989 }
17990
17991 static void
17992 do_neon_step (void)
17993 {
17994   enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
17995   struct neon_type_el et = neon_check_type (3, rs, N_EQK, N_EQK,
17996                                             N_F_16_32 | N_KEY);
17997   neon_three_same (neon_quad (rs), 0, et.size == 16 ? (int) et.size : -1);
17998 }
17999
18000 static void
18001 do_neon_abs_neg (void)
18002 {
18003   enum neon_shape rs;
18004   struct neon_type_el et;
18005
18006   if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
18007     return;
18008
18009   rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
18010   et = neon_check_type (2, rs, N_EQK, N_S_32 | N_F_16_32 | N_KEY);
18011
18012   if (check_simd_pred_availability (et.type == NT_float,
18013                                     NEON_CHECK_ARCH | NEON_CHECK_CC))
18014     return;
18015
18016   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
18017   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
18018   inst.instruction |= LOW4 (inst.operands[1].reg);
18019   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
18020   inst.instruction |= neon_quad (rs) << 6;
18021   inst.instruction |= (et.type == NT_float) << 10;
18022   inst.instruction |= neon_logbits (et.size) << 18;
18023
18024   neon_dp_fixup (&inst);
18025 }
18026
18027 static void
18028 do_neon_sli (void)
18029 {
18030   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
18031     return;
18032
18033   enum neon_shape rs;
18034   struct neon_type_el et;
18035   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
18036     {
18037       rs = neon_select_shape (NS_QQI, NS_NULL);
18038       et = neon_check_type (2, rs, N_EQK, N_8 | N_16 | N_32 | N_KEY);
18039     }
18040   else
18041     {
18042       rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
18043       et = neon_check_type (2, rs, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
18044     }
18045
18046
18047   int imm = inst.operands[2].imm;
18048   constraint (imm < 0 || (unsigned)imm >= et.size,
18049               _("immediate out of range for insert"));
18050   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
18051 }
18052
18053 static void
18054 do_neon_sri (void)
18055 {
18056   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
18057     return;
18058
18059   enum neon_shape rs;
18060   struct neon_type_el et;
18061   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
18062     {
18063       rs = neon_select_shape (NS_QQI, NS_NULL);
18064       et = neon_check_type (2, rs, N_EQK, N_8 | N_16 | N_32 | N_KEY);
18065     }
18066   else
18067     {
18068       rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
18069       et = neon_check_type (2, rs, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
18070     }
18071
18072   int imm = inst.operands[2].imm;
18073   constraint (imm < 1 || (unsigned)imm > et.size,
18074               _("immediate out of range for insert"));
18075   neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
18076 }
18077
18078 static void
18079 do_neon_qshlu_imm (void)
18080 {
18081   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
18082     return;
18083
18084   enum neon_shape rs;
18085   struct neon_type_el et;
18086   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
18087     {
18088       rs = neon_select_shape (NS_QQI, NS_NULL);
18089       et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
18090     }
18091   else
18092     {
18093       rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
18094       et = neon_check_type (2, rs, N_EQK | N_UNS,
18095                             N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
18096     }
18097
18098   int imm = inst.operands[2].imm;
18099   constraint (imm < 0 || (unsigned)imm >= et.size,
18100               _("immediate out of range for shift"));
18101   /* Only encodes the 'U present' variant of the instruction.
18102      In this case, signed types have OP (bit 8) set to 0.
18103      Unsigned types have OP set to 1.  */
18104   inst.instruction |= (et.type == NT_unsigned) << 8;
18105   /* The rest of the bits are the same as other immediate shifts.  */
18106   neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
18107 }
18108
18109 static void
18110 do_neon_qmovn (void)
18111 {
18112   struct neon_type_el et = neon_check_type (2, NS_DQ,
18113     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
18114   /* Saturating move where operands can be signed or unsigned, and the
18115      destination has the same signedness.  */
18116   NEON_ENCODE (INTEGER, inst);
18117   if (et.type == NT_unsigned)
18118     inst.instruction |= 0xc0;
18119   else
18120     inst.instruction |= 0x80;
18121   neon_two_same (0, 1, et.size / 2);
18122 }
18123
18124 static void
18125 do_neon_qmovun (void)
18126 {
18127   struct neon_type_el et = neon_check_type (2, NS_DQ,
18128     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
18129   /* Saturating move with unsigned results. Operands must be signed.  */
18130   NEON_ENCODE (INTEGER, inst);
18131   neon_two_same (0, 1, et.size / 2);
18132 }
18133
18134 static void
18135 do_neon_rshift_sat_narrow (void)
18136 {
18137   /* FIXME: Types for narrowing. If operands are signed, results can be signed
18138      or unsigned. If operands are unsigned, results must also be unsigned.  */
18139   struct neon_type_el et = neon_check_type (2, NS_DQI,
18140     N_EQK | N_HLF, N_SU_16_64 | N_KEY);
18141   int imm = inst.operands[2].imm;
18142   /* This gets the bounds check, size encoding and immediate bits calculation
18143      right.  */
18144   et.size /= 2;
18145
18146   /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
18147      VQMOVN.I<size> <Dd>, <Qm>.  */
18148   if (imm == 0)
18149     {
18150       inst.operands[2].present = 0;
18151       inst.instruction = N_MNEM_vqmovn;
18152       do_neon_qmovn ();
18153       return;
18154     }
18155
18156   constraint (imm < 1 || (unsigned)imm > et.size,
18157               _("immediate out of range"));
18158   neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
18159 }
18160
18161 static void
18162 do_neon_rshift_sat_narrow_u (void)
18163 {
18164   /* FIXME: Types for narrowing. If operands are signed, results can be signed
18165      or unsigned. If operands are unsigned, results must also be unsigned.  */
18166   struct neon_type_el et = neon_check_type (2, NS_DQI,
18167     N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
18168   int imm = inst.operands[2].imm;
18169   /* This gets the bounds check, size encoding and immediate bits calculation
18170      right.  */
18171   et.size /= 2;
18172
18173   /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
18174      VQMOVUN.I<size> <Dd>, <Qm>.  */
18175   if (imm == 0)
18176     {
18177       inst.operands[2].present = 0;
18178       inst.instruction = N_MNEM_vqmovun;
18179       do_neon_qmovun ();
18180       return;
18181     }
18182
18183   constraint (imm < 1 || (unsigned)imm > et.size,
18184               _("immediate out of range"));
18185   /* FIXME: The manual is kind of unclear about what value U should have in
18186      VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
18187      must be 1.  */
18188   neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
18189 }
18190
18191 static void
18192 do_neon_movn (void)
18193 {
18194   struct neon_type_el et = neon_check_type (2, NS_DQ,
18195     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
18196   NEON_ENCODE (INTEGER, inst);
18197   neon_two_same (0, 1, et.size / 2);
18198 }
18199
18200 static void
18201 do_neon_rshift_narrow (void)
18202 {
18203   struct neon_type_el et = neon_check_type (2, NS_DQI,
18204     N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
18205   int imm = inst.operands[2].imm;
18206   /* This gets the bounds check, size encoding and immediate bits calculation
18207      right.  */
18208   et.size /= 2;
18209
18210   /* If immediate is zero then we are a pseudo-instruction for
18211      VMOVN.I<size> <Dd>, <Qm>  */
18212   if (imm == 0)
18213     {
18214       inst.operands[2].present = 0;
18215       inst.instruction = N_MNEM_vmovn;
18216       do_neon_movn ();
18217       return;
18218     }
18219
18220   constraint (imm < 1 || (unsigned)imm > et.size,
18221               _("immediate out of range for narrowing operation"));
18222   neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
18223 }
18224
18225 static void
18226 do_neon_shll (void)
18227 {
18228   /* FIXME: Type checking when lengthening.  */
18229   struct neon_type_el et = neon_check_type (2, NS_QDI,
18230     N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
18231   unsigned imm = inst.operands[2].imm;
18232
18233   if (imm == et.size)
18234     {
18235       /* Maximum shift variant.  */
18236       NEON_ENCODE (INTEGER, inst);
18237       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
18238       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
18239       inst.instruction |= LOW4 (inst.operands[1].reg);
18240       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
18241       inst.instruction |= neon_logbits (et.size) << 18;
18242
18243       neon_dp_fixup (&inst);
18244     }
18245   else
18246     {
18247       /* A more-specific type check for non-max versions.  */
18248       et = neon_check_type (2, NS_QDI,
18249         N_EQK | N_DBL, N_SU_32 | N_KEY);
18250       NEON_ENCODE (IMMED, inst);
18251       neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
18252     }
18253 }
18254
18255 /* Check the various types for the VCVT instruction, and return which version
18256    the current instruction is.  */
18257
18258 #define CVT_FLAVOUR_VAR                                                       \
18259   CVT_VAR (s32_f32, N_S32, N_F32, whole_reg,   "ftosls", "ftosis", "ftosizs") \
18260   CVT_VAR (u32_f32, N_U32, N_F32, whole_reg,   "ftouls", "ftouis", "ftouizs") \
18261   CVT_VAR (f32_s32, N_F32, N_S32, whole_reg,   "fsltos", "fsitos", NULL)      \
18262   CVT_VAR (f32_u32, N_F32, N_U32, whole_reg,   "fultos", "fuitos", NULL)      \
18263   /* Half-precision conversions.  */                                          \
18264   CVT_VAR (s16_f16, N_S16, N_F16 | N_KEY, whole_reg, NULL, NULL, NULL)        \
18265   CVT_VAR (u16_f16, N_U16, N_F16 | N_KEY, whole_reg, NULL, NULL, NULL)        \
18266   CVT_VAR (f16_s16, N_F16 | N_KEY, N_S16, whole_reg, NULL, NULL, NULL)        \
18267   CVT_VAR (f16_u16, N_F16 | N_KEY, N_U16, whole_reg, NULL, NULL, NULL)        \
18268   CVT_VAR (f32_f16, N_F32, N_F16, whole_reg,   NULL,     NULL,     NULL)      \
18269   CVT_VAR (f16_f32, N_F16, N_F32, whole_reg,   NULL,     NULL,     NULL)      \
18270   /* New VCVT instructions introduced by ARMv8.2 fp16 extension.              \
18271      Compared with single/double precision variants, only the co-processor    \
18272      field is different, so the encoding flow is reused here.  */             \
18273   CVT_VAR (f16_s32, N_F16 | N_KEY, N_S32, N_VFP, "fsltos", "fsitos", NULL)    \
18274   CVT_VAR (f16_u32, N_F16 | N_KEY, N_U32, N_VFP, "fultos", "fuitos", NULL)    \
18275   CVT_VAR (u32_f16, N_U32, N_F16 | N_KEY, N_VFP, "ftouls", "ftouis", "ftouizs")\
18276   CVT_VAR (s32_f16, N_S32, N_F16 | N_KEY, N_VFP, "ftosls", "ftosis", "ftosizs")\
18277   /* VFP instructions.  */                                                    \
18278   CVT_VAR (f32_f64, N_F32, N_F64, N_VFP,       NULL,     "fcvtsd", NULL)      \
18279   CVT_VAR (f64_f32, N_F64, N_F32, N_VFP,       NULL,     "fcvtds", NULL)      \
18280   CVT_VAR (s32_f64, N_S32, N_F64 | key, N_VFP, "ftosld", "ftosid", "ftosizd") \
18281   CVT_VAR (u32_f64, N_U32, N_F64 | key, N_VFP, "ftould", "ftouid", "ftouizd") \
18282   CVT_VAR (f64_s32, N_F64 | key, N_S32, N_VFP, "fsltod", "fsitod", NULL)      \
18283   CVT_VAR (f64_u32, N_F64 | key, N_U32, N_VFP, "fultod", "fuitod", NULL)      \
18284   /* VFP instructions with bitshift.  */                                      \
18285   CVT_VAR (f32_s16, N_F32 | key, N_S16, N_VFP, "fshtos", NULL,     NULL)      \
18286   CVT_VAR (f32_u16, N_F32 | key, N_U16, N_VFP, "fuhtos", NULL,     NULL)      \
18287   CVT_VAR (f64_s16, N_F64 | key, N_S16, N_VFP, "fshtod", NULL,     NULL)      \
18288   CVT_VAR (f64_u16, N_F64 | key, N_U16, N_VFP, "fuhtod", NULL,     NULL)      \
18289   CVT_VAR (s16_f32, N_S16, N_F32 | key, N_VFP, "ftoshs", NULL,     NULL)      \
18290   CVT_VAR (u16_f32, N_U16, N_F32 | key, N_VFP, "ftouhs", NULL,     NULL)      \
18291   CVT_VAR (s16_f64, N_S16, N_F64 | key, N_VFP, "ftoshd", NULL,     NULL)      \
18292   CVT_VAR (u16_f64, N_U16, N_F64 | key, N_VFP, "ftouhd", NULL,     NULL)
18293
18294 #define CVT_VAR(C, X, Y, R, BSN, CN, ZN) \
18295   neon_cvt_flavour_##C,
18296
18297 /* The different types of conversions we can do.  */
18298 enum neon_cvt_flavour
18299 {
18300   CVT_FLAVOUR_VAR
18301   neon_cvt_flavour_invalid,
18302   neon_cvt_flavour_first_fp = neon_cvt_flavour_f32_f64
18303 };
18304
18305 #undef CVT_VAR
18306
18307 static enum neon_cvt_flavour
18308 get_neon_cvt_flavour (enum neon_shape rs)
18309 {
18310 #define CVT_VAR(C,X,Y,R,BSN,CN,ZN)                      \
18311   et = neon_check_type (2, rs, (R) | (X), (R) | (Y));   \
18312   if (et.type != NT_invtype)                            \
18313     {                                                   \
18314       inst.error = NULL;                                \
18315       return (neon_cvt_flavour_##C);                    \
18316     }
18317
18318   struct neon_type_el et;
18319   unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
18320                         || rs == NS_FF) ? N_VFP : 0;
18321   /* The instruction versions which take an immediate take one register
18322      argument, which is extended to the width of the full register. Thus the
18323      "source" and "destination" registers must have the same width.  Hack that
18324      here by making the size equal to the key (wider, in this case) operand.  */
18325   unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
18326
18327   CVT_FLAVOUR_VAR;
18328
18329   return neon_cvt_flavour_invalid;
18330 #undef CVT_VAR
18331 }
18332
18333 enum neon_cvt_mode
18334 {
18335   neon_cvt_mode_a,
18336   neon_cvt_mode_n,
18337   neon_cvt_mode_p,
18338   neon_cvt_mode_m,
18339   neon_cvt_mode_z,
18340   neon_cvt_mode_x,
18341   neon_cvt_mode_r
18342 };
18343
18344 /* Neon-syntax VFP conversions.  */
18345
18346 static void
18347 do_vfp_nsyn_cvt (enum neon_shape rs, enum neon_cvt_flavour flavour)
18348 {
18349   const char *opname = 0;
18350
18351   if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI
18352       || rs == NS_FHI || rs == NS_HFI)
18353     {
18354       /* Conversions with immediate bitshift.  */
18355       const char *enc[] =
18356         {
18357 #define CVT_VAR(C,A,B,R,BSN,CN,ZN) BSN,
18358           CVT_FLAVOUR_VAR
18359           NULL
18360 #undef CVT_VAR
18361         };
18362
18363       if (flavour < (int) ARRAY_SIZE (enc))
18364         {
18365           opname = enc[flavour];
18366           constraint (inst.operands[0].reg != inst.operands[1].reg,
18367                       _("operands 0 and 1 must be the same register"));
18368           inst.operands[1] = inst.operands[2];
18369           memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
18370         }
18371     }
18372   else
18373     {
18374       /* Conversions without bitshift.  */
18375       const char *enc[] =
18376         {
18377 #define CVT_VAR(C,A,B,R,BSN,CN,ZN) CN,
18378           CVT_FLAVOUR_VAR
18379           NULL
18380 #undef CVT_VAR
18381         };
18382
18383       if (flavour < (int) ARRAY_SIZE (enc))
18384         opname = enc[flavour];
18385     }
18386
18387   if (opname)
18388     do_vfp_nsyn_opcode (opname);
18389
18390   /* ARMv8.2 fp16 VCVT instruction.  */
18391   if (flavour == neon_cvt_flavour_s32_f16
18392       || flavour == neon_cvt_flavour_u32_f16
18393       || flavour == neon_cvt_flavour_f16_u32
18394       || flavour == neon_cvt_flavour_f16_s32)
18395     do_scalar_fp16_v82_encode ();
18396 }
18397
18398 static void
18399 do_vfp_nsyn_cvtz (void)
18400 {
18401   enum neon_shape rs = neon_select_shape (NS_FH, NS_FF, NS_FD, NS_NULL);
18402   enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
18403   const char *enc[] =
18404     {
18405 #define CVT_VAR(C,A,B,R,BSN,CN,ZN) ZN,
18406       CVT_FLAVOUR_VAR
18407       NULL
18408 #undef CVT_VAR
18409     };
18410
18411   if (flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
18412     do_vfp_nsyn_opcode (enc[flavour]);
18413 }
18414
18415 static void
18416 do_vfp_nsyn_cvt_fpv8 (enum neon_cvt_flavour flavour,
18417                       enum neon_cvt_mode mode)
18418 {
18419   int sz, op;
18420   int rm;
18421
18422   /* Targets like FPv5-SP-D16 don't support FP v8 instructions with
18423      D register operands.  */
18424   if (flavour == neon_cvt_flavour_s32_f64
18425       || flavour == neon_cvt_flavour_u32_f64)
18426     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
18427                 _(BAD_FPU));
18428
18429   if (flavour == neon_cvt_flavour_s32_f16
18430       || flavour == neon_cvt_flavour_u32_f16)
18431     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16),
18432                 _(BAD_FP16));
18433
18434   set_pred_insn_type (OUTSIDE_PRED_INSN);
18435
18436   switch (flavour)
18437     {
18438     case neon_cvt_flavour_s32_f64:
18439       sz = 1;
18440       op = 1;
18441       break;
18442     case neon_cvt_flavour_s32_f32:
18443       sz = 0;
18444       op = 1;
18445       break;
18446     case neon_cvt_flavour_s32_f16:
18447       sz = 0;
18448       op = 1;
18449       break;
18450     case neon_cvt_flavour_u32_f64:
18451       sz = 1;
18452       op = 0;
18453       break;
18454     case neon_cvt_flavour_u32_f32:
18455       sz = 0;
18456       op = 0;
18457       break;
18458     case neon_cvt_flavour_u32_f16:
18459       sz = 0;
18460       op = 0;
18461       break;
18462     default:
18463       first_error (_("invalid instruction shape"));
18464       return;
18465     }
18466
18467   switch (mode)
18468     {
18469     case neon_cvt_mode_a: rm = 0; break;
18470     case neon_cvt_mode_n: rm = 1; break;
18471     case neon_cvt_mode_p: rm = 2; break;
18472     case neon_cvt_mode_m: rm = 3; break;
18473     default: first_error (_("invalid rounding mode")); return;
18474     }
18475
18476   NEON_ENCODE (FPV8, inst);
18477   encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
18478   encode_arm_vfp_reg (inst.operands[1].reg, sz == 1 ? VFP_REG_Dm : VFP_REG_Sm);
18479   inst.instruction |= sz << 8;
18480
18481   /* ARMv8.2 fp16 VCVT instruction.  */
18482   if (flavour == neon_cvt_flavour_s32_f16
18483       ||flavour == neon_cvt_flavour_u32_f16)
18484     do_scalar_fp16_v82_encode ();
18485   inst.instruction |= op << 7;
18486   inst.instruction |= rm << 16;
18487   inst.instruction |= 0xf0000000;
18488   inst.is_neon = TRUE;
18489 }
18490
18491 static void
18492 do_neon_cvt_1 (enum neon_cvt_mode mode)
18493 {
18494   enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
18495                                           NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ,
18496                                           NS_FH, NS_HF, NS_FHI, NS_HFI,
18497                                           NS_NULL);
18498   enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
18499
18500   if (flavour == neon_cvt_flavour_invalid)
18501     return;
18502
18503   /* PR11109: Handle round-to-zero for VCVT conversions.  */
18504   if (mode == neon_cvt_mode_z
18505       && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_vfp_v2)
18506       && (flavour == neon_cvt_flavour_s16_f16
18507           || flavour == neon_cvt_flavour_u16_f16
18508           || flavour == neon_cvt_flavour_s32_f32
18509           || flavour == neon_cvt_flavour_u32_f32
18510           || flavour == neon_cvt_flavour_s32_f64
18511           || flavour == neon_cvt_flavour_u32_f64)
18512       && (rs == NS_FD || rs == NS_FF))
18513     {
18514       do_vfp_nsyn_cvtz ();
18515       return;
18516     }
18517
18518   /* ARMv8.2 fp16 VCVT conversions.  */
18519   if (mode == neon_cvt_mode_z
18520       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16)
18521       && (flavour == neon_cvt_flavour_s32_f16
18522           || flavour == neon_cvt_flavour_u32_f16)
18523       && (rs == NS_FH))
18524     {
18525       do_vfp_nsyn_cvtz ();
18526       do_scalar_fp16_v82_encode ();
18527       return;
18528     }
18529
18530   /* VFP rather than Neon conversions.  */
18531   if (flavour >= neon_cvt_flavour_first_fp)
18532     {
18533       if (mode == neon_cvt_mode_x || mode == neon_cvt_mode_z)
18534         do_vfp_nsyn_cvt (rs, flavour);
18535       else
18536         do_vfp_nsyn_cvt_fpv8 (flavour, mode);
18537
18538       return;
18539     }
18540
18541   switch (rs)
18542     {
18543     case NS_QQI:
18544       if (mode == neon_cvt_mode_z
18545           && (flavour == neon_cvt_flavour_f16_s16
18546               || flavour == neon_cvt_flavour_f16_u16
18547               || flavour == neon_cvt_flavour_s16_f16
18548               || flavour == neon_cvt_flavour_u16_f16
18549               || flavour == neon_cvt_flavour_f32_u32
18550               || flavour == neon_cvt_flavour_f32_s32
18551               || flavour == neon_cvt_flavour_s32_f32
18552               || flavour == neon_cvt_flavour_u32_f32))
18553         {
18554           if (check_simd_pred_availability (1, NEON_CHECK_CC | NEON_CHECK_ARCH))
18555             return;
18556         }
18557       else if (mode == neon_cvt_mode_n)
18558         {
18559           /* We are dealing with vcvt with the 'ne' condition.  */
18560           inst.cond = 0x1;
18561           inst.instruction = N_MNEM_vcvt;
18562           do_neon_cvt_1 (neon_cvt_mode_z);
18563           return;
18564         }
18565       /* fall through.  */
18566     case NS_DDI:
18567       {
18568         unsigned immbits;
18569         unsigned enctab[] = {0x0000100, 0x1000100, 0x0, 0x1000000,
18570                              0x0000100, 0x1000100, 0x0, 0x1000000};
18571
18572         if ((rs != NS_QQI || !ARM_CPU_HAS_FEATURE (cpu_variant, mve_fp_ext))
18573             && vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
18574             return;
18575
18576         if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_fp_ext))
18577           {
18578             constraint (inst.operands[2].present && inst.operands[2].imm == 0,
18579                         _("immediate value out of range"));
18580             switch (flavour)
18581               {
18582                 case neon_cvt_flavour_f16_s16:
18583                 case neon_cvt_flavour_f16_u16:
18584                 case neon_cvt_flavour_s16_f16:
18585                 case neon_cvt_flavour_u16_f16:
18586                   constraint (inst.operands[2].imm > 16,
18587                               _("immediate value out of range"));
18588                   break;
18589                 case neon_cvt_flavour_f32_u32:
18590                 case neon_cvt_flavour_f32_s32:
18591                 case neon_cvt_flavour_s32_f32:
18592                 case neon_cvt_flavour_u32_f32:
18593                   constraint (inst.operands[2].imm > 32,
18594                               _("immediate value out of range"));
18595                   break;
18596                 default:
18597                   inst.error = BAD_FPU;
18598                   return;
18599               }
18600           }
18601
18602         /* Fixed-point conversion with #0 immediate is encoded as an
18603            integer conversion.  */
18604         if (inst.operands[2].present && inst.operands[2].imm == 0)
18605           goto int_encode;
18606         NEON_ENCODE (IMMED, inst);
18607         if (flavour != neon_cvt_flavour_invalid)
18608           inst.instruction |= enctab[flavour];
18609         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
18610         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
18611         inst.instruction |= LOW4 (inst.operands[1].reg);
18612         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
18613         inst.instruction |= neon_quad (rs) << 6;
18614         inst.instruction |= 1 << 21;
18615         if (flavour < neon_cvt_flavour_s16_f16)
18616           {
18617             inst.instruction |= 1 << 21;
18618             immbits = 32 - inst.operands[2].imm;
18619             inst.instruction |= immbits << 16;
18620           }
18621         else
18622           {
18623             inst.instruction |= 3 << 20;
18624             immbits = 16 - inst.operands[2].imm;
18625             inst.instruction |= immbits << 16;
18626             inst.instruction &= ~(1 << 9);
18627           }
18628
18629         neon_dp_fixup (&inst);
18630       }
18631       break;
18632
18633     case NS_QQ:
18634       if ((mode == neon_cvt_mode_a || mode == neon_cvt_mode_n
18635            || mode == neon_cvt_mode_m || mode == neon_cvt_mode_p)
18636           && (flavour == neon_cvt_flavour_s16_f16
18637               || flavour == neon_cvt_flavour_u16_f16
18638               || flavour == neon_cvt_flavour_s32_f32
18639               || flavour == neon_cvt_flavour_u32_f32))
18640         {
18641           if (check_simd_pred_availability (1,
18642                                             NEON_CHECK_CC | NEON_CHECK_ARCH8))
18643             return;
18644         }
18645       else if (mode == neon_cvt_mode_z
18646                && (flavour == neon_cvt_flavour_f16_s16
18647                    || flavour == neon_cvt_flavour_f16_u16
18648                    || flavour == neon_cvt_flavour_s16_f16
18649                    || flavour == neon_cvt_flavour_u16_f16
18650                    || flavour == neon_cvt_flavour_f32_u32
18651                    || flavour == neon_cvt_flavour_f32_s32
18652                    || flavour == neon_cvt_flavour_s32_f32
18653                    || flavour == neon_cvt_flavour_u32_f32))
18654         {
18655           if (check_simd_pred_availability (1,
18656                                             NEON_CHECK_CC | NEON_CHECK_ARCH))
18657             return;
18658         }
18659       /* fall through.  */
18660     case NS_DD:
18661       if (mode != neon_cvt_mode_x && mode != neon_cvt_mode_z)
18662         {
18663
18664           NEON_ENCODE (FLOAT, inst);
18665           if (check_simd_pred_availability (1,
18666                                             NEON_CHECK_CC | NEON_CHECK_ARCH8))
18667             return;
18668
18669           inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
18670           inst.instruction |= HI1 (inst.operands[0].reg) << 22;
18671           inst.instruction |= LOW4 (inst.operands[1].reg);
18672           inst.instruction |= HI1 (inst.operands[1].reg) << 5;
18673           inst.instruction |= neon_quad (rs) << 6;
18674           inst.instruction |= (flavour == neon_cvt_flavour_u16_f16
18675                                || flavour == neon_cvt_flavour_u32_f32) << 7;
18676           inst.instruction |= mode << 8;
18677           if (flavour == neon_cvt_flavour_u16_f16
18678               || flavour == neon_cvt_flavour_s16_f16)
18679             /* Mask off the original size bits and reencode them.  */
18680             inst.instruction = ((inst.instruction & 0xfff3ffff) | (1 << 18));
18681
18682           if (thumb_mode)
18683             inst.instruction |= 0xfc000000;
18684           else
18685             inst.instruction |= 0xf0000000;
18686         }
18687       else
18688         {
18689     int_encode:
18690           {
18691             unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080,
18692                                   0x100, 0x180, 0x0, 0x080};
18693
18694             NEON_ENCODE (INTEGER, inst);
18695
18696           if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_fp_ext))
18697             {
18698               if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
18699                 return;
18700             }
18701
18702             if (flavour != neon_cvt_flavour_invalid)
18703               inst.instruction |= enctab[flavour];
18704
18705             inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
18706             inst.instruction |= HI1 (inst.operands[0].reg) << 22;
18707             inst.instruction |= LOW4 (inst.operands[1].reg);
18708             inst.instruction |= HI1 (inst.operands[1].reg) << 5;
18709             inst.instruction |= neon_quad (rs) << 6;
18710             if (flavour >= neon_cvt_flavour_s16_f16
18711                 && flavour <= neon_cvt_flavour_f16_u16)
18712               /* Half precision.  */
18713               inst.instruction |= 1 << 18;
18714             else
18715               inst.instruction |= 2 << 18;
18716
18717             neon_dp_fixup (&inst);
18718           }
18719         }
18720       break;
18721
18722     /* Half-precision conversions for Advanced SIMD -- neon.  */
18723     case NS_QD:
18724     case NS_DQ:
18725       if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
18726         return;
18727
18728       if ((rs == NS_DQ)
18729           && (inst.vectype.el[0].size != 16 || inst.vectype.el[1].size != 32))
18730           {
18731             as_bad (_("operand size must match register width"));
18732             break;
18733           }
18734
18735       if ((rs == NS_QD)
18736           && ((inst.vectype.el[0].size != 32 || inst.vectype.el[1].size != 16)))
18737           {
18738             as_bad (_("operand size must match register width"));
18739             break;
18740           }
18741
18742       if (rs == NS_DQ)
18743         inst.instruction = 0x3b60600;
18744       else
18745         inst.instruction = 0x3b60700;
18746
18747       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
18748       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
18749       inst.instruction |= LOW4 (inst.operands[1].reg);
18750       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
18751       neon_dp_fixup (&inst);
18752       break;
18753
18754     default:
18755       /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32).  */
18756       if (mode == neon_cvt_mode_x || mode == neon_cvt_mode_z)
18757         do_vfp_nsyn_cvt (rs, flavour);
18758       else
18759         do_vfp_nsyn_cvt_fpv8 (flavour, mode);
18760     }
18761 }
18762
18763 static void
18764 do_neon_cvtr (void)
18765 {
18766   do_neon_cvt_1 (neon_cvt_mode_x);
18767 }
18768
18769 static void
18770 do_neon_cvt (void)
18771 {
18772   do_neon_cvt_1 (neon_cvt_mode_z);
18773 }
18774
18775 static void
18776 do_neon_cvta (void)
18777 {
18778   do_neon_cvt_1 (neon_cvt_mode_a);
18779 }
18780
18781 static void
18782 do_neon_cvtn (void)
18783 {
18784   do_neon_cvt_1 (neon_cvt_mode_n);
18785 }
18786
18787 static void
18788 do_neon_cvtp (void)
18789 {
18790   do_neon_cvt_1 (neon_cvt_mode_p);
18791 }
18792
18793 static void
18794 do_neon_cvtm (void)
18795 {
18796   do_neon_cvt_1 (neon_cvt_mode_m);
18797 }
18798
18799 static void
18800 do_neon_cvttb_2 (bfd_boolean t, bfd_boolean to, bfd_boolean is_double)
18801 {
18802   if (is_double)
18803     mark_feature_used (&fpu_vfp_ext_armv8);
18804
18805   encode_arm_vfp_reg (inst.operands[0].reg,
18806                       (is_double && !to) ? VFP_REG_Dd : VFP_REG_Sd);
18807   encode_arm_vfp_reg (inst.operands[1].reg,
18808                       (is_double && to) ? VFP_REG_Dm : VFP_REG_Sm);
18809   inst.instruction |= to ? 0x10000 : 0;
18810   inst.instruction |= t ? 0x80 : 0;
18811   inst.instruction |= is_double ? 0x100 : 0;
18812   do_vfp_cond_or_thumb ();
18813 }
18814
18815 static void
18816 do_neon_cvttb_1 (bfd_boolean t)
18817 {
18818   enum neon_shape rs = neon_select_shape (NS_HF, NS_HD, NS_FH, NS_FF, NS_FD,
18819                                           NS_DF, NS_DH, NS_QQ, NS_QQI, NS_NULL);
18820
18821   if (rs == NS_NULL)
18822     return;
18823   else if (rs == NS_QQ || rs == NS_QQI)
18824     {
18825       int single_to_half = 0;
18826       if (check_simd_pred_availability (1, NEON_CHECK_ARCH))
18827         return;
18828
18829       enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
18830
18831       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext)
18832           && (flavour ==  neon_cvt_flavour_u16_f16
18833               || flavour ==  neon_cvt_flavour_s16_f16
18834               || flavour ==  neon_cvt_flavour_f16_s16
18835               || flavour ==  neon_cvt_flavour_f16_u16
18836               || flavour ==  neon_cvt_flavour_u32_f32
18837               || flavour ==  neon_cvt_flavour_s32_f32
18838               || flavour ==  neon_cvt_flavour_f32_s32
18839               || flavour ==  neon_cvt_flavour_f32_u32))
18840         {
18841           inst.cond = 0xf;
18842           inst.instruction = N_MNEM_vcvt;
18843           set_pred_insn_type (INSIDE_VPT_INSN);
18844           do_neon_cvt_1 (neon_cvt_mode_z);
18845           return;
18846         }
18847       else if (rs == NS_QQ && flavour == neon_cvt_flavour_f32_f16)
18848         single_to_half = 1;
18849       else if (rs == NS_QQ && flavour != neon_cvt_flavour_f16_f32)
18850         {
18851           first_error (BAD_FPU);
18852           return;
18853         }
18854
18855       inst.instruction = 0xee3f0e01;
18856       inst.instruction |= single_to_half << 28;
18857       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
18858       inst.instruction |= LOW4 (inst.operands[0].reg) << 13;
18859       inst.instruction |= t << 12;
18860       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
18861       inst.instruction |= LOW4 (inst.operands[1].reg) << 1;
18862       inst.is_neon = 1;
18863     }
18864   else if (neon_check_type (2, rs, N_F16, N_F32 | N_VFP).type != NT_invtype)
18865     {
18866       inst.error = NULL;
18867       do_neon_cvttb_2 (t, /*to=*/TRUE, /*is_double=*/FALSE);
18868     }
18869   else if (neon_check_type (2, rs, N_F32 | N_VFP, N_F16).type != NT_invtype)
18870     {
18871       inst.error = NULL;
18872       do_neon_cvttb_2 (t, /*to=*/FALSE, /*is_double=*/FALSE);
18873     }
18874   else if (neon_check_type (2, rs, N_F16, N_F64 | N_VFP).type != NT_invtype)
18875     {
18876       /* The VCVTB and VCVTT instructions with D-register operands
18877          don't work for SP only targets.  */
18878       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
18879                   _(BAD_FPU));
18880
18881       inst.error = NULL;
18882       do_neon_cvttb_2 (t, /*to=*/TRUE, /*is_double=*/TRUE);
18883     }
18884   else if (neon_check_type (2, rs, N_F64 | N_VFP, N_F16).type != NT_invtype)
18885     {
18886       /* The VCVTB and VCVTT instructions with D-register operands
18887          don't work for SP only targets.  */
18888       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
18889                   _(BAD_FPU));
18890
18891       inst.error = NULL;
18892       do_neon_cvttb_2 (t, /*to=*/FALSE, /*is_double=*/TRUE);
18893     }
18894   else
18895     return;
18896 }
18897
18898 static void
18899 do_neon_cvtb (void)
18900 {
18901   do_neon_cvttb_1 (FALSE);
18902 }
18903
18904
18905 static void
18906 do_neon_cvtt (void)
18907 {
18908   do_neon_cvttb_1 (TRUE);
18909 }
18910
18911 static void
18912 neon_move_immediate (void)
18913 {
18914   enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
18915   struct neon_type_el et = neon_check_type (2, rs,
18916     N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
18917   unsigned immlo, immhi = 0, immbits;
18918   int op, cmode, float_p;
18919
18920   constraint (et.type == NT_invtype,
18921               _("operand size must be specified for immediate VMOV"));
18922
18923   /* We start out as an MVN instruction if OP = 1, MOV otherwise.  */
18924   op = (inst.instruction & (1 << 5)) != 0;
18925
18926   immlo = inst.operands[1].imm;
18927   if (inst.operands[1].regisimm)
18928     immhi = inst.operands[1].reg;
18929
18930   constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
18931               _("immediate has bits set outside the operand size"));
18932
18933   float_p = inst.operands[1].immisfloat;
18934
18935   if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
18936                                         et.size, et.type)) == FAIL)
18937     {
18938       /* Invert relevant bits only.  */
18939       neon_invert_size (&immlo, &immhi, et.size);
18940       /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
18941          with one or the other; those cases are caught by
18942          neon_cmode_for_move_imm.  */
18943       op = !op;
18944       if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
18945                                             &op, et.size, et.type)) == FAIL)
18946         {
18947           first_error (_("immediate out of range"));
18948           return;
18949         }
18950     }
18951
18952   inst.instruction &= ~(1 << 5);
18953   inst.instruction |= op << 5;
18954
18955   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
18956   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
18957   inst.instruction |= neon_quad (rs) << 6;
18958   inst.instruction |= cmode << 8;
18959
18960   neon_write_immbits (immbits);
18961 }
18962
18963 static void
18964 do_neon_mvn (void)
18965 {
18966   if (check_simd_pred_availability (0, NEON_CHECK_CC | NEON_CHECK_ARCH))
18967     return;
18968
18969   if (inst.operands[1].isreg)
18970     {
18971       enum neon_shape rs;
18972       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
18973         rs = neon_select_shape (NS_QQ, NS_NULL);
18974       else
18975         rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
18976
18977       NEON_ENCODE (INTEGER, inst);
18978       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
18979       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
18980       inst.instruction |= LOW4 (inst.operands[1].reg);
18981       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
18982       inst.instruction |= neon_quad (rs) << 6;
18983     }
18984   else
18985     {
18986       NEON_ENCODE (IMMED, inst);
18987       neon_move_immediate ();
18988     }
18989
18990   neon_dp_fixup (&inst);
18991
18992   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
18993     {
18994       constraint (!inst.operands[1].isreg && !inst.operands[0].isquad, BAD_FPU);
18995       constraint ((inst.instruction & 0xd00) == 0xd00,
18996                   _("immediate value out of range"));
18997     }
18998 }
18999
19000 /* Encode instructions of form:
19001
19002   |28/24|23|22|21 20|19 16|15 12|11    8|7|6|5|4|3  0|
19003   |  U  |x |D |size | Rn  | Rd  |x x x x|N|x|M|x| Rm |  */
19004
19005 static void
19006 neon_mixed_length (struct neon_type_el et, unsigned size)
19007 {
19008   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
19009   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
19010   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
19011   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
19012   inst.instruction |= LOW4 (inst.operands[2].reg);
19013   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
19014   inst.instruction |= (et.type == NT_unsigned) << 24;
19015   inst.instruction |= neon_logbits (size) << 20;
19016
19017   neon_dp_fixup (&inst);
19018 }
19019
19020 static void
19021 do_neon_dyadic_long (void)
19022 {
19023   enum neon_shape rs = neon_select_shape (NS_QDD, NS_QQQ, NS_QQR, NS_NULL);
19024   if (rs == NS_QDD)
19025     {
19026       if (vfp_or_neon_is_neon (NEON_CHECK_ARCH | NEON_CHECK_CC) == FAIL)
19027         return;
19028
19029       NEON_ENCODE (INTEGER, inst);
19030       /* FIXME: Type checking for lengthening op.  */
19031       struct neon_type_el et = neon_check_type (3, NS_QDD,
19032         N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
19033       neon_mixed_length (et, et.size);
19034     }
19035   else if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext)
19036            && (inst.cond == 0xf || inst.cond == 0x10))
19037     {
19038       /* If parsing for MVE, vaddl/vsubl/vabdl{e,t} can only be vadd/vsub/vabd
19039          in an IT block with le/lt conditions.  */
19040
19041       if (inst.cond == 0xf)
19042         inst.cond = 0xb;
19043       else if (inst.cond == 0x10)
19044         inst.cond = 0xd;
19045
19046       inst.pred_insn_type = INSIDE_IT_INSN;
19047
19048       if (inst.instruction == N_MNEM_vaddl)
19049         {
19050           inst.instruction = N_MNEM_vadd;
19051           do_neon_addsub_if_i ();
19052         }
19053       else if (inst.instruction == N_MNEM_vsubl)
19054         {
19055           inst.instruction = N_MNEM_vsub;
19056           do_neon_addsub_if_i ();
19057         }
19058       else if (inst.instruction == N_MNEM_vabdl)
19059         {
19060           inst.instruction = N_MNEM_vabd;
19061           do_neon_dyadic_if_su ();
19062         }
19063     }
19064   else
19065     first_error (BAD_FPU);
19066 }
19067
19068 static void
19069 do_neon_abal (void)
19070 {
19071   struct neon_type_el et = neon_check_type (3, NS_QDD,
19072     N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
19073   neon_mixed_length (et, et.size);
19074 }
19075
19076 static void
19077 neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
19078 {
19079   if (inst.operands[2].isscalar)
19080     {
19081       struct neon_type_el et = neon_check_type (3, NS_QDS,
19082         N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
19083       NEON_ENCODE (SCALAR, inst);
19084       neon_mul_mac (et, et.type == NT_unsigned);
19085     }
19086   else
19087     {
19088       struct neon_type_el et = neon_check_type (3, NS_QDD,
19089         N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
19090       NEON_ENCODE (INTEGER, inst);
19091       neon_mixed_length (et, et.size);
19092     }
19093 }
19094
19095 static void
19096 do_neon_mac_maybe_scalar_long (void)
19097 {
19098   neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
19099 }
19100
19101 /* Like neon_scalar_for_mul, this function generate Rm encoding from GAS's
19102    internal SCALAR.  QUAD_P is 1 if it's for Q format, otherwise it's 0.  */
19103
19104 static unsigned
19105 neon_scalar_for_fmac_fp16_long (unsigned scalar, unsigned quad_p)
19106 {
19107   unsigned regno = NEON_SCALAR_REG (scalar);
19108   unsigned elno = NEON_SCALAR_INDEX (scalar);
19109
19110   if (quad_p)
19111     {
19112       if (regno > 7 || elno > 3)
19113         goto bad_scalar;
19114
19115       return ((regno & 0x7)
19116               | ((elno & 0x1) << 3)
19117               | (((elno >> 1) & 0x1) << 5));
19118     }
19119   else
19120     {
19121       if (regno > 15 || elno > 1)
19122         goto bad_scalar;
19123
19124       return (((regno & 0x1) << 5)
19125               | ((regno >> 1) & 0x7)
19126               | ((elno & 0x1) << 3));
19127     }
19128
19129 bad_scalar:
19130   first_error (_("scalar out of range for multiply instruction"));
19131   return 0;
19132 }
19133
19134 static void
19135 do_neon_fmac_maybe_scalar_long (int subtype)
19136 {
19137   enum neon_shape rs;
19138   int high8;
19139   /* NOTE: vfmal/vfmsl use slightly different NEON three-same encoding.  'size"
19140      field (bits[21:20]) has different meaning.  For scalar index variant, it's
19141      used to differentiate add and subtract, otherwise it's with fixed value
19142      0x2.  */
19143   int size = -1;
19144
19145   if (inst.cond != COND_ALWAYS)
19146     as_warn (_("vfmal/vfmsl with FP16 type cannot be conditional, the "
19147                "behaviour is UNPREDICTABLE"));
19148
19149   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16_fml),
19150               _(BAD_FP16));
19151
19152   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_armv8),
19153               _(BAD_FPU));
19154
19155   /* vfmal/vfmsl are in three-same D/Q register format or the third operand can
19156      be a scalar index register.  */
19157   if (inst.operands[2].isscalar)
19158     {
19159       high8 = 0xfe000000;
19160       if (subtype)
19161         size = 16;
19162       rs = neon_select_shape (NS_DHS, NS_QDS, NS_NULL);
19163     }
19164   else
19165     {
19166       high8 = 0xfc000000;
19167       size = 32;
19168       if (subtype)
19169         inst.instruction |= (0x1 << 23);
19170       rs = neon_select_shape (NS_DHH, NS_QDD, NS_NULL);
19171     }
19172
19173   neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_F16);
19174
19175   /* "opcode" from template has included "ubit", so simply pass 0 here.  Also,
19176      the "S" bit in size field has been reused to differentiate vfmal and vfmsl,
19177      so we simply pass -1 as size.  */
19178   unsigned quad_p = (rs == NS_QDD || rs == NS_QDS);
19179   neon_three_same (quad_p, 0, size);
19180
19181   /* Undo neon_dp_fixup.  Redo the high eight bits.  */
19182   inst.instruction &= 0x00ffffff;
19183   inst.instruction |= high8;
19184
19185 #define LOW1(R) ((R) & 0x1)
19186 #define HI4(R) (((R) >> 1) & 0xf)
19187   /* Unlike usually NEON three-same, encoding for Vn and Vm will depend on
19188      whether the instruction is in Q form and whether Vm is a scalar indexed
19189      operand.  */
19190   if (inst.operands[2].isscalar)
19191     {
19192       unsigned rm
19193         = neon_scalar_for_fmac_fp16_long (inst.operands[2].reg, quad_p);
19194       inst.instruction &= 0xffffffd0;
19195       inst.instruction |= rm;
19196
19197       if (!quad_p)
19198         {
19199           /* Redo Rn as well.  */
19200           inst.instruction &= 0xfff0ff7f;
19201           inst.instruction |= HI4 (inst.operands[1].reg) << 16;
19202           inst.instruction |= LOW1 (inst.operands[1].reg) << 7;
19203         }
19204     }
19205   else if (!quad_p)
19206     {
19207       /* Redo Rn and Rm.  */
19208       inst.instruction &= 0xfff0ff50;
19209       inst.instruction |= HI4 (inst.operands[1].reg) << 16;
19210       inst.instruction |= LOW1 (inst.operands[1].reg) << 7;
19211       inst.instruction |= HI4 (inst.operands[2].reg);
19212       inst.instruction |= LOW1 (inst.operands[2].reg) << 5;
19213     }
19214 }
19215
19216 static void
19217 do_neon_vfmal (void)
19218 {
19219   return do_neon_fmac_maybe_scalar_long (0);
19220 }
19221
19222 static void
19223 do_neon_vfmsl (void)
19224 {
19225   return do_neon_fmac_maybe_scalar_long (1);
19226 }
19227
19228 static void
19229 do_neon_dyadic_wide (void)
19230 {
19231   struct neon_type_el et = neon_check_type (3, NS_QQD,
19232     N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
19233   neon_mixed_length (et, et.size);
19234 }
19235
19236 static void
19237 do_neon_dyadic_narrow (void)
19238 {
19239   struct neon_type_el et = neon_check_type (3, NS_QDD,
19240     N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
19241   /* Operand sign is unimportant, and the U bit is part of the opcode,
19242      so force the operand type to integer.  */
19243   et.type = NT_integer;
19244   neon_mixed_length (et, et.size / 2);
19245 }
19246
19247 static void
19248 do_neon_mul_sat_scalar_long (void)
19249 {
19250   neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
19251 }
19252
19253 static void
19254 do_neon_vmull (void)
19255 {
19256   if (inst.operands[2].isscalar)
19257     do_neon_mac_maybe_scalar_long ();
19258   else
19259     {
19260       struct neon_type_el et = neon_check_type (3, NS_QDD,
19261         N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_P64 | N_KEY);
19262
19263       if (et.type == NT_poly)
19264         NEON_ENCODE (POLY, inst);
19265       else
19266         NEON_ENCODE (INTEGER, inst);
19267
19268       /* For polynomial encoding the U bit must be zero, and the size must
19269          be 8 (encoded as 0b00) or, on ARMv8 or later 64 (encoded, non
19270          obviously, as 0b10).  */
19271       if (et.size == 64)
19272         {
19273           /* Check we're on the correct architecture.  */
19274           if (!mark_feature_used (&fpu_crypto_ext_armv8))
19275             inst.error =
19276               _("Instruction form not available on this architecture.");
19277
19278           et.size = 32;
19279         }
19280
19281       neon_mixed_length (et, et.size);
19282     }
19283 }
19284
19285 static void
19286 do_neon_ext (void)
19287 {
19288   enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
19289   struct neon_type_el et = neon_check_type (3, rs,
19290     N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
19291   unsigned imm = (inst.operands[3].imm * et.size) / 8;
19292
19293   constraint (imm >= (unsigned) (neon_quad (rs) ? 16 : 8),
19294               _("shift out of range"));
19295   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
19296   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
19297   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
19298   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
19299   inst.instruction |= LOW4 (inst.operands[2].reg);
19300   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
19301   inst.instruction |= neon_quad (rs) << 6;
19302   inst.instruction |= imm << 8;
19303
19304   neon_dp_fixup (&inst);
19305 }
19306
19307 static void
19308 do_neon_rev (void)
19309 {
19310   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
19311    return;
19312
19313   enum neon_shape rs;
19314   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
19315     rs = neon_select_shape (NS_QQ, NS_NULL);
19316   else
19317     rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
19318
19319   struct neon_type_el et = neon_check_type (2, rs,
19320     N_EQK, N_8 | N_16 | N_32 | N_KEY);
19321
19322   unsigned op = (inst.instruction >> 7) & 3;
19323   /* N (width of reversed regions) is encoded as part of the bitmask. We
19324      extract it here to check the elements to be reversed are smaller.
19325      Otherwise we'd get a reserved instruction.  */
19326   unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
19327
19328   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext) && elsize == 64
19329       && inst.operands[0].reg == inst.operands[1].reg)
19330     as_tsktsk (_("Warning: 64-bit element size and same destination and source"
19331                  " operands makes instruction UNPREDICTABLE"));
19332
19333   gas_assert (elsize != 0);
19334   constraint (et.size >= elsize,
19335               _("elements must be smaller than reversal region"));
19336   neon_two_same (neon_quad (rs), 1, et.size);
19337 }
19338
19339 static void
19340 do_neon_dup (void)
19341 {
19342   if (inst.operands[1].isscalar)
19343     {
19344       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1),
19345                   BAD_FPU);
19346       enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
19347       struct neon_type_el et = neon_check_type (2, rs,
19348         N_EQK, N_8 | N_16 | N_32 | N_KEY);
19349       unsigned sizebits = et.size >> 3;
19350       unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
19351       int logsize = neon_logbits (et.size);
19352       unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
19353
19354       if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
19355         return;
19356
19357       NEON_ENCODE (SCALAR, inst);
19358       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
19359       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
19360       inst.instruction |= LOW4 (dm);
19361       inst.instruction |= HI1 (dm) << 5;
19362       inst.instruction |= neon_quad (rs) << 6;
19363       inst.instruction |= x << 17;
19364       inst.instruction |= sizebits << 16;
19365
19366       neon_dp_fixup (&inst);
19367     }
19368   else
19369     {
19370       enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
19371       struct neon_type_el et = neon_check_type (2, rs,
19372         N_8 | N_16 | N_32 | N_KEY, N_EQK);
19373       if (rs == NS_QR)
19374         {
19375           if (check_simd_pred_availability (0, NEON_CHECK_ARCH))
19376             return;
19377         }
19378       else
19379         constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1),
19380                     BAD_FPU);
19381
19382       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
19383         {
19384           if (inst.operands[1].reg == REG_SP)
19385             as_tsktsk (MVE_BAD_SP);
19386           else if (inst.operands[1].reg == REG_PC)
19387             as_tsktsk (MVE_BAD_PC);
19388         }
19389
19390       /* Duplicate ARM register to lanes of vector.  */
19391       NEON_ENCODE (ARMREG, inst);
19392       switch (et.size)
19393         {
19394         case 8:  inst.instruction |= 0x400000; break;
19395         case 16: inst.instruction |= 0x000020; break;
19396         case 32: inst.instruction |= 0x000000; break;
19397         default: break;
19398         }
19399       inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
19400       inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
19401       inst.instruction |= HI1 (inst.operands[0].reg) << 7;
19402       inst.instruction |= neon_quad (rs) << 21;
19403       /* The encoding for this instruction is identical for the ARM and Thumb
19404          variants, except for the condition field.  */
19405       do_vfp_cond_or_thumb ();
19406     }
19407 }
19408
19409 static void
19410 do_mve_mov (int toQ)
19411 {
19412   if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
19413     return;
19414   if (inst.cond > COND_ALWAYS)
19415     inst.pred_insn_type = MVE_UNPREDICABLE_INSN;
19416
19417   unsigned Rt = 0, Rt2 = 1, Q0 = 2, Q1 = 3;
19418   if (toQ)
19419     {
19420       Q0 = 0;
19421       Q1 = 1;
19422       Rt = 2;
19423       Rt2 = 3;
19424     }
19425
19426   constraint (inst.operands[Q0].reg != inst.operands[Q1].reg + 2,
19427               _("Index one must be [2,3] and index two must be two less than"
19428                 " index one."));
19429   constraint (inst.operands[Rt].reg == inst.operands[Rt2].reg,
19430               _("General purpose registers may not be the same"));
19431   constraint (inst.operands[Rt].reg == REG_SP
19432               || inst.operands[Rt2].reg == REG_SP,
19433               BAD_SP);
19434   constraint (inst.operands[Rt].reg == REG_PC
19435               || inst.operands[Rt2].reg == REG_PC,
19436               BAD_PC);
19437
19438   inst.instruction = 0xec000f00;
19439   inst.instruction |= HI1 (inst.operands[Q1].reg / 32) << 23;
19440   inst.instruction |= !!toQ << 20;
19441   inst.instruction |= inst.operands[Rt2].reg << 16;
19442   inst.instruction |= LOW4 (inst.operands[Q1].reg / 32) << 13;
19443   inst.instruction |= (inst.operands[Q1].reg % 4) << 4;
19444   inst.instruction |= inst.operands[Rt].reg;
19445 }
19446
19447 static void
19448 do_mve_movn (void)
19449 {
19450   if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
19451     return;
19452
19453   if (inst.cond > COND_ALWAYS)
19454     inst.pred_insn_type = INSIDE_VPT_INSN;
19455   else
19456     inst.pred_insn_type = MVE_OUTSIDE_PRED_INSN;
19457
19458   struct neon_type_el et = neon_check_type (2, NS_QQ, N_EQK, N_I16 | N_I32
19459                                             | N_KEY);
19460
19461   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
19462   inst.instruction |= (neon_logbits (et.size) - 1) << 18;
19463   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
19464   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
19465   inst.instruction |= LOW4 (inst.operands[1].reg);
19466   inst.is_neon = 1;
19467
19468 }
19469
19470 /* VMOV has particularly many variations. It can be one of:
19471      0. VMOV<c><q> <Qd>, <Qm>
19472      1. VMOV<c><q> <Dd>, <Dm>
19473    (Register operations, which are VORR with Rm = Rn.)
19474      2. VMOV<c><q>.<dt> <Qd>, #<imm>
19475      3. VMOV<c><q>.<dt> <Dd>, #<imm>
19476    (Immediate loads.)
19477      4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
19478    (ARM register to scalar.)
19479      5. VMOV<c><q> <Dm>, <Rd>, <Rn>
19480    (Two ARM registers to vector.)
19481      6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
19482    (Scalar to ARM register.)
19483      7. VMOV<c><q> <Rd>, <Rn>, <Dm>
19484    (Vector to two ARM registers.)
19485      8. VMOV.F32 <Sd>, <Sm>
19486      9. VMOV.F64 <Dd>, <Dm>
19487    (VFP register moves.)
19488     10. VMOV.F32 <Sd>, #imm
19489     11. VMOV.F64 <Dd>, #imm
19490    (VFP float immediate load.)
19491     12. VMOV <Rd>, <Sm>
19492    (VFP single to ARM reg.)
19493     13. VMOV <Sd>, <Rm>
19494    (ARM reg to VFP single.)
19495     14. VMOV <Rd>, <Re>, <Sn>, <Sm>
19496    (Two ARM regs to two VFP singles.)
19497     15. VMOV <Sd>, <Se>, <Rn>, <Rm>
19498    (Two VFP singles to two ARM regs.)
19499    16. VMOV<c> <Rt>, <Rt2>, <Qd[idx]>, <Qd[idx2]>
19500    17. VMOV<c> <Qd[idx]>, <Qd[idx2]>, <Rt>, <Rt2>
19501    18. VMOV<c>.<dt> <Rt>, <Qn[idx]>
19502    19. VMOV<c>.<dt> <Qd[idx]>, <Rt>
19503
19504    These cases can be disambiguated using neon_select_shape, except cases 1/9
19505    and 3/11 which depend on the operand type too.
19506
19507    All the encoded bits are hardcoded by this function.
19508
19509    Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
19510    Cases 5, 7 may be used with VFPv2 and above.
19511
19512    FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
19513    can specify a type where it doesn't make sense to, and is ignored).  */
19514
19515 static void
19516 do_neon_mov (void)
19517 {
19518   enum neon_shape rs = neon_select_shape (NS_RRSS, NS_SSRR, NS_RRFF, NS_FFRR,
19519                                           NS_DRR, NS_RRD, NS_QQ, NS_DD, NS_QI,
19520                                           NS_DI, NS_SR, NS_RS, NS_FF, NS_FI,
19521                                           NS_RF, NS_FR, NS_HR, NS_RH, NS_HI,
19522                                           NS_NULL);
19523   struct neon_type_el et;
19524   const char *ldconst = 0;
19525
19526   switch (rs)
19527     {
19528     case NS_DD:  /* case 1/9.  */
19529       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
19530       /* It is not an error here if no type is given.  */
19531       inst.error = NULL;
19532       if (et.type == NT_float && et.size == 64)
19533         {
19534           do_vfp_nsyn_opcode ("fcpyd");
19535           break;
19536         }
19537       /* fall through.  */
19538
19539     case NS_QQ:  /* case 0/1.  */
19540       {
19541         if (check_simd_pred_availability (0, NEON_CHECK_CC | NEON_CHECK_ARCH))
19542           return;
19543         /* The architecture manual I have doesn't explicitly state which
19544            value the U bit should have for register->register moves, but
19545            the equivalent VORR instruction has U = 0, so do that.  */
19546         inst.instruction = 0x0200110;
19547         inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
19548         inst.instruction |= HI1 (inst.operands[0].reg) << 22;
19549         inst.instruction |= LOW4 (inst.operands[1].reg);
19550         inst.instruction |= HI1 (inst.operands[1].reg) << 5;
19551         inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
19552         inst.instruction |= HI1 (inst.operands[1].reg) << 7;
19553         inst.instruction |= neon_quad (rs) << 6;
19554
19555         neon_dp_fixup (&inst);
19556       }
19557       break;
19558
19559     case NS_DI:  /* case 3/11.  */
19560       et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
19561       inst.error = NULL;
19562       if (et.type == NT_float && et.size == 64)
19563         {
19564           /* case 11 (fconstd).  */
19565           ldconst = "fconstd";
19566           goto encode_fconstd;
19567         }
19568       /* fall through.  */
19569
19570     case NS_QI:  /* case 2/3.  */
19571       if (check_simd_pred_availability (0, NEON_CHECK_CC | NEON_CHECK_ARCH))
19572         return;
19573       inst.instruction = 0x0800010;
19574       neon_move_immediate ();
19575       neon_dp_fixup (&inst);
19576       break;
19577
19578     case NS_SR:  /* case 4.  */
19579       {
19580         unsigned bcdebits = 0;
19581         int logsize;
19582         unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
19583         unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
19584
19585         /* .<size> is optional here, defaulting to .32. */
19586         if (inst.vectype.elems == 0
19587             && inst.operands[0].vectype.type == NT_invtype
19588             && inst.operands[1].vectype.type == NT_invtype)
19589           {
19590             inst.vectype.el[0].type = NT_untyped;
19591             inst.vectype.el[0].size = 32;
19592             inst.vectype.elems = 1;
19593           }
19594
19595         et = neon_check_type (2, NS_NULL, N_8 | N_16 | N_32 | N_KEY, N_EQK);
19596         logsize = neon_logbits (et.size);
19597
19598         if (et.size != 32)
19599           {
19600             if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext)
19601                 && vfp_or_neon_is_neon (NEON_CHECK_ARCH) == FAIL)
19602               return;
19603           }
19604         else
19605           {
19606             constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1)
19607                         && !ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext),
19608                         _(BAD_FPU));
19609           }
19610
19611         if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
19612           {
19613             if (inst.operands[1].reg == REG_SP)
19614               as_tsktsk (MVE_BAD_SP);
19615             else if (inst.operands[1].reg == REG_PC)
19616               as_tsktsk (MVE_BAD_PC);
19617           }
19618         unsigned size = inst.operands[0].isscalar == 1 ? 64 : 128;
19619
19620         constraint (et.type == NT_invtype, _("bad type for scalar"));
19621         constraint (x >= size / et.size, _("scalar index out of range"));
19622
19623
19624         switch (et.size)
19625           {
19626           case 8:  bcdebits = 0x8; break;
19627           case 16: bcdebits = 0x1; break;
19628           case 32: bcdebits = 0x0; break;
19629           default: ;
19630           }
19631
19632         bcdebits |= (x & ((1 << (3-logsize)) - 1)) << logsize;
19633
19634         inst.instruction = 0xe000b10;
19635         do_vfp_cond_or_thumb ();
19636         inst.instruction |= LOW4 (dn) << 16;
19637         inst.instruction |= HI1 (dn) << 7;
19638         inst.instruction |= inst.operands[1].reg << 12;
19639         inst.instruction |= (bcdebits & 3) << 5;
19640         inst.instruction |= ((bcdebits >> 2) & 3) << 21;
19641         inst.instruction |= (x >> (3-logsize)) << 16;
19642       }
19643       break;
19644
19645     case NS_DRR:  /* case 5 (fmdrr).  */
19646       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2)
19647                   && !ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext),
19648                   _(BAD_FPU));
19649
19650       inst.instruction = 0xc400b10;
19651       do_vfp_cond_or_thumb ();
19652       inst.instruction |= LOW4 (inst.operands[0].reg);
19653       inst.instruction |= HI1 (inst.operands[0].reg) << 5;
19654       inst.instruction |= inst.operands[1].reg << 12;
19655       inst.instruction |= inst.operands[2].reg << 16;
19656       break;
19657
19658     case NS_RS:  /* case 6.  */
19659       {
19660         unsigned logsize;
19661         unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
19662         unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
19663         unsigned abcdebits = 0;
19664
19665         /* .<dt> is optional here, defaulting to .32. */
19666         if (inst.vectype.elems == 0
19667             && inst.operands[0].vectype.type == NT_invtype
19668             && inst.operands[1].vectype.type == NT_invtype)
19669           {
19670             inst.vectype.el[0].type = NT_untyped;
19671             inst.vectype.el[0].size = 32;
19672             inst.vectype.elems = 1;
19673           }
19674
19675         et = neon_check_type (2, NS_NULL,
19676                               N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
19677         logsize = neon_logbits (et.size);
19678
19679         if (et.size != 32)
19680           {
19681             if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext)
19682                 && vfp_or_neon_is_neon (NEON_CHECK_CC
19683                                         | NEON_CHECK_ARCH) == FAIL)
19684               return;
19685           }
19686         else
19687           {
19688             constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1)
19689                         && !ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext),
19690                         _(BAD_FPU));
19691           }
19692
19693         if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
19694           {
19695             if (inst.operands[0].reg == REG_SP)
19696               as_tsktsk (MVE_BAD_SP);
19697             else if (inst.operands[0].reg == REG_PC)
19698               as_tsktsk (MVE_BAD_PC);
19699           }
19700
19701         unsigned size = inst.operands[1].isscalar == 1 ? 64 : 128;
19702
19703         constraint (et.type == NT_invtype, _("bad type for scalar"));
19704         constraint (x >= size / et.size, _("scalar index out of range"));
19705
19706         switch (et.size)
19707           {
19708           case 8:  abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
19709           case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
19710           case 32: abcdebits = 0x00; break;
19711           default: ;
19712           }
19713
19714         abcdebits |= (x & ((1 << (3-logsize)) - 1)) << logsize;
19715         inst.instruction = 0xe100b10;
19716         do_vfp_cond_or_thumb ();
19717         inst.instruction |= LOW4 (dn) << 16;
19718         inst.instruction |= HI1 (dn) << 7;
19719         inst.instruction |= inst.operands[0].reg << 12;
19720         inst.instruction |= (abcdebits & 3) << 5;
19721         inst.instruction |= (abcdebits >> 2) << 21;
19722         inst.instruction |= (x >> (3-logsize)) << 16;
19723       }
19724       break;
19725
19726     case NS_RRD:  /* case 7 (fmrrd).  */
19727       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2)
19728                   && !ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext),
19729                   _(BAD_FPU));
19730
19731       inst.instruction = 0xc500b10;
19732       do_vfp_cond_or_thumb ();
19733       inst.instruction |= inst.operands[0].reg << 12;
19734       inst.instruction |= inst.operands[1].reg << 16;
19735       inst.instruction |= LOW4 (inst.operands[2].reg);
19736       inst.instruction |= HI1 (inst.operands[2].reg) << 5;
19737       break;
19738
19739     case NS_FF:  /* case 8 (fcpys).  */
19740       do_vfp_nsyn_opcode ("fcpys");
19741       break;
19742
19743     case NS_HI:
19744     case NS_FI:  /* case 10 (fconsts).  */
19745       ldconst = "fconsts";
19746     encode_fconstd:
19747       if (!inst.operands[1].immisfloat)
19748         {
19749           unsigned new_imm;
19750           /* Immediate has to fit in 8 bits so float is enough.  */
19751           float imm = (float) inst.operands[1].imm;
19752           memcpy (&new_imm, &imm, sizeof (float));
19753           /* But the assembly may have been written to provide an integer
19754              bit pattern that equates to a float, so check that the
19755              conversion has worked.  */
19756           if (is_quarter_float (new_imm))
19757             {
19758               if (is_quarter_float (inst.operands[1].imm))
19759                 as_warn (_("immediate constant is valid both as a bit-pattern and a floating point value (using the fp value)"));
19760
19761               inst.operands[1].imm = new_imm;
19762               inst.operands[1].immisfloat = 1;
19763             }
19764         }
19765
19766       if (is_quarter_float (inst.operands[1].imm))
19767         {
19768           inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
19769           do_vfp_nsyn_opcode (ldconst);
19770
19771           /* ARMv8.2 fp16 vmov.f16 instruction.  */
19772           if (rs == NS_HI)
19773             do_scalar_fp16_v82_encode ();
19774         }
19775       else
19776         first_error (_("immediate out of range"));
19777       break;
19778
19779     case NS_RH:
19780     case NS_RF:  /* case 12 (fmrs).  */
19781       do_vfp_nsyn_opcode ("fmrs");
19782       /* ARMv8.2 fp16 vmov.f16 instruction.  */
19783       if (rs == NS_RH)
19784         do_scalar_fp16_v82_encode ();
19785       break;
19786
19787     case NS_HR:
19788     case NS_FR:  /* case 13 (fmsr).  */
19789       do_vfp_nsyn_opcode ("fmsr");
19790       /* ARMv8.2 fp16 vmov.f16 instruction.  */
19791       if (rs == NS_HR)
19792         do_scalar_fp16_v82_encode ();
19793       break;
19794
19795     case NS_RRSS:
19796       do_mve_mov (0);
19797       break;
19798     case NS_SSRR:
19799       do_mve_mov (1);
19800       break;
19801
19802     /* The encoders for the fmrrs and fmsrr instructions expect three operands
19803        (one of which is a list), but we have parsed four.  Do some fiddling to
19804        make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
19805        expect.  */
19806     case NS_RRFF:  /* case 14 (fmrrs).  */
19807       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2)
19808                   && !ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext),
19809                   _(BAD_FPU));
19810       constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
19811                   _("VFP registers must be adjacent"));
19812       inst.operands[2].imm = 2;
19813       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
19814       do_vfp_nsyn_opcode ("fmrrs");
19815       break;
19816
19817     case NS_FFRR:  /* case 15 (fmsrr).  */
19818       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2)
19819                   && !ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext),
19820                   _(BAD_FPU));
19821       constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
19822                   _("VFP registers must be adjacent"));
19823       inst.operands[1] = inst.operands[2];
19824       inst.operands[2] = inst.operands[3];
19825       inst.operands[0].imm = 2;
19826       memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
19827       do_vfp_nsyn_opcode ("fmsrr");
19828       break;
19829
19830     case NS_NULL:
19831       /* neon_select_shape has determined that the instruction
19832          shape is wrong and has already set the error message.  */
19833       break;
19834
19835     default:
19836       abort ();
19837     }
19838 }
19839
19840 static void
19841 do_mve_movl (void)
19842 {
19843   if (!(inst.operands[0].present && inst.operands[0].isquad
19844       && inst.operands[1].present && inst.operands[1].isquad
19845       && !inst.operands[2].present))
19846     {
19847       inst.instruction = 0;
19848       inst.cond = 0xb;
19849       if (thumb_mode)
19850         set_pred_insn_type (INSIDE_IT_INSN);
19851       do_neon_mov ();
19852       return;
19853     }
19854
19855   if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
19856     return;
19857
19858   if (inst.cond != COND_ALWAYS)
19859     inst.pred_insn_type = INSIDE_VPT_INSN;
19860
19861   struct neon_type_el et = neon_check_type (2, NS_QQ, N_EQK, N_S8 | N_U8
19862                                             | N_S16 | N_U16 | N_KEY);
19863
19864   inst.instruction |= (et.type == NT_unsigned) << 28;
19865   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
19866   inst.instruction |= (neon_logbits (et.size) + 1) << 19;
19867   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
19868   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
19869   inst.instruction |= LOW4 (inst.operands[1].reg);
19870   inst.is_neon = 1;
19871 }
19872
19873 static void
19874 do_neon_rshift_round_imm (void)
19875 {
19876   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
19877    return;
19878
19879   enum neon_shape rs;
19880   struct neon_type_el et;
19881
19882   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
19883     {
19884       rs = neon_select_shape (NS_QQI, NS_NULL);
19885       et = neon_check_type (2, rs, N_EQK, N_SU_MVE | N_KEY);
19886     }
19887   else
19888     {
19889       rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
19890       et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
19891     }
19892   int imm = inst.operands[2].imm;
19893
19894   /* imm == 0 case is encoded as VMOV for V{R}SHR.  */
19895   if (imm == 0)
19896     {
19897       inst.operands[2].present = 0;
19898       do_neon_mov ();
19899       return;
19900     }
19901
19902   constraint (imm < 1 || (unsigned)imm > et.size,
19903               _("immediate out of range for shift"));
19904   neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
19905                   et.size - imm);
19906 }
19907
19908 static void
19909 do_neon_movhf (void)
19910 {
19911   enum neon_shape rs = neon_select_shape (NS_HH, NS_NULL);
19912   constraint (rs != NS_HH, _("invalid suffix"));
19913
19914   if (inst.cond != COND_ALWAYS)
19915     {
19916       if (thumb_mode)
19917         {
19918           as_warn (_("ARMv8.2 scalar fp16 instruction cannot be conditional,"
19919                      " the behaviour is UNPREDICTABLE"));
19920         }
19921       else
19922         {
19923           inst.error = BAD_COND;
19924           return;
19925         }
19926     }
19927
19928   do_vfp_sp_monadic ();
19929
19930   inst.is_neon = 1;
19931   inst.instruction |= 0xf0000000;
19932 }
19933
19934 static void
19935 do_neon_movl (void)
19936 {
19937   struct neon_type_el et = neon_check_type (2, NS_QD,
19938     N_EQK | N_DBL, N_SU_32 | N_KEY);
19939   unsigned sizebits = et.size >> 3;
19940   inst.instruction |= sizebits << 19;
19941   neon_two_same (0, et.type == NT_unsigned, -1);
19942 }
19943
19944 static void
19945 do_neon_trn (void)
19946 {
19947   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
19948   struct neon_type_el et = neon_check_type (2, rs,
19949     N_EQK, N_8 | N_16 | N_32 | N_KEY);
19950   NEON_ENCODE (INTEGER, inst);
19951   neon_two_same (neon_quad (rs), 1, et.size);
19952 }
19953
19954 static void
19955 do_neon_zip_uzp (void)
19956 {
19957   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
19958   struct neon_type_el et = neon_check_type (2, rs,
19959     N_EQK, N_8 | N_16 | N_32 | N_KEY);
19960   if (rs == NS_DD && et.size == 32)
19961     {
19962       /* Special case: encode as VTRN.32 <Dd>, <Dm>.  */
19963       inst.instruction = N_MNEM_vtrn;
19964       do_neon_trn ();
19965       return;
19966     }
19967   neon_two_same (neon_quad (rs), 1, et.size);
19968 }
19969
19970 static void
19971 do_neon_sat_abs_neg (void)
19972 {
19973   if (check_simd_pred_availability (0, NEON_CHECK_CC | NEON_CHECK_ARCH))
19974     return;
19975
19976   enum neon_shape rs;
19977   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
19978     rs = neon_select_shape (NS_QQ, NS_NULL);
19979   else
19980     rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
19981   struct neon_type_el et = neon_check_type (2, rs,
19982     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
19983   neon_two_same (neon_quad (rs), 1, et.size);
19984 }
19985
19986 static void
19987 do_neon_pair_long (void)
19988 {
19989   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
19990   struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
19991   /* Unsigned is encoded in OP field (bit 7) for these instruction.  */
19992   inst.instruction |= (et.type == NT_unsigned) << 7;
19993   neon_two_same (neon_quad (rs), 1, et.size);
19994 }
19995
19996 static void
19997 do_neon_recip_est (void)
19998 {
19999   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
20000   struct neon_type_el et = neon_check_type (2, rs,
20001     N_EQK | N_FLT, N_F_16_32 | N_U32 | N_KEY);
20002   inst.instruction |= (et.type == NT_float) << 8;
20003   neon_two_same (neon_quad (rs), 1, et.size);
20004 }
20005
20006 static void
20007 do_neon_cls (void)
20008 {
20009   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
20010     return;
20011
20012   enum neon_shape rs;
20013   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
20014    rs = neon_select_shape (NS_QQ, NS_NULL);
20015   else
20016    rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
20017
20018   struct neon_type_el et = neon_check_type (2, rs,
20019     N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
20020   neon_two_same (neon_quad (rs), 1, et.size);
20021 }
20022
20023 static void
20024 do_neon_clz (void)
20025 {
20026   if (check_simd_pred_availability (0, NEON_CHECK_ARCH | NEON_CHECK_CC))
20027     return;
20028
20029   enum neon_shape rs;
20030   if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
20031    rs = neon_select_shape (NS_QQ, NS_NULL);
20032   else
20033    rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
20034
20035   struct neon_type_el et = neon_check_type (2, rs,
20036     N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
20037   neon_two_same (neon_quad (rs), 1, et.size);
20038 }
20039
20040 static void
20041 do_neon_cnt (void)
20042 {
20043   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
20044   struct neon_type_el et = neon_check_type (2, rs,
20045     N_EQK | N_INT, N_8 | N_KEY);
20046   neon_two_same (neon_quad (rs), 1, et.size);
20047 }
20048
20049 static void
20050 do_neon_swp (void)
20051 {
20052   enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
20053   neon_two_same (neon_quad (rs), 1, -1);
20054 }
20055
20056 static void
20057 do_neon_tbl_tbx (void)
20058 {
20059   unsigned listlenbits;
20060   neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
20061
20062   if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
20063     {
20064       first_error (_("bad list length for table lookup"));
20065       return;
20066     }
20067
20068   listlenbits = inst.operands[1].imm - 1;
20069   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
20070   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
20071   inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
20072   inst.instruction |= HI1 (inst.operands[1].reg) << 7;
20073   inst.instruction |= LOW4 (inst.operands[2].reg);
20074   inst.instruction |= HI1 (inst.operands[2].reg) << 5;
20075   inst.instruction |= listlenbits << 8;
20076
20077   neon_dp_fixup (&inst);
20078 }
20079
20080 static void
20081 do_neon_ldm_stm (void)
20082 {
20083   /* P, U and L bits are part of bitmask.  */
20084   int is_dbmode = (inst.instruction & (1 << 24)) != 0;
20085   unsigned offsetbits = inst.operands[1].imm * 2;
20086
20087   if (inst.operands[1].issingle)
20088     {
20089       do_vfp_nsyn_ldm_stm (is_dbmode);
20090       return;
20091     }
20092
20093   constraint (is_dbmode && !inst.operands[0].writeback,
20094               _("writeback (!) must be used for VLDMDB and VSTMDB"));
20095
20096   constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
20097               _("register list must contain at least 1 and at most 16 "
20098                 "registers"));
20099
20100   inst.instruction |= inst.operands[0].reg << 16;
20101   inst.instruction |= inst.operands[0].writeback << 21;
20102   inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
20103   inst.instruction |= HI1 (inst.operands[1].reg) << 22;
20104
20105   inst.instruction |= offsetbits;
20106
20107   do_vfp_cond_or_thumb ();
20108 }
20109
20110 static void
20111 do_neon_ldr_str (void)
20112 {
20113   int is_ldr = (inst.instruction & (1 << 20)) != 0;
20114
20115   /* Use of PC in vstr in ARM mode is deprecated in ARMv7.
20116      And is UNPREDICTABLE in thumb mode.  */
20117   if (!is_ldr
20118       && inst.operands[1].reg == REG_PC
20119       && (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7) || thumb_mode))
20120     {
20121       if (thumb_mode)
20122         inst.error = _("Use of PC here is UNPREDICTABLE");
20123       else if (warn_on_deprecated)
20124         as_tsktsk (_("Use of PC here is deprecated"));
20125     }
20126
20127   if (inst.operands[0].issingle)
20128     {
20129       if (is_ldr)
20130         do_vfp_nsyn_opcode ("flds");
20131       else
20132         do_vfp_nsyn_opcode ("fsts");
20133
20134       /* ARMv8.2 vldr.16/vstr.16 instruction.  */
20135       if (inst.vectype.el[0].size == 16)
20136         do_scalar_fp16_v82_encode ();
20137     }
20138   else
20139     {
20140       if (is_ldr)
20141         do_vfp_nsyn_opcode ("fldd");
20142       else
20143         do_vfp_nsyn_opcode ("fstd");
20144     }
20145 }
20146
20147 static void
20148 do_t_vldr_vstr_sysreg (void)
20149 {
20150   int fp_vldr_bitno = 20, sysreg_vldr_bitno = 20;
20151   bfd_boolean is_vldr = ((inst.instruction & (1 << fp_vldr_bitno)) != 0);
20152
20153   /* Use of PC is UNPREDICTABLE.  */
20154   if (inst.operands[1].reg == REG_PC)
20155     inst.error = _("Use of PC here is UNPREDICTABLE");
20156
20157   if (inst.operands[1].immisreg)
20158     inst.error = _("instruction does not accept register index");
20159
20160   if (!inst.operands[1].isreg)
20161     inst.error = _("instruction does not accept PC-relative addressing");
20162
20163   if (abs (inst.operands[1].imm) >= (1 << 7))
20164     inst.error = _("immediate value out of range");
20165
20166   inst.instruction = 0xec000f80;
20167   if (is_vldr)
20168     inst.instruction |= 1 << sysreg_vldr_bitno;
20169   encode_arm_cp_address (1, TRUE, FALSE, BFD_RELOC_ARM_T32_VLDR_VSTR_OFF_IMM);
20170   inst.instruction |= (inst.operands[0].imm & 0x7) << 13;
20171   inst.instruction |= (inst.operands[0].imm & 0x8) << 19;
20172 }
20173
20174 static void
20175 do_vldr_vstr (void)
20176 {
20177   bfd_boolean sysreg_op = !inst.operands[0].isreg;
20178
20179   /* VLDR/VSTR (System Register).  */
20180   if (sysreg_op)
20181     {
20182       if (!mark_feature_used (&arm_ext_v8_1m_main))
20183         as_bad (_("Instruction not permitted on this architecture"));
20184
20185       do_t_vldr_vstr_sysreg ();
20186     }
20187   /* VLDR/VSTR.  */
20188   else
20189     {
20190       if (!mark_feature_used (&fpu_vfp_ext_v1xd))
20191         as_bad (_("Instruction not permitted on this architecture"));
20192       do_neon_ldr_str ();
20193     }
20194 }
20195
20196 /* "interleave" version also handles non-interleaving register VLD1/VST1
20197    instructions.  */
20198
20199 static void
20200 do_neon_ld_st_interleave (void)
20201 {
20202   struct neon_type_el et = neon_check_type (1, NS_NULL,
20203                                             N_8 | N_16 | N_32 | N_64);
20204   unsigned alignbits = 0;
20205   unsigned idx;
20206   /* The bits in this table go:
20207      0: register stride of one (0) or two (1)
20208      1,2: register list length, minus one (1, 2, 3, 4).
20209      3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
20210      We use -1 for invalid entries.  */
20211   const int typetable[] =
20212     {
20213       0x7,  -1, 0xa,  -1, 0x6,  -1, 0x2,  -1, /* VLD1 / VST1.  */
20214        -1,  -1, 0x8, 0x9,  -1,  -1, 0x3,  -1, /* VLD2 / VST2.  */
20215        -1,  -1,  -1,  -1, 0x4, 0x5,  -1,  -1, /* VLD3 / VST3.  */
20216        -1,  -1,  -1,  -1,  -1,  -1, 0x0, 0x1  /* VLD4 / VST4.  */
20217     };
20218   int typebits;
20219
20220   if (et.type == NT_invtype)
20221     return;
20222
20223   if (inst.operands[1].immisalign)
20224     switch (inst.operands[1].imm >> 8)
20225       {
20226       case 64: alignbits = 1; break;
20227       case 128:
20228         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2
20229             && NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
20230           goto bad_alignment;
20231         alignbits = 2;
20232         break;
20233       case 256:
20234         if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
20235           goto bad_alignment;
20236         alignbits = 3;
20237         break;
20238       default:
20239       bad_alignment:
20240         first_error (_("bad alignment"));
20241         return;
20242       }
20243
20244   inst.instruction |= alignbits << 4;
20245   inst.instruction |= neon_logbits (et.size) << 6;
20246
20247   /* Bits [4:6] of the immediate in a list specifier encode register stride
20248      (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
20249      VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
20250      up the right value for "type" in a table based on this value and the given
20251      list style, then stick it back.  */
20252   idx = ((inst.operands[0].imm >> 4) & 7)
20253         | (((inst.instruction >> 8) & 3) << 3);
20254
20255   typebits = typetable[idx];
20256
20257   constraint (typebits == -1, _("bad list type for instruction"));
20258   constraint (((inst.instruction >> 8) & 3) && et.size == 64,
20259               BAD_EL_TYPE);
20260
20261   inst.instruction &= ~0xf00;
20262   inst.instruction |= typebits << 8;
20263 }
20264
20265 /* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
20266    *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
20267    otherwise. The variable arguments are a list of pairs of legal (size, align)
20268    values, terminated with -1.  */
20269
20270 static int
20271 neon_alignment_bit (int size, int align, int *do_alignment, ...)
20272 {
20273   va_list ap;
20274   int result = FAIL, thissize, thisalign;
20275
20276   if (!inst.operands[1].immisalign)
20277     {
20278       *do_alignment = 0;
20279       return SUCCESS;
20280     }
20281
20282   va_start (ap, do_alignment);
20283
20284   do
20285     {
20286       thissize = va_arg (ap, int);
20287       if (thissize == -1)
20288         break;
20289       thisalign = va_arg (ap, int);
20290
20291       if (size == thissize && align == thisalign)
20292         result = SUCCESS;
20293     }
20294   while (result != SUCCESS);
20295
20296   va_end (ap);
20297
20298   if (result == SUCCESS)
20299     *do_alignment = 1;
20300   else
20301     first_error (_("unsupported alignment for instruction"));
20302
20303   return result;
20304 }
20305
20306 static void
20307 do_neon_ld_st_lane (void)
20308 {
20309   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
20310   int align_good, do_alignment = 0;
20311   int logsize = neon_logbits (et.size);
20312   int align = inst.operands[1].imm >> 8;
20313   int n = (inst.instruction >> 8) & 3;
20314   int max_el = 64 / et.size;
20315
20316   if (et.type == NT_invtype)
20317     return;
20318
20319   constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
20320               _("bad list length"));
20321   constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
20322               _("scalar index out of range"));
20323   constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
20324               && et.size == 8,
20325               _("stride of 2 unavailable when element size is 8"));
20326
20327   switch (n)
20328     {
20329     case 0:  /* VLD1 / VST1.  */
20330       align_good = neon_alignment_bit (et.size, align, &do_alignment, 16, 16,
20331                                        32, 32, -1);
20332       if (align_good == FAIL)
20333         return;
20334       if (do_alignment)
20335         {
20336           unsigned alignbits = 0;
20337           switch (et.size)
20338             {
20339             case 16: alignbits = 0x1; break;
20340             case 32: alignbits = 0x3; break;
20341             default: ;
20342             }
20343           inst.instruction |= alignbits << 4;
20344         }
20345       break;
20346
20347     case 1:  /* VLD2 / VST2.  */
20348       align_good = neon_alignment_bit (et.size, align, &do_alignment, 8, 16,
20349                       16, 32, 32, 64, -1);
20350       if (align_good == FAIL)
20351         return;
20352       if (do_alignment)
20353         inst.instruction |= 1 << 4;
20354       break;
20355
20356     case 2:  /* VLD3 / VST3.  */
20357       constraint (inst.operands[1].immisalign,
20358                   _("can't use alignment with this instruction"));
20359       break;
20360
20361     case 3:  /* VLD4 / VST4.  */
20362       align_good = neon_alignment_bit (et.size, align, &do_alignment, 8, 32,
20363                                        16, 64, 32, 64, 32, 128, -1);
20364       if (align_good == FAIL)
20365         return;
20366       if (do_alignment)
20367         {
20368           unsigned alignbits = 0;
20369           switch (et.size)
20370             {
20371             case 8:  alignbits = 0x1; break;
20372             case 16: alignbits = 0x1; break;
20373             case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
20374             default: ;
20375             }
20376           inst.instruction |= alignbits << 4;
20377         }
20378       break;
20379
20380     default: ;
20381     }
20382
20383   /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32.  */
20384   if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
20385     inst.instruction |= 1 << (4 + logsize);
20386
20387   inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
20388   inst.instruction |= logsize << 10;
20389 }
20390
20391 /* Encode single n-element structure to all lanes VLD<n> instructions.  */
20392
20393 static void
20394 do_neon_ld_dup (void)
20395 {
20396   struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
20397   int align_good, do_alignment = 0;
20398
20399   if (et.type == NT_invtype)
20400     return;
20401
20402   switch ((inst.instruction >> 8) & 3)
20403     {
20404     case 0:  /* VLD1.  */
20405       gas_assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
20406       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
20407                                        &do_alignment, 16, 16, 32, 32, -1);
20408       if (align_good == FAIL)
20409         return;
20410       switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
20411         {
20412         case 1: break;
20413         case 2: inst.instruction |= 1 << 5; break;
20414         default: first_error (_("bad list length")); return;
20415         }
20416       inst.instruction |= neon_logbits (et.size) << 6;
20417       break;
20418
20419     case 1:  /* VLD2.  */
20420       align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
20421                                        &do_alignment, 8, 16, 16, 32, 32, 64,
20422                                        -1);
20423       if (align_good == FAIL)
20424         return;
20425       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
20426                   _("bad list length"));
20427       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
20428         inst.instruction |= 1 << 5;
20429       inst.instruction |= neon_logbits (et.size) << 6;
20430       break;
20431
20432     case 2:  /* VLD3.  */
20433       constraint (inst.operands[1].immisalign,
20434                   _("can't use alignment with this instruction"));
20435       constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
20436                   _("bad list length"));
20437       if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
20438         inst.instruction |= 1 << 5;
20439       inst.instruction |= neon_logbits (et.size) << 6;
20440       break;
20441
20442     case 3:  /* VLD4.  */
20443       {
20444         int align = inst.operands[1].imm >> 8;
20445         align_good = neon_alignment_bit (et.size, align, &do_alignment, 8, 32,
20446                                          16, 64, 32, 64, 32, 128, -1);
20447         if (align_good == FAIL)
20448           return;
20449         constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
20450                     _("bad list length"));
20451         if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
20452           inst.instruction |= 1 << 5;
20453         if (et.size == 32 && align == 128)
20454           inst.instruction |= 0x3 << 6;
20455         else
20456           inst.instruction |= neon_logbits (et.size) << 6;
20457       }
20458       break;
20459
20460     default: ;
20461     }
20462
20463   inst.instruction |= do_alignment << 4;
20464 }
20465
20466 /* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
20467    apart from bits [11:4].  */
20468
20469 static void
20470 do_neon_ldx_stx (void)
20471 {
20472   if (inst.operands[1].isreg)
20473     constraint (inst.operands[1].reg == REG_PC, BAD_PC);
20474
20475   switch (NEON_LANE (inst.operands[0].imm))
20476     {
20477     case NEON_INTERLEAVE_LANES:
20478       NEON_ENCODE (INTERLV, inst);
20479       do_neon_ld_st_interleave ();
20480       break;
20481
20482     case NEON_ALL_LANES:
20483       NEON_ENCODE (DUP, inst);
20484       if (inst.instruction == N_INV)
20485         {
20486           first_error ("only loads support such operands");
20487           break;
20488         }
20489       do_neon_ld_dup ();
20490       break;
20491
20492     default:
20493       NEON_ENCODE (LANE, inst);
20494       do_neon_ld_st_lane ();
20495     }
20496
20497   /* L bit comes from bit mask.  */
20498   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
20499   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
20500   inst.instruction |= inst.operands[1].reg << 16;
20501
20502   if (inst.operands[1].postind)
20503     {
20504       int postreg = inst.operands[1].imm & 0xf;
20505       constraint (!inst.operands[1].immisreg,
20506                   _("post-index must be a register"));
20507       constraint (postreg == 0xd || postreg == 0xf,
20508                   _("bad register for post-index"));
20509       inst.instruction |= postreg;
20510     }
20511   else
20512     {
20513       constraint (inst.operands[1].immisreg, BAD_ADDR_MODE);
20514       constraint (inst.relocs[0].exp.X_op != O_constant
20515                   || inst.relocs[0].exp.X_add_number != 0,
20516                   BAD_ADDR_MODE);
20517
20518       if (inst.operands[1].writeback)
20519         {
20520           inst.instruction |= 0xd;
20521         }
20522       else
20523         inst.instruction |= 0xf;
20524     }
20525
20526   if (thumb_mode)
20527     inst.instruction |= 0xf9000000;
20528   else
20529     inst.instruction |= 0xf4000000;
20530 }
20531
20532 /* FP v8.  */
20533 static void
20534 do_vfp_nsyn_fpv8 (enum neon_shape rs)
20535 {
20536   /* Targets like FPv5-SP-D16 don't support FP v8 instructions with
20537      D register operands.  */
20538   if (neon_shape_class[rs] == SC_DOUBLE)
20539     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
20540                 _(BAD_FPU));
20541
20542   NEON_ENCODE (FPV8, inst);
20543
20544   if (rs == NS_FFF || rs == NS_HHH)
20545     {
20546       do_vfp_sp_dyadic ();
20547
20548       /* ARMv8.2 fp16 instruction.  */
20549       if (rs == NS_HHH)
20550         do_scalar_fp16_v82_encode ();
20551     }
20552   else
20553     do_vfp_dp_rd_rn_rm ();
20554
20555   if (rs == NS_DDD)
20556     inst.instruction |= 0x100;
20557
20558   inst.instruction |= 0xf0000000;
20559 }
20560
20561 static void
20562 do_vsel (void)
20563 {
20564   set_pred_insn_type (OUTSIDE_PRED_INSN);
20565
20566   if (try_vfp_nsyn (3, do_vfp_nsyn_fpv8) != SUCCESS)
20567     first_error (_("invalid instruction shape"));
20568 }
20569
20570 static void
20571 do_vmaxnm (void)
20572 {
20573   if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
20574     set_pred_insn_type (OUTSIDE_PRED_INSN);
20575
20576   if (try_vfp_nsyn (3, do_vfp_nsyn_fpv8) == SUCCESS)
20577     return;
20578
20579   if (check_simd_pred_availability (1, NEON_CHECK_CC | NEON_CHECK_ARCH8))
20580     return;
20581
20582   neon_dyadic_misc (NT_untyped, N_F_16_32, 0);
20583 }
20584
20585 static void
20586 do_vrint_1 (enum neon_cvt_mode mode)
20587 {
20588   enum neon_shape rs = neon_select_shape (NS_HH, NS_FF, NS_DD, NS_QQ, NS_NULL);
20589   struct neon_type_el et;
20590
20591   if (rs == NS_NULL)
20592     return;
20593
20594   /* Targets like FPv5-SP-D16 don't support FP v8 instructions with
20595      D register operands.  */
20596   if (neon_shape_class[rs] == SC_DOUBLE)
20597     constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
20598                 _(BAD_FPU));
20599
20600   et = neon_check_type (2, rs, N_EQK | N_VFP, N_F_ALL | N_KEY
20601                         | N_VFP);
20602   if (et.type != NT_invtype)
20603     {
20604       /* VFP encodings.  */
20605       if (mode == neon_cvt_mode_a || mode == neon_cvt_mode_n
20606           || mode == neon_cvt_mode_p || mode == neon_cvt_mode_m)
20607         set_pred_insn_type (OUTSIDE_PRED_INSN);
20608
20609       NEON_ENCODE (FPV8, inst);
20610       if (rs == NS_FF || rs == NS_HH)
20611         do_vfp_sp_monadic ();
20612       else
20613         do_vfp_dp_rd_rm ();
20614
20615       switch (mode)
20616         {
20617         case neon_cvt_mode_r: inst.instruction |= 0x00000000; break;
20618         case neon_cvt_mode_z: inst.instruction |= 0x00000080; break;
20619         case neon_cvt_mode_x: inst.instruction |= 0x00010000; break;
20620         case neon_cvt_mode_a: inst.instruction |= 0xf0000000; break;
20621         case neon_cvt_mode_n: inst.instruction |= 0xf0010000; break;
20622         case neon_cvt_mode_p: inst.instruction |= 0xf0020000; break;
20623         case neon_cvt_mode_m: inst.instruction |= 0xf0030000; break;
20624         default: abort ();
20625         }
20626
20627       inst.instruction |= (rs == NS_DD) << 8;
20628       do_vfp_cond_or_thumb ();
20629
20630       /* ARMv8.2 fp16 vrint instruction.  */
20631       if (rs == NS_HH)
20632       do_scalar_fp16_v82_encode ();
20633     }
20634   else
20635     {
20636       /* Neon encodings (or something broken...).  */
20637       inst.error = NULL;
20638       et = neon_check_type (2, rs, N_EQK, N_F_16_32 | N_KEY);
20639
20640       if (et.type == NT_invtype)
20641         return;
20642
20643       if (check_simd_pred_availability (1, NEON_CHECK_CC | NEON_CHECK_ARCH8))
20644         return;
20645
20646       NEON_ENCODE (FLOAT, inst);
20647
20648       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
20649       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
20650       inst.instruction |= LOW4 (inst.operands[1].reg);
20651       inst.instruction |= HI1 (inst.operands[1].reg) << 5;
20652       inst.instruction |= neon_quad (rs) << 6;
20653       /* Mask off the original size bits and reencode them.  */
20654       inst.instruction = ((inst.instruction & 0xfff3ffff)
20655                           | neon_logbits (et.size) << 18);
20656
20657       switch (mode)
20658         {
20659         case neon_cvt_mode_z: inst.instruction |= 3 << 7; break;
20660         case neon_cvt_mode_x: inst.instruction |= 1 << 7; break;
20661         case neon_cvt_mode_a: inst.instruction |= 2 << 7; break;
20662         case neon_cvt_mode_n: inst.instruction |= 0 << 7; break;
20663         case neon_cvt_mode_p: inst.instruction |= 7 << 7; break;
20664         case neon_cvt_mode_m: inst.instruction |= 5 << 7; break;
20665         case neon_cvt_mode_r: inst.error = _("invalid rounding mode"); break;
20666         default: abort ();
20667         }
20668
20669       if (thumb_mode)
20670         inst.instruction |= 0xfc000000;
20671       else
20672         inst.instruction |= 0xf0000000;
20673     }
20674 }
20675
20676 static void
20677 do_vrintx (void)
20678 {
20679   do_vrint_1 (neon_cvt_mode_x);
20680 }
20681
20682 static void
20683 do_vrintz (void)
20684 {
20685   do_vrint_1 (neon_cvt_mode_z);
20686 }
20687
20688 static void
20689 do_vrintr (void)
20690 {
20691   do_vrint_1 (neon_cvt_mode_r);
20692 }
20693
20694 static void
20695 do_vrinta (void)
20696 {
20697   do_vrint_1 (neon_cvt_mode_a);
20698 }
20699
20700 static void
20701 do_vrintn (void)
20702 {
20703   do_vrint_1 (neon_cvt_mode_n);
20704 }
20705
20706 static void
20707 do_vrintp (void)
20708 {
20709   do_vrint_1 (neon_cvt_mode_p);
20710 }
20711
20712 static void
20713 do_vrintm (void)
20714 {
20715   do_vrint_1 (neon_cvt_mode_m);
20716 }
20717
20718 static unsigned
20719 neon_scalar_for_vcmla (unsigned opnd, unsigned elsize)
20720 {
20721   unsigned regno = NEON_SCALAR_REG (opnd);
20722   unsigned elno = NEON_SCALAR_INDEX (opnd);
20723
20724   if (elsize == 16 && elno < 2 && regno < 16)
20725     return regno | (elno << 4);
20726   else if (elsize == 32 && elno == 0)
20727     return regno;
20728
20729   first_error (_("scalar out of range"));
20730   return 0;
20731 }
20732
20733 static void
20734 do_vcmla (void)
20735 {
20736   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_fp_ext)
20737               && (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_armv8)
20738                   || !mark_feature_used (&arm_ext_v8_3)), (BAD_FPU));
20739   constraint (inst.relocs[0].exp.X_op != O_constant,
20740               _("expression too complex"));
20741   unsigned rot = inst.relocs[0].exp.X_add_number;
20742   constraint (rot != 0 && rot != 90 && rot != 180 && rot != 270,
20743               _("immediate out of range"));
20744   rot /= 90;
20745
20746   if (check_simd_pred_availability (1, NEON_CHECK_ARCH8 | NEON_CHECK_CC))
20747     return;
20748
20749   if (inst.operands[2].isscalar)
20750     {
20751       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_fp_ext))
20752         first_error (_("invalid instruction shape"));
20753       enum neon_shape rs = neon_select_shape (NS_DDSI, NS_QQSI, NS_NULL);
20754       unsigned size = neon_check_type (3, rs, N_EQK, N_EQK,
20755                                        N_KEY | N_F16 | N_F32).size;
20756       unsigned m = neon_scalar_for_vcmla (inst.operands[2].reg, size);
20757       inst.is_neon = 1;
20758       inst.instruction = 0xfe000800;
20759       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
20760       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
20761       inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
20762       inst.instruction |= HI1 (inst.operands[1].reg) << 7;
20763       inst.instruction |= LOW4 (m);
20764       inst.instruction |= HI1 (m) << 5;
20765       inst.instruction |= neon_quad (rs) << 6;
20766       inst.instruction |= rot << 20;
20767       inst.instruction |= (size == 32) << 23;
20768     }
20769   else
20770     {
20771       enum neon_shape rs;
20772       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_fp_ext))
20773         rs = neon_select_shape (NS_QQQI, NS_NULL);
20774       else
20775         rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
20776
20777       unsigned size = neon_check_type (3, rs, N_EQK, N_EQK,
20778                                        N_KEY | N_F16 | N_F32).size;
20779       if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_fp_ext) && size == 32
20780           && (inst.operands[0].reg == inst.operands[1].reg
20781               || inst.operands[0].reg == inst.operands[2].reg))
20782         as_tsktsk (BAD_MVE_SRCDEST);
20783
20784       neon_three_same (neon_quad (rs), 0, -1);
20785       inst.instruction &= 0x00ffffff; /* Undo neon_dp_fixup.  */
20786       inst.instruction |= 0xfc200800;
20787       inst.instruction |= rot << 23;
20788       inst.instruction |= (size == 32) << 20;
20789     }
20790 }
20791
20792 static void
20793 do_vcadd (void)
20794 {
20795   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext)
20796               && (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_armv8)
20797                   || !mark_feature_used (&arm_ext_v8_3)), (BAD_FPU));
20798   constraint (inst.relocs[0].exp.X_op != O_constant,
20799               _("expression too complex"));
20800
20801   unsigned rot = inst.relocs[0].exp.X_add_number;
20802   constraint (rot != 90 && rot != 270, _("immediate out of range"));
20803   enum neon_shape rs;
20804   struct neon_type_el et;
20805   if (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
20806     {
20807       rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
20808       et = neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_F16 | N_F32);
20809     }
20810   else
20811     {
20812       rs = neon_select_shape (NS_QQQI, NS_NULL);
20813       et = neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_F16 | N_F32 | N_I8
20814                             | N_I16 | N_I32);
20815       if (et.size == 32 && inst.operands[0].reg == inst.operands[2].reg)
20816         as_tsktsk (_("Warning: 32-bit element size and same first and third "
20817                      "operand makes instruction UNPREDICTABLE"));
20818     }
20819
20820   if (et.type == NT_invtype)
20821     return;
20822
20823   if (check_simd_pred_availability (et.type == NT_float, NEON_CHECK_ARCH8
20824                                     | NEON_CHECK_CC))
20825     return;
20826
20827   if (et.type == NT_float)
20828     {
20829       neon_three_same (neon_quad (rs), 0, -1);
20830       inst.instruction &= 0x00ffffff; /* Undo neon_dp_fixup.  */
20831       inst.instruction |= 0xfc800800;
20832       inst.instruction |= (rot == 270) << 24;
20833       inst.instruction |= (et.size == 32) << 20;
20834     }
20835   else
20836     {
20837       constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext), BAD_FPU);
20838       inst.instruction = 0xfe000f00;
20839       inst.instruction |= HI1 (inst.operands[0].reg) << 22;
20840       inst.instruction |= neon_logbits (et.size) << 20;
20841       inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
20842       inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
20843       inst.instruction |= (rot == 270) << 12;
20844       inst.instruction |= HI1 (inst.operands[1].reg) << 7;
20845       inst.instruction |= HI1 (inst.operands[2].reg) << 5;
20846       inst.instruction |= LOW4 (inst.operands[2].reg);
20847       inst.is_neon = 1;
20848     }
20849 }
20850
20851 /* Dot Product instructions encoding support.  */
20852
20853 static void
20854 do_neon_dotproduct (int unsigned_p)
20855 {
20856   enum neon_shape rs;
20857   unsigned scalar_oprd2 = 0;
20858   int high8;
20859
20860   if (inst.cond != COND_ALWAYS)
20861     as_warn (_("Dot Product instructions cannot be conditional,  the behaviour "
20862                "is UNPREDICTABLE"));
20863
20864   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_armv8),
20865               _(BAD_FPU));
20866
20867   /* Dot Product instructions are in three-same D/Q register format or the third
20868      operand can be a scalar index register.  */
20869   if (inst.operands[2].isscalar)
20870     {
20871       scalar_oprd2 = neon_scalar_for_mul (inst.operands[2].reg, 32);
20872       high8 = 0xfe000000;
20873       rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
20874     }
20875   else
20876     {
20877       high8 = 0xfc000000;
20878       rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
20879     }
20880
20881   if (unsigned_p)
20882     neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_U8);
20883   else
20884     neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_S8);
20885
20886   /* The "U" bit in traditional Three Same encoding is fixed to 0 for Dot
20887      Product instruction, so we pass 0 as the "ubit" parameter.  And the
20888      "Size" field are fixed to 0x2, so we pass 32 as the "size" parameter.  */
20889   neon_three_same (neon_quad (rs), 0, 32);
20890
20891   /* Undo neon_dp_fixup.  Dot Product instructions are using a slightly
20892      different NEON three-same encoding.  */
20893   inst.instruction &= 0x00ffffff;
20894   inst.instruction |= high8;
20895   /* Encode 'U' bit which indicates signedness.  */
20896   inst.instruction |= (unsigned_p ? 1 : 0) << 4;
20897   /* Re-encode operand2 if it's indexed scalar operand.  What has been encoded
20898      from inst.operand[2].reg in neon_three_same is GAS's internal encoding, not
20899      the instruction encoding.  */
20900   if (inst.operands[2].isscalar)
20901     {
20902       inst.instruction &= 0xffffffd0;
20903       inst.instruction |= LOW4 (scalar_oprd2);
20904       inst.instruction |= HI1 (scalar_oprd2) << 5;
20905     }
20906 }
20907
20908 /* Dot Product instructions for signed integer.  */
20909
20910 static void
20911 do_neon_dotproduct_s (void)
20912 {
20913   return do_neon_dotproduct (0);
20914 }
20915
20916 /* Dot Product instructions for unsigned integer.  */
20917
20918 static void
20919 do_neon_dotproduct_u (void)
20920 {
20921   return do_neon_dotproduct (1);
20922 }
20923
20924 /* Crypto v1 instructions.  */
20925 static void
20926 do_crypto_2op_1 (unsigned elttype, int op)
20927 {
20928   set_pred_insn_type (OUTSIDE_PRED_INSN);
20929
20930   if (neon_check_type (2, NS_QQ, N_EQK | N_UNT, elttype | N_UNT | N_KEY).type
20931       == NT_invtype)
20932     return;
20933
20934   inst.error = NULL;
20935
20936   NEON_ENCODE (INTEGER, inst);
20937   inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
20938   inst.instruction |= HI1 (inst.operands[0].reg) << 22;
20939   inst.instruction |= LOW4 (inst.operands[1].reg);
20940   inst.instruction |= HI1 (inst.operands[1].reg) << 5;
20941   if (op != -1)
20942     inst.instruction |= op << 6;
20943
20944   if (thumb_mode)
20945     inst.instruction |= 0xfc000000;
20946   else
20947     inst.instruction |= 0xf0000000;
20948 }
20949
20950 static void
20951 do_crypto_3op_1 (int u, int op)
20952 {
20953   set_pred_insn_type (OUTSIDE_PRED_INSN);
20954
20955   if (neon_check_type (3, NS_QQQ, N_EQK | N_UNT, N_EQK | N_UNT,
20956                        N_32 | N_UNT | N_KEY).type == NT_invtype)
20957     return;
20958
20959   inst.error = NULL;
20960
20961   NEON_ENCODE (INTEGER, inst);
20962   neon_three_same (1, u, 8 << op);
20963 }
20964
20965 static void
20966 do_aese (void)
20967 {
20968   do_crypto_2op_1 (N_8, 0);
20969 }
20970
20971 static void
20972 do_aesd (void)
20973 {
20974   do_crypto_2op_1 (N_8, 1);
20975 }
20976
20977 static void
20978 do_aesmc (void)
20979 {
20980   do_crypto_2op_1 (N_8, 2);
20981 }
20982
20983 static void
20984 do_aesimc (void)
20985 {
20986   do_crypto_2op_1 (N_8, 3);
20987 }
20988
20989 static void
20990 do_sha1c (void)
20991 {
20992   do_crypto_3op_1 (0, 0);
20993 }
20994
20995 static void
20996 do_sha1p (void)
20997 {
20998   do_crypto_3op_1 (0, 1);
20999 }
21000
21001 static void
21002 do_sha1m (void)
21003 {
21004   do_crypto_3op_1 (0, 2);
21005 }
21006
21007 static void
21008 do_sha1su0 (void)
21009 {
21010   do_crypto_3op_1 (0, 3);
21011 }
21012
21013 static void
21014 do_sha256h (void)
21015 {
21016   do_crypto_3op_1 (1, 0);
21017 }
21018
21019 static void
21020 do_sha256h2 (void)
21021 {
21022   do_crypto_3op_1 (1, 1);
21023 }
21024
21025 static void
21026 do_sha256su1 (void)
21027 {
21028   do_crypto_3op_1 (1, 2);
21029 }
21030
21031 static void
21032 do_sha1h (void)
21033 {
21034   do_crypto_2op_1 (N_32, -1);
21035 }
21036
21037 static void
21038 do_sha1su1 (void)
21039 {
21040   do_crypto_2op_1 (N_32, 0);
21041 }
21042
21043 static void
21044 do_sha256su0 (void)
21045 {
21046   do_crypto_2op_1 (N_32, 1);
21047 }
21048
21049 static void
21050 do_crc32_1 (unsigned int poly, unsigned int sz)
21051 {
21052   unsigned int Rd = inst.operands[0].reg;
21053   unsigned int Rn = inst.operands[1].reg;
21054   unsigned int Rm = inst.operands[2].reg;
21055
21056   set_pred_insn_type (OUTSIDE_PRED_INSN);
21057   inst.instruction |= LOW4 (Rd) << (thumb_mode ? 8 : 12);
21058   inst.instruction |= LOW4 (Rn) << 16;
21059   inst.instruction |= LOW4 (Rm);
21060   inst.instruction |= sz << (thumb_mode ? 4 : 21);
21061   inst.instruction |= poly << (thumb_mode ? 20 : 9);
21062
21063   if (Rd == REG_PC || Rn == REG_PC || Rm == REG_PC)
21064     as_warn (UNPRED_REG ("r15"));
21065 }
21066
21067 static void
21068 do_crc32b (void)
21069 {
21070   do_crc32_1 (0, 0);
21071 }
21072
21073 static void
21074 do_crc32h (void)
21075 {
21076   do_crc32_1 (0, 1);
21077 }
21078
21079 static void
21080 do_crc32w (void)
21081 {
21082   do_crc32_1 (0, 2);
21083 }
21084
21085 static void
21086 do_crc32cb (void)
21087 {
21088   do_crc32_1 (1, 0);
21089 }
21090
21091 static void
21092 do_crc32ch (void)
21093 {
21094   do_crc32_1 (1, 1);
21095 }
21096
21097 static void
21098 do_crc32cw (void)
21099 {
21100   do_crc32_1 (1, 2);
21101 }
21102
21103 static void
21104 do_vjcvt (void)
21105 {
21106   constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
21107               _(BAD_FPU));
21108   neon_check_type (2, NS_FD, N_S32, N_F64);
21109   do_vfp_sp_dp_cvt ();
21110   do_vfp_cond_or_thumb ();
21111 }
21112
21113 \f
21114 /* Overall per-instruction processing.  */
21115
21116 /* We need to be able to fix up arbitrary expressions in some statements.
21117    This is so that we can handle symbols that are an arbitrary distance from
21118    the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
21119    which returns part of an address in a form which will be valid for
21120    a data instruction.  We do this by pushing the expression into a symbol
21121    in the expr_section, and creating a fix for that.  */
21122
21123 static void
21124 fix_new_arm (fragS *       frag,
21125              int           where,
21126              short int     size,
21127              expressionS * exp,
21128              int           pc_rel,
21129              int           reloc)
21130 {
21131   fixS *           new_fix;
21132
21133   switch (exp->X_op)
21134     {
21135     case O_constant:
21136       if (pc_rel)
21137         {
21138           /* Create an absolute valued symbol, so we have something to
21139              refer to in the object file.  Unfortunately for us, gas's
21140              generic expression parsing will already have folded out
21141              any use of .set foo/.type foo %function that may have
21142              been used to set type information of the target location,
21143              that's being specified symbolically.  We have to presume
21144              the user knows what they are doing.  */
21145           char name[16 + 8];
21146           symbolS *symbol;
21147
21148           sprintf (name, "*ABS*0x%lx", (unsigned long)exp->X_add_number);
21149
21150           symbol = symbol_find_or_make (name);
21151           S_SET_SEGMENT (symbol, absolute_section);
21152           symbol_set_frag (symbol, &zero_address_frag);
21153           S_SET_VALUE (symbol, exp->X_add_number);
21154           exp->X_op = O_symbol;
21155           exp->X_add_symbol = symbol;
21156           exp->X_add_number = 0;
21157         }
21158       /* FALLTHROUGH */
21159     case O_symbol:
21160     case O_add:
21161     case O_subtract:
21162       new_fix = fix_new_exp (frag, where, size, exp, pc_rel,
21163                              (enum bfd_reloc_code_real) reloc);
21164       break;
21165
21166     default:
21167       new_fix = (fixS *) fix_new (frag, where, size, make_expr_symbol (exp), 0,
21168                                   pc_rel, (enum bfd_reloc_code_real) reloc);
21169       break;
21170     }
21171
21172   /* Mark whether the fix is to a THUMB instruction, or an ARM
21173      instruction.  */
21174   new_fix->tc_fix_data = thumb_mode;
21175 }
21176
21177 /* Create a frg for an instruction requiring relaxation.  */
21178 static void
21179 output_relax_insn (void)
21180 {
21181   char * to;
21182   symbolS *sym;
21183   int offset;
21184
21185   /* The size of the instruction is unknown, so tie the debug info to the
21186      start of the instruction.  */
21187   dwarf2_emit_insn (0);
21188
21189   switch (inst.relocs[0].exp.X_op)
21190     {
21191     case O_symbol:
21192       sym = inst.relocs[0].exp.X_add_symbol;
21193       offset = inst.relocs[0].exp.X_add_number;
21194       break;
21195     case O_constant:
21196       sym = NULL;
21197       offset = inst.relocs[0].exp.X_add_number;
21198       break;
21199     default:
21200       sym = make_expr_symbol (&inst.relocs[0].exp);
21201       offset = 0;
21202       break;
21203   }
21204   to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
21205                  inst.relax, sym, offset, NULL/*offset, opcode*/);
21206   md_number_to_chars (to, inst.instruction, THUMB_SIZE);
21207 }
21208
21209 /* Write a 32-bit thumb instruction to buf.  */
21210 static void
21211 put_thumb32_insn (char * buf, unsigned long insn)
21212 {
21213   md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
21214   md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
21215 }
21216
21217 static void
21218 output_inst (const char * str)
21219 {
21220   char * to = NULL;
21221
21222   if (inst.error)
21223     {
21224       as_bad ("%s -- `%s'", inst.error, str);
21225       return;
21226     }
21227   if (inst.relax)
21228     {
21229       output_relax_insn ();
21230       return;
21231     }
21232   if (inst.size == 0)
21233     return;
21234
21235   to = frag_more (inst.size);
21236   /* PR 9814: Record the thumb mode into the current frag so that we know
21237      what type of NOP padding to use, if necessary.  We override any previous
21238      setting so that if the mode has changed then the NOPS that we use will
21239      match the encoding of the last instruction in the frag.  */
21240   frag_now->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
21241
21242   if (thumb_mode && (inst.size > THUMB_SIZE))
21243     {
21244       gas_assert (inst.size == (2 * THUMB_SIZE));
21245       put_thumb32_insn (to, inst.instruction);
21246     }
21247   else if (inst.size > INSN_SIZE)
21248     {
21249       gas_assert (inst.size == (2 * INSN_SIZE));
21250       md_number_to_chars (to, inst.instruction, INSN_SIZE);
21251       md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
21252     }
21253   else
21254     md_number_to_chars (to, inst.instruction, inst.size);
21255
21256   int r;
21257   for (r = 0; r < ARM_IT_MAX_RELOCS; r++)
21258     {
21259       if (inst.relocs[r].type != BFD_RELOC_UNUSED)
21260         fix_new_arm (frag_now, to - frag_now->fr_literal,
21261                      inst.size, & inst.relocs[r].exp, inst.relocs[r].pc_rel,
21262                      inst.relocs[r].type);
21263     }
21264
21265   dwarf2_emit_insn (inst.size);
21266 }
21267
21268 static char *
21269 output_it_inst (int cond, int mask, char * to)
21270 {
21271   unsigned long instruction = 0xbf00;
21272
21273   mask &= 0xf;
21274   instruction |= mask;
21275   instruction |= cond << 4;
21276
21277   if (to == NULL)
21278     {
21279       to = frag_more (2);
21280 #ifdef OBJ_ELF
21281       dwarf2_emit_insn (2);
21282 #endif
21283     }
21284
21285   md_number_to_chars (to, instruction, 2);
21286
21287   return to;
21288 }
21289
21290 /* Tag values used in struct asm_opcode's tag field.  */
21291 enum opcode_tag
21292 {
21293   OT_unconditional,     /* Instruction cannot be conditionalized.
21294                            The ARM condition field is still 0xE.  */
21295   OT_unconditionalF,    /* Instruction cannot be conditionalized
21296                            and carries 0xF in its ARM condition field.  */
21297   OT_csuffix,           /* Instruction takes a conditional suffix.  */
21298   OT_csuffixF,          /* Some forms of the instruction take a scalar
21299                            conditional suffix, others place 0xF where the
21300                            condition field would be, others take a vector
21301                            conditional suffix.  */
21302   OT_cinfix3,           /* Instruction takes a conditional infix,
21303                            beginning at character index 3.  (In
21304                            unified mode, it becomes a suffix.)  */
21305   OT_cinfix3_deprecated, /* The same as OT_cinfix3.  This is used for
21306                             tsts, cmps, cmns, and teqs. */
21307   OT_cinfix3_legacy,    /* Legacy instruction takes a conditional infix at
21308                            character index 3, even in unified mode.  Used for
21309                            legacy instructions where suffix and infix forms
21310                            may be ambiguous.  */
21311   OT_csuf_or_in3,       /* Instruction takes either a conditional
21312                            suffix or an infix at character index 3.  */
21313   OT_odd_infix_unc,     /* This is the unconditional variant of an
21314                            instruction that takes a conditional infix
21315                            at an unusual position.  In unified mode,
21316                            this variant will accept a suffix.  */
21317   OT_odd_infix_0        /* Values greater than or equal to OT_odd_infix_0
21318                            are the conditional variants of instructions that
21319                            take conditional infixes in unusual positions.
21320                            The infix appears at character index
21321                            (tag - OT_odd_infix_0).  These are not accepted
21322                            in unified mode.  */
21323 };
21324
21325 /* Subroutine of md_assemble, responsible for looking up the primary
21326    opcode from the mnemonic the user wrote.  STR points to the
21327    beginning of the mnemonic.
21328
21329    This is not simply a hash table lookup, because of conditional
21330    variants.  Most instructions have conditional variants, which are
21331    expressed with a _conditional affix_ to the mnemonic.  If we were
21332    to encode each conditional variant as a literal string in the opcode
21333    table, it would have approximately 20,000 entries.
21334
21335    Most mnemonics take this affix as a suffix, and in unified syntax,
21336    'most' is upgraded to 'all'.  However, in the divided syntax, some
21337    instructions take the affix as an infix, notably the s-variants of
21338    the arithmetic instructions.  Of those instructions, all but six
21339    have the infix appear after the third character of the mnemonic.
21340
21341    Accordingly, the algorithm for looking up primary opcodes given
21342    an identifier is:
21343
21344    1. Look up the identifier in the opcode table.
21345       If we find a match, go to step U.
21346
21347    2. Look up the last two characters of the identifier in the
21348       conditions table.  If we find a match, look up the first N-2
21349       characters of the identifier in the opcode table.  If we
21350       find a match, go to step CE.
21351
21352    3. Look up the fourth and fifth characters of the identifier in
21353       the conditions table.  If we find a match, extract those
21354       characters from the identifier, and look up the remaining
21355       characters in the opcode table.  If we find a match, go
21356       to step CM.
21357
21358    4. Fail.
21359
21360    U. Examine the tag field of the opcode structure, in case this is
21361       one of the six instructions with its conditional infix in an
21362       unusual place.  If it is, the tag tells us where to find the
21363       infix; look it up in the conditions table and set inst.cond
21364       accordingly.  Otherwise, this is an unconditional instruction.
21365       Again set inst.cond accordingly.  Return the opcode structure.
21366
21367   CE. Examine the tag field to make sure this is an instruction that
21368       should receive a conditional suffix.  If it is not, fail.
21369       Otherwise, set inst.cond from the suffix we already looked up,
21370       and return the opcode structure.
21371
21372   CM. Examine the tag field to make sure this is an instruction that
21373       should receive a conditional infix after the third character.
21374       If it is not, fail.  Otherwise, undo the edits to the current
21375       line of input and proceed as for case CE.  */
21376
21377 static const struct asm_opcode *
21378 opcode_lookup (char **str)
21379 {
21380   char *end, *base;
21381   char *affix;
21382   const struct asm_opcode *opcode;
21383   const struct asm_cond *cond;
21384   char save[2];
21385
21386   /* Scan up to the end of the mnemonic, which must end in white space,
21387      '.' (in unified mode, or for Neon/VFP instructions), or end of string.  */
21388   for (base = end = *str; *end != '\0'; end++)
21389     if (*end == ' ' || *end == '.')
21390       break;
21391
21392   if (end == base)
21393     return NULL;
21394
21395   /* Handle a possible width suffix and/or Neon type suffix.  */
21396   if (end[0] == '.')
21397     {
21398       int offset = 2;
21399
21400       /* The .w and .n suffixes are only valid if the unified syntax is in
21401          use.  */
21402       if (unified_syntax && end[1] == 'w')
21403         inst.size_req = 4;
21404       else if (unified_syntax && end[1] == 'n')
21405         inst.size_req = 2;
21406       else
21407         offset = 0;
21408
21409       inst.vectype.elems = 0;
21410
21411       *str = end + offset;
21412
21413       if (end[offset] == '.')
21414         {
21415           /* See if we have a Neon type suffix (possible in either unified or
21416              non-unified ARM syntax mode).  */
21417           if (parse_neon_type (&inst.vectype, str) == FAIL)
21418             return NULL;
21419         }
21420       else if (end[offset] != '\0' && end[offset] != ' ')
21421         return NULL;
21422     }
21423   else
21424     *str = end;
21425
21426   /* Look for unaffixed or special-case affixed mnemonic.  */
21427   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
21428                                                     end - base);
21429   if (opcode)
21430     {
21431       /* step U */
21432       if (opcode->tag < OT_odd_infix_0)
21433         {
21434           inst.cond = COND_ALWAYS;
21435           return opcode;
21436         }
21437
21438       if (warn_on_deprecated && unified_syntax)
21439         as_tsktsk (_("conditional infixes are deprecated in unified syntax"));
21440       affix = base + (opcode->tag - OT_odd_infix_0);
21441       cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
21442       gas_assert (cond);
21443
21444       inst.cond = cond->value;
21445       return opcode;
21446     }
21447  if (ARM_CPU_HAS_FEATURE (cpu_variant, mve_ext))
21448    {
21449     /* Cannot have a conditional suffix on a mnemonic of less than a character.
21450      */
21451     if (end - base < 2)
21452       return NULL;
21453      affix = end - 1;
21454      cond = (const struct asm_cond *) hash_find_n (arm_vcond_hsh, affix, 1);
21455      opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
21456                                                       affix - base);
21457      /* If this opcode can not be vector predicated then don't accept it with a
21458         vector predication code.  */
21459      if (opcode && !opcode->mayBeVecPred)
21460        opcode = NULL;
21461    }
21462   if (!opcode || !cond)
21463     {
21464       /* Cannot have a conditional suffix on a mnemonic of less than two
21465          characters.  */
21466       if (end - base < 3)
21467         return NULL;
21468
21469       /* Look for suffixed mnemonic.  */
21470       affix = end - 2;
21471       cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
21472       opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
21473                                                         affix - base);
21474     }
21475
21476   if (opcode && cond)
21477     {
21478       /* step CE */
21479       switch (opcode->tag)
21480         {
21481         case OT_cinfix3_legacy:
21482           /* Ignore conditional suffixes matched on infix only mnemonics.  */
21483           break;
21484
21485         case OT_cinfix3:
21486         case OT_cinfix3_deprecated:
21487         case OT_odd_infix_unc:
21488           if (!unified_syntax)
21489             return NULL;
21490           /* Fall through.  */
21491
21492         case OT_csuffix:
21493         case OT_csuffixF:
21494         case OT_csuf_or_in3:
21495           inst.cond = cond->value;
21496           return opcode;
21497
21498         case OT_unconditional:
21499         case OT_unconditionalF:
21500           if (thumb_mode)
21501             inst.cond = cond->value;
21502           else
21503             {
21504               /* Delayed diagnostic.  */
21505               inst.error = BAD_COND;
21506               inst.cond = COND_ALWAYS;
21507             }
21508           return opcode;
21509
21510         default:
21511           return NULL;
21512         }
21513     }
21514
21515   /* Cannot have a usual-position infix on a mnemonic of less than
21516      six characters (five would be a suffix).  */
21517   if (end - base < 6)
21518     return NULL;
21519
21520   /* Look for infixed mnemonic in the usual position.  */
21521   affix = base + 3;
21522   cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
21523   if (!cond)
21524     return NULL;
21525
21526   memcpy (save, affix, 2);
21527   memmove (affix, affix + 2, (end - affix) - 2);
21528   opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
21529                                                     (end - base) - 2);
21530   memmove (affix + 2, affix, (end - affix) - 2);
21531   memcpy (affix, save, 2);
21532
21533   if (opcode
21534       && (opcode->tag == OT_cinfix3
21535           || opcode->tag == OT_cinfix3_deprecated
21536           || opcode->tag == OT_csuf_or_in3
21537           || opcode->tag == OT_cinfix3_legacy))
21538     {
21539       /* Step CM.  */
21540       if (warn_on_deprecated && unified_syntax
21541           && (opcode->tag == OT_cinfix3
21542               || opcode->tag == OT_cinfix3_deprecated))
21543         as_tsktsk (_("conditional infixes are deprecated in unified syntax"));
21544
21545       inst.cond = cond->value;
21546       return opcode;
21547     }
21548
21549   return NULL;
21550 }
21551
21552 /* This function generates an initial IT instruction, leaving its block
21553    virtually open for the new instructions. Eventually,
21554    the mask will be updated by now_pred_add_mask () each time
21555    a new instruction needs to be included in the IT block.
21556    Finally, the block is closed with close_automatic_it_block ().
21557    The block closure can be requested either from md_assemble (),
21558    a tencode (), or due to a label hook.  */
21559
21560 static void
21561 new_automatic_it_block (int cond)
21562 {
21563   now_pred.state = AUTOMATIC_PRED_BLOCK;
21564   now_pred.mask = 0x18;
21565   now_pred.cc = cond;
21566   now_pred.block_length = 1;
21567   mapping_state (MAP_THUMB);
21568   now_pred.insn = output_it_inst (cond, now_pred.mask, NULL);
21569   now_pred.warn_deprecated = FALSE;
21570   now_pred.insn_cond = TRUE;
21571 }
21572
21573 /* Close an automatic IT block.
21574    See comments in new_automatic_it_block ().  */
21575
21576 static void
21577 close_automatic_it_block (void)
21578 {
21579   now_pred.mask = 0x10;
21580   now_pred.block_length = 0;
21581 }
21582
21583 /* Update the mask of the current automatically-generated IT
21584    instruction. See comments in new_automatic_it_block ().  */
21585
21586 static void
21587 now_pred_add_mask (int cond)
21588 {
21589 #define CLEAR_BIT(value, nbit)  ((value) & ~(1 << (nbit)))
21590 #define SET_BIT_VALUE(value, bitvalue, nbit)  (CLEAR_BIT (value, nbit) \
21591                                               | ((bitvalue) << (nbit)))
21592   const int resulting_bit = (cond & 1);
21593
21594   now_pred.mask &= 0xf;
21595   now_pred.mask = SET_BIT_VALUE (now_pred.mask,
21596                                    resulting_bit,
21597                                   (5 - now_pred.block_length));
21598   now_pred.mask = SET_BIT_VALUE (now_pred.mask,
21599                                    1,
21600                                    ((5 - now_pred.block_length) - 1));
21601   output_it_inst (now_pred.cc, now_pred.mask, now_pred.insn);
21602
21603 #undef CLEAR_BIT
21604 #undef SET_BIT_VALUE
21605 }
21606
21607 /* The IT blocks handling machinery is accessed through the these functions:
21608      it_fsm_pre_encode ()               from md_assemble ()
21609      set_pred_insn_type ()              optional, from the tencode functions
21610      set_pred_insn_type_last ()         ditto
21611      in_pred_block ()                   ditto
21612      it_fsm_post_encode ()              from md_assemble ()
21613      force_automatic_it_block_close ()  from label handling functions
21614
21615    Rationale:
21616      1) md_assemble () calls it_fsm_pre_encode () before calling tencode (),
21617         initializing the IT insn type with a generic initial value depending
21618         on the inst.condition.
21619      2) During the tencode function, two things may happen:
21620         a) The tencode function overrides the IT insn type by
21621            calling either set_pred_insn_type (type) or
21622            set_pred_insn_type_last ().
21623         b) The tencode function queries the IT block state by
21624            calling in_pred_block () (i.e. to determine narrow/not narrow mode).
21625
21626         Both set_pred_insn_type and in_pred_block run the internal FSM state
21627         handling function (handle_pred_state), because: a) setting the IT insn
21628         type may incur in an invalid state (exiting the function),
21629         and b) querying the state requires the FSM to be updated.
21630         Specifically we want to avoid creating an IT block for conditional
21631         branches, so it_fsm_pre_encode is actually a guess and we can't
21632         determine whether an IT block is required until the tencode () routine
21633         has decided what type of instruction this actually it.
21634         Because of this, if set_pred_insn_type and in_pred_block have to be
21635         used, set_pred_insn_type has to be called first.
21636
21637         set_pred_insn_type_last () is a wrapper of set_pred_insn_type (type),
21638         that determines the insn IT type depending on the inst.cond code.
21639         When a tencode () routine encodes an instruction that can be
21640         either outside an IT block, or, in the case of being inside, has to be
21641         the last one, set_pred_insn_type_last () will determine the proper
21642         IT instruction type based on the inst.cond code. Otherwise,
21643         set_pred_insn_type can be called for overriding that logic or
21644         for covering other cases.
21645
21646         Calling handle_pred_state () may not transition the IT block state to
21647         OUTSIDE_PRED_BLOCK immediately, since the (current) state could be
21648         still queried. Instead, if the FSM determines that the state should
21649         be transitioned to OUTSIDE_PRED_BLOCK, a flag is marked to be closed
21650         after the tencode () function: that's what it_fsm_post_encode () does.
21651
21652         Since in_pred_block () calls the state handling function to get an
21653         updated state, an error may occur (due to invalid insns combination).
21654         In that case, inst.error is set.
21655         Therefore, inst.error has to be checked after the execution of
21656         the tencode () routine.
21657
21658      3) Back in md_assemble(), it_fsm_post_encode () is called to commit
21659         any pending state change (if any) that didn't take place in
21660         handle_pred_state () as explained above.  */
21661
21662 static void
21663 it_fsm_pre_encode (void)
21664 {
21665   if (inst.cond != COND_ALWAYS)
21666     inst.pred_insn_type =  INSIDE_IT_INSN;
21667   else
21668     inst.pred_insn_type = OUTSIDE_PRED_INSN;
21669
21670   now_pred.state_handled = 0;
21671 }
21672
21673 /* IT state FSM handling function.  */
21674 /* MVE instructions and non-MVE instructions are handled differently because of
21675    the introduction of VPT blocks.
21676    Specifications say that any non-MVE instruction inside a VPT block is
21677    UNPREDICTABLE, with the exception of the BKPT instruction.  Whereas most MVE
21678    instructions are deemed to be UNPREDICTABLE if inside an IT block.  For the
21679    few exceptions we have MVE_UNPREDICABLE_INSN.
21680    The error messages provided depending on the different combinations possible
21681    are described in the cases below:
21682    For 'most' MVE instructions:
21683    1) In an IT block, with an IT code: syntax error
21684    2) In an IT block, with a VPT code: error: must be in a VPT block
21685    3) In an IT block, with no code: warning: UNPREDICTABLE
21686    4) In a VPT block, with an IT code: syntax error
21687    5) In a VPT block, with a VPT code: OK!
21688    6) In a VPT block, with no code: error: missing code
21689    7) Outside a pred block, with an IT code: error: syntax error
21690    8) Outside a pred block, with a VPT code: error: should be in a VPT block
21691    9) Outside a pred block, with no code: OK!
21692    For non-MVE instructions:
21693    10) In an IT block, with an IT code: OK!
21694    11) In an IT block, with a VPT code: syntax error
21695    12) In an IT block, with no code: error: missing code
21696    13) In a VPT block, with an IT code: error: should be in an IT block
21697    14) In a VPT block, with a VPT code: syntax error
21698    15) In a VPT block, with no code: UNPREDICTABLE
21699    16) Outside a pred block, with an IT code: error: should be in an IT block
21700    17) Outside a pred block, with a VPT code: syntax error
21701    18) Outside a pred block, with no code: OK!
21702  */
21703
21704
21705 static int
21706 handle_pred_state (void)
21707 {
21708   now_pred.state_handled = 1;
21709   now_pred.insn_cond = FALSE;
21710
21711   switch (now_pred.state)
21712     {
21713     case OUTSIDE_PRED_BLOCK:
21714       switch (inst.pred_insn_type)
21715         {
21716         case MVE_UNPREDICABLE_INSN:
21717         case MVE_OUTSIDE_PRED_INSN:
21718           if (inst.cond < COND_ALWAYS)
21719             {
21720               /* Case 7: Outside a pred block, with an IT code: error: syntax
21721                  error.  */
21722               inst.error = BAD_SYNTAX;
21723               return FAIL;
21724             }
21725           /* Case 9:  Outside a pred block, with no code: OK!  */
21726           break;
21727         case OUTSIDE_PRED_INSN:
21728           if (inst.cond > COND_ALWAYS)
21729             {
21730               /* Case 17:  Outside a pred block, with a VPT code: syntax error.
21731                */
21732               inst.error = BAD_SYNTAX;
21733               return FAIL;
21734             }
21735           /* Case 18: Outside a pred block, with no code: OK!  */
21736           break;
21737
21738         case INSIDE_VPT_INSN:
21739           /* Case 8: Outside a pred block, with a VPT code: error: should be in
21740              a VPT block.  */
21741           inst.error = BAD_OUT_VPT;
21742           return FAIL;
21743
21744         case INSIDE_IT_INSN:
21745         case INSIDE_IT_LAST_INSN:
21746           if (inst.cond < COND_ALWAYS)
21747             {
21748               /* Case 16: Outside a pred block, with an IT code: error: should
21749                  be in an IT block.  */
21750               if (thumb_mode == 0)
21751                 {
21752                   if (unified_syntax
21753                       && !(implicit_it_mode & IMPLICIT_IT_MODE_ARM))
21754                     as_tsktsk (_("Warning: conditional outside an IT block"\
21755                                  " for Thumb."));
21756                 }
21757               else
21758                 {
21759                   if ((implicit_it_mode & IMPLICIT_IT_MODE_THUMB)
21760                       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2))
21761                     {
21762                       /* Automatically generate the IT instruction.  */
21763                       new_automatic_it_block (inst.cond);
21764                       if (inst.pred_insn_type == INSIDE_IT_LAST_INSN)
21765                         close_automatic_it_block ();
21766                     }
21767                   else
21768                     {
21769                       inst.error = BAD_OUT_IT;
21770                       return FAIL;
21771                     }
21772                 }
21773               break;
21774             }
21775           else if (inst.cond > COND_ALWAYS)
21776             {
21777               /* Case 17: Outside a pred block, with a VPT code: syntax error.
21778                */
21779               inst.error = BAD_SYNTAX;
21780               return FAIL;
21781             }
21782           else
21783             gas_assert (0);
21784         case IF_INSIDE_IT_LAST_INSN:
21785         case NEUTRAL_IT_INSN:
21786           break;
21787
21788         case VPT_INSN:
21789           if (inst.cond != COND_ALWAYS)
21790             first_error (BAD_SYNTAX);
21791           now_pred.state = MANUAL_PRED_BLOCK;
21792           now_pred.block_length = 0;
21793           now_pred.type = VECTOR_PRED;
21794           now_pred.cc = 0;
21795           break;
21796         case IT_INSN:
21797           now_pred.state = MANUAL_PRED_BLOCK;
21798           now_pred.block_length = 0;
21799           now_pred.type = SCALAR_PRED;
21800           break;
21801         }
21802       break;
21803
21804     case AUTOMATIC_PRED_BLOCK:
21805       /* Three things may happen now:
21806          a) We should increment current it block size;
21807          b) We should close current it block (closing insn or 4 insns);
21808          c) We should close current it block and start a new one (due
21809          to incompatible conditions or
21810          4 insns-length block reached).  */
21811
21812       switch (inst.pred_insn_type)
21813         {
21814         case INSIDE_VPT_INSN:
21815         case VPT_INSN:
21816         case MVE_UNPREDICABLE_INSN:
21817         case MVE_OUTSIDE_PRED_INSN:
21818           gas_assert (0);
21819         case OUTSIDE_PRED_INSN:
21820           /* The closure of the block shall happen immediately,
21821              so any in_pred_block () call reports the block as closed.  */
21822           force_automatic_it_block_close ();
21823           break;
21824
21825         case INSIDE_IT_INSN:
21826         case INSIDE_IT_LAST_INSN:
21827         case IF_INSIDE_IT_LAST_INSN:
21828           now_pred.block_length++;
21829
21830           if (now_pred.block_length > 4
21831               || !now_pred_compatible (inst.cond))
21832             {
21833               force_automatic_it_block_close ();
21834               if (inst.pred_insn_type != IF_INSIDE_IT_LAST_INSN)
21835                 new_automatic_it_block (inst.cond);
21836             }
21837           else
21838             {
21839               now_pred.insn_cond = TRUE;
21840               now_pred_add_mask (inst.cond);
21841             }
21842
21843           if (now_pred.state == AUTOMATIC_PRED_BLOCK
21844               && (inst.pred_insn_type == INSIDE_IT_LAST_INSN
21845                   || inst.pred_insn_type == IF_INSIDE_IT_LAST_INSN))
21846             close_automatic_it_block ();
21847           break;
21848
21849         case NEUTRAL_IT_INSN:
21850           now_pred.block_length++;
21851           now_pred.insn_cond = TRUE;
21852
21853           if (now_pred.block_length > 4)
21854             force_automatic_it_block_close ();
21855           else
21856             now_pred_add_mask (now_pred.cc & 1);
21857           break;
21858
21859         case IT_INSN:
21860           close_automatic_it_block ();
21861           now_pred.state = MANUAL_PRED_BLOCK;
21862           break;
21863         }
21864       break;
21865
21866     case MANUAL_PRED_BLOCK:
21867       {
21868         int cond, is_last;
21869         if (now_pred.type == SCALAR_PRED)
21870           {
21871             /* Check conditional suffixes.  */
21872             cond = now_pred.cc ^ ((now_pred.mask >> 4) & 1) ^ 1;
21873             now_pred.mask <<= 1;
21874             now_pred.mask &= 0x1f;
21875             is_last = (now_pred.mask == 0x10);
21876           }
21877         else
21878           {
21879             now_pred.cc ^= (now_pred.mask >> 4);
21880             cond = now_pred.cc + 0xf;
21881             now_pred.mask <<= 1;
21882             now_pred.mask &= 0x1f;
21883             is_last = now_pred.mask == 0x10;
21884           }
21885         now_pred.insn_cond = TRUE;
21886
21887         switch (inst.pred_insn_type)
21888           {
21889           case OUTSIDE_PRED_INSN:
21890             if (now_pred.type == SCALAR_PRED)
21891               {
21892                 if (inst.cond == COND_ALWAYS)
21893                   {
21894                     /* Case 12: In an IT block, with no code: error: missing
21895                        code.  */
21896                     inst.error = BAD_NOT_IT;
21897                     return FAIL;
21898                   }
21899                 else if (inst.cond > COND_ALWAYS)
21900                   {
21901                     /* Case 11: In an IT block, with a VPT code: syntax error.
21902                      */
21903                     inst.error = BAD_SYNTAX;
21904                     return FAIL;
21905                   }
21906                 else if (thumb_mode)
21907                   {
21908                     /* This is for some special cases where a non-MVE
21909                        instruction is not allowed in an IT block, such as cbz,
21910                        but are put into one with a condition code.
21911                        You could argue this should be a syntax error, but we
21912                        gave the 'not allowed in IT block' diagnostic in the
21913                        past so we will keep doing so.  */
21914                     inst.error = BAD_NOT_IT;
21915                     return FAIL;
21916                   }
21917                 break;
21918               }
21919             else
21920               {
21921                 /* Case 15: In a VPT block, with no code: UNPREDICTABLE.  */
21922                 as_tsktsk (MVE_NOT_VPT);
21923                 return SUCCESS;
21924               }
21925           case MVE_OUTSIDE_PRED_INSN:
21926             if (now_pred.type == SCALAR_PRED)
21927               {
21928                 if (inst.cond == COND_ALWAYS)
21929                   {
21930                     /* Case 3: In an IT block, with no code: warning:
21931                        UNPREDICTABLE.  */
21932                     as_tsktsk (MVE_NOT_IT);
21933                     return SUCCESS;
21934                   }
21935                 else if (inst.cond < COND_ALWAYS)
21936                   {
21937                     /* Case 1: In an IT block, with an IT code: syntax error.
21938                      */
21939                     inst.error = BAD_SYNTAX;
21940                     return FAIL;
21941                   }
21942                 else
21943                   gas_assert (0);
21944               }
21945             else
21946               {
21947                 if (inst.cond < COND_ALWAYS)
21948                   {
21949                     /* Case 4: In a VPT block, with an IT code: syntax error.
21950                      */
21951                     inst.error = BAD_SYNTAX;
21952                     return FAIL;
21953                   }
21954                 else if (inst.cond == COND_ALWAYS)
21955                   {
21956                     /* Case 6: In a VPT block, with no code: error: missing
21957                        code.  */
21958                     inst.error = BAD_NOT_VPT;
21959                     return FAIL;
21960                   }
21961                 else
21962                   {
21963                     gas_assert (0);
21964                   }
21965               }
21966           case MVE_UNPREDICABLE_INSN:
21967             as_tsktsk (now_pred.type == SCALAR_PRED ? MVE_NOT_IT : MVE_NOT_VPT);
21968             return SUCCESS;
21969           case INSIDE_IT_INSN:
21970             if (inst.cond > COND_ALWAYS)
21971               {
21972                 /* Case 11: In an IT block, with a VPT code: syntax error.  */
21973                 /* Case 14: In a VPT block, with a VPT code: syntax error.  */
21974                 inst.error = BAD_SYNTAX;
21975                 return FAIL;
21976               }
21977             else if (now_pred.type == SCALAR_PRED)
21978               {
21979                 /* Case 10: In an IT block, with an IT code: OK!  */
21980                 if (cond != inst.cond)
21981                   {
21982                     inst.error = now_pred.type == SCALAR_PRED ? BAD_IT_COND :
21983                       BAD_VPT_COND;
21984                     return FAIL;
21985                   }
21986               }
21987             else
21988               {
21989                 /* Case 13: In a VPT block, with an IT code: error: should be
21990                    in an IT block.  */
21991                 inst.error = BAD_OUT_IT;
21992                 return FAIL;
21993               }
21994             break;
21995
21996           case INSIDE_VPT_INSN:
21997             if (now_pred.type == SCALAR_PRED)
21998               {
21999                 /* Case 2: In an IT block, with a VPT code: error: must be in a
22000                    VPT block.  */
22001                 inst.error = BAD_OUT_VPT;
22002                 return FAIL;
22003               }
22004             /* Case 5:  In a VPT block, with a VPT code: OK!  */
22005             else if (cond != inst.cond)
22006               {
22007                 inst.error = BAD_VPT_COND;
22008                 return FAIL;
22009               }
22010             break;
22011           case INSIDE_IT_LAST_INSN:
22012           case IF_INSIDE_IT_LAST_INSN:
22013             if (now_pred.type == VECTOR_PRED || inst.cond > COND_ALWAYS)
22014               {
22015                 /* Case 4: In a VPT block, with an IT code: syntax error.  */
22016                 /* Case 11: In an IT block, with a VPT code: syntax error.  */
22017                 inst.error = BAD_SYNTAX;
22018                 return FAIL;
22019               }
22020             else if (cond != inst.cond)
22021               {
22022                 inst.error = BAD_IT_COND;
22023                 return FAIL;
22024               }
22025             if (!is_last)
22026               {
22027                 inst.error = BAD_BRANCH;
22028                 return FAIL;
22029               }
22030             break;
22031
22032           case NEUTRAL_IT_INSN:
22033             /* The BKPT instruction is unconditional even in a IT or VPT
22034                block.  */
22035             break;
22036
22037           case IT_INSN:
22038             if (now_pred.type == SCALAR_PRED)
22039               {
22040                 inst.error = BAD_IT_IT;
22041                 return FAIL;
22042               }
22043             /* fall through.  */
22044           case VPT_INSN:
22045             if (inst.cond == COND_ALWAYS)
22046               {
22047                 /* Executing a VPT/VPST instruction inside an IT block or a
22048                    VPT/VPST/IT instruction inside a VPT block is UNPREDICTABLE.
22049                  */
22050                 if (now_pred.type == SCALAR_PRED)
22051                   as_tsktsk (MVE_NOT_IT);
22052                 else
22053                   as_tsktsk (MVE_NOT_VPT);
22054                 return SUCCESS;
22055               }
22056             else
22057               {
22058                 /* VPT/VPST do not accept condition codes.  */
22059                 inst.error = BAD_SYNTAX;
22060                 return FAIL;
22061               }
22062           }
22063         }
22064       break;
22065     }
22066
22067   return SUCCESS;
22068 }
22069
22070 struct depr_insn_mask
22071 {
22072   unsigned long pattern;
22073   unsigned long mask;
22074   const char* description;
22075 };
22076
22077 /* List of 16-bit instruction patterns deprecated in an IT block in
22078    ARMv8.  */
22079 static const struct depr_insn_mask depr_it_insns[] = {
22080   { 0xc000, 0xc000, N_("Short branches, Undefined, SVC, LDM/STM") },
22081   { 0xb000, 0xb000, N_("Miscellaneous 16-bit instructions") },
22082   { 0xa000, 0xb800, N_("ADR") },
22083   { 0x4800, 0xf800, N_("Literal loads") },
22084   { 0x4478, 0xf478, N_("Hi-register ADD, MOV, CMP, BX, BLX using pc") },
22085   { 0x4487, 0xfc87, N_("Hi-register ADD, MOV, CMP using pc") },
22086   /* NOTE: 0x00dd is not the real encoding, instead, it is the 'tvalue'
22087      field in asm_opcode. 'tvalue' is used at the stage this check happen.  */
22088   { 0x00dd, 0x7fff, N_("ADD/SUB sp, sp #imm") },
22089   { 0, 0, NULL }
22090 };
22091
22092 static void
22093 it_fsm_post_encode (void)
22094 {
22095   int is_last;
22096
22097   if (!now_pred.state_handled)
22098     handle_pred_state ();
22099
22100   if (now_pred.insn_cond
22101       && !now_pred.warn_deprecated
22102       && warn_on_deprecated
22103       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8)
22104       && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_m))
22105     {
22106       if (inst.instruction >= 0x10000)
22107         {
22108           as_tsktsk (_("IT blocks containing 32-bit Thumb instructions are "
22109                      "performance deprecated in ARMv8-A and ARMv8-R"));
22110           now_pred.warn_deprecated = TRUE;
22111         }
22112       else
22113         {
22114           const struct depr_insn_mask *p = depr_it_insns;
22115
22116           while (p->mask != 0)
22117             {
22118               if ((inst.instruction & p->mask) == p->pattern)
22119                 {
22120                   as_tsktsk (_("IT blocks containing 16-bit Thumb "
22121                                "instructions of the following class are "
22122                                "performance deprecated in ARMv8-A and "
22123                                "ARMv8-R: %s"), p->description);
22124                   now_pred.warn_deprecated = TRUE;
22125                   break;
22126                 }
22127
22128               ++p;
22129             }
22130         }
22131
22132       if (now_pred.block_length > 1)
22133         {
22134           as_tsktsk (_("IT blocks containing more than one conditional "
22135                      "instruction are performance deprecated in ARMv8-A and "
22136                      "ARMv8-R"));
22137           now_pred.warn_deprecated = TRUE;
22138         }
22139     }
22140
22141     is_last = (now_pred.mask == 0x10);
22142     if (is_last)
22143       {
22144         now_pred.state = OUTSIDE_PRED_BLOCK;
22145         now_pred.mask = 0;
22146       }
22147 }
22148
22149 static void
22150 force_automatic_it_block_close (void)
22151 {
22152   if (now_pred.state == AUTOMATIC_PRED_BLOCK)
22153     {
22154       close_automatic_it_block ();
22155       now_pred.state = OUTSIDE_PRED_BLOCK;
22156       now_pred.mask = 0;
22157     }
22158 }
22159
22160 static int
22161 in_pred_block (void)
22162 {
22163   if (!now_pred.state_handled)
22164     handle_pred_state ();
22165
22166   return now_pred.state != OUTSIDE_PRED_BLOCK;
22167 }
22168
22169 /* Whether OPCODE only has T32 encoding.  Since this function is only used by
22170    t32_insn_ok, OPCODE enabled by v6t2 extension bit do not need to be listed
22171    here, hence the "known" in the function name.  */
22172
22173 static bfd_boolean
22174 known_t32_only_insn (const struct asm_opcode *opcode)
22175 {
22176   /* Original Thumb-1 wide instruction.  */
22177   if (opcode->tencode == do_t_blx
22178       || opcode->tencode == do_t_branch23
22179       || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
22180       || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier))
22181     return TRUE;
22182
22183   /* Wide-only instruction added to ARMv8-M Baseline.  */
22184   if (ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_v8m_m_only)
22185       || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_atomics)
22186       || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_v6t2_v8m)
22187       || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_div))
22188     return TRUE;
22189
22190   return FALSE;
22191 }
22192
22193 /* Whether wide instruction variant can be used if available for a valid OPCODE
22194    in ARCH.  */
22195
22196 static bfd_boolean
22197 t32_insn_ok (arm_feature_set arch, const struct asm_opcode *opcode)
22198 {
22199   if (known_t32_only_insn (opcode))
22200     return TRUE;
22201
22202   /* Instruction with narrow and wide encoding added to ARMv8-M.  Availability
22203      of variant T3 of B.W is checked in do_t_branch.  */
22204   if (ARM_CPU_HAS_FEATURE (arch, arm_ext_v8m)
22205       && opcode->tencode == do_t_branch)
22206     return TRUE;
22207
22208   /* MOV accepts T1/T3 encodings under Baseline, T3 encoding is 32bit.  */
22209   if (ARM_CPU_HAS_FEATURE (arch, arm_ext_v8m)
22210       && opcode->tencode == do_t_mov_cmp
22211       /* Make sure CMP instruction is not affected.  */
22212       && opcode->aencode == do_mov)
22213     return TRUE;
22214
22215   /* Wide instruction variants of all instructions with narrow *and* wide
22216      variants become available with ARMv6t2.  Other opcodes are either
22217      narrow-only or wide-only and are thus available if OPCODE is valid.  */
22218   if (ARM_CPU_HAS_FEATURE (arch, arm_ext_v6t2))
22219     return TRUE;
22220
22221   /* OPCODE with narrow only instruction variant or wide variant not
22222      available.  */
22223   return FALSE;
22224 }
22225
22226 void
22227 md_assemble (char *str)
22228 {
22229   char *p = str;
22230   const struct asm_opcode * opcode;
22231
22232   /* Align the previous label if needed.  */
22233   if (last_label_seen != NULL)
22234     {
22235       symbol_set_frag (last_label_seen, frag_now);
22236       S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
22237       S_SET_SEGMENT (last_label_seen, now_seg);
22238     }
22239
22240   memset (&inst, '\0', sizeof (inst));
22241   int r;
22242   for (r = 0; r < ARM_IT_MAX_RELOCS; r++)
22243     inst.relocs[r].type = BFD_RELOC_UNUSED;
22244
22245   opcode = opcode_lookup (&p);
22246   if (!opcode)
22247     {
22248       /* It wasn't an instruction, but it might be a register alias of
22249          the form alias .req reg, or a Neon .dn/.qn directive.  */
22250       if (! create_register_alias (str, p)
22251           && ! create_neon_reg_alias (str, p))
22252         as_bad (_("bad instruction `%s'"), str);
22253
22254       return;
22255     }
22256
22257   if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
22258     as_tsktsk (_("s suffix on comparison instruction is deprecated"));
22259
22260   /* The value which unconditional instructions should have in place of the
22261      condition field.  */
22262   inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
22263
22264   if (thumb_mode)
22265     {
22266       arm_feature_set variant;
22267
22268       variant = cpu_variant;
22269       /* Only allow coprocessor instructions on Thumb-2 capable devices.  */
22270       if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
22271         ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
22272       /* Check that this instruction is supported for this CPU.  */
22273       if (!opcode->tvariant
22274           || (thumb_mode == 1
22275               && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
22276         {
22277           if (opcode->tencode == do_t_swi)
22278             as_bad (_("SVC is not permitted on this architecture"));
22279           else
22280             as_bad (_("selected processor does not support `%s' in Thumb mode"), str);
22281           return;
22282         }
22283       if (inst.cond != COND_ALWAYS && !unified_syntax
22284           && opcode->tencode != do_t_branch)
22285         {
22286           as_bad (_("Thumb does not support conditional execution"));
22287           return;
22288         }
22289
22290       /* Two things are addressed here:
22291          1) Implicit require narrow instructions on Thumb-1.
22292             This avoids relaxation accidentally introducing Thumb-2
22293             instructions.
22294          2) Reject wide instructions in non Thumb-2 cores.
22295
22296          Only instructions with narrow and wide variants need to be handled
22297          but selecting all non wide-only instructions is easier.  */
22298       if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2)
22299           && !t32_insn_ok (variant, opcode))
22300         {
22301           if (inst.size_req == 0)
22302             inst.size_req = 2;
22303           else if (inst.size_req == 4)
22304             {
22305               if (ARM_CPU_HAS_FEATURE (variant, arm_ext_v8m))
22306                 as_bad (_("selected processor does not support 32bit wide "
22307                           "variant of instruction `%s'"), str);
22308               else
22309                 as_bad (_("selected processor does not support `%s' in "
22310                           "Thumb-2 mode"), str);
22311               return;
22312             }
22313         }
22314
22315       inst.instruction = opcode->tvalue;
22316
22317       if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
22318         {
22319           /* Prepare the pred_insn_type for those encodings that don't set
22320              it.  */
22321           it_fsm_pre_encode ();
22322
22323           opcode->tencode ();
22324
22325           it_fsm_post_encode ();
22326         }
22327
22328       if (!(inst.error || inst.relax))
22329         {
22330           gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
22331           inst.size = (inst.instruction > 0xffff ? 4 : 2);
22332           if (inst.size_req && inst.size_req != inst.size)
22333             {
22334               as_bad (_("cannot honor width suffix -- `%s'"), str);
22335               return;
22336             }
22337         }
22338
22339       /* Something has gone badly wrong if we try to relax a fixed size
22340          instruction.  */
22341       gas_assert (inst.size_req == 0 || !inst.relax);
22342
22343       ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
22344                               *opcode->tvariant);
22345       /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
22346          set those bits when Thumb-2 32-bit instructions are seen.  The impact
22347          of relaxable instructions will be considered later after we finish all
22348          relaxation.  */
22349       if (ARM_FEATURE_CORE_EQUAL (cpu_variant, arm_arch_any))
22350         variant = arm_arch_none;
22351       else
22352         variant = cpu_variant;
22353       if (inst.size == 4 && !t32_insn_ok (variant, opcode))
22354         ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
22355                                 arm_ext_v6t2);
22356
22357       check_neon_suffixes;
22358
22359       if (!inst.error)
22360         {
22361           mapping_state (MAP_THUMB);
22362         }
22363     }
22364   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
22365     {
22366       bfd_boolean is_bx;
22367
22368       /* bx is allowed on v5 cores, and sometimes on v4 cores.  */
22369       is_bx = (opcode->aencode == do_bx);
22370
22371       /* Check that this instruction is supported for this CPU.  */
22372       if (!(is_bx && fix_v4bx)
22373           && !(opcode->avariant &&
22374                ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
22375         {
22376           as_bad (_("selected processor does not support `%s' in ARM mode"), str);
22377           return;
22378         }
22379       if (inst.size_req)
22380         {
22381           as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
22382           return;
22383         }
22384
22385       inst.instruction = opcode->avalue;
22386       if (opcode->tag == OT_unconditionalF)
22387         inst.instruction |= 0xFU << 28;
22388       else
22389         inst.instruction |= inst.cond << 28;
22390       inst.size = INSN_SIZE;
22391       if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
22392         {
22393           it_fsm_pre_encode ();
22394           opcode->aencode ();
22395           it_fsm_post_encode ();
22396         }
22397       /* Arm mode bx is marked as both v4T and v5 because it's still required
22398          on a hypothetical non-thumb v5 core.  */
22399       if (is_bx)
22400         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
22401       else
22402         ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
22403                                 *opcode->avariant);
22404
22405       check_neon_suffixes;
22406
22407       if (!inst.error)
22408         {
22409           mapping_state (MAP_ARM);
22410         }
22411     }
22412   else
22413     {
22414       as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
22415                 "-- `%s'"), str);
22416       return;
22417     }
22418   output_inst (str);
22419 }
22420
22421 static void
22422 check_pred_blocks_finished (void)
22423 {
22424 #ifdef OBJ_ELF
22425   asection *sect;
22426
22427   for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
22428     if (seg_info (sect)->tc_segment_info_data.current_pred.state
22429         == MANUAL_PRED_BLOCK)
22430       {
22431         if (now_pred.type == SCALAR_PRED)
22432           as_warn (_("section '%s' finished with an open IT block."),
22433                    sect->name);
22434         else
22435           as_warn (_("section '%s' finished with an open VPT/VPST block."),
22436                    sect->name);
22437       }
22438 #else
22439   if (now_pred.state == MANUAL_PRED_BLOCK)
22440     {
22441       if (now_pred.type == SCALAR_PRED)
22442        as_warn (_("file finished with an open IT block."));
22443       else
22444         as_warn (_("file finished with an open VPT/VPST block."));
22445     }
22446 #endif
22447 }
22448
22449 /* Various frobbings of labels and their addresses.  */
22450
22451 void
22452 arm_start_line_hook (void)
22453 {
22454   last_label_seen = NULL;
22455 }
22456
22457 void
22458 arm_frob_label (symbolS * sym)
22459 {
22460   last_label_seen = sym;
22461
22462   ARM_SET_THUMB (sym, thumb_mode);
22463
22464 #if defined OBJ_COFF || defined OBJ_ELF
22465   ARM_SET_INTERWORK (sym, support_interwork);
22466 #endif
22467
22468   force_automatic_it_block_close ();
22469
22470   /* Note - do not allow local symbols (.Lxxx) to be labelled
22471      as Thumb functions.  This is because these labels, whilst
22472      they exist inside Thumb code, are not the entry points for
22473      possible ARM->Thumb calls.  Also, these labels can be used
22474      as part of a computed goto or switch statement.  eg gcc
22475      can generate code that looks like this:
22476
22477                 ldr  r2, [pc, .Laaa]
22478                 lsl  r3, r3, #2
22479                 ldr  r2, [r3, r2]
22480                 mov  pc, r2
22481
22482        .Lbbb:  .word .Lxxx
22483        .Lccc:  .word .Lyyy
22484        ..etc...
22485        .Laaa:   .word Lbbb
22486
22487      The first instruction loads the address of the jump table.
22488      The second instruction converts a table index into a byte offset.
22489      The third instruction gets the jump address out of the table.
22490      The fourth instruction performs the jump.
22491
22492      If the address stored at .Laaa is that of a symbol which has the
22493      Thumb_Func bit set, then the linker will arrange for this address
22494      to have the bottom bit set, which in turn would mean that the
22495      address computation performed by the third instruction would end
22496      up with the bottom bit set.  Since the ARM is capable of unaligned
22497      word loads, the instruction would then load the incorrect address
22498      out of the jump table, and chaos would ensue.  */
22499   if (label_is_thumb_function_name
22500       && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
22501       && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
22502     {
22503       /* When the address of a Thumb function is taken the bottom
22504          bit of that address should be set.  This will allow
22505          interworking between Arm and Thumb functions to work
22506          correctly.  */
22507
22508       THUMB_SET_FUNC (sym, 1);
22509
22510       label_is_thumb_function_name = FALSE;
22511     }
22512
22513   dwarf2_emit_label (sym);
22514 }
22515
22516 bfd_boolean
22517 arm_data_in_code (void)
22518 {
22519   if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
22520     {
22521       *input_line_pointer = '/';
22522       input_line_pointer += 5;
22523       *input_line_pointer = 0;
22524       return TRUE;
22525     }
22526
22527   return FALSE;
22528 }
22529
22530 char *
22531 arm_canonicalize_symbol_name (char * name)
22532 {
22533   int len;
22534
22535   if (thumb_mode && (len = strlen (name)) > 5
22536       && streq (name + len - 5, "/data"))
22537     *(name + len - 5) = 0;
22538
22539   return name;
22540 }
22541 \f
22542 /* Table of all register names defined by default.  The user can
22543    define additional names with .req.  Note that all register names
22544    should appear in both upper and lowercase variants.  Some registers
22545    also have mixed-case names.  */
22546
22547 #define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
22548 #define REGNUM(p,n,t) REGDEF(p##n, n, t)
22549 #define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
22550 #define REGSET(p,t) \
22551   REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
22552   REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
22553   REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
22554   REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
22555 #define REGSETH(p,t) \
22556   REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
22557   REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
22558   REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
22559   REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
22560 #define REGSET2(p,t) \
22561   REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
22562   REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
22563   REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
22564   REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
22565 #define SPLRBANK(base,bank,t) \
22566   REGDEF(lr_##bank, 768|((base+0)<<16), t), \
22567   REGDEF(sp_##bank, 768|((base+1)<<16), t), \
22568   REGDEF(spsr_##bank, 768|(base<<16)|SPSR_BIT, t), \
22569   REGDEF(LR_##bank, 768|((base+0)<<16), t), \
22570   REGDEF(SP_##bank, 768|((base+1)<<16), t), \
22571   REGDEF(SPSR_##bank, 768|(base<<16)|SPSR_BIT, t)
22572
22573 static const struct reg_entry reg_names[] =
22574 {
22575   /* ARM integer registers.  */
22576   REGSET(r, RN), REGSET(R, RN),
22577
22578   /* ATPCS synonyms.  */
22579   REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
22580   REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
22581   REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
22582
22583   REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
22584   REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
22585   REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
22586
22587   /* Well-known aliases.  */
22588   REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
22589   REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
22590
22591   REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
22592   REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
22593
22594   /* Defining the new Zero register from ARMv8.1-M.  */
22595   REGDEF(zr,15,ZR),
22596   REGDEF(ZR,15,ZR),
22597
22598   /* Coprocessor numbers.  */
22599   REGSET(p, CP), REGSET(P, CP),
22600
22601   /* Coprocessor register numbers.  The "cr" variants are for backward
22602      compatibility.  */
22603   REGSET(c,  CN), REGSET(C, CN),
22604   REGSET(cr, CN), REGSET(CR, CN),
22605
22606   /* ARM banked registers.  */
22607   REGDEF(R8_usr,512|(0<<16),RNB), REGDEF(r8_usr,512|(0<<16),RNB),
22608   REGDEF(R9_usr,512|(1<<16),RNB), REGDEF(r9_usr,512|(1<<16),RNB),
22609   REGDEF(R10_usr,512|(2<<16),RNB), REGDEF(r10_usr,512|(2<<16),RNB),
22610   REGDEF(R11_usr,512|(3<<16),RNB), REGDEF(r11_usr,512|(3<<16),RNB),
22611   REGDEF(R12_usr,512|(4<<16),RNB), REGDEF(r12_usr,512|(4<<16),RNB),
22612   REGDEF(SP_usr,512|(5<<16),RNB), REGDEF(sp_usr,512|(5<<16),RNB),
22613   REGDEF(LR_usr,512|(6<<16),RNB), REGDEF(lr_usr,512|(6<<16),RNB),
22614
22615   REGDEF(R8_fiq,512|(8<<16),RNB), REGDEF(r8_fiq,512|(8<<16),RNB),
22616   REGDEF(R9_fiq,512|(9<<16),RNB), REGDEF(r9_fiq,512|(9<<16),RNB),
22617   REGDEF(R10_fiq,512|(10<<16),RNB), REGDEF(r10_fiq,512|(10<<16),RNB),
22618   REGDEF(R11_fiq,512|(11<<16),RNB), REGDEF(r11_fiq,512|(11<<16),RNB),
22619   REGDEF(R12_fiq,512|(12<<16),RNB), REGDEF(r12_fiq,512|(12<<16),RNB),
22620   REGDEF(SP_fiq,512|(13<<16),RNB), REGDEF(sp_fiq,512|(13<<16),RNB),
22621   REGDEF(LR_fiq,512|(14<<16),RNB), REGDEF(lr_fiq,512|(14<<16),RNB),
22622   REGDEF(SPSR_fiq,512|(14<<16)|SPSR_BIT,RNB), REGDEF(spsr_fiq,512|(14<<16)|SPSR_BIT,RNB),
22623
22624   SPLRBANK(0,IRQ,RNB), SPLRBANK(0,irq,RNB),
22625   SPLRBANK(2,SVC,RNB), SPLRBANK(2,svc,RNB),
22626   SPLRBANK(4,ABT,RNB), SPLRBANK(4,abt,RNB),
22627   SPLRBANK(6,UND,RNB), SPLRBANK(6,und,RNB),
22628   SPLRBANK(12,MON,RNB), SPLRBANK(12,mon,RNB),
22629   REGDEF(elr_hyp,768|(14<<16),RNB), REGDEF(ELR_hyp,768|(14<<16),RNB),
22630   REGDEF(sp_hyp,768|(15<<16),RNB), REGDEF(SP_hyp,768|(15<<16),RNB),
22631   REGDEF(spsr_hyp,768|(14<<16)|SPSR_BIT,RNB),
22632   REGDEF(SPSR_hyp,768|(14<<16)|SPSR_BIT,RNB),
22633
22634   /* FPA registers.  */
22635   REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
22636   REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
22637
22638   REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
22639   REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
22640
22641   /* VFP SP registers.  */
22642   REGSET(s,VFS),  REGSET(S,VFS),
22643   REGSETH(s,VFS), REGSETH(S,VFS),
22644
22645   /* VFP DP Registers.  */
22646   REGSET(d,VFD),  REGSET(D,VFD),
22647   /* Extra Neon DP registers.  */
22648   REGSETH(d,VFD), REGSETH(D,VFD),
22649
22650   /* Neon QP registers.  */
22651   REGSET2(q,NQ),  REGSET2(Q,NQ),
22652
22653   /* VFP control registers.  */
22654   REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
22655   REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
22656   REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
22657   REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
22658   REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
22659   REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
22660   REGDEF(mvfr2,5,VFC), REGDEF(MVFR2,5,VFC),
22661
22662   /* Maverick DSP coprocessor registers.  */
22663   REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
22664   REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
22665
22666   REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
22667   REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
22668   REGDEF(dspsc,0,DSPSC),
22669
22670   REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
22671   REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
22672   REGDEF(DSPSC,0,DSPSC),
22673
22674   /* iWMMXt data registers - p0, c0-15.  */
22675   REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
22676
22677   /* iWMMXt control registers - p1, c0-3.  */
22678   REGDEF(wcid,  0,MMXWC),  REGDEF(wCID,  0,MMXWC),  REGDEF(WCID,  0,MMXWC),
22679   REGDEF(wcon,  1,MMXWC),  REGDEF(wCon,  1,MMXWC),  REGDEF(WCON,  1,MMXWC),
22680   REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
22681   REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
22682
22683   /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
22684   REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
22685   REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
22686   REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
22687   REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
22688
22689   /* XScale accumulator registers.  */
22690   REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
22691 };
22692 #undef REGDEF
22693 #undef REGNUM
22694 #undef REGSET
22695
22696 /* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
22697    within psr_required_here.  */
22698 static const struct asm_psr psrs[] =
22699 {
22700   /* Backward compatibility notation.  Note that "all" is no longer
22701      truly all possible PSR bits.  */
22702   {"all",  PSR_c | PSR_f},
22703   {"flg",  PSR_f},
22704   {"ctl",  PSR_c},
22705
22706   /* Individual flags.  */
22707   {"f",    PSR_f},
22708   {"c",    PSR_c},
22709   {"x",    PSR_x},
22710   {"s",    PSR_s},
22711
22712   /* Combinations of flags.  */
22713   {"fs",   PSR_f | PSR_s},
22714   {"fx",   PSR_f | PSR_x},
22715   {"fc",   PSR_f | PSR_c},
22716   {"sf",   PSR_s | PSR_f},
22717   {"sx",   PSR_s | PSR_x},
22718   {"sc",   PSR_s | PSR_c},
22719   {"xf",   PSR_x | PSR_f},
22720   {"xs",   PSR_x | PSR_s},
22721   {"xc",   PSR_x | PSR_c},
22722   {"cf",   PSR_c | PSR_f},
22723   {"cs",   PSR_c | PSR_s},
22724   {"cx",   PSR_c | PSR_x},
22725   {"fsx",  PSR_f | PSR_s | PSR_x},
22726   {"fsc",  PSR_f | PSR_s | PSR_c},
22727   {"fxs",  PSR_f | PSR_x | PSR_s},
22728   {"fxc",  PSR_f | PSR_x | PSR_c},
22729   {"fcs",  PSR_f | PSR_c | PSR_s},
22730   {"fcx",  PSR_f | PSR_c | PSR_x},
22731   {"sfx",  PSR_s | PSR_f | PSR_x},
22732   {"sfc",  PSR_s | PSR_f | PSR_c},
22733   {"sxf",  PSR_s | PSR_x | PSR_f},
22734   {"sxc",  PSR_s | PSR_x | PSR_c},
22735   {"scf",  PSR_s | PSR_c | PSR_f},
22736   {"scx",  PSR_s | PSR_c | PSR_x},
22737   {"xfs",  PSR_x | PSR_f | PSR_s},
22738   {"xfc",  PSR_x | PSR_f | PSR_c},
22739   {"xsf",  PSR_x | PSR_s | PSR_f},
22740   {"xsc",  PSR_x | PSR_s | PSR_c},
22741   {"xcf",  PSR_x | PSR_c | PSR_f},
22742   {"xcs",  PSR_x | PSR_c | PSR_s},
22743   {"cfs",  PSR_c | PSR_f | PSR_s},
22744   {"cfx",  PSR_c | PSR_f | PSR_x},
22745   {"csf",  PSR_c | PSR_s | PSR_f},
22746   {"csx",  PSR_c | PSR_s | PSR_x},
22747   {"cxf",  PSR_c | PSR_x | PSR_f},
22748   {"cxs",  PSR_c | PSR_x | PSR_s},
22749   {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
22750   {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
22751   {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
22752   {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
22753   {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
22754   {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
22755   {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
22756   {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
22757   {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
22758   {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
22759   {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
22760   {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
22761   {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
22762   {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
22763   {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
22764   {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
22765   {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
22766   {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
22767   {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
22768   {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
22769   {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
22770   {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
22771   {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
22772   {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
22773 };
22774
22775 /* Table of V7M psr names.  */
22776 static const struct asm_psr v7m_psrs[] =
22777 {
22778   {"apsr",         0x0 }, {"APSR",         0x0 },
22779   {"iapsr",        0x1 }, {"IAPSR",        0x1 },
22780   {"eapsr",        0x2 }, {"EAPSR",        0x2 },
22781   {"psr",          0x3 }, {"PSR",          0x3 },
22782   {"xpsr",         0x3 }, {"XPSR",         0x3 }, {"xPSR",        3 },
22783   {"ipsr",         0x5 }, {"IPSR",         0x5 },
22784   {"epsr",         0x6 }, {"EPSR",         0x6 },
22785   {"iepsr",        0x7 }, {"IEPSR",        0x7 },
22786   {"msp",          0x8 }, {"MSP",          0x8 },
22787   {"psp",          0x9 }, {"PSP",          0x9 },
22788   {"msplim",       0xa }, {"MSPLIM",       0xa },
22789   {"psplim",       0xb }, {"PSPLIM",       0xb },
22790   {"primask",      0x10}, {"PRIMASK",      0x10},
22791   {"basepri",      0x11}, {"BASEPRI",      0x11},
22792   {"basepri_max",  0x12}, {"BASEPRI_MAX",  0x12},
22793   {"faultmask",    0x13}, {"FAULTMASK",    0x13},
22794   {"control",      0x14}, {"CONTROL",      0x14},
22795   {"msp_ns",       0x88}, {"MSP_NS",       0x88},
22796   {"psp_ns",       0x89}, {"PSP_NS",       0x89},
22797   {"msplim_ns",    0x8a}, {"MSPLIM_NS",    0x8a},
22798   {"psplim_ns",    0x8b}, {"PSPLIM_NS",    0x8b},
22799   {"primask_ns",   0x90}, {"PRIMASK_NS",   0x90},
22800   {"basepri_ns",   0x91}, {"BASEPRI_NS",   0x91},
22801   {"faultmask_ns", 0x93}, {"FAULTMASK_NS", 0x93},
22802   {"control_ns",   0x94}, {"CONTROL_NS",   0x94},
22803   {"sp_ns",        0x98}, {"SP_NS",        0x98 }
22804 };
22805
22806 /* Table of all shift-in-operand names.  */
22807 static const struct asm_shift_name shift_names [] =
22808 {
22809   { "asl", SHIFT_LSL },  { "ASL", SHIFT_LSL },
22810   { "lsl", SHIFT_LSL },  { "LSL", SHIFT_LSL },
22811   { "lsr", SHIFT_LSR },  { "LSR", SHIFT_LSR },
22812   { "asr", SHIFT_ASR },  { "ASR", SHIFT_ASR },
22813   { "ror", SHIFT_ROR },  { "ROR", SHIFT_ROR },
22814   { "rrx", SHIFT_RRX },  { "RRX", SHIFT_RRX },
22815   { "uxtw", SHIFT_UXTW}, { "UXTW", SHIFT_UXTW}
22816 };
22817
22818 /* Table of all explicit relocation names.  */
22819 #ifdef OBJ_ELF
22820 static struct reloc_entry reloc_names[] =
22821 {
22822   { "got",     BFD_RELOC_ARM_GOT32   },  { "GOT",     BFD_RELOC_ARM_GOT32   },
22823   { "gotoff",  BFD_RELOC_ARM_GOTOFF  },  { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
22824   { "plt",     BFD_RELOC_ARM_PLT32   },  { "PLT",     BFD_RELOC_ARM_PLT32   },
22825   { "target1", BFD_RELOC_ARM_TARGET1 },  { "TARGET1", BFD_RELOC_ARM_TARGET1 },
22826   { "target2", BFD_RELOC_ARM_TARGET2 },  { "TARGET2", BFD_RELOC_ARM_TARGET2 },
22827   { "sbrel",   BFD_RELOC_ARM_SBREL32 },  { "SBREL",   BFD_RELOC_ARM_SBREL32 },
22828   { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
22829   { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
22830   { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
22831   { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
22832   { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32},
22833   { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL},
22834   { "tlsdesc", BFD_RELOC_ARM_TLS_GOTDESC},
22835         { "TLSDESC", BFD_RELOC_ARM_TLS_GOTDESC},
22836   { "tlscall", BFD_RELOC_ARM_TLS_CALL},
22837         { "TLSCALL", BFD_RELOC_ARM_TLS_CALL},
22838   { "tlsdescseq", BFD_RELOC_ARM_TLS_DESCSEQ},
22839         { "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ},
22840   { "gotfuncdesc", BFD_RELOC_ARM_GOTFUNCDESC },
22841         { "GOTFUNCDESC", BFD_RELOC_ARM_GOTFUNCDESC },
22842   { "gotofffuncdesc", BFD_RELOC_ARM_GOTOFFFUNCDESC },
22843         { "GOTOFFFUNCDESC", BFD_RELOC_ARM_GOTOFFFUNCDESC },
22844   { "funcdesc", BFD_RELOC_ARM_FUNCDESC },
22845         { "FUNCDESC", BFD_RELOC_ARM_FUNCDESC },
22846    { "tlsgd_fdpic", BFD_RELOC_ARM_TLS_GD32_FDPIC },      { "TLSGD_FDPIC", BFD_RELOC_ARM_TLS_GD32_FDPIC },
22847    { "tlsldm_fdpic", BFD_RELOC_ARM_TLS_LDM32_FDPIC },    { "TLSLDM_FDPIC", BFD_RELOC_ARM_TLS_LDM32_FDPIC },
22848    { "gottpoff_fdpic", BFD_RELOC_ARM_TLS_IE32_FDPIC },   { "GOTTPOFF_FDIC", BFD_RELOC_ARM_TLS_IE32_FDPIC },
22849 };
22850 #endif
22851
22852 /* Table of all conditional affixes.  */
22853 static const struct asm_cond conds[] =
22854 {
22855   {"eq", 0x0},
22856   {"ne", 0x1},
22857   {"cs", 0x2}, {"hs", 0x2},
22858   {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
22859   {"mi", 0x4},
22860   {"pl", 0x5},
22861   {"vs", 0x6},
22862   {"vc", 0x7},
22863   {"hi", 0x8},
22864   {"ls", 0x9},
22865   {"ge", 0xa},
22866   {"lt", 0xb},
22867   {"gt", 0xc},
22868   {"le", 0xd},
22869   {"al", 0xe}
22870 };
22871 static const struct asm_cond vconds[] =
22872 {
22873     {"t", 0xf},
22874     {"e", 0x10}
22875 };
22876
22877 #define UL_BARRIER(L,U,CODE,FEAT) \
22878   { L, CODE, ARM_FEATURE_CORE_LOW (FEAT) }, \
22879   { U, CODE, ARM_FEATURE_CORE_LOW (FEAT) }
22880
22881 static struct asm_barrier_opt barrier_opt_names[] =
22882 {
22883   UL_BARRIER ("sy",     "SY",    0xf, ARM_EXT_BARRIER),
22884   UL_BARRIER ("st",     "ST",    0xe, ARM_EXT_BARRIER),
22885   UL_BARRIER ("ld",     "LD",    0xd, ARM_EXT_V8),
22886   UL_BARRIER ("ish",    "ISH",   0xb, ARM_EXT_BARRIER),
22887   UL_BARRIER ("sh",     "SH",    0xb, ARM_EXT_BARRIER),
22888   UL_BARRIER ("ishst",  "ISHST", 0xa, ARM_EXT_BARRIER),
22889   UL_BARRIER ("shst",   "SHST",  0xa, ARM_EXT_BARRIER),
22890   UL_BARRIER ("ishld",  "ISHLD", 0x9, ARM_EXT_V8),
22891   UL_BARRIER ("un",     "UN",    0x7, ARM_EXT_BARRIER),
22892   UL_BARRIER ("nsh",    "NSH",   0x7, ARM_EXT_BARRIER),
22893   UL_BARRIER ("unst",   "UNST",  0x6, ARM_EXT_BARRIER),
22894   UL_BARRIER ("nshst",  "NSHST", 0x6, ARM_EXT_BARRIER),
22895   UL_BARRIER ("nshld",  "NSHLD", 0x5, ARM_EXT_V8),
22896   UL_BARRIER ("osh",    "OSH",   0x3, ARM_EXT_BARRIER),
22897   UL_BARRIER ("oshst",  "OSHST", 0x2, ARM_EXT_BARRIER),
22898   UL_BARRIER ("oshld",  "OSHLD", 0x1, ARM_EXT_V8)
22899 };
22900
22901 #undef UL_BARRIER
22902
22903 /* Table of ARM-format instructions.    */
22904
22905 /* Macros for gluing together operand strings.  N.B. In all cases
22906    other than OPS0, the trailing OP_stop comes from default
22907    zero-initialization of the unspecified elements of the array.  */
22908 #define OPS0()            { OP_stop, }
22909 #define OPS1(a)           { OP_##a, }
22910 #define OPS2(a,b)         { OP_##a,OP_##b, }
22911 #define OPS3(a,b,c)       { OP_##a,OP_##b,OP_##c, }
22912 #define OPS4(a,b,c,d)     { OP_##a,OP_##b,OP_##c,OP_##d, }
22913 #define OPS5(a,b,c,d,e)   { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
22914 #define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
22915
22916 /* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
22917    This is useful when mixing operands for ARM and THUMB, i.e. using the
22918    MIX_ARM_THUMB_OPERANDS macro.
22919    In order to use these macros, prefix the number of operands with _
22920    e.g. _3.  */
22921 #define OPS_1(a)           { a, }
22922 #define OPS_2(a,b)         { a,b, }
22923 #define OPS_3(a,b,c)       { a,b,c, }
22924 #define OPS_4(a,b,c,d)     { a,b,c,d, }
22925 #define OPS_5(a,b,c,d,e)   { a,b,c,d,e, }
22926 #define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
22927
22928 /* These macros abstract out the exact format of the mnemonic table and
22929    save some repeated characters.  */
22930
22931 /* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
22932 #define TxCE(mnem, op, top, nops, ops, ae, te) \
22933   { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
22934     THUMB_VARIANT, do_##ae, do_##te, 0 }
22935
22936 /* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
22937    a T_MNEM_xyz enumerator.  */
22938 #define TCE(mnem, aop, top, nops, ops, ae, te) \
22939       TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
22940 #define tCE(mnem, aop, top, nops, ops, ae, te) \
22941       TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
22942
22943 /* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
22944    infix after the third character.  */
22945 #define TxC3(mnem, op, top, nops, ops, ae, te) \
22946   { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
22947     THUMB_VARIANT, do_##ae, do_##te, 0 }
22948 #define TxC3w(mnem, op, top, nops, ops, ae, te) \
22949   { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
22950     THUMB_VARIANT, do_##ae, do_##te, 0 }
22951 #define TC3(mnem, aop, top, nops, ops, ae, te) \
22952       TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
22953 #define TC3w(mnem, aop, top, nops, ops, ae, te) \
22954       TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
22955 #define tC3(mnem, aop, top, nops, ops, ae, te) \
22956       TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
22957 #define tC3w(mnem, aop, top, nops, ops, ae, te) \
22958       TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
22959
22960 /* Mnemonic that cannot be conditionalized.  The ARM condition-code
22961    field is still 0xE.  Many of the Thumb variants can be executed
22962    conditionally, so this is checked separately.  */
22963 #define TUE(mnem, op, top, nops, ops, ae, te)                           \
22964   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
22965     THUMB_VARIANT, do_##ae, do_##te, 0 }
22966
22967 /* Same as TUE but the encoding function for ARM and Thumb modes is the same.
22968    Used by mnemonics that have very minimal differences in the encoding for
22969    ARM and Thumb variants and can be handled in a common function.  */
22970 #define TUEc(mnem, op, top, nops, ops, en) \
22971   { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
22972     THUMB_VARIANT, do_##en, do_##en, 0 }
22973
22974 /* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
22975    condition code field.  */
22976 #define TUF(mnem, op, top, nops, ops, ae, te)                           \
22977   { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
22978     THUMB_VARIANT, do_##ae, do_##te, 0 }
22979
22980 /* ARM-only variants of all the above.  */
22981 #define CE(mnem,  op, nops, ops, ae)    \
22982   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL, 0 }
22983
22984 #define C3(mnem, op, nops, ops, ae)     \
22985   { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL, 0 }
22986
22987 /* Thumb-only variants of TCE and TUE.  */
22988 #define ToC(mnem, top, nops, ops, te) \
22989   { mnem, OPS##nops ops, OT_csuffix, 0x0, 0x##top, 0, THUMB_VARIANT, NULL, \
22990     do_##te, 0 }
22991
22992 #define ToU(mnem, top, nops, ops, te) \
22993   { mnem, OPS##nops ops, OT_unconditional, 0x0, 0x##top, 0, THUMB_VARIANT, \
22994     NULL, do_##te, 0 }
22995
22996 /* T_MNEM_xyz enumerator variants of ToC.  */
22997 #define toC(mnem, top, nops, ops, te) \
22998   { mnem, OPS##nops ops, OT_csuffix, 0x0, T_MNEM##top, 0, THUMB_VARIANT, NULL, \
22999     do_##te, 0 }
23000
23001 /* T_MNEM_xyz enumerator variants of ToU.  */
23002 #define toU(mnem, top, nops, ops, te) \
23003   { mnem, OPS##nops ops, OT_unconditional, 0x0, T_MNEM##top, 0, THUMB_VARIANT, \
23004     NULL, do_##te, 0 }
23005
23006 /* Legacy mnemonics that always have conditional infix after the third
23007    character.  */
23008 #define CL(mnem, op, nops, ops, ae)     \
23009   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
23010     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL, 0 }
23011
23012 /* Coprocessor instructions.  Isomorphic between Arm and Thumb-2.  */
23013 #define cCE(mnem,  op, nops, ops, ae)   \
23014   { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae, 0 }
23015
23016 /* mov instructions that are shared between coprocessor and MVE.  */
23017 #define mcCE(mnem,  op, nops, ops, ae)  \
23018   { #mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, THUMB_VARIANT, do_##ae, do_##ae, 0 }
23019
23020 /* Legacy coprocessor instructions where conditional infix and conditional
23021    suffix are ambiguous.  For consistency this includes all FPA instructions,
23022    not just the potentially ambiguous ones.  */
23023 #define cCL(mnem, op, nops, ops, ae)    \
23024   { mnem, OPS##nops ops, OT_cinfix3_legacy, \
23025     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae, 0 }
23026
23027 /* Coprocessor, takes either a suffix or a position-3 infix
23028    (for an FPA corner case). */
23029 #define C3E(mnem, op, nops, ops, ae) \
23030   { mnem, OPS##nops ops, OT_csuf_or_in3, \
23031     0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae, 0 }
23032
23033 #define xCM_(m1, m2, m3, op, nops, ops, ae)     \
23034   { m1 #m2 m3, OPS##nops ops, \
23035     sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
23036     0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL, 0 }
23037
23038 #define CM(m1, m2, op, nops, ops, ae)   \
23039   xCM_ (m1,   , m2, op, nops, ops, ae), \
23040   xCM_ (m1, eq, m2, op, nops, ops, ae), \
23041   xCM_ (m1, ne, m2, op, nops, ops, ae), \
23042   xCM_ (m1, cs, m2, op, nops, ops, ae), \
23043   xCM_ (m1, hs, m2, op, nops, ops, ae), \
23044   xCM_ (m1, cc, m2, op, nops, ops, ae), \
23045   xCM_ (m1, ul, m2, op, nops, ops, ae), \
23046   xCM_ (m1, lo, m2, op, nops, ops, ae), \
23047   xCM_ (m1, mi, m2, op, nops, ops, ae), \
23048   xCM_ (m1, pl, m2, op, nops, ops, ae), \
23049   xCM_ (m1, vs, m2, op, nops, ops, ae), \
23050   xCM_ (m1, vc, m2, op, nops, ops, ae), \
23051   xCM_ (m1, hi, m2, op, nops, ops, ae), \
23052   xCM_ (m1, ls, m2, op, nops, ops, ae), \
23053   xCM_ (m1, ge, m2, op, nops, ops, ae), \
23054   xCM_ (m1, lt, m2, op, nops, ops, ae), \
23055   xCM_ (m1, gt, m2, op, nops, ops, ae), \
23056   xCM_ (m1, le, m2, op, nops, ops, ae), \
23057   xCM_ (m1, al, m2, op, nops, ops, ae)
23058
23059 #define UE(mnem, op, nops, ops, ae)     \
23060   { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL, 0 }
23061
23062 #define UF(mnem, op, nops, ops, ae)     \
23063   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL, 0 }
23064
23065 /* Neon data-processing. ARM versions are unconditional with cond=0xf.
23066    The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
23067    use the same encoding function for each.  */
23068 #define NUF(mnem, op, nops, ops, enc)                                   \
23069   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op,            \
23070     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc, 0 }
23071
23072 /* Neon data processing, version which indirects through neon_enc_tab for
23073    the various overloaded versions of opcodes.  */
23074 #define nUF(mnem, op, nops, ops, enc)                                   \
23075   { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op,    \
23076     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc, 0 }
23077
23078 /* Neon insn with conditional suffix for the ARM version, non-overloaded
23079    version.  */
23080 #define NCE_tag(mnem, op, nops, ops, enc, tag, mve_p)                           \
23081   { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT,             \
23082     THUMB_VARIANT, do_##enc, do_##enc, mve_p }
23083
23084 #define NCE(mnem, op, nops, ops, enc)                                   \
23085    NCE_tag (mnem, op, nops, ops, enc, OT_csuffix, 0)
23086
23087 #define NCEF(mnem, op, nops, ops, enc)                                  \
23088     NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF, 0)
23089
23090 /* Neon insn with conditional suffix for the ARM version, overloaded types.  */
23091 #define nCE_tag(mnem, op, nops, ops, enc, tag, mve_p)                           \
23092   { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op,          \
23093     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc, mve_p }
23094
23095 #define nCE(mnem, op, nops, ops, enc)                                   \
23096    nCE_tag (mnem, op, nops, ops, enc, OT_csuffix, 0)
23097
23098 #define nCEF(mnem, op, nops, ops, enc)                                  \
23099     nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF, 0)
23100
23101 /*   */
23102 #define mCEF(mnem, op, nops, ops, enc)                          \
23103   { #mnem, OPS##nops ops, OT_csuffixF, M_MNEM##op, M_MNEM##op,  \
23104     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc, 1 }
23105
23106
23107 /* nCEF but for MVE predicated instructions.  */
23108 #define mnCEF(mnem, op, nops, ops, enc)                                 \
23109     nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF, 1)
23110
23111 /* nCE but for MVE predicated instructions.  */
23112 #define mnCE(mnem, op, nops, ops, enc)                                  \
23113    nCE_tag (mnem, op, nops, ops, enc, OT_csuffix, 1)
23114
23115 /* NUF but for potentially MVE predicated instructions.  */
23116 #define MNUF(mnem, op, nops, ops, enc)                                  \
23117   { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op,            \
23118     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc, 1 }
23119
23120 /* nUF but for potentially MVE predicated instructions.  */
23121 #define mnUF(mnem, op, nops, ops, enc)                                  \
23122   { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op,    \
23123     ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc, 1 }
23124
23125 /* ToC but for potentially MVE predicated instructions.  */
23126 #define mToC(mnem, top, nops, ops, te) \
23127   { mnem, OPS##nops ops, OT_csuffix, 0x0, 0x##top, 0, THUMB_VARIANT, NULL, \
23128     do_##te, 1 }
23129
23130 /* NCE but for MVE predicated instructions.  */
23131 #define MNCE(mnem, op, nops, ops, enc)                                  \
23132    NCE_tag (mnem, op, nops, ops, enc, OT_csuffix, 1)
23133
23134 /* NCEF but for MVE predicated instructions.  */
23135 #define MNCEF(mnem, op, nops, ops, enc)                                 \
23136     NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF, 1)
23137 #define do_0 0
23138
23139 static const struct asm_opcode insns[] =
23140 {
23141 #define ARM_VARIANT    & arm_ext_v1 /* Core ARM Instructions.  */
23142 #define THUMB_VARIANT  & arm_ext_v4t
23143  tCE("and",     0000000, _and,     3, (RR, oRR, SH), arit, t_arit3c),
23144  tC3("ands",    0100000, _ands,    3, (RR, oRR, SH), arit, t_arit3c),
23145  tCE("eor",     0200000, _eor,     3, (RR, oRR, SH), arit, t_arit3c),
23146  tC3("eors",    0300000, _eors,    3, (RR, oRR, SH), arit, t_arit3c),
23147  tCE("sub",     0400000, _sub,     3, (RR, oRR, SH), arit, t_add_sub),
23148  tC3("subs",    0500000, _subs,    3, (RR, oRR, SH), arit, t_add_sub),
23149  tCE("add",     0800000, _add,     3, (RR, oRR, SHG), arit, t_add_sub),
23150  tC3("adds",    0900000, _adds,    3, (RR, oRR, SHG), arit, t_add_sub),
23151  tCE("adc",     0a00000, _adc,     3, (RR, oRR, SH), arit, t_arit3c),
23152  tC3("adcs",    0b00000, _adcs,    3, (RR, oRR, SH), arit, t_arit3c),
23153  tCE("sbc",     0c00000, _sbc,     3, (RR, oRR, SH), arit, t_arit3),
23154  tC3("sbcs",    0d00000, _sbcs,    3, (RR, oRR, SH), arit, t_arit3),
23155  tCE("orr",     1800000, _orr,     3, (RR, oRR, SH), arit, t_arit3c),
23156  tC3("orrs",    1900000, _orrs,    3, (RR, oRR, SH), arit, t_arit3c),
23157  tCE("bic",     1c00000, _bic,     3, (RR, oRR, SH), arit, t_arit3),
23158  tC3("bics",    1d00000, _bics,    3, (RR, oRR, SH), arit, t_arit3),
23159
23160  /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
23161     for setting PSR flag bits.  They are obsolete in V6 and do not
23162     have Thumb equivalents. */
23163  tCE("tst",     1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
23164  tC3w("tsts",   1100000, _tst,     2, (RR, SH),      cmp,  t_mvn_tst),
23165   CL("tstp",    110f000,           2, (RR, SH),      cmp),
23166  tCE("cmp",     1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
23167  tC3w("cmps",   1500000, _cmp,     2, (RR, SH),      cmp,  t_mov_cmp),
23168   CL("cmpp",    150f000,           2, (RR, SH),      cmp),
23169  tCE("cmn",     1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
23170  tC3w("cmns",   1700000, _cmn,     2, (RR, SH),      cmp,  t_mvn_tst),
23171   CL("cmnp",    170f000,           2, (RR, SH),      cmp),
23172
23173  tCE("mov",     1a00000, _mov,     2, (RR, SH),      mov,  t_mov_cmp),
23174  tC3("movs",    1b00000, _movs,    2, (RR, SHG),     mov,  t_mov_cmp),
23175  tCE("mvn",     1e00000, _mvn,     2, (RR, SH),      mov,  t_mvn_tst),
23176  tC3("mvns",    1f00000, _mvns,    2, (RR, SH),      mov,  t_mvn_tst),
23177
23178  tCE("ldr",     4100000, _ldr,     2, (RR, ADDRGLDR),ldst, t_ldst),
23179  tC3("ldrb",    4500000, _ldrb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
23180  tCE("str",     4000000, _str,     _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
23181                                                                 OP_RRnpc),
23182                                         OP_ADDRGLDR),ldst, t_ldst),
23183  tC3("strb",    4400000, _strb,    2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
23184
23185  tCE("stm",     8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
23186  tC3("stmia",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
23187  tC3("stmea",   8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
23188  tCE("ldm",     8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
23189  tC3("ldmia",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
23190  tC3("ldmfd",   8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
23191
23192  tCE("b",       a000000, _b,       1, (EXPr),        branch, t_branch),
23193  TCE("bl",      b000000, f000f800, 1, (EXPr),        bl, t_branch23),
23194
23195   /* Pseudo ops.  */
23196  tCE("adr",     28f0000, _adr,     2, (RR, EXP),     adr,  t_adr),
23197   C3(adrl,      28f0000,           2, (RR, EXP),     adrl),
23198  tCE("nop",     1a00000, _nop,     1, (oI255c),      nop,  t_nop),
23199  tCE("udf",     7f000f0, _udf,     1, (oIffffb),     bkpt, t_udf),
23200
23201   /* Thumb-compatibility pseudo ops.  */
23202  tCE("lsl",     1a00000, _lsl,     3, (RR, oRR, SH), shift, t_shift),
23203  tC3("lsls",    1b00000, _lsls,    3, (RR, oRR, SH), shift, t_shift),
23204  tCE("lsr",     1a00020, _lsr,     3, (RR, oRR, SH), shift, t_shift),
23205  tC3("lsrs",    1b00020, _lsrs,    3, (RR, oRR, SH), shift, t_shift),
23206  tCE("asr",     1a00040, _asr,     3, (RR, oRR, SH), shift, t_shift),
23207  tC3("asrs",      1b00040, _asrs,     3, (RR, oRR, SH), shift, t_shift),
23208  tCE("ror",     1a00060, _ror,     3, (RR, oRR, SH), shift, t_shift),
23209  tC3("rors",    1b00060, _rors,    3, (RR, oRR, SH), shift, t_shift),
23210  tCE("neg",     2600000, _neg,     2, (RR, RR),      rd_rn, t_neg),
23211  tC3("negs",    2700000, _negs,    2, (RR, RR),      rd_rn, t_neg),
23212  tCE("push",    92d0000, _push,     1, (REGLST),             push_pop, t_push_pop),
23213  tCE("pop",     8bd0000, _pop,     1, (REGLST),      push_pop, t_push_pop),
23214
23215  /* These may simplify to neg.  */
23216  TCE("rsb",     0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
23217  TC3("rsbs",    0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
23218
23219 #undef THUMB_VARIANT
23220 #define THUMB_VARIANT  & arm_ext_os
23221
23222  TCE("swi",     f000000, df00,     1, (EXPi),        swi, t_swi),
23223  TCE("svc",     f000000, df00,     1, (EXPi),        swi, t_swi),
23224
23225 #undef  THUMB_VARIANT
23226 #define THUMB_VARIANT  & arm_ext_v6
23227
23228  TCE("cpy",       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
23229
23230  /* V1 instructions with no Thumb analogue prior to V6T2.  */
23231 #undef  THUMB_VARIANT
23232 #define THUMB_VARIANT  & arm_ext_v6t2
23233
23234  TCE("teq",     1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
23235  TC3w("teqs",   1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
23236   CL("teqp",    130f000,           2, (RR, SH),      cmp),
23237
23238  TC3("ldrt",    4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
23239  TC3("ldrbt",   4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
23240  TC3("strt",    4200000, f8400e00, 2, (RR_npcsp, ADDR),   ldstt, t_ldstt),
23241  TC3("strbt",   4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
23242
23243  TC3("stmdb",   9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
23244  TC3("stmfd",     9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
23245
23246  TC3("ldmdb",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
23247  TC3("ldmea",   9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
23248
23249  /* V1 instructions with no Thumb analogue at all.  */
23250   CE("rsc",     0e00000,           3, (RR, oRR, SH), arit),
23251   C3(rscs,      0f00000,           3, (RR, oRR, SH), arit),
23252
23253   C3(stmib,     9800000,           2, (RRw, REGLST), ldmstm),
23254   C3(stmfa,     9800000,           2, (RRw, REGLST), ldmstm),
23255   C3(stmda,     8000000,           2, (RRw, REGLST), ldmstm),
23256   C3(stmed,     8000000,           2, (RRw, REGLST), ldmstm),
23257   C3(ldmib,     9900000,           2, (RRw, REGLST), ldmstm),
23258   C3(ldmed,     9900000,           2, (RRw, REGLST), ldmstm),
23259   C3(ldmda,     8100000,           2, (RRw, REGLST), ldmstm),
23260   C3(ldmfa,     8100000,           2, (RRw, REGLST), ldmstm),
23261
23262 #undef  ARM_VARIANT
23263 #define ARM_VARIANT    & arm_ext_v2     /* ARM 2 - multiplies.  */
23264 #undef  THUMB_VARIANT
23265 #define THUMB_VARIANT  & arm_ext_v4t
23266
23267  tCE("mul",     0000090, _mul,     3, (RRnpc, RRnpc, oRR), mul, t_mul),
23268  tC3("muls",    0100090, _muls,    3, (RRnpc, RRnpc, oRR), mul, t_mul),
23269
23270 #undef  THUMB_VARIANT
23271 #define THUMB_VARIANT  & arm_ext_v6t2
23272
23273  TCE("mla",     0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
23274   C3(mlas,      0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
23275
23276   /* Generic coprocessor instructions.  */
23277  TCE("cdp",     e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
23278  TCE("ldc",     c100000, ec100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
23279  TC3("ldcl",    c500000, ec500000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
23280  TCE("stc",     c000000, ec000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
23281  TC3("stcl",    c400000, ec400000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
23282  TCE("mcr",     e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
23283  TCE("mrc",     e100010, ee100010, 6, (RCP, I7b, APSR_RR, RCN, RCN, oI7b),   co_reg, co_reg),
23284
23285 #undef  ARM_VARIANT
23286 #define ARM_VARIANT  & arm_ext_v2s /* ARM 3 - swp instructions.  */
23287
23288   CE("swp",     1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
23289   C3(swpb,      1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
23290
23291 #undef  ARM_VARIANT
23292 #define ARM_VARIANT    & arm_ext_v3     /* ARM 6 Status register instructions.  */
23293 #undef  THUMB_VARIANT
23294 #define THUMB_VARIANT  & arm_ext_msr
23295
23296  TCE("mrs",     1000000, f3e08000, 2, (RRnpc, rPSR), mrs, t_mrs),
23297  TCE("msr",     120f000, f3808000, 2, (wPSR, RR_EXi), msr, t_msr),
23298
23299 #undef  ARM_VARIANT
23300 #define ARM_VARIANT    & arm_ext_v3m     /* ARM 7M long multiplies.  */
23301 #undef  THUMB_VARIANT
23302 #define THUMB_VARIANT  & arm_ext_v6t2
23303
23304  TCE("smull",   0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
23305   CM("smull","s",       0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
23306  TCE("umull",   0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
23307   CM("umull","s",       0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
23308  TCE("smlal",   0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
23309   CM("smlal","s",       0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
23310  TCE("umlal",   0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
23311   CM("umlal","s",       0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
23312
23313 #undef  ARM_VARIANT
23314 #define ARM_VARIANT    & arm_ext_v4     /* ARM Architecture 4.  */
23315 #undef  THUMB_VARIANT
23316 #define THUMB_VARIANT  & arm_ext_v4t
23317
23318  tC3("ldrh",    01000b0, _ldrh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
23319  tC3("strh",    00000b0, _strh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
23320  tC3("ldrsh",   01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
23321  tC3("ldrsb",   01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
23322  tC3("ldsh",    01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
23323  tC3("ldsb",    01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
23324
23325 #undef  ARM_VARIANT
23326 #define ARM_VARIANT  & arm_ext_v4t_5
23327
23328   /* ARM Architecture 4T.  */
23329   /* Note: bx (and blx) are required on V5, even if the processor does
23330      not support Thumb.  */
23331  TCE("bx",      12fff10, 4700, 1, (RR), bx, t_bx),
23332
23333 #undef  ARM_VARIANT
23334 #define ARM_VARIANT    & arm_ext_v5 /*  ARM Architecture 5T.     */
23335 #undef  THUMB_VARIANT
23336 #define THUMB_VARIANT  & arm_ext_v5t
23337
23338   /* Note: blx has 2 variants; the .value coded here is for
23339      BLX(2).  Only this variant has conditional execution.  */
23340  TCE("blx",     12fff30, 4780, 1, (RR_EXr),                         blx,  t_blx),
23341  TUE("bkpt",    1200070, be00, 1, (oIffffb),                        bkpt, t_bkpt),
23342
23343 #undef  THUMB_VARIANT
23344 #define THUMB_VARIANT  & arm_ext_v6t2
23345
23346  TCE("clz",     16f0f10, fab0f080, 2, (RRnpc, RRnpc),                   rd_rm,  t_clz),
23347  TUF("ldc2",    c100000, fc100000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
23348  TUF("ldc2l",   c500000, fc500000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
23349  TUF("stc2",    c000000, fc000000, 3, (RCP, RCN, ADDRGLDC),             lstc,   lstc),
23350  TUF("stc2l",   c400000, fc400000, 3, (RCP, RCN, ADDRGLDC),                     lstc,   lstc),
23351  TUF("cdp2",    e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
23352  TUF("mcr2",    e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
23353  TUF("mrc2",    e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
23354
23355 #undef  ARM_VARIANT
23356 #define ARM_VARIANT    & arm_ext_v5exp /*  ARM Architecture 5TExP.  */
23357 #undef  THUMB_VARIANT
23358 #define THUMB_VARIANT  & arm_ext_v5exp
23359
23360  TCE("smlabb",  1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
23361  TCE("smlatb",  10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
23362  TCE("smlabt",  10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
23363  TCE("smlatt",  10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
23364
23365  TCE("smlawb",  1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
23366  TCE("smlawt",  12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
23367
23368  TCE("smlalbb", 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
23369  TCE("smlaltb", 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
23370  TCE("smlalbt", 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
23371  TCE("smlaltt", 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
23372
23373  TCE("smulbb",  1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
23374  TCE("smultb",  16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
23375  TCE("smulbt",  16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
23376  TCE("smultt",  16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
23377
23378  TCE("smulwb",  12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
23379  TCE("smulwt",  12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),        smul, t_simd),
23380
23381  TCE("qadd",    1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
23382  TCE("qdadd",   1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
23383  TCE("qsub",    1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
23384  TCE("qdsub",   1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),        rd_rm_rn, t_simd2),
23385
23386 #undef  ARM_VARIANT
23387 #define ARM_VARIANT    & arm_ext_v5e /*  ARM Architecture 5TE.  */
23388 #undef  THUMB_VARIANT
23389 #define THUMB_VARIANT  & arm_ext_v6t2
23390
23391  TUF("pld",     450f000, f810f000, 1, (ADDR),                pld,  t_pld),
23392  TC3("ldrd",    00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
23393      ldrd, t_ldstd),
23394  TC3("strd",    00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
23395                                        ADDRGLDRS), ldrd, t_ldstd),
23396
23397  TCE("mcrr",    c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
23398  TCE("mrrc",    c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
23399
23400 #undef  ARM_VARIANT
23401 #define ARM_VARIANT  & arm_ext_v5j /*  ARM Architecture 5TEJ.  */
23402
23403  TCE("bxj",     12fff20, f3c08f00, 1, (RR),                       bxj, t_bxj),
23404
23405 #undef  ARM_VARIANT
23406 #define ARM_VARIANT    & arm_ext_v6 /*  ARM V6.  */
23407 #undef  THUMB_VARIANT
23408 #define THUMB_VARIANT  & arm_ext_v6
23409
23410  TUF("cpsie",     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
23411  TUF("cpsid",     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
23412  tCE("rev",       6bf0f30, _rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
23413  tCE("rev16",     6bf0fb0, _rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
23414  tCE("revsh",     6ff0fb0, _revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
23415  tCE("sxth",      6bf0070, _sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
23416  tCE("uxth",      6ff0070, _uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
23417  tCE("sxtb",      6af0070, _sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
23418  tCE("uxtb",      6ef0070, _uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
23419  TUF("setend",    1010000, b650,     1, (ENDI),                     setend, t_setend),
23420
23421 #undef  THUMB_VARIANT
23422 #define THUMB_VARIANT  & arm_ext_v6t2_v8m
23423
23424  TCE("ldrex",   1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR),        ldrex, t_ldrex),
23425  TCE("strex",   1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
23426                                       strex,  t_strex),
23427 #undef  THUMB_VARIANT
23428 #define THUMB_VARIANT  & arm_ext_v6t2
23429
23430  TUF("mcrr2",   c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
23431  TUF("mrrc2",   c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
23432
23433  TCE("ssat",    6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
23434  TCE("usat",    6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
23435
23436 /*  ARM V6 not included in V7M.  */
23437 #undef  THUMB_VARIANT
23438 #define THUMB_VARIANT  & arm_ext_v6_notm
23439  TUF("rfeia",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
23440  TUF("rfe",     8900a00, e990c000, 1, (RRw),                       rfe, rfe),
23441   UF(rfeib,     9900a00,           1, (RRw),                       rfe),
23442   UF(rfeda,     8100a00,           1, (RRw),                       rfe),
23443  TUF("rfedb",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
23444  TUF("rfefd",   8900a00, e990c000, 1, (RRw),                       rfe, rfe),
23445   UF(rfefa,     8100a00,           1, (RRw),                       rfe),
23446  TUF("rfeea",   9100a00, e810c000, 1, (RRw),                       rfe, rfe),
23447   UF(rfeed,     9900a00,           1, (RRw),                       rfe),
23448  TUF("srsia",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
23449  TUF("srs",     8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
23450  TUF("srsea",   8c00500, e980c000, 2, (oRRw, I31w),                srs,  srs),
23451   UF(srsib,     9c00500,           2, (oRRw, I31w),                srs),
23452   UF(srsfa,     9c00500,           2, (oRRw, I31w),                srs),
23453   UF(srsda,     8400500,           2, (oRRw, I31w),                srs),
23454   UF(srsed,     8400500,           2, (oRRw, I31w),                srs),
23455  TUF("srsdb",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
23456  TUF("srsfd",   9400500, e800c000, 2, (oRRw, I31w),                srs,  srs),
23457  TUF("cps",     1020000, f3af8100, 1, (I31b),                     imm0, t_cps),
23458
23459 /*  ARM V6 not included in V7M (eg. integer SIMD).  */
23460 #undef  THUMB_VARIANT
23461 #define THUMB_VARIANT  & arm_ext_v6_dsp
23462  TCE("pkhbt",   6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
23463  TCE("pkhtb",   6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
23464  TCE("qadd16",  6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23465  TCE("qadd8",   6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23466  TCE("qasx",    6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23467  /* Old name for QASX.  */
23468  TCE("qaddsubx",6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23469  TCE("qsax",    6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23470  /* Old name for QSAX.  */
23471  TCE("qsubaddx",6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23472  TCE("qsub16",  6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23473  TCE("qsub8",   6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23474  TCE("sadd16",  6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23475  TCE("sadd8",   6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23476  TCE("sasx",    6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23477  /* Old name for SASX.  */
23478  TCE("saddsubx",6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23479  TCE("shadd16", 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23480  TCE("shadd8",  6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23481  TCE("shasx",   6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23482  /* Old name for SHASX.  */
23483  TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
23484  TCE("shsax",     6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
23485  /* Old name for SHSAX.  */
23486  TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
23487  TCE("shsub16", 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23488  TCE("shsub8",  6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23489  TCE("ssax",    6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23490  /* Old name for SSAX.  */
23491  TCE("ssubaddx",6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23492  TCE("ssub16",  6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23493  TCE("ssub8",   6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23494  TCE("uadd16",  6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23495  TCE("uadd8",   6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23496  TCE("uasx",    6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23497  /* Old name for UASX.  */
23498  TCE("uaddsubx",6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23499  TCE("uhadd16", 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23500  TCE("uhadd8",  6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23501  TCE("uhasx",   6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23502  /* Old name for UHASX.  */
23503  TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
23504  TCE("uhsax",     6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
23505  /* Old name for UHSAX.  */
23506  TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
23507  TCE("uhsub16", 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23508  TCE("uhsub8",  6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23509  TCE("uqadd16", 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23510  TCE("uqadd8",  6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23511  TCE("uqasx",   6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23512  /* Old name for UQASX.  */
23513  TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
23514  TCE("uqsax",     6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
23515  /* Old name for UQSAX.  */
23516  TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),     rd_rn_rm, t_simd),
23517  TCE("uqsub16", 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23518  TCE("uqsub8",  6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23519  TCE("usub16",  6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23520  TCE("usax",    6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23521  /* Old name for USAX.  */
23522  TCE("usubaddx",6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23523  TCE("usub8",   6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23524  TCE("sxtah",   6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
23525  TCE("sxtab16", 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
23526  TCE("sxtab",   6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
23527  TCE("sxtb16",  68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
23528  TCE("uxtah",   6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
23529  TCE("uxtab16", 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
23530  TCE("uxtab",   6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
23531  TCE("uxtb16",  6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),        sxth,  t_sxth),
23532  TCE("sel",     6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),       rd_rn_rm, t_simd),
23533  TCE("smlad",   7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
23534  TCE("smladx",  7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
23535  TCE("smlald",  7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
23536  TCE("smlaldx", 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
23537  TCE("smlsd",   7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
23538  TCE("smlsdx",  7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
23539  TCE("smlsld",  7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
23540  TCE("smlsldx", 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
23541  TCE("smmla",   7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
23542  TCE("smmlar",  7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
23543  TCE("smmls",   75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
23544  TCE("smmlsr",  75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
23545  TCE("smmul",   750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
23546  TCE("smmulr",  750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
23547  TCE("smuad",   700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
23548  TCE("smuadx",  700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
23549  TCE("smusd",   700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
23550  TCE("smusdx",  700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),       smul, t_simd),
23551  TCE("ssat16",  6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),         ssat16, t_ssat16),
23552  TCE("umaal",   0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
23553  TCE("usad8",   780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),       smul,   t_simd),
23554  TCE("usada8",  7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
23555  TCE("usat16",  6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),         usat16, t_usat16),
23556
23557 #undef  ARM_VARIANT
23558 #define ARM_VARIANT   & arm_ext_v6k_v6t2
23559 #undef  THUMB_VARIANT
23560 #define THUMB_VARIANT & arm_ext_v6k_v6t2
23561
23562  tCE("yield",   320f001, _yield,    0, (), noargs, t_hint),
23563  tCE("wfe",     320f002, _wfe,      0, (), noargs, t_hint),
23564  tCE("wfi",     320f003, _wfi,      0, (), noargs, t_hint),
23565  tCE("sev",     320f004, _sev,      0, (), noargs, t_hint),
23566
23567 #undef  THUMB_VARIANT
23568 #define THUMB_VARIANT  & arm_ext_v6_notm
23569  TCE("ldrexd",  1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
23570                                       ldrexd, t_ldrexd),
23571  TCE("strexd",  1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
23572                                        RRnpcb), strexd, t_strexd),
23573
23574 #undef  THUMB_VARIANT
23575 #define THUMB_VARIANT  & arm_ext_v6t2_v8m
23576  TCE("ldrexb",  1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
23577      rd_rn,  rd_rn),
23578  TCE("ldrexh",  1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
23579      rd_rn,  rd_rn),
23580  TCE("strexb",  1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
23581      strex, t_strexbh),
23582  TCE("strexh",  1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
23583      strex, t_strexbh),
23584  TUF("clrex",   57ff01f, f3bf8f2f, 0, (),                             noargs, noargs),
23585
23586 #undef  ARM_VARIANT
23587 #define ARM_VARIANT    & arm_ext_sec
23588 #undef  THUMB_VARIANT
23589 #define THUMB_VARIANT  & arm_ext_sec
23590
23591  TCE("smc",     1600070, f7f08000, 1, (EXPi), smc, t_smc),
23592
23593 #undef  ARM_VARIANT
23594 #define ARM_VARIANT    & arm_ext_virt
23595 #undef  THUMB_VARIANT
23596 #define THUMB_VARIANT    & arm_ext_virt
23597
23598  TCE("hvc",     1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
23599  TCE("eret",    160006e, f3de8f00, 0, (), noargs, noargs),
23600
23601 #undef  ARM_VARIANT
23602 #define ARM_VARIANT    & arm_ext_pan
23603 #undef  THUMB_VARIANT
23604 #define THUMB_VARIANT  & arm_ext_pan
23605
23606  TUF("setpan",  1100000, b610, 1, (I7), setpan, t_setpan),
23607
23608 #undef  ARM_VARIANT
23609 #define ARM_VARIANT    & arm_ext_v6t2
23610 #undef  THUMB_VARIANT
23611 #define THUMB_VARIANT  & arm_ext_v6t2
23612
23613  TCE("bfc",     7c0001f, f36f0000, 3, (RRnpc, I31, I32),           bfc, t_bfc),
23614  TCE("bfi",     7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
23615  TCE("sbfx",    7a00050, f3400000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
23616  TCE("ubfx",    7e00050, f3c00000, 4, (RR, RR, I31, I32),          bfx, t_bfx),
23617
23618  TCE("mls",     0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
23619  TCE("rbit",    6ff0f30, fa90f0a0, 2, (RR, RR),                     rd_rm, t_rbit),
23620
23621  TC3("ldrht",   03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
23622  TC3("ldrsht",  03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
23623  TC3("ldrsbt",  03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
23624  TC3("strht",   02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
23625
23626 #undef  ARM_VARIANT
23627 #define ARM_VARIANT    & arm_ext_v3
23628 #undef  THUMB_VARIANT
23629 #define THUMB_VARIANT  & arm_ext_v6t2
23630
23631  TUE("csdb",    320f014, f3af8014, 0, (), noargs, t_csdb),
23632  TUF("ssbb",    57ff040, f3bf8f40, 0, (), noargs, t_csdb),
23633  TUF("pssbb",   57ff044, f3bf8f44, 0, (), noargs, t_csdb),
23634
23635 #undef  ARM_VARIANT
23636 #define ARM_VARIANT    & arm_ext_v6t2
23637 #undef  THUMB_VARIANT
23638 #define THUMB_VARIANT  & arm_ext_v6t2_v8m
23639  TCE("movw",    3000000, f2400000, 2, (RRnpc, HALF),                mov16, t_mov16),
23640  TCE("movt",    3400000, f2c00000, 2, (RRnpc, HALF),                mov16, t_mov16),
23641
23642  /* Thumb-only instructions.  */
23643 #undef  ARM_VARIANT
23644 #define ARM_VARIANT NULL
23645   TUE("cbnz",     0,           b900,     2, (RR, EXP), 0, t_cbz),
23646   TUE("cbz",      0,           b100,     2, (RR, EXP), 0, t_cbz),
23647
23648  /* ARM does not really have an IT instruction, so always allow it.
23649     The opcode is copied from Thumb in order to allow warnings in
23650     -mimplicit-it=[never | arm] modes.  */
23651 #undef  ARM_VARIANT
23652 #define ARM_VARIANT  & arm_ext_v1
23653 #undef  THUMB_VARIANT
23654 #define THUMB_VARIANT  & arm_ext_v6t2
23655
23656  TUE("it",        bf08,        bf08,     1, (COND),   it,    t_it),
23657  TUE("itt",       bf0c,        bf0c,     1, (COND),   it,    t_it),
23658  TUE("ite",       bf04,        bf04,     1, (COND),   it,    t_it),
23659  TUE("ittt",      bf0e,        bf0e,     1, (COND),   it,    t_it),
23660  TUE("itet",      bf06,        bf06,     1, (COND),   it,    t_it),
23661  TUE("itte",      bf0a,        bf0a,     1, (COND),   it,    t_it),
23662  TUE("itee",      bf02,        bf02,     1, (COND),   it,    t_it),
23663  TUE("itttt",     bf0f,        bf0f,     1, (COND),   it,    t_it),
23664  TUE("itett",     bf07,        bf07,     1, (COND),   it,    t_it),
23665  TUE("ittet",     bf0b,        bf0b,     1, (COND),   it,    t_it),
23666  TUE("iteet",     bf03,        bf03,     1, (COND),   it,    t_it),
23667  TUE("ittte",     bf0d,        bf0d,     1, (COND),   it,    t_it),
23668  TUE("itete",     bf05,        bf05,     1, (COND),   it,    t_it),
23669  TUE("ittee",     bf09,        bf09,     1, (COND),   it,    t_it),
23670  TUE("iteee",     bf01,        bf01,     1, (COND),   it,    t_it),
23671  /* ARM/Thumb-2 instructions with no Thumb-1 equivalent.  */
23672  TC3("rrx",       01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
23673  TC3("rrxs",      01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
23674
23675  /* Thumb2 only instructions.  */
23676 #undef  ARM_VARIANT
23677 #define ARM_VARIANT  NULL
23678
23679  TCE("addw",    0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
23680  TCE("subw",    0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
23681  TCE("orn",       0, ea600000, 3, (RR, oRR, SH),  0, t_orn),
23682  TCE("orns",      0, ea700000, 3, (RR, oRR, SH),  0, t_orn),
23683  TCE("tbb",       0, e8d0f000, 1, (TB), 0, t_tb),
23684  TCE("tbh",       0, e8d0f010, 1, (TB), 0, t_tb),
23685
23686  /* Hardware division instructions.  */
23687 #undef  ARM_VARIANT
23688 #define ARM_VARIANT    & arm_ext_adiv
23689 #undef  THUMB_VARIANT
23690 #define THUMB_VARIANT  & arm_ext_div
23691
23692  TCE("sdiv",    710f010, fb90f0f0, 3, (RR, oRR, RR), div, t_div),
23693  TCE("udiv",    730f010, fbb0f0f0, 3, (RR, oRR, RR), div, t_div),
23694
23695  /* ARM V6M/V7 instructions.  */
23696 #undef  ARM_VARIANT
23697 #define ARM_VARIANT    & arm_ext_barrier
23698 #undef  THUMB_VARIANT
23699 #define THUMB_VARIANT  & arm_ext_barrier
23700
23701  TUF("dmb",     57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier, barrier),
23702  TUF("dsb",     57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier, barrier),
23703  TUF("isb",     57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier, barrier),
23704
23705  /* ARM V7 instructions.  */
23706 #undef  ARM_VARIANT
23707 #define ARM_VARIANT    & arm_ext_v7
23708 #undef  THUMB_VARIANT
23709 #define THUMB_VARIANT  & arm_ext_v7
23710
23711  TUF("pli",     450f000, f910f000, 1, (ADDR),     pli,      t_pld),
23712  TCE("dbg",     320f0f0, f3af80f0, 1, (I15),      dbg,      t_dbg),
23713
23714 #undef  ARM_VARIANT
23715 #define ARM_VARIANT    & arm_ext_mp
23716 #undef  THUMB_VARIANT
23717 #define THUMB_VARIANT  & arm_ext_mp
23718
23719  TUF("pldw",    410f000, f830f000, 1, (ADDR),   pld,    t_pld),
23720
23721  /* AArchv8 instructions.  */
23722 #undef  ARM_VARIANT
23723 #define ARM_VARIANT   & arm_ext_v8
23724
23725 /* Instructions shared between armv8-a and armv8-m.  */
23726 #undef  THUMB_VARIANT
23727 #define THUMB_VARIANT & arm_ext_atomics
23728
23729  TCE("lda",     1900c9f, e8d00faf, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
23730  TCE("ldab",    1d00c9f, e8d00f8f, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
23731  TCE("ldah",    1f00c9f, e8d00f9f, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
23732  TCE("stl",     180fc90, e8c00faf, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
23733  TCE("stlb",    1c0fc90, e8c00f8f, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
23734  TCE("stlh",    1e0fc90, e8c00f9f, 2, (RRnpc, RRnpcb),  rm_rn,  rd_rn),
23735  TCE("ldaex",   1900e9f, e8d00fef, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
23736  TCE("ldaexb",  1d00e9f, e8d00fcf, 2, (RRnpc,RRnpcb),   rd_rn,  rd_rn),
23737  TCE("ldaexh",  1f00e9f, e8d00fdf, 2, (RRnpc, RRnpcb),  rd_rn,  rd_rn),
23738  TCE("stlex",   1800e90, e8c00fe0, 3, (RRnpc, RRnpc, RRnpcb),
23739                                                         stlex,  t_stlex),
23740  TCE("stlexb",  1c00e90, e8c00fc0, 3, (RRnpc, RRnpc, RRnpcb),
23741                                                         stlex, t_stlex),
23742  TCE("stlexh",  1e00e90, e8c00fd0, 3, (RRnpc, RRnpc, RRnpcb),
23743                                                         stlex, t_stlex),
23744 #undef  THUMB_VARIANT
23745 #define THUMB_VARIANT & arm_ext_v8
23746
23747  tCE("sevl",    320f005, _sevl,    0, (),               noargs, t_hint),
23748  TCE("ldaexd",  1b00e9f, e8d000ff, 3, (RRnpc, oRRnpc, RRnpcb),
23749                                                         ldrexd, t_ldrexd),
23750  TCE("stlexd",  1a00e90, e8c000f0, 4, (RRnpc, RRnpc, oRRnpc, RRnpcb),
23751                                                         strexd, t_strexd),
23752
23753 /* Defined in V8 but is in undefined encoding space for earlier
23754    architectures.  However earlier architectures are required to treat
23755    this instuction as a semihosting trap as well.  Hence while not explicitly
23756    defined as such, it is in fact correct to define the instruction for all
23757    architectures.  */
23758 #undef  THUMB_VARIANT
23759 #define THUMB_VARIANT  & arm_ext_v1
23760 #undef  ARM_VARIANT
23761 #define ARM_VARIANT  & arm_ext_v1
23762  TUE("hlt",     1000070, ba80,     1, (oIffffb),        bkpt,   t_hlt),
23763
23764  /* ARMv8 T32 only.  */
23765 #undef  ARM_VARIANT
23766 #define ARM_VARIANT  NULL
23767  TUF("dcps1",   0,       f78f8001, 0, (),       noargs, noargs),
23768  TUF("dcps2",   0,       f78f8002, 0, (),       noargs, noargs),
23769  TUF("dcps3",   0,       f78f8003, 0, (),       noargs, noargs),
23770
23771   /* FP for ARMv8.  */
23772 #undef  ARM_VARIANT
23773 #define ARM_VARIANT   & fpu_vfp_ext_armv8xd
23774 #undef  THUMB_VARIANT
23775 #define THUMB_VARIANT & fpu_vfp_ext_armv8xd
23776
23777   nUF(vseleq, _vseleq, 3, (RVSD, RVSD, RVSD),           vsel),
23778   nUF(vselvs, _vselvs, 3, (RVSD, RVSD, RVSD),           vsel),
23779   nUF(vselge, _vselge, 3, (RVSD, RVSD, RVSD),           vsel),
23780   nUF(vselgt, _vselgt, 3, (RVSD, RVSD, RVSD),           vsel),
23781   nCE(vrintr, _vrintr, 2, (RNSDQ, oRNSDQ),              vrintr),
23782   mnCE(vrintz, _vrintr, 2, (RNSDQMQ, oRNSDQMQ),         vrintz),
23783   mnCE(vrintx, _vrintr, 2, (RNSDQMQ, oRNSDQMQ),         vrintx),
23784   mnUF(vrinta, _vrinta, 2, (RNSDQMQ, oRNSDQMQ),         vrinta),
23785   mnUF(vrintn, _vrinta, 2, (RNSDQMQ, oRNSDQMQ),         vrintn),
23786   mnUF(vrintp, _vrinta, 2, (RNSDQMQ, oRNSDQMQ),         vrintp),
23787   mnUF(vrintm, _vrinta, 2, (RNSDQMQ, oRNSDQMQ),         vrintm),
23788
23789   /* Crypto v1 extensions.  */
23790 #undef  ARM_VARIANT
23791 #define ARM_VARIANT & fpu_crypto_ext_armv8
23792 #undef  THUMB_VARIANT
23793 #define THUMB_VARIANT & fpu_crypto_ext_armv8
23794
23795   nUF(aese, _aes, 2, (RNQ, RNQ), aese),
23796   nUF(aesd, _aes, 2, (RNQ, RNQ), aesd),
23797   nUF(aesmc, _aes, 2, (RNQ, RNQ), aesmc),
23798   nUF(aesimc, _aes, 2, (RNQ, RNQ), aesimc),
23799   nUF(sha1c, _sha3op, 3, (RNQ, RNQ, RNQ), sha1c),
23800   nUF(sha1p, _sha3op, 3, (RNQ, RNQ, RNQ), sha1p),
23801   nUF(sha1m, _sha3op, 3, (RNQ, RNQ, RNQ), sha1m),
23802   nUF(sha1su0, _sha3op, 3, (RNQ, RNQ, RNQ), sha1su0),
23803   nUF(sha256h, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h),
23804   nUF(sha256h2, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h2),
23805   nUF(sha256su1, _sha3op, 3, (RNQ, RNQ, RNQ), sha256su1),
23806   nUF(sha1h, _sha1h, 2, (RNQ, RNQ), sha1h),
23807   nUF(sha1su1, _sha2op, 2, (RNQ, RNQ), sha1su1),
23808   nUF(sha256su0, _sha2op, 2, (RNQ, RNQ), sha256su0),
23809
23810 #undef  ARM_VARIANT
23811 #define ARM_VARIANT   & crc_ext_armv8
23812 #undef  THUMB_VARIANT
23813 #define THUMB_VARIANT & crc_ext_armv8
23814   TUEc("crc32b", 1000040, fac0f080, 3, (RR, oRR, RR), crc32b),
23815   TUEc("crc32h", 1200040, fac0f090, 3, (RR, oRR, RR), crc32h),
23816   TUEc("crc32w", 1400040, fac0f0a0, 3, (RR, oRR, RR), crc32w),
23817   TUEc("crc32cb",1000240, fad0f080, 3, (RR, oRR, RR), crc32cb),
23818   TUEc("crc32ch",1200240, fad0f090, 3, (RR, oRR, RR), crc32ch),
23819   TUEc("crc32cw",1400240, fad0f0a0, 3, (RR, oRR, RR), crc32cw),
23820
23821  /* ARMv8.2 RAS extension.  */
23822 #undef  ARM_VARIANT
23823 #define ARM_VARIANT   & arm_ext_ras
23824 #undef  THUMB_VARIANT
23825 #define THUMB_VARIANT & arm_ext_ras
23826  TUE ("esb", 320f010, f3af8010, 0, (), noargs,  noargs),
23827
23828 #undef  ARM_VARIANT
23829 #define ARM_VARIANT   & arm_ext_v8_3
23830 #undef  THUMB_VARIANT
23831 #define THUMB_VARIANT & arm_ext_v8_3
23832  NCE (vjcvt, eb90bc0, 2, (RVS, RVD), vjcvt),
23833
23834 #undef  ARM_VARIANT
23835 #define ARM_VARIANT   & fpu_neon_ext_dotprod
23836 #undef  THUMB_VARIANT
23837 #define THUMB_VARIANT & fpu_neon_ext_dotprod
23838  NUF (vsdot, d00, 3, (RNDQ, RNDQ, RNDQ_RNSC), neon_dotproduct_s),
23839  NUF (vudot, d00, 3, (RNDQ, RNDQ, RNDQ_RNSC), neon_dotproduct_u),
23840
23841 #undef  ARM_VARIANT
23842 #define ARM_VARIANT  & fpu_fpa_ext_v1  /* Core FPA instruction set (V1).  */
23843 #undef  THUMB_VARIANT
23844 #define THUMB_VARIANT NULL
23845
23846  cCE("wfs",     e200110, 1, (RR),            rd),
23847  cCE("rfs",     e300110, 1, (RR),            rd),
23848  cCE("wfc",     e400110, 1, (RR),            rd),
23849  cCE("rfc",     e500110, 1, (RR),            rd),
23850
23851  cCL("ldfs",    c100100, 2, (RF, ADDRGLDC),  rd_cpaddr),
23852  cCL("ldfd",    c108100, 2, (RF, ADDRGLDC),  rd_cpaddr),
23853  cCL("ldfe",    c500100, 2, (RF, ADDRGLDC),  rd_cpaddr),
23854  cCL("ldfp",    c508100, 2, (RF, ADDRGLDC),  rd_cpaddr),
23855
23856  cCL("stfs",    c000100, 2, (RF, ADDRGLDC),  rd_cpaddr),
23857  cCL("stfd",    c008100, 2, (RF, ADDRGLDC),  rd_cpaddr),
23858  cCL("stfe",    c400100, 2, (RF, ADDRGLDC),  rd_cpaddr),
23859  cCL("stfp",    c408100, 2, (RF, ADDRGLDC),  rd_cpaddr),
23860
23861  cCL("mvfs",    e008100, 2, (RF, RF_IF),     rd_rm),
23862  cCL("mvfsp",   e008120, 2, (RF, RF_IF),     rd_rm),
23863  cCL("mvfsm",   e008140, 2, (RF, RF_IF),     rd_rm),
23864  cCL("mvfsz",   e008160, 2, (RF, RF_IF),     rd_rm),
23865  cCL("mvfd",    e008180, 2, (RF, RF_IF),     rd_rm),
23866  cCL("mvfdp",   e0081a0, 2, (RF, RF_IF),     rd_rm),
23867  cCL("mvfdm",   e0081c0, 2, (RF, RF_IF),     rd_rm),
23868  cCL("mvfdz",   e0081e0, 2, (RF, RF_IF),     rd_rm),
23869  cCL("mvfe",    e088100, 2, (RF, RF_IF),     rd_rm),
23870  cCL("mvfep",   e088120, 2, (RF, RF_IF),     rd_rm),
23871  cCL("mvfem",   e088140, 2, (RF, RF_IF),     rd_rm),
23872  cCL("mvfez",   e088160, 2, (RF, RF_IF),     rd_rm),
23873
23874  cCL("mnfs",    e108100, 2, (RF, RF_IF),     rd_rm),
23875  cCL("mnfsp",   e108120, 2, (RF, RF_IF),     rd_rm),
23876  cCL("mnfsm",   e108140, 2, (RF, RF_IF),     rd_rm),
23877  cCL("mnfsz",   e108160, 2, (RF, RF_IF),     rd_rm),
23878  cCL("mnfd",    e108180, 2, (RF, RF_IF),     rd_rm),
23879  cCL("mnfdp",   e1081a0, 2, (RF, RF_IF),     rd_rm),
23880  cCL("mnfdm",   e1081c0, 2, (RF, RF_IF),     rd_rm),
23881  cCL("mnfdz",   e1081e0, 2, (RF, RF_IF),     rd_rm),
23882  cCL("mnfe",    e188100, 2, (RF, RF_IF),     rd_rm),
23883  cCL("mnfep",   e188120, 2, (RF, RF_IF),     rd_rm),
23884  cCL("mnfem",   e188140, 2, (RF, RF_IF),     rd_rm),
23885  cCL("mnfez",   e188160, 2, (RF, RF_IF),     rd_rm),
23886
23887  cCL("abss",    e208100, 2, (RF, RF_IF),     rd_rm),
23888  cCL("abssp",   e208120, 2, (RF, RF_IF),     rd_rm),
23889  cCL("abssm",   e208140, 2, (RF, RF_IF),     rd_rm),
23890  cCL("abssz",   e208160, 2, (RF, RF_IF),     rd_rm),
23891  cCL("absd",    e208180, 2, (RF, RF_IF),     rd_rm),
23892  cCL("absdp",   e2081a0, 2, (RF, RF_IF),     rd_rm),
23893  cCL("absdm",   e2081c0, 2, (RF, RF_IF),     rd_rm),
23894  cCL("absdz",   e2081e0, 2, (RF, RF_IF),     rd_rm),
23895  cCL("abse",    e288100, 2, (RF, RF_IF),     rd_rm),
23896  cCL("absep",   e288120, 2, (RF, RF_IF),     rd_rm),
23897  cCL("absem",   e288140, 2, (RF, RF_IF),     rd_rm),
23898  cCL("absez",   e288160, 2, (RF, RF_IF),     rd_rm),
23899
23900  cCL("rnds",    e308100, 2, (RF, RF_IF),     rd_rm),
23901  cCL("rndsp",   e308120, 2, (RF, RF_IF),     rd_rm),
23902  cCL("rndsm",   e308140, 2, (RF, RF_IF),     rd_rm),
23903  cCL("rndsz",   e308160, 2, (RF, RF_IF),     rd_rm),
23904  cCL("rndd",    e308180, 2, (RF, RF_IF),     rd_rm),
23905  cCL("rnddp",   e3081a0, 2, (RF, RF_IF),     rd_rm),
23906  cCL("rnddm",   e3081c0, 2, (RF, RF_IF),     rd_rm),
23907  cCL("rnddz",   e3081e0, 2, (RF, RF_IF),     rd_rm),
23908  cCL("rnde",    e388100, 2, (RF, RF_IF),     rd_rm),
23909  cCL("rndep",   e388120, 2, (RF, RF_IF),     rd_rm),
23910  cCL("rndem",   e388140, 2, (RF, RF_IF),     rd_rm),
23911  cCL("rndez",   e388160, 2, (RF, RF_IF),     rd_rm),
23912
23913  cCL("sqts",    e408100, 2, (RF, RF_IF),     rd_rm),
23914  cCL("sqtsp",   e408120, 2, (RF, RF_IF),     rd_rm),
23915  cCL("sqtsm",   e408140, 2, (RF, RF_IF),     rd_rm),
23916  cCL("sqtsz",   e408160, 2, (RF, RF_IF),     rd_rm),
23917  cCL("sqtd",    e408180, 2, (RF, RF_IF),     rd_rm),
23918  cCL("sqtdp",   e4081a0, 2, (RF, RF_IF),     rd_rm),
23919  cCL("sqtdm",   e4081c0, 2, (RF, RF_IF),     rd_rm),
23920  cCL("sqtdz",   e4081e0, 2, (RF, RF_IF),     rd_rm),
23921  cCL("sqte",    e488100, 2, (RF, RF_IF),     rd_rm),
23922  cCL("sqtep",   e488120, 2, (RF, RF_IF),     rd_rm),
23923  cCL("sqtem",   e488140, 2, (RF, RF_IF),     rd_rm),
23924  cCL("sqtez",   e488160, 2, (RF, RF_IF),     rd_rm),
23925
23926  cCL("logs",    e508100, 2, (RF, RF_IF),     rd_rm),
23927  cCL("logsp",   e508120, 2, (RF, RF_IF),     rd_rm),
23928  cCL("logsm",   e508140, 2, (RF, RF_IF),     rd_rm),
23929  cCL("logsz",   e508160, 2, (RF, RF_IF),     rd_rm),
23930  cCL("logd",    e508180, 2, (RF, RF_IF),     rd_rm),
23931  cCL("logdp",   e5081a0, 2, (RF, RF_IF),     rd_rm),
23932  cCL("logdm",   e5081c0, 2, (RF, RF_IF),     rd_rm),
23933  cCL("logdz",   e5081e0, 2, (RF, RF_IF),     rd_rm),
23934  cCL("loge",    e588100, 2, (RF, RF_IF),     rd_rm),
23935  cCL("logep",   e588120, 2, (RF, RF_IF),     rd_rm),
23936  cCL("logem",   e588140, 2, (RF, RF_IF),     rd_rm),
23937  cCL("logez",   e588160, 2, (RF, RF_IF),     rd_rm),
23938
23939  cCL("lgns",    e608100, 2, (RF, RF_IF),     rd_rm),
23940  cCL("lgnsp",   e608120, 2, (RF, RF_IF),     rd_rm),
23941  cCL("lgnsm",   e608140, 2, (RF, RF_IF),     rd_rm),
23942  cCL("lgnsz",   e608160, 2, (RF, RF_IF),     rd_rm),
23943  cCL("lgnd",    e608180, 2, (RF, RF_IF),     rd_rm),
23944  cCL("lgndp",   e6081a0, 2, (RF, RF_IF),     rd_rm),
23945  cCL("lgndm",   e6081c0, 2, (RF, RF_IF),     rd_rm),
23946  cCL("lgndz",   e6081e0, 2, (RF, RF_IF),     rd_rm),
23947  cCL("lgne",    e688100, 2, (RF, RF_IF),     rd_rm),
23948  cCL("lgnep",   e688120, 2, (RF, RF_IF),     rd_rm),
23949  cCL("lgnem",   e688140, 2, (RF, RF_IF),     rd_rm),
23950  cCL("lgnez",   e688160, 2, (RF, RF_IF),     rd_rm),
23951
23952  cCL("exps",    e708100, 2, (RF, RF_IF),     rd_rm),
23953  cCL("expsp",   e708120, 2, (RF, RF_IF),     rd_rm),
23954  cCL("expsm",   e708140, 2, (RF, RF_IF),     rd_rm),
23955  cCL("expsz",   e708160, 2, (RF, RF_IF),     rd_rm),
23956  cCL("expd",    e708180, 2, (RF, RF_IF),     rd_rm),
23957  cCL("expdp",   e7081a0, 2, (RF, RF_IF),     rd_rm),
23958  cCL("expdm",   e7081c0, 2, (RF, RF_IF),     rd_rm),
23959  cCL("expdz",   e7081e0, 2, (RF, RF_IF),     rd_rm),
23960  cCL("expe",    e788100, 2, (RF, RF_IF),     rd_rm),
23961  cCL("expep",   e788120, 2, (RF, RF_IF),     rd_rm),
23962  cCL("expem",   e788140, 2, (RF, RF_IF),     rd_rm),
23963  cCL("expdz",   e788160, 2, (RF, RF_IF),     rd_rm),
23964
23965  cCL("sins",    e808100, 2, (RF, RF_IF),     rd_rm),
23966  cCL("sinsp",   e808120, 2, (RF, RF_IF),     rd_rm),
23967  cCL("sinsm",   e808140, 2, (RF, RF_IF),     rd_rm),
23968  cCL("sinsz",   e808160, 2, (RF, RF_IF),     rd_rm),
23969  cCL("sind",    e808180, 2, (RF, RF_IF),     rd_rm),
23970  cCL("sindp",   e8081a0, 2, (RF, RF_IF),     rd_rm),
23971  cCL("sindm",   e8081c0, 2, (RF, RF_IF),     rd_rm),
23972  cCL("sindz",   e8081e0, 2, (RF, RF_IF),     rd_rm),
23973  cCL("sine",    e888100, 2, (RF, RF_IF),     rd_rm),
23974  cCL("sinep",   e888120, 2, (RF, RF_IF),     rd_rm),
23975  cCL("sinem",   e888140, 2, (RF, RF_IF),     rd_rm),
23976  cCL("sinez",   e888160, 2, (RF, RF_IF),     rd_rm),
23977
23978  cCL("coss",    e908100, 2, (RF, RF_IF),     rd_rm),
23979  cCL("cossp",   e908120, 2, (RF, RF_IF),     rd_rm),
23980  cCL("cossm",   e908140, 2, (RF, RF_IF),     rd_rm),
23981  cCL("cossz",   e908160, 2, (RF, RF_IF),     rd_rm),
23982  cCL("cosd",    e908180, 2, (RF, RF_IF),     rd_rm),
23983  cCL("cosdp",   e9081a0, 2, (RF, RF_IF),     rd_rm),
23984  cCL("cosdm",   e9081c0, 2, (RF, RF_IF),     rd_rm),
23985  cCL("cosdz",   e9081e0, 2, (RF, RF_IF),     rd_rm),
23986  cCL("cose",    e988100, 2, (RF, RF_IF),     rd_rm),
23987  cCL("cosep",   e988120, 2, (RF, RF_IF),     rd_rm),
23988  cCL("cosem",   e988140, 2, (RF, RF_IF),     rd_rm),
23989  cCL("cosez",   e988160, 2, (RF, RF_IF),     rd_rm),
23990
23991  cCL("tans",    ea08100, 2, (RF, RF_IF),     rd_rm),
23992  cCL("tansp",   ea08120, 2, (RF, RF_IF),     rd_rm),
23993  cCL("tansm",   ea08140, 2, (RF, RF_IF),     rd_rm),
23994  cCL("tansz",   ea08160, 2, (RF, RF_IF),     rd_rm),
23995  cCL("tand",    ea08180, 2, (RF, RF_IF),     rd_rm),
23996  cCL("tandp",   ea081a0, 2, (RF, RF_IF),     rd_rm),
23997  cCL("tandm",   ea081c0, 2, (RF, RF_IF),     rd_rm),
23998  cCL("tandz",   ea081e0, 2, (RF, RF_IF),     rd_rm),
23999  cCL("tane",    ea88100, 2, (RF, RF_IF),     rd_rm),
24000  cCL("tanep",   ea88120, 2, (RF, RF_IF),     rd_rm),
24001  cCL("tanem",   ea88140, 2, (RF, RF_IF),     rd_rm),
24002  cCL("tanez",   ea88160, 2, (RF, RF_IF),     rd_rm),
24003
24004  cCL("asns",    eb08100, 2, (RF, RF_IF),     rd_rm),
24005  cCL("asnsp",   eb08120, 2, (RF, RF_IF),     rd_rm),
24006  cCL("asnsm",   eb08140, 2, (RF, RF_IF),     rd_rm),
24007  cCL("asnsz",   eb08160, 2, (RF, RF_IF),     rd_rm),
24008  cCL("asnd",    eb08180, 2, (RF, RF_IF),     rd_rm),
24009  cCL("asndp",   eb081a0, 2, (RF, RF_IF),     rd_rm),
24010  cCL("asndm",   eb081c0, 2, (RF, RF_IF),     rd_rm),
24011  cCL("asndz",   eb081e0, 2, (RF, RF_IF),     rd_rm),
24012  cCL("asne",    eb88100, 2, (RF, RF_IF),     rd_rm),
24013  cCL("asnep",   eb88120, 2, (RF, RF_IF),     rd_rm),
24014  cCL("asnem",   eb88140, 2, (RF, RF_IF),     rd_rm),
24015  cCL("asnez",   eb88160, 2, (RF, RF_IF),     rd_rm),
24016
24017  cCL("acss",    ec08100, 2, (RF, RF_IF),     rd_rm),
24018  cCL("acssp",   ec08120, 2, (RF, RF_IF),     rd_rm),
24019  cCL("acssm",   ec08140, 2, (RF, RF_IF),     rd_rm),
24020  cCL("acssz",   ec08160, 2, (RF, RF_IF),     rd_rm),
24021  cCL("acsd",    ec08180, 2, (RF, RF_IF),     rd_rm),
24022  cCL("acsdp",   ec081a0, 2, (RF, RF_IF),     rd_rm),
24023  cCL("acsdm",   ec081c0, 2, (RF, RF_IF),     rd_rm),
24024  cCL("acsdz",   ec081e0, 2, (RF, RF_IF),     rd_rm),
24025  cCL("acse",    ec88100, 2, (RF, RF_IF),     rd_rm),
24026  cCL("acsep",   ec88120, 2, (RF, RF_IF),     rd_rm),
24027  cCL("acsem",   ec88140, 2, (RF, RF_IF),     rd_rm),
24028  cCL("acsez",   ec88160, 2, (RF, RF_IF),     rd_rm),
24029
24030  cCL("atns",    ed08100, 2, (RF, RF_IF),     rd_rm),
24031  cCL("atnsp",   ed08120, 2, (RF, RF_IF),     rd_rm),
24032  cCL("atnsm",   ed08140, 2, (RF, RF_IF),     rd_rm),
24033  cCL("atnsz",   ed08160, 2, (RF, RF_IF),     rd_rm),
24034  cCL("atnd",    ed08180, 2, (RF, RF_IF),     rd_rm),
24035  cCL("atndp",   ed081a0, 2, (RF, RF_IF),     rd_rm),
24036  cCL("atndm",   ed081c0, 2, (RF, RF_IF),     rd_rm),
24037  cCL("atndz",   ed081e0, 2, (RF, RF_IF),     rd_rm),
24038  cCL("atne",    ed88100, 2, (RF, RF_IF),     rd_rm),
24039  cCL("atnep",   ed88120, 2, (RF, RF_IF),     rd_rm),
24040  cCL("atnem",   ed88140, 2, (RF, RF_IF),     rd_rm),
24041  cCL("atnez",   ed88160, 2, (RF, RF_IF),     rd_rm),
24042
24043  cCL("urds",    ee08100, 2, (RF, RF_IF),     rd_rm),
24044  cCL("urdsp",   ee08120, 2, (RF, RF_IF),     rd_rm),
24045  cCL("urdsm",   ee08140, 2, (RF, RF_IF),     rd_rm),
24046  cCL("urdsz",   ee08160, 2, (RF, RF_IF),     rd_rm),
24047  cCL("urdd",    ee08180, 2, (RF, RF_IF),     rd_rm),
24048  cCL("urddp",   ee081a0, 2, (RF, RF_IF),     rd_rm),
24049  cCL("urddm",   ee081c0, 2, (RF, RF_IF),     rd_rm),
24050  cCL("urddz",   ee081e0, 2, (RF, RF_IF),     rd_rm),
24051  cCL("urde",    ee88100, 2, (RF, RF_IF),     rd_rm),
24052  cCL("urdep",   ee88120, 2, (RF, RF_IF),     rd_rm),
24053  cCL("urdem",   ee88140, 2, (RF, RF_IF),     rd_rm),
24054  cCL("urdez",   ee88160, 2, (RF, RF_IF),     rd_rm),
24055
24056  cCL("nrms",    ef08100, 2, (RF, RF_IF),     rd_rm),
24057  cCL("nrmsp",   ef08120, 2, (RF, RF_IF),     rd_rm),
24058  cCL("nrmsm",   ef08140, 2, (RF, RF_IF),     rd_rm),
24059  cCL("nrmsz",   ef08160, 2, (RF, RF_IF),     rd_rm),
24060  cCL("nrmd",    ef08180, 2, (RF, RF_IF),     rd_rm),
24061  cCL("nrmdp",   ef081a0, 2, (RF, RF_IF),     rd_rm),
24062  cCL("nrmdm",   ef081c0, 2, (RF, RF_IF),     rd_rm),
24063  cCL("nrmdz",   ef081e0, 2, (RF, RF_IF),     rd_rm),
24064  cCL("nrme",    ef88100, 2, (RF, RF_IF),     rd_rm),
24065  cCL("nrmep",   ef88120, 2, (RF, RF_IF),     rd_rm),
24066  cCL("nrmem",   ef88140, 2, (RF, RF_IF),     rd_rm),
24067  cCL("nrmez",   ef88160, 2, (RF, RF_IF),     rd_rm),
24068
24069  cCL("adfs",    e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
24070  cCL("adfsp",   e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
24071  cCL("adfsm",   e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
24072  cCL("adfsz",   e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
24073  cCL("adfd",    e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
24074  cCL("adfdp",   e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24075  cCL("adfdm",   e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24076  cCL("adfdz",   e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24077  cCL("adfe",    e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
24078  cCL("adfep",   e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
24079  cCL("adfem",   e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
24080  cCL("adfez",   e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
24081
24082  cCL("sufs",    e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
24083  cCL("sufsp",   e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
24084  cCL("sufsm",   e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
24085  cCL("sufsz",   e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
24086  cCL("sufd",    e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
24087  cCL("sufdp",   e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24088  cCL("sufdm",   e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24089  cCL("sufdz",   e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24090  cCL("sufe",    e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
24091  cCL("sufep",   e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
24092  cCL("sufem",   e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
24093  cCL("sufez",   e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
24094
24095  cCL("rsfs",    e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
24096  cCL("rsfsp",   e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
24097  cCL("rsfsm",   e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
24098  cCL("rsfsz",   e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
24099  cCL("rsfd",    e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
24100  cCL("rsfdp",   e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24101  cCL("rsfdm",   e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24102  cCL("rsfdz",   e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24103  cCL("rsfe",    e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
24104  cCL("rsfep",   e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
24105  cCL("rsfem",   e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
24106  cCL("rsfez",   e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
24107
24108  cCL("mufs",    e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
24109  cCL("mufsp",   e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
24110  cCL("mufsm",   e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
24111  cCL("mufsz",   e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
24112  cCL("mufd",    e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
24113  cCL("mufdp",   e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24114  cCL("mufdm",   e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24115  cCL("mufdz",   e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24116  cCL("mufe",    e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
24117  cCL("mufep",   e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
24118  cCL("mufem",   e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
24119  cCL("mufez",   e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
24120
24121  cCL("dvfs",    e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
24122  cCL("dvfsp",   e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
24123  cCL("dvfsm",   e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
24124  cCL("dvfsz",   e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
24125  cCL("dvfd",    e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
24126  cCL("dvfdp",   e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24127  cCL("dvfdm",   e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24128  cCL("dvfdz",   e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24129  cCL("dvfe",    e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
24130  cCL("dvfep",   e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
24131  cCL("dvfem",   e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
24132  cCL("dvfez",   e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
24133
24134  cCL("rdfs",    e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
24135  cCL("rdfsp",   e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
24136  cCL("rdfsm",   e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
24137  cCL("rdfsz",   e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
24138  cCL("rdfd",    e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
24139  cCL("rdfdp",   e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24140  cCL("rdfdm",   e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24141  cCL("rdfdz",   e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24142  cCL("rdfe",    e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
24143  cCL("rdfep",   e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
24144  cCL("rdfem",   e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
24145  cCL("rdfez",   e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
24146
24147  cCL("pows",    e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
24148  cCL("powsp",   e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
24149  cCL("powsm",   e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
24150  cCL("powsz",   e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
24151  cCL("powd",    e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
24152  cCL("powdp",   e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24153  cCL("powdm",   e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24154  cCL("powdz",   e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24155  cCL("powe",    e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
24156  cCL("powep",   e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
24157  cCL("powem",   e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
24158  cCL("powez",   e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
24159
24160  cCL("rpws",    e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
24161  cCL("rpwsp",   e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
24162  cCL("rpwsm",   e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
24163  cCL("rpwsz",   e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
24164  cCL("rpwd",    e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
24165  cCL("rpwdp",   e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24166  cCL("rpwdm",   e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24167  cCL("rpwdz",   e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24168  cCL("rpwe",    e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
24169  cCL("rpwep",   e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
24170  cCL("rpwem",   e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
24171  cCL("rpwez",   e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
24172
24173  cCL("rmfs",    e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
24174  cCL("rmfsp",   e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
24175  cCL("rmfsm",   e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
24176  cCL("rmfsz",   e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
24177  cCL("rmfd",    e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
24178  cCL("rmfdp",   e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24179  cCL("rmfdm",   e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24180  cCL("rmfdz",   e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24181  cCL("rmfe",    e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
24182  cCL("rmfep",   e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
24183  cCL("rmfem",   e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
24184  cCL("rmfez",   e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
24185
24186  cCL("fmls",    e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
24187  cCL("fmlsp",   e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
24188  cCL("fmlsm",   e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
24189  cCL("fmlsz",   e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
24190  cCL("fmld",    e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
24191  cCL("fmldp",   e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24192  cCL("fmldm",   e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24193  cCL("fmldz",   e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24194  cCL("fmle",    e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
24195  cCL("fmlep",   e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
24196  cCL("fmlem",   e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
24197  cCL("fmlez",   e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
24198
24199  cCL("fdvs",    ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
24200  cCL("fdvsp",   ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
24201  cCL("fdvsm",   ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
24202  cCL("fdvsz",   ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
24203  cCL("fdvd",    ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
24204  cCL("fdvdp",   ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24205  cCL("fdvdm",   ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24206  cCL("fdvdz",   ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24207  cCL("fdve",    ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
24208  cCL("fdvep",   ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
24209  cCL("fdvem",   ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
24210  cCL("fdvez",   ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
24211
24212  cCL("frds",    eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
24213  cCL("frdsp",   eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
24214  cCL("frdsm",   eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
24215  cCL("frdsz",   eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
24216  cCL("frdd",    eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
24217  cCL("frddp",   eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24218  cCL("frddm",   eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24219  cCL("frddz",   eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24220  cCL("frde",    eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
24221  cCL("frdep",   eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
24222  cCL("frdem",   eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
24223  cCL("frdez",   eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
24224
24225  cCL("pols",    ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
24226  cCL("polsp",   ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
24227  cCL("polsm",   ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
24228  cCL("polsz",   ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
24229  cCL("pold",    ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
24230  cCL("poldp",   ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
24231  cCL("poldm",   ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
24232  cCL("poldz",   ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
24233  cCL("pole",    ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
24234  cCL("polep",   ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
24235  cCL("polem",   ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
24236  cCL("polez",   ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
24237
24238  cCE("cmf",     e90f110, 2, (RF, RF_IF),     fpa_cmp),
24239  C3E("cmfe",    ed0f110, 2, (RF, RF_IF),     fpa_cmp),
24240  cCE("cnf",     eb0f110, 2, (RF, RF_IF),     fpa_cmp),
24241  C3E("cnfe",    ef0f110, 2, (RF, RF_IF),     fpa_cmp),
24242
24243  cCL("flts",    e000110, 2, (RF, RR),        rn_rd),
24244  cCL("fltsp",   e000130, 2, (RF, RR),        rn_rd),
24245  cCL("fltsm",   e000150, 2, (RF, RR),        rn_rd),
24246  cCL("fltsz",   e000170, 2, (RF, RR),        rn_rd),
24247  cCL("fltd",    e000190, 2, (RF, RR),        rn_rd),
24248  cCL("fltdp",   e0001b0, 2, (RF, RR),        rn_rd),
24249  cCL("fltdm",   e0001d0, 2, (RF, RR),        rn_rd),
24250  cCL("fltdz",   e0001f0, 2, (RF, RR),        rn_rd),
24251  cCL("flte",    e080110, 2, (RF, RR),        rn_rd),
24252  cCL("fltep",   e080130, 2, (RF, RR),        rn_rd),
24253  cCL("fltem",   e080150, 2, (RF, RR),        rn_rd),
24254  cCL("fltez",   e080170, 2, (RF, RR),        rn_rd),
24255
24256   /* The implementation of the FIX instruction is broken on some
24257      assemblers, in that it accepts a precision specifier as well as a
24258      rounding specifier, despite the fact that this is meaningless.
24259      To be more compatible, we accept it as well, though of course it
24260      does not set any bits.  */
24261  cCE("fix",     e100110, 2, (RR, RF),        rd_rm),
24262  cCL("fixp",    e100130, 2, (RR, RF),        rd_rm),
24263  cCL("fixm",    e100150, 2, (RR, RF),        rd_rm),
24264  cCL("fixz",    e100170, 2, (RR, RF),        rd_rm),
24265  cCL("fixsp",   e100130, 2, (RR, RF),        rd_rm),
24266  cCL("fixsm",   e100150, 2, (RR, RF),        rd_rm),
24267  cCL("fixsz",   e100170, 2, (RR, RF),        rd_rm),
24268  cCL("fixdp",   e100130, 2, (RR, RF),        rd_rm),
24269  cCL("fixdm",   e100150, 2, (RR, RF),        rd_rm),
24270  cCL("fixdz",   e100170, 2, (RR, RF),        rd_rm),
24271  cCL("fixep",   e100130, 2, (RR, RF),        rd_rm),
24272  cCL("fixem",   e100150, 2, (RR, RF),        rd_rm),
24273  cCL("fixez",   e100170, 2, (RR, RF),        rd_rm),
24274
24275   /* Instructions that were new with the real FPA, call them V2.  */
24276 #undef  ARM_VARIANT
24277 #define ARM_VARIANT  & fpu_fpa_ext_v2
24278
24279  cCE("lfm",     c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
24280  cCL("lfmfd",   c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
24281  cCL("lfmea",   d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
24282  cCE("sfm",     c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
24283  cCL("sfmfd",   d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
24284  cCL("sfmea",   c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
24285
24286 #undef  ARM_VARIANT
24287 #define ARM_VARIANT  & fpu_vfp_ext_v1xd  /* VFP V1xD (single precision).  */
24288
24289   /* Moves and type conversions.  */
24290  cCE("fmstat",  ef1fa10, 0, (),               noargs),
24291  cCE("vmrs",    ef00a10, 2, (APSR_RR, RVC),   vmrs),
24292  cCE("vmsr",    ee00a10, 2, (RVC, RR),        vmsr),
24293  cCE("fsitos",  eb80ac0, 2, (RVS, RVS),       vfp_sp_monadic),
24294  cCE("fuitos",  eb80a40, 2, (RVS, RVS),       vfp_sp_monadic),
24295  cCE("ftosis",  ebd0a40, 2, (RVS, RVS),       vfp_sp_monadic),
24296  cCE("ftosizs", ebd0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
24297  cCE("ftouis",  ebc0a40, 2, (RVS, RVS),       vfp_sp_monadic),
24298  cCE("ftouizs", ebc0ac0, 2, (RVS, RVS),       vfp_sp_monadic),
24299  cCE("fmrx",    ef00a10, 2, (RR, RVC),        rd_rn),
24300  cCE("fmxr",    ee00a10, 2, (RVC, RR),        rn_rd),
24301
24302   /* Memory operations.  */
24303  cCE("flds",    d100a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
24304  cCE("fsts",    d000a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
24305  cCE("fldmias", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
24306  cCE("fldmfds", c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
24307  cCE("fldmdbs", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
24308  cCE("fldmeas", d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
24309  cCE("fldmiax", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
24310  cCE("fldmfdx", c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
24311  cCE("fldmdbx", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
24312  cCE("fldmeax", d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
24313  cCE("fstmias", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
24314  cCE("fstmeas", c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
24315  cCE("fstmdbs", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
24316  cCE("fstmfds", d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
24317  cCE("fstmiax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
24318  cCE("fstmeax", c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
24319  cCE("fstmdbx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
24320  cCE("fstmfdx", d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
24321
24322   /* Monadic operations.  */
24323  cCE("fabss",   eb00ac0, 2, (RVS, RVS),       vfp_sp_monadic),
24324  cCE("fnegs",   eb10a40, 2, (RVS, RVS),       vfp_sp_monadic),
24325  cCE("fsqrts",  eb10ac0, 2, (RVS, RVS),       vfp_sp_monadic),
24326
24327   /* Dyadic operations.  */
24328  cCE("fadds",   e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
24329  cCE("fsubs",   e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
24330  cCE("fmuls",   e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
24331  cCE("fdivs",   e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
24332  cCE("fmacs",   e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
24333  cCE("fmscs",   e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
24334  cCE("fnmuls",  e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
24335  cCE("fnmacs",  e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
24336  cCE("fnmscs",  e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
24337
24338   /* Comparisons.  */
24339  cCE("fcmps",   eb40a40, 2, (RVS, RVS),       vfp_sp_monadic),
24340  cCE("fcmpzs",  eb50a40, 1, (RVS),            vfp_sp_compare_z),
24341  cCE("fcmpes",  eb40ac0, 2, (RVS, RVS),       vfp_sp_monadic),
24342  cCE("fcmpezs", eb50ac0, 1, (RVS),            vfp_sp_compare_z),
24343
24344  /* Double precision load/store are still present on single precision
24345     implementations.  */
24346  cCE("fldd",    d100b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
24347  cCE("fstd",    d000b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
24348  cCE("fldmiad", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
24349  cCE("fldmfdd", c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
24350  cCE("fldmdbd", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
24351  cCE("fldmead", d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
24352  cCE("fstmiad", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
24353  cCE("fstmead", c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
24354  cCE("fstmdbd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
24355  cCE("fstmfdd", d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
24356
24357 #undef  ARM_VARIANT
24358 #define ARM_VARIANT  & fpu_vfp_ext_v1 /* VFP V1 (Double precision).  */
24359
24360   /* Moves and type conversions.  */
24361  cCE("fcvtds",  eb70ac0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
24362  cCE("fcvtsd",  eb70bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
24363  cCE("fmdhr",   e200b10, 2, (RVD, RR),        vfp_dp_rn_rd),
24364  cCE("fmdlr",   e000b10, 2, (RVD, RR),        vfp_dp_rn_rd),
24365  cCE("fmrdh",   e300b10, 2, (RR, RVD),        vfp_dp_rd_rn),
24366  cCE("fmrdl",   e100b10, 2, (RR, RVD),        vfp_dp_rd_rn),
24367  cCE("fsitod",  eb80bc0, 2, (RVD, RVS),       vfp_dp_sp_cvt),
24368  cCE("fuitod",  eb80b40, 2, (RVD, RVS),       vfp_dp_sp_cvt),
24369  cCE("ftosid",  ebd0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
24370  cCE("ftosizd", ebd0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
24371  cCE("ftouid",  ebc0b40, 2, (RVS, RVD),       vfp_sp_dp_cvt),
24372  cCE("ftouizd", ebc0bc0, 2, (RVS, RVD),       vfp_sp_dp_cvt),
24373
24374   /* Monadic operations.  */
24375  cCE("fabsd",   eb00bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
24376  cCE("fnegd",   eb10b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
24377  cCE("fsqrtd",  eb10bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
24378
24379   /* Dyadic operations.  */
24380  cCE("faddd",   e300b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
24381  cCE("fsubd",   e300b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
24382  cCE("fmuld",   e200b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
24383  cCE("fdivd",   e800b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
24384  cCE("fmacd",   e000b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
24385  cCE("fmscd",   e100b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
24386  cCE("fnmuld",  e200b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
24387  cCE("fnmacd",  e000b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
24388  cCE("fnmscd",  e100b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
24389
24390   /* Comparisons.  */
24391  cCE("fcmpd",   eb40b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
24392  cCE("fcmpzd",  eb50b40, 1, (RVD),            vfp_dp_rd),
24393  cCE("fcmped",  eb40bc0, 2, (RVD, RVD),       vfp_dp_rd_rm),
24394  cCE("fcmpezd", eb50bc0, 1, (RVD),            vfp_dp_rd),
24395
24396 /* Instructions which may belong to either the Neon or VFP instruction sets.
24397    Individual encoder functions perform additional architecture checks.  */
24398 #undef  ARM_VARIANT
24399 #define ARM_VARIANT    & fpu_vfp_ext_v1xd
24400 #undef  THUMB_VARIANT
24401 #define THUMB_VARIANT  & fpu_vfp_ext_v1xd
24402
24403   /* These mnemonics are unique to VFP.  */
24404  NCE(vsqrt,     0,       2, (RVSD, RVSD),       vfp_nsyn_sqrt),
24405  NCE(vdiv,      0,       3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
24406  nCE(vnmul,     _vnmul,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
24407  nCE(vnmla,     _vnmla,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
24408  nCE(vnmls,     _vnmls,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
24409  NCE(vpush,     0,       1, (VRSDLST),          vfp_nsyn_push),
24410  NCE(vpop,      0,       1, (VRSDLST),          vfp_nsyn_pop),
24411  NCE(vcvtz,     0,       2, (RVSD, RVSD),       vfp_nsyn_cvtz),
24412
24413   /* Mnemonics shared by Neon and VFP.  */
24414  nCEF(vmls,     _vmls,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
24415
24416  NCE(vldm,      c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
24417  NCE(vldmia,    c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
24418  NCE(vldmdb,    d100b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
24419  NCE(vstm,      c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
24420  NCE(vstmia,    c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
24421  NCE(vstmdb,    d000b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
24422
24423  mnCEF(vcvt,     _vcvt,   3, (RNSDQMQ, RNSDQMQ, oI32z), neon_cvt),
24424  nCEF(vcvtr,    _vcvt,   2, (RNSDQ, RNSDQ), neon_cvtr),
24425  MNCEF(vcvtb,   eb20a40, 3, (RVSDMQ, RVSDMQ, oI32b), neon_cvtb),
24426  MNCEF(vcvtt,   eb20a40, 3, (RVSDMQ, RVSDMQ, oI32b), neon_cvtt),
24427
24428
24429   /* NOTE: All VMOV encoding is special-cased!  */
24430  NCE(vmovq,     0,       1, (VMOV), neon_mov),
24431
24432 #undef  THUMB_VARIANT
24433 /* Could be either VLDR/VSTR or VLDR/VSTR (system register) which are guarded
24434    by different feature bits.  Since we are setting the Thumb guard, we can
24435    require Thumb-1 which makes it a nop guard and set the right feature bit in
24436    do_vldr_vstr ().  */
24437 #define THUMB_VARIANT  & arm_ext_v4t
24438  NCE(vldr,      d100b00, 2, (VLDR, ADDRGLDC), vldr_vstr),
24439  NCE(vstr,      d000b00, 2, (VLDR, ADDRGLDC), vldr_vstr),
24440
24441 #undef  ARM_VARIANT
24442 #define ARM_VARIANT    & arm_ext_fp16
24443 #undef  THUMB_VARIANT
24444 #define THUMB_VARIANT  & arm_ext_fp16
24445  /* New instructions added from v8.2, allowing the extraction and insertion of
24446     the upper 16 bits of a 32-bit vector register.  */
24447  NCE (vmovx,     eb00a40,       2, (RVS, RVS), neon_movhf),
24448  NCE (vins,      eb00ac0,       2, (RVS, RVS), neon_movhf),
24449
24450  /* New backported fma/fms instructions optional in v8.2.  */
24451  NCE (vfmal, 810, 3, (RNDQ, RNSD, RNSD_RNSC), neon_vfmal),
24452  NCE (vfmsl, 810, 3, (RNDQ, RNSD, RNSD_RNSC), neon_vfmsl),
24453
24454 #undef  THUMB_VARIANT
24455 #define THUMB_VARIANT  & fpu_neon_ext_v1
24456 #undef  ARM_VARIANT
24457 #define ARM_VARIANT    & fpu_neon_ext_v1
24458
24459   /* Data processing with three registers of the same length.  */
24460   /* integer ops, valid types S8 S16 S32 U8 U16 U32.  */
24461  NUF(vaba,      0000710, 3, (RNDQ, RNDQ,  RNDQ), neon_dyadic_i_su),
24462  NUF(vabaq,     0000710, 3, (RNQ,  RNQ,   RNQ),  neon_dyadic_i_su),
24463  NUF(vhaddq,    0000000, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
24464  NUF(vrhaddq,   0000100, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
24465  NUF(vhsubq,    0000200, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
24466   /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64.  */
24467  NUF(vqaddq,    0000010, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
24468  NUF(vqsubq,    0000210, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
24469  NUF(vrshlq,    0000500, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
24470  NUF(vqrshlq,   0000510, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
24471   /* If not immediate, fall back to neon_dyadic_i64_su.
24472      shl should accept I8 I16 I32 I64,
24473      qshl should accept S8 S16 S32 S64 U8 U16 U32 U64.  */
24474  nUF(vshlq,     _vshl,    3, (RNQ,  oRNQ,  RNDQ_I63b), neon_shl),
24475  nUF(vqshlq,    _vqshl,   3, (RNQ,  oRNQ,  RNDQ_I63b), neon_qshl),
24476   /* Logic ops, types optional & ignored.  */
24477  nUF(vandq,     _vand,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
24478  nUF(vbicq,     _vbic,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
24479  nUF(vorrq,     _vorr,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
24480  nUF(vornq,     _vorn,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
24481  nUF(veorq,     _veor,    3, (RNQ,  oRNQ,  RNQ),       neon_logic),
24482   /* Bitfield ops, untyped.  */
24483  NUF(vbsl,      1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
24484  NUF(vbslq,     1100110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
24485  NUF(vbit,      1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
24486  NUF(vbitq,     1200110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
24487  NUF(vbif,      1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
24488  NUF(vbifq,     1300110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
24489   /* Int and float variants, types S8 S16 S32 U8 U16 U32 F16 F32.  */
24490  nUF(vabdq,     _vabd,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
24491  nUF(vmaxq,     _vmax,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
24492  nUF(vminq,     _vmin,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
24493   /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
24494      back to neon_dyadic_if_su.  */
24495  nUF(vcge,      _vcge,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
24496  nUF(vcgeq,     _vcge,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
24497  nUF(vcgt,      _vcgt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
24498  nUF(vcgtq,     _vcgt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
24499  nUF(vclt,      _vclt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
24500  nUF(vcltq,     _vclt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
24501  nUF(vcle,      _vcle,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
24502  nUF(vcleq,     _vcle,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
24503   /* Comparison. Type I8 I16 I32 F32.  */
24504  nUF(vceq,      _vceq,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
24505  nUF(vceqq,     _vceq,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_ceq),
24506   /* As above, D registers only.  */
24507  nUF(vpmax,     _vpmax,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
24508  nUF(vpmin,     _vpmin,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
24509   /* Int and float variants, signedness unimportant.  */
24510  nUF(vmlaq,     _vmla,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
24511  nUF(vmlsq,     _vmls,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
24512  nUF(vpadd,     _vpadd,   3, (RND,  oRND,  RND),       neon_dyadic_if_i_d),
24513   /* Add/sub take types I8 I16 I32 I64 F32.  */
24514  nUF(vaddq,     _vadd,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
24515  nUF(vsubq,     _vsub,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
24516   /* vtst takes sizes 8, 16, 32.  */
24517  NUF(vtst,      0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
24518  NUF(vtstq,     0000810, 3, (RNQ,  oRNQ,  RNQ),  neon_tst),
24519   /* VMUL takes I8 I16 I32 F32 P8.  */
24520  nUF(vmulq,     _vmul,     3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mul),
24521   /* VQD{R}MULH takes S16 S32.  */
24522  nUF(vqdmulhq,  _vqdmulh,  3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
24523  nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
24524  NUF(vacge,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
24525  NUF(vacgeq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
24526  NUF(vacgt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
24527  NUF(vacgtq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
24528  NUF(vaclt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
24529  NUF(vacltq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
24530  NUF(vacle,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
24531  NUF(vacleq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
24532  NUF(vrecps,    0000f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
24533  NUF(vrecpsq,   0000f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
24534  NUF(vrsqrts,   0200f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
24535  NUF(vrsqrtsq,  0200f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
24536  /* ARM v8.1 extension.  */
24537  nUF (vqrdmlahq, _vqrdmlah, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qrdmlah),
24538  nUF (vqrdmlsh,  _vqrdmlsh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qrdmlah),
24539  nUF (vqrdmlshq, _vqrdmlsh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qrdmlah),
24540
24541   /* Two address, int/float. Types S8 S16 S32 F32.  */
24542  NUF(vabsq,     1b10300, 2, (RNQ,  RNQ),      neon_abs_neg),
24543  NUF(vnegq,     1b10380, 2, (RNQ,  RNQ),      neon_abs_neg),
24544
24545   /* Data processing with two registers and a shift amount.  */
24546   /* Right shifts, and variants with rounding.
24547      Types accepted S8 S16 S32 S64 U8 U16 U32 U64.  */
24548  NUF(vshrq,     0800010, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
24549  NUF(vrshrq,    0800210, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
24550  NUF(vsra,      0800110, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
24551  NUF(vsraq,     0800110, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
24552  NUF(vrsra,     0800310, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
24553  NUF(vrsraq,    0800310, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
24554   /* Shift and insert. Sizes accepted 8 16 32 64.  */
24555  NUF(vsliq,     1800510, 3, (RNQ,  oRNQ,  I63), neon_sli),
24556  NUF(vsriq,     1800410, 3, (RNQ,  oRNQ,  I64), neon_sri),
24557   /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64.  */
24558  NUF(vqshluq,   1800610, 3, (RNQ,  oRNQ,  I63), neon_qshlu_imm),
24559   /* Right shift immediate, saturating & narrowing, with rounding variants.
24560      Types accepted S16 S32 S64 U16 U32 U64.  */
24561  NUF(vqshrn,    0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
24562  NUF(vqrshrn,   0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
24563   /* As above, unsigned. Types accepted S16 S32 S64.  */
24564  NUF(vqshrun,   0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
24565  NUF(vqrshrun,  0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
24566   /* Right shift narrowing. Types accepted I16 I32 I64.  */
24567  NUF(vshrn,     0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
24568  NUF(vrshrn,    0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
24569   /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant.  */
24570  nUF(vshll,     _vshll,   3, (RNQ, RND, I32),  neon_shll),
24571   /* CVT with optional immediate for fixed-point variant.  */
24572  nUF(vcvtq,     _vcvt,    3, (RNQ, RNQ, oI32b), neon_cvt),
24573
24574  nUF(vmvnq,     _vmvn,    2, (RNQ,  RNDQ_Ibig), neon_mvn),
24575
24576   /* Data processing, three registers of different lengths.  */
24577   /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32.  */
24578  NUF(vabal,     0800500, 3, (RNQ, RND, RND),  neon_abal),
24579   /* If not scalar, fall back to neon_dyadic_long.
24580      Vector types as above, scalar types S16 S32 U16 U32.  */
24581  nUF(vmlal,     _vmlal,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
24582  nUF(vmlsl,     _vmlsl,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
24583   /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32.  */
24584  NUF(vaddw,     0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
24585  NUF(vsubw,     0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
24586   /* Dyadic, narrowing insns. Types I16 I32 I64.  */
24587  NUF(vaddhn,    0800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
24588  NUF(vraddhn,   1800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
24589  NUF(vsubhn,    0800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
24590  NUF(vrsubhn,   1800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
24591   /* Saturating doubling multiplies. Types S16 S32.  */
24592  nUF(vqdmlal,   _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
24593  nUF(vqdmlsl,   _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
24594  nUF(vqdmull,   _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
24595   /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
24596      S16 S32 U16 U32.  */
24597  nUF(vmull,     _vmull,   3, (RNQ, RND, RND_RNSC), neon_vmull),
24598
24599   /* Extract. Size 8.  */
24600  NUF(vext,      0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
24601  NUF(vextq,     0b00000, 4, (RNQ,  oRNQ,  RNQ,  I15), neon_ext),
24602
24603   /* Two registers, miscellaneous.  */
24604   /* Reverse. Sizes 8 16 32 (must be < size in opcode).  */
24605  NUF(vrev64q,   1b00000, 2, (RNQ,  RNQ),      neon_rev),
24606  NUF(vrev32q,   1b00080, 2, (RNQ,  RNQ),      neon_rev),
24607  NUF(vrev16q,   1b00100, 2, (RNQ,  RNQ),      neon_rev),
24608   /* Vector replicate. Sizes 8 16 32.  */
24609  nCE(vdupq,     _vdup,    2, (RNQ,  RR_RNSC),  neon_dup),
24610   /* VMOVL. Types S8 S16 S32 U8 U16 U32.  */
24611  NUF(vmovl,     0800a10, 2, (RNQ, RND),       neon_movl),
24612   /* VMOVN. Types I16 I32 I64.  */
24613  nUF(vmovn,     _vmovn,   2, (RND, RNQ),       neon_movn),
24614   /* VQMOVN. Types S16 S32 S64 U16 U32 U64.  */
24615  nUF(vqmovn,    _vqmovn,  2, (RND, RNQ),       neon_qmovn),
24616   /* VQMOVUN. Types S16 S32 S64.  */
24617  nUF(vqmovun,   _vqmovun, 2, (RND, RNQ),       neon_qmovun),
24618   /* VZIP / VUZP. Sizes 8 16 32.  */
24619  NUF(vzip,      1b20180, 2, (RNDQ, RNDQ),     neon_zip_uzp),
24620  NUF(vzipq,     1b20180, 2, (RNQ,  RNQ),      neon_zip_uzp),
24621  NUF(vuzp,      1b20100, 2, (RNDQ, RNDQ),     neon_zip_uzp),
24622  NUF(vuzpq,     1b20100, 2, (RNQ,  RNQ),      neon_zip_uzp),
24623   /* VQABS / VQNEG. Types S8 S16 S32.  */
24624  NUF(vqabsq,    1b00700, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
24625  NUF(vqnegq,    1b00780, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
24626   /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32.  */
24627  NUF(vpadal,    1b00600, 2, (RNDQ, RNDQ),     neon_pair_long),
24628  NUF(vpadalq,   1b00600, 2, (RNQ,  RNQ),      neon_pair_long),
24629  NUF(vpaddl,    1b00200, 2, (RNDQ, RNDQ),     neon_pair_long),
24630  NUF(vpaddlq,   1b00200, 2, (RNQ,  RNQ),      neon_pair_long),
24631   /* Reciprocal estimates.  Types U32 F16 F32.  */
24632  NUF(vrecpe,    1b30400, 2, (RNDQ, RNDQ),     neon_recip_est),
24633  NUF(vrecpeq,   1b30400, 2, (RNQ,  RNQ),      neon_recip_est),
24634  NUF(vrsqrte,   1b30480, 2, (RNDQ, RNDQ),     neon_recip_est),
24635  NUF(vrsqrteq,  1b30480, 2, (RNQ,  RNQ),      neon_recip_est),
24636   /* VCLS. Types S8 S16 S32.  */
24637  NUF(vclsq,     1b00400, 2, (RNQ,  RNQ),      neon_cls),
24638   /* VCLZ. Types I8 I16 I32.  */
24639  NUF(vclzq,     1b00480, 2, (RNQ,  RNQ),      neon_clz),
24640   /* VCNT. Size 8.  */
24641  NUF(vcnt,      1b00500, 2, (RNDQ, RNDQ),     neon_cnt),
24642  NUF(vcntq,     1b00500, 2, (RNQ,  RNQ),      neon_cnt),
24643   /* Two address, untyped.  */
24644  NUF(vswp,      1b20000, 2, (RNDQ, RNDQ),     neon_swp),
24645  NUF(vswpq,     1b20000, 2, (RNQ,  RNQ),      neon_swp),
24646   /* VTRN. Sizes 8 16 32.  */
24647  nUF(vtrn,      _vtrn,    2, (RNDQ, RNDQ),     neon_trn),
24648  nUF(vtrnq,     _vtrn,    2, (RNQ,  RNQ),      neon_trn),
24649
24650   /* Table lookup. Size 8.  */
24651  NUF(vtbl,      1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
24652  NUF(vtbx,      1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
24653
24654 #undef  THUMB_VARIANT
24655 #define THUMB_VARIANT  & fpu_vfp_v3_or_neon_ext
24656 #undef  ARM_VARIANT
24657 #define ARM_VARIANT    & fpu_vfp_v3_or_neon_ext
24658
24659   /* Neon element/structure load/store.  */
24660  nUF(vld1,      _vld1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
24661  nUF(vst1,      _vst1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
24662  nUF(vld2,      _vld2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
24663  nUF(vst2,      _vst2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
24664  nUF(vld3,      _vld3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
24665  nUF(vst3,      _vst3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
24666  nUF(vld4,      _vld4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
24667  nUF(vst4,      _vst4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
24668
24669 #undef  THUMB_VARIANT
24670 #define THUMB_VARIANT & fpu_vfp_ext_v3xd
24671 #undef  ARM_VARIANT
24672 #define ARM_VARIANT   & fpu_vfp_ext_v3xd
24673  cCE("fconsts",   eb00a00, 2, (RVS, I255),      vfp_sp_const),
24674  cCE("fshtos",    eba0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
24675  cCE("fsltos",    eba0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
24676  cCE("fuhtos",    ebb0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
24677  cCE("fultos",    ebb0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
24678  cCE("ftoshs",    ebe0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
24679  cCE("ftosls",    ebe0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
24680  cCE("ftouhs",    ebf0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
24681  cCE("ftouls",    ebf0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
24682
24683 #undef  THUMB_VARIANT
24684 #define THUMB_VARIANT  & fpu_vfp_ext_v3
24685 #undef  ARM_VARIANT
24686 #define ARM_VARIANT    & fpu_vfp_ext_v3
24687
24688  cCE("fconstd",   eb00b00, 2, (RVD, I255),      vfp_dp_const),
24689  cCE("fshtod",    eba0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
24690  cCE("fsltod",    eba0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
24691  cCE("fuhtod",    ebb0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
24692  cCE("fultod",    ebb0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
24693  cCE("ftoshd",    ebe0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
24694  cCE("ftosld",    ebe0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
24695  cCE("ftouhd",    ebf0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
24696  cCE("ftould",    ebf0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
24697
24698 #undef  ARM_VARIANT
24699 #define ARM_VARIANT    & fpu_vfp_ext_fma
24700 #undef  THUMB_VARIANT
24701 #define THUMB_VARIANT  & fpu_vfp_ext_fma
24702  /* Mnemonics shared by Neon, VFP and MVE.  These are included in the
24703     VFP FMA variant; NEON and VFP FMA always includes the NEON
24704     FMA instructions.  */
24705  mnCEF(vfma,     _vfma,    3, (RNSDQMQ, oRNSDQMQ, RNSDQMQR), neon_fmac),
24706  mnCEF(vfms,     _vfms,    3, (RNSDQMQ, oRNSDQMQ, RNSDQMQ),  neon_fmac),
24707
24708  /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
24709     the v form should always be used.  */
24710  cCE("ffmas",   ea00a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
24711  cCE("ffnmas",  ea00a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
24712  cCE("ffmad",   ea00b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
24713  cCE("ffnmad",  ea00b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
24714  nCE(vfnma,     _vfnma,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
24715  nCE(vfnms,     _vfnms,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
24716
24717 #undef THUMB_VARIANT
24718 #undef  ARM_VARIANT
24719 #define ARM_VARIANT  & arm_cext_xscale /* Intel XScale extensions.  */
24720
24721  cCE("mia",     e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
24722  cCE("miaph",   e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
24723  cCE("miabb",   e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
24724  cCE("miabt",   e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
24725  cCE("miatb",   e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
24726  cCE("miatt",   e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
24727  cCE("mar",     c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
24728  cCE("mra",     c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
24729
24730 #undef  ARM_VARIANT
24731 #define ARM_VARIANT  & arm_cext_iwmmxt /* Intel Wireless MMX technology.  */
24732
24733  cCE("tandcb",  e13f130, 1, (RR),                   iwmmxt_tandorc),
24734  cCE("tandch",  e53f130, 1, (RR),                   iwmmxt_tandorc),
24735  cCE("tandcw",  e93f130, 1, (RR),                   iwmmxt_tandorc),
24736  cCE("tbcstb",  e400010, 2, (RIWR, RR),             rn_rd),
24737  cCE("tbcsth",  e400050, 2, (RIWR, RR),             rn_rd),
24738  cCE("tbcstw",  e400090, 2, (RIWR, RR),             rn_rd),
24739  cCE("textrcb", e130170, 2, (RR, I7),               iwmmxt_textrc),
24740  cCE("textrch", e530170, 2, (RR, I7),               iwmmxt_textrc),
24741  cCE("textrcw", e930170, 2, (RR, I7),               iwmmxt_textrc),
24742  cCE("textrmub",e100070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
24743  cCE("textrmuh",e500070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
24744  cCE("textrmuw",e900070, 3, (RR, RIWR, I7),         iwmmxt_textrm),
24745  cCE("textrmsb",e100078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
24746  cCE("textrmsh",e500078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
24747  cCE("textrmsw",e900078, 3, (RR, RIWR, I7),         iwmmxt_textrm),
24748  cCE("tinsrb",  e600010, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
24749  cCE("tinsrh",  e600050, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
24750  cCE("tinsrw",  e600090, 3, (RIWR, RR, I7),         iwmmxt_tinsr),
24751  cCE("tmcr",    e000110, 2, (RIWC_RIWG, RR),        rn_rd),
24752  cCE("tmcrr",   c400000, 3, (RIWR, RR, RR),         rm_rd_rn),
24753  cCE("tmia",    e200010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
24754  cCE("tmiaph",  e280010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
24755  cCE("tmiabb",  e2c0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
24756  cCE("tmiabt",  e2d0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
24757  cCE("tmiatb",  e2e0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
24758  cCE("tmiatt",  e2f0010, 3, (RIWR, RR, RR),         iwmmxt_tmia),
24759  cCE("tmovmskb",e100030, 2, (RR, RIWR),             rd_rn),
24760  cCE("tmovmskh",e500030, 2, (RR, RIWR),             rd_rn),
24761  cCE("tmovmskw",e900030, 2, (RR, RIWR),             rd_rn),
24762  cCE("tmrc",    e100110, 2, (RR, RIWC_RIWG),        rd_rn),
24763  cCE("tmrrc",   c500000, 3, (RR, RR, RIWR),         rd_rn_rm),
24764  cCE("torcb",   e13f150, 1, (RR),                   iwmmxt_tandorc),
24765  cCE("torch",   e53f150, 1, (RR),                   iwmmxt_tandorc),
24766  cCE("torcw",   e93f150, 1, (RR),                   iwmmxt_tandorc),
24767  cCE("waccb",   e0001c0, 2, (RIWR, RIWR),           rd_rn),
24768  cCE("wacch",   e4001c0, 2, (RIWR, RIWR),           rd_rn),
24769  cCE("waccw",   e8001c0, 2, (RIWR, RIWR),           rd_rn),
24770  cCE("waddbss", e300180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24771  cCE("waddb",   e000180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24772  cCE("waddbus", e100180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24773  cCE("waddhss", e700180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24774  cCE("waddh",   e400180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24775  cCE("waddhus", e500180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24776  cCE("waddwss", eb00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24777  cCE("waddw",   e800180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24778  cCE("waddwus", e900180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24779  cCE("waligni", e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
24780  cCE("walignr0",e800020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24781  cCE("walignr1",e900020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24782  cCE("walignr2",ea00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24783  cCE("walignr3",eb00020, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24784  cCE("wand",    e200000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24785  cCE("wandn",   e300000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24786  cCE("wavg2b",  e800000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24787  cCE("wavg2br", e900000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24788  cCE("wavg2h",  ec00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24789  cCE("wavg2hr", ed00000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24790  cCE("wcmpeqb", e000060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24791  cCE("wcmpeqh", e400060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24792  cCE("wcmpeqw", e800060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24793  cCE("wcmpgtub",e100060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24794  cCE("wcmpgtuh",e500060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24795  cCE("wcmpgtuw",e900060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24796  cCE("wcmpgtsb",e300060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24797  cCE("wcmpgtsh",e700060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24798  cCE("wcmpgtsw",eb00060, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24799  cCE("wldrb",   c100000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
24800  cCE("wldrh",   c500000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
24801  cCE("wldrw",   c100100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
24802  cCE("wldrd",   c500100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
24803  cCE("wmacs",   e600100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24804  cCE("wmacsz",  e700100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24805  cCE("wmacu",   e400100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24806  cCE("wmacuz",  e500100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24807  cCE("wmadds",  ea00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24808  cCE("wmaddu",  e800100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24809  cCE("wmaxsb",  e200160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24810  cCE("wmaxsh",  e600160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24811  cCE("wmaxsw",  ea00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24812  cCE("wmaxub",  e000160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24813  cCE("wmaxuh",  e400160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24814  cCE("wmaxuw",  e800160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24815  cCE("wminsb",  e300160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24816  cCE("wminsh",  e700160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24817  cCE("wminsw",  eb00160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24818  cCE("wminub",  e100160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24819  cCE("wminuh",  e500160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24820  cCE("wminuw",  e900160, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24821  cCE("wmov",    e000000, 2, (RIWR, RIWR),           iwmmxt_wmov),
24822  cCE("wmulsm",  e300100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24823  cCE("wmulsl",  e200100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24824  cCE("wmulum",  e100100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24825  cCE("wmulul",  e000100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24826  cCE("wor",     e000000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24827  cCE("wpackhss",e700080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24828  cCE("wpackhus",e500080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24829  cCE("wpackwss",eb00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24830  cCE("wpackwus",e900080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24831  cCE("wpackdss",ef00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24832  cCE("wpackdus",ed00080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24833  cCE("wrorh",   e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
24834  cCE("wrorhg",  e700148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
24835  cCE("wrorw",   eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
24836  cCE("wrorwg",  eb00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
24837  cCE("wrord",   ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
24838  cCE("wrordg",  ef00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
24839  cCE("wsadb",   e000120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24840  cCE("wsadbz",  e100120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24841  cCE("wsadh",   e400120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24842  cCE("wsadhz",  e500120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24843  cCE("wshufh",  e0001e0, 3, (RIWR, RIWR, I255),     iwmmxt_wshufh),
24844  cCE("wsllh",   e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
24845  cCE("wsllhg",  e500148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
24846  cCE("wsllw",   e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
24847  cCE("wsllwg",  e900148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
24848  cCE("wslld",   ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
24849  cCE("wslldg",  ed00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
24850  cCE("wsrah",   e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
24851  cCE("wsrahg",  e400148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
24852  cCE("wsraw",   e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
24853  cCE("wsrawg",  e800148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
24854  cCE("wsrad",   ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
24855  cCE("wsradg",  ec00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
24856  cCE("wsrlh",   e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
24857  cCE("wsrlhg",  e600148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
24858  cCE("wsrlw",   ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
24859  cCE("wsrlwg",  ea00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
24860  cCE("wsrld",   ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
24861  cCE("wsrldg",  ee00148, 3, (RIWR, RIWR, RIWG),     rd_rn_rm),
24862  cCE("wstrb",   c000000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
24863  cCE("wstrh",   c400000, 2, (RIWR, ADDR),           iwmmxt_wldstbh),
24864  cCE("wstrw",   c000100, 2, (RIWR_RIWC, ADDR),      iwmmxt_wldstw),
24865  cCE("wstrd",   c400100, 2, (RIWR, ADDR),           iwmmxt_wldstd),
24866  cCE("wsubbss", e3001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24867  cCE("wsubb",   e0001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24868  cCE("wsubbus", e1001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24869  cCE("wsubhss", e7001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24870  cCE("wsubh",   e4001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24871  cCE("wsubhus", e5001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24872  cCE("wsubwss", eb001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24873  cCE("wsubw",   e8001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24874  cCE("wsubwus", e9001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24875  cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR),         rd_rn),
24876  cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR),         rd_rn),
24877  cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR),         rd_rn),
24878  cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR),         rd_rn),
24879  cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR),         rd_rn),
24880  cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR),         rd_rn),
24881  cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
24882  cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
24883  cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
24884  cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR),         rd_rn),
24885  cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR),         rd_rn),
24886  cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR),         rd_rn),
24887  cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR),         rd_rn),
24888  cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR),         rd_rn),
24889  cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR),         rd_rn),
24890  cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
24891  cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
24892  cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR),           rd_rn_rm),
24893  cCE("wxor",    e100000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24894  cCE("wzero",   e300000, 1, (RIWR),                 iwmmxt_wzero),
24895
24896 #undef  ARM_VARIANT
24897 #define ARM_VARIANT  & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2.  */
24898
24899  cCE("torvscb",   e12f190, 1, (RR),                 iwmmxt_tandorc),
24900  cCE("torvsch",   e52f190, 1, (RR),                 iwmmxt_tandorc),
24901  cCE("torvscw",   e92f190, 1, (RR),                 iwmmxt_tandorc),
24902  cCE("wabsb",     e2001c0, 2, (RIWR, RIWR),           rd_rn),
24903  cCE("wabsh",     e6001c0, 2, (RIWR, RIWR),           rd_rn),
24904  cCE("wabsw",     ea001c0, 2, (RIWR, RIWR),           rd_rn),
24905  cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24906  cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24907  cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24908  cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24909  cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24910  cCE("waddhc",    e600180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24911  cCE("waddwc",    ea00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24912  cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24913  cCE("wavg4",   e400000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24914  cCE("wavg4r",    e500000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24915  cCE("wmaddsn",   ee00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24916  cCE("wmaddsx",   eb00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24917  cCE("wmaddun",   ec00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24918  cCE("wmaddux",   e900100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24919  cCE("wmerge",    e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
24920  cCE("wmiabb",    e0000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24921  cCE("wmiabt",    e1000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24922  cCE("wmiatb",    e2000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24923  cCE("wmiatt",    e3000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24924  cCE("wmiabbn",   e4000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24925  cCE("wmiabtn",   e5000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24926  cCE("wmiatbn",   e6000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24927  cCE("wmiattn",   e7000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24928  cCE("wmiawbb",   e800120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24929  cCE("wmiawbt",   e900120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24930  cCE("wmiawtb",   ea00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24931  cCE("wmiawtt",   eb00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24932  cCE("wmiawbbn",  ec00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24933  cCE("wmiawbtn",  ed00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24934  cCE("wmiawtbn",  ee00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24935  cCE("wmiawttn",  ef00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24936  cCE("wmulsmr",   ef00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24937  cCE("wmulumr",   ed00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24938  cCE("wmulwumr",  ec000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24939  cCE("wmulwsmr",  ee000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24940  cCE("wmulwum",   ed000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24941  cCE("wmulwsm",   ef000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24942  cCE("wmulwl",    eb000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24943  cCE("wqmiabb",   e8000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24944  cCE("wqmiabt",   e9000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24945  cCE("wqmiatb",   ea000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24946  cCE("wqmiatt",   eb000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24947  cCE("wqmiabbn",  ec000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24948  cCE("wqmiabtn",  ed000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24949  cCE("wqmiatbn",  ee000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24950  cCE("wqmiattn",  ef000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24951  cCE("wqmulm",    e100080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24952  cCE("wqmulmr",   e300080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24953  cCE("wqmulwm",   ec000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24954  cCE("wqmulwmr",  ee000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24955  cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
24956
24957 #undef  ARM_VARIANT
24958 #define ARM_VARIANT  & arm_cext_maverick /* Cirrus Maverick instructions.  */
24959
24960  cCE("cfldrs",  c100400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
24961  cCE("cfldrd",  c500400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
24962  cCE("cfldr32", c100500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
24963  cCE("cfldr64", c500500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
24964  cCE("cfstrs",  c000400, 2, (RMF, ADDRGLDC),          rd_cpaddr),
24965  cCE("cfstrd",  c400400, 2, (RMD, ADDRGLDC),          rd_cpaddr),
24966  cCE("cfstr32", c000500, 2, (RMFX, ADDRGLDC),         rd_cpaddr),
24967  cCE("cfstr64", c400500, 2, (RMDX, ADDRGLDC),         rd_cpaddr),
24968  cCE("cfmvsr",  e000450, 2, (RMF, RR),                rn_rd),
24969  cCE("cfmvrs",  e100450, 2, (RR, RMF),                rd_rn),
24970  cCE("cfmvdlr", e000410, 2, (RMD, RR),                rn_rd),
24971  cCE("cfmvrdl", e100410, 2, (RR, RMD),                rd_rn),
24972  cCE("cfmvdhr", e000430, 2, (RMD, RR),                rn_rd),
24973  cCE("cfmvrdh", e100430, 2, (RR, RMD),                rd_rn),
24974  cCE("cfmv64lr",e000510, 2, (RMDX, RR),               rn_rd),
24975  cCE("cfmvr64l",e100510, 2, (RR, RMDX),               rd_rn),
24976  cCE("cfmv64hr",e000530, 2, (RMDX, RR),               rn_rd),
24977  cCE("cfmvr64h",e100530, 2, (RR, RMDX),               rd_rn),
24978  cCE("cfmval32",e200440, 2, (RMAX, RMFX),             rd_rn),
24979  cCE("cfmv32al",e100440, 2, (RMFX, RMAX),             rd_rn),
24980  cCE("cfmvam32",e200460, 2, (RMAX, RMFX),             rd_rn),
24981  cCE("cfmv32am",e100460, 2, (RMFX, RMAX),             rd_rn),
24982  cCE("cfmvah32",e200480, 2, (RMAX, RMFX),             rd_rn),
24983  cCE("cfmv32ah",e100480, 2, (RMFX, RMAX),             rd_rn),
24984  cCE("cfmva32", e2004a0, 2, (RMAX, RMFX),             rd_rn),
24985  cCE("cfmv32a", e1004a0, 2, (RMFX, RMAX),             rd_rn),
24986  cCE("cfmva64", e2004c0, 2, (RMAX, RMDX),             rd_rn),
24987  cCE("cfmv64a", e1004c0, 2, (RMDX, RMAX),             rd_rn),
24988  cCE("cfmvsc32",e2004e0, 2, (RMDS, RMDX),             mav_dspsc),
24989  cCE("cfmv32sc",e1004e0, 2, (RMDX, RMDS),             rd),
24990  cCE("cfcpys",  e000400, 2, (RMF, RMF),               rd_rn),
24991  cCE("cfcpyd",  e000420, 2, (RMD, RMD),               rd_rn),
24992  cCE("cfcvtsd", e000460, 2, (RMD, RMF),               rd_rn),
24993  cCE("cfcvtds", e000440, 2, (RMF, RMD),               rd_rn),
24994  cCE("cfcvt32s",e000480, 2, (RMF, RMFX),              rd_rn),
24995  cCE("cfcvt32d",e0004a0, 2, (RMD, RMFX),              rd_rn),
24996  cCE("cfcvt64s",e0004c0, 2, (RMF, RMDX),              rd_rn),
24997  cCE("cfcvt64d",e0004e0, 2, (RMD, RMDX),              rd_rn),
24998  cCE("cfcvts32",e100580, 2, (RMFX, RMF),              rd_rn),
24999  cCE("cfcvtd32",e1005a0, 2, (RMFX, RMD),              rd_rn),
25000  cCE("cftruncs32",e1005c0, 2, (RMFX, RMF),            rd_rn),
25001  cCE("cftruncd32",e1005e0, 2, (RMFX, RMD),            rd_rn),
25002  cCE("cfrshl32",e000550, 3, (RMFX, RMFX, RR),         mav_triple),
25003  cCE("cfrshl64",e000570, 3, (RMDX, RMDX, RR),         mav_triple),
25004  cCE("cfsh32",  e000500, 3, (RMFX, RMFX, I63s),       mav_shift),
25005  cCE("cfsh64",  e200500, 3, (RMDX, RMDX, I63s),       mav_shift),
25006  cCE("cfcmps",  e100490, 3, (RR, RMF, RMF),           rd_rn_rm),
25007  cCE("cfcmpd",  e1004b0, 3, (RR, RMD, RMD),           rd_rn_rm),
25008  cCE("cfcmp32", e100590, 3, (RR, RMFX, RMFX),         rd_rn_rm),
25009  cCE("cfcmp64", e1005b0, 3, (RR, RMDX, RMDX),         rd_rn_rm),
25010  cCE("cfabss",  e300400, 2, (RMF, RMF),               rd_rn),
25011  cCE("cfabsd",  e300420, 2, (RMD, RMD),               rd_rn),
25012  cCE("cfnegs",  e300440, 2, (RMF, RMF),               rd_rn),
25013  cCE("cfnegd",  e300460, 2, (RMD, RMD),               rd_rn),
25014  cCE("cfadds",  e300480, 3, (RMF, RMF, RMF),          rd_rn_rm),
25015  cCE("cfaddd",  e3004a0, 3, (RMD, RMD, RMD),          rd_rn_rm),
25016  cCE("cfsubs",  e3004c0, 3, (RMF, RMF, RMF),          rd_rn_rm),
25017  cCE("cfsubd",  e3004e0, 3, (RMD, RMD, RMD),          rd_rn_rm),
25018  cCE("cfmuls",  e100400, 3, (RMF, RMF, RMF),          rd_rn_rm),
25019  cCE("cfmuld",  e100420, 3, (RMD, RMD, RMD),          rd_rn_rm),
25020  cCE("cfabs32", e300500, 2, (RMFX, RMFX),             rd_rn),
25021  cCE("cfabs64", e300520, 2, (RMDX, RMDX),             rd_rn),
25022  cCE("cfneg32", e300540, 2, (RMFX, RMFX),             rd_rn),
25023  cCE("cfneg64", e300560, 2, (RMDX, RMDX),             rd_rn),
25024  cCE("cfadd32", e300580, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
25025  cCE("cfadd64", e3005a0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
25026  cCE("cfsub32", e3005c0, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
25027  cCE("cfsub64", e3005e0, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
25028  cCE("cfmul32", e100500, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
25029  cCE("cfmul64", e100520, 3, (RMDX, RMDX, RMDX),       rd_rn_rm),
25030  cCE("cfmac32", e100540, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
25031  cCE("cfmsc32", e100560, 3, (RMFX, RMFX, RMFX),       rd_rn_rm),
25032  cCE("cfmadd32",e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
25033  cCE("cfmsub32",e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
25034  cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
25035  cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
25036
25037  /* ARMv8.5-A instructions.  */
25038 #undef  ARM_VARIANT
25039 #define ARM_VARIANT   & arm_ext_sb
25040 #undef  THUMB_VARIANT
25041 #define THUMB_VARIANT & arm_ext_sb
25042  TUF("sb", 57ff070, f3bf8f70, 0, (), noargs, noargs),
25043
25044 #undef  ARM_VARIANT
25045 #define ARM_VARIANT   & arm_ext_predres
25046 #undef  THUMB_VARIANT
25047 #define THUMB_VARIANT & arm_ext_predres
25048  CE("cfprctx", e070f93, 1, (RRnpc), rd),
25049  CE("dvprctx", e070fb3, 1, (RRnpc), rd),
25050  CE("cpprctx", e070ff3, 1, (RRnpc), rd),
25051
25052  /* ARMv8-M instructions.  */
25053 #undef  ARM_VARIANT
25054 #define ARM_VARIANT NULL
25055 #undef  THUMB_VARIANT
25056 #define THUMB_VARIANT & arm_ext_v8m
25057  ToU("sg",    e97fe97f, 0, (),             noargs),
25058  ToC("blxns", 4784,     1, (RRnpc),        t_blx),
25059  ToC("bxns",  4704,     1, (RRnpc),        t_bx),
25060  ToC("tt",    e840f000, 2, (RRnpc, RRnpc), tt),
25061  ToC("ttt",   e840f040, 2, (RRnpc, RRnpc), tt),
25062  ToC("tta",   e840f080, 2, (RRnpc, RRnpc), tt),
25063  ToC("ttat",  e840f0c0, 2, (RRnpc, RRnpc), tt),
25064
25065  /* FP for ARMv8-M Mainline.  Enabled for ARMv8-M Mainline because the
25066     instructions behave as nop if no VFP is present.  */
25067 #undef  THUMB_VARIANT
25068 #define THUMB_VARIANT & arm_ext_v8m_main
25069  ToC("vlldm", ec300a00, 1, (RRnpc), rn),
25070  ToC("vlstm", ec200a00, 1, (RRnpc), rn),
25071
25072  /* Armv8.1-M Mainline instructions.  */
25073 #undef  THUMB_VARIANT
25074 #define THUMB_VARIANT & arm_ext_v8_1m_main
25075  toC("bf",     _bf,     2, (EXPs, EXPs),             t_branch_future),
25076  toU("bfcsel", _bfcsel, 4, (EXPs, EXPs, EXPs, COND), t_branch_future),
25077  toC("bfx",    _bfx,    2, (EXPs, RRnpcsp),          t_branch_future),
25078  toC("bfl",    _bfl,    2, (EXPs, EXPs),             t_branch_future),
25079  toC("bflx",   _bflx,   2, (EXPs, RRnpcsp),          t_branch_future),
25080
25081  toU("dls", _dls, 2, (LR, RRnpcsp),      t_loloop),
25082  toU("wls", _wls, 3, (LR, RRnpcsp, EXP), t_loloop),
25083  toU("le",  _le,  2, (oLR, EXP),         t_loloop),
25084
25085  ToC("clrm",    e89f0000, 1, (CLRMLST),  t_clrm),
25086  ToC("vscclrm", ec9f0a00, 1, (VRSDVLST), t_vscclrm),
25087
25088 #undef  THUMB_VARIANT
25089 #define THUMB_VARIANT & mve_ext
25090
25091  ToC("vpt",     ee410f00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25092  ToC("vptt",    ee018f00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25093  ToC("vpte",    ee418f00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25094  ToC("vpttt",   ee014f00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25095  ToC("vptte",   ee01cf00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25096  ToC("vptet",   ee41cf00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25097  ToC("vptee",   ee414f00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25098  ToC("vptttt",  ee012f00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25099  ToC("vpttte",  ee016f00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25100  ToC("vpttet",  ee01ef00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25101  ToC("vpttee",  ee01af00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25102  ToC("vptett",  ee41af00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25103  ToC("vptete",  ee41ef00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25104  ToC("vpteet",  ee416f00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25105  ToC("vpteee",  ee412f00, 3, (COND, RMQ, RMQRZ), mve_vpt),
25106
25107  ToC("vpst",    fe710f4d, 0, (), mve_vpt),
25108  ToC("vpstt",   fe318f4d, 0, (), mve_vpt),
25109  ToC("vpste",   fe718f4d, 0, (), mve_vpt),
25110  ToC("vpsttt",  fe314f4d, 0, (), mve_vpt),
25111  ToC("vpstte",  fe31cf4d, 0, (), mve_vpt),
25112  ToC("vpstet",  fe71cf4d, 0, (), mve_vpt),
25113  ToC("vpstee",  fe714f4d, 0, (), mve_vpt),
25114  ToC("vpstttt", fe312f4d, 0, (), mve_vpt),
25115  ToC("vpsttte", fe316f4d, 0, (), mve_vpt),
25116  ToC("vpsttet", fe31ef4d, 0, (), mve_vpt),
25117  ToC("vpsttee", fe31af4d, 0, (), mve_vpt),
25118  ToC("vpstett", fe71af4d, 0, (), mve_vpt),
25119  ToC("vpstete", fe71ef4d, 0, (), mve_vpt),
25120  ToC("vpsteet", fe716f4d, 0, (), mve_vpt),
25121  ToC("vpsteee", fe712f4d, 0, (), mve_vpt),
25122
25123  /* MVE and MVE FP only.  */
25124  mToC("vhcadd", ee000f00,   4, (RMQ, RMQ, RMQ, EXPi),             mve_vhcadd),
25125  mCEF(vadc,     _vadc,      3, (RMQ, RMQ, RMQ),                   mve_vadc),
25126  mCEF(vadci,    _vadci,     3, (RMQ, RMQ, RMQ),                   mve_vadc),
25127  mToC("vsbc",   fe300f00,   3, (RMQ, RMQ, RMQ),                   mve_vsbc),
25128  mToC("vsbci",  fe301f00,   3, (RMQ, RMQ, RMQ),                   mve_vsbc),
25129  mCEF(vmullb,   _vmullb,    3, (RMQ, RMQ, RMQ),                   mve_vmull),
25130  mCEF(vabav,    _vabav,     3, (RRnpcsp, RMQ, RMQ),               mve_vabav),
25131  mCEF(vmladav,    _vmladav,     3, (RRe, RMQ, RMQ),             mve_vmladav),
25132  mCEF(vmladava,   _vmladava,    3, (RRe, RMQ, RMQ),             mve_vmladav),
25133  mCEF(vmladavx,   _vmladavx,    3, (RRe, RMQ, RMQ),             mve_vmladav),
25134  mCEF(vmladavax,  _vmladavax,   3, (RRe, RMQ, RMQ),             mve_vmladav),
25135  mCEF(vmlav,      _vmladav,     3, (RRe, RMQ, RMQ),             mve_vmladav),
25136  mCEF(vmlava,     _vmladava,    3, (RRe, RMQ, RMQ),             mve_vmladav),
25137  mCEF(vmlsdav,    _vmlsdav,     3, (RRe, RMQ, RMQ),             mve_vmladav),
25138  mCEF(vmlsdava,   _vmlsdava,    3, (RRe, RMQ, RMQ),             mve_vmladav),
25139  mCEF(vmlsdavx,   _vmlsdavx,    3, (RRe, RMQ, RMQ),             mve_vmladav),
25140  mCEF(vmlsdavax,  _vmlsdavax,   3, (RRe, RMQ, RMQ),             mve_vmladav),
25141
25142  mCEF(vst20,    _vst20,     2, (MSTRLST2, ADDRMVE),             mve_vst_vld),
25143  mCEF(vst21,    _vst21,     2, (MSTRLST2, ADDRMVE),             mve_vst_vld),
25144  mCEF(vst40,    _vst40,     2, (MSTRLST4, ADDRMVE),             mve_vst_vld),
25145  mCEF(vst41,    _vst41,     2, (MSTRLST4, ADDRMVE),             mve_vst_vld),
25146  mCEF(vst42,    _vst42,     2, (MSTRLST4, ADDRMVE),             mve_vst_vld),
25147  mCEF(vst43,    _vst43,     2, (MSTRLST4, ADDRMVE),             mve_vst_vld),
25148  mCEF(vld20,    _vld20,     2, (MSTRLST2, ADDRMVE),             mve_vst_vld),
25149  mCEF(vld21,    _vld21,     2, (MSTRLST2, ADDRMVE),             mve_vst_vld),
25150  mCEF(vld40,    _vld40,     2, (MSTRLST4, ADDRMVE),             mve_vst_vld),
25151  mCEF(vld41,    _vld41,     2, (MSTRLST4, ADDRMVE),             mve_vst_vld),
25152  mCEF(vld42,    _vld42,     2, (MSTRLST4, ADDRMVE),             mve_vst_vld),
25153  mCEF(vld43,    _vld43,     2, (MSTRLST4, ADDRMVE),             mve_vst_vld),
25154  mCEF(vstrb,    _vstrb,     2, (RMQ, ADDRMVE),                  mve_vstr_vldr),
25155  mCEF(vstrh,    _vstrh,     2, (RMQ, ADDRMVE),                  mve_vstr_vldr),
25156  mCEF(vstrw,    _vstrw,     2, (RMQ, ADDRMVE),                  mve_vstr_vldr),
25157  mCEF(vstrd,    _vstrd,     2, (RMQ, ADDRMVE),                  mve_vstr_vldr),
25158  mCEF(vldrb,    _vldrb,     2, (RMQ, ADDRMVE),                  mve_vstr_vldr),
25159  mCEF(vldrh,    _vldrh,     2, (RMQ, ADDRMVE),                  mve_vstr_vldr),
25160  mCEF(vldrw,    _vldrw,     2, (RMQ, ADDRMVE),                  mve_vstr_vldr),
25161  mCEF(vldrd,    _vldrd,     2, (RMQ, ADDRMVE),                  mve_vstr_vldr),
25162
25163  mCEF(vmovnt,   _vmovnt,    2, (RMQ, RMQ),                        mve_movn),
25164  mCEF(vmovnb,   _vmovnb,    2, (RMQ, RMQ),                        mve_movn),
25165  mCEF(vbrsr,    _vbrsr,     3, (RMQ, RMQ, RR),                    mve_vbrsr),
25166  mCEF(vaddlv,   _vaddlv,    3, (RRe, RRo, RMQ),                   mve_vaddlv),
25167  mCEF(vaddlva,  _vaddlva,   3, (RRe, RRo, RMQ),                   mve_vaddlv),
25168  mCEF(vaddv,    _vaddv,     2, (RRe, RMQ),                        mve_vaddv),
25169  mCEF(vaddva,   _vaddva,    2, (RRe, RMQ),                        mve_vaddv),
25170  mCEF(vddup,    _vddup,     3, (RMQ, RRe, EXPi),                  mve_viddup),
25171  mCEF(vdwdup,   _vdwdup,    4, (RMQ, RRe, RR, EXPi),              mve_viddup),
25172  mCEF(vidup,    _vidup,     3, (RMQ, RRe, EXPi),                  mve_viddup),
25173  mCEF(viwdup,   _viwdup,    4, (RMQ, RRe, RR, EXPi),              mve_viddup),
25174  mToC("vmaxa",  ee330e81,   2, (RMQ, RMQ),                        mve_vmaxa_vmina),
25175  mToC("vmina",  ee331e81,   2, (RMQ, RMQ),                        mve_vmaxa_vmina),
25176  mCEF(vmaxv,    _vmaxv,   2, (RR, RMQ),                           mve_vmaxv),
25177  mCEF(vmaxav,   _vmaxav,  2, (RR, RMQ),                           mve_vmaxv),
25178  mCEF(vminv,    _vminv,   2, (RR, RMQ),                           mve_vmaxv),
25179  mCEF(vminav,   _vminav,  2, (RR, RMQ),                           mve_vmaxv),
25180
25181  mCEF(vmlaldav,   _vmlaldav,    4, (RRe, RRo, RMQ, RMQ),        mve_vmlaldav),
25182  mCEF(vmlaldava,  _vmlaldava,   4, (RRe, RRo, RMQ, RMQ),        mve_vmlaldav),
25183  mCEF(vmlaldavx,  _vmlaldavx,   4, (RRe, RRo, RMQ, RMQ),        mve_vmlaldav),
25184  mCEF(vmlaldavax, _vmlaldavax,  4, (RRe, RRo, RMQ, RMQ),        mve_vmlaldav),
25185  mCEF(vmlalv,     _vmlaldav,    4, (RRe, RRo, RMQ, RMQ),        mve_vmlaldav),
25186  mCEF(vmlalva,    _vmlaldava,   4, (RRe, RRo, RMQ, RMQ),        mve_vmlaldav),
25187  mCEF(vmlsldav,   _vmlsldav,    4, (RRe, RRo, RMQ, RMQ),        mve_vmlaldav),
25188  mCEF(vmlsldava,  _vmlsldava,   4, (RRe, RRo, RMQ, RMQ),        mve_vmlaldav),
25189  mCEF(vmlsldavx,  _vmlsldavx,   4, (RRe, RRo, RMQ, RMQ),        mve_vmlaldav),
25190  mCEF(vmlsldavax, _vmlsldavax,  4, (RRe, RRo, RMQ, RMQ),        mve_vmlaldav),
25191  mToC("vrmlaldavh", ee800f00,      4, (RRe, RR, RMQ, RMQ),  mve_vrmlaldavh),
25192  mToC("vrmlaldavha",ee800f20,      4, (RRe, RR, RMQ, RMQ),  mve_vrmlaldavh),
25193  mCEF(vrmlaldavhx,  _vrmlaldavhx,  4, (RRe, RR, RMQ, RMQ),  mve_vrmlaldavh),
25194  mCEF(vrmlaldavhax, _vrmlaldavhax, 4, (RRe, RR, RMQ, RMQ),  mve_vrmlaldavh),
25195  mToC("vrmlalvh",   ee800f00,      4, (RRe, RR, RMQ, RMQ),  mve_vrmlaldavh),
25196  mToC("vrmlalvha",  ee800f20,      4, (RRe, RR, RMQ, RMQ),  mve_vrmlaldavh),
25197  mCEF(vrmlsldavh,   _vrmlsldavh,   4, (RRe, RR, RMQ, RMQ),  mve_vrmlaldavh),
25198  mCEF(vrmlsldavha,  _vrmlsldavha,  4, (RRe, RR, RMQ, RMQ),  mve_vrmlaldavh),
25199  mCEF(vrmlsldavhx,  _vrmlsldavhx,  4, (RRe, RR, RMQ, RMQ),  mve_vrmlaldavh),
25200  mCEF(vrmlsldavhax, _vrmlsldavhax, 4, (RRe, RR, RMQ, RMQ),  mve_vrmlaldavh),
25201
25202  mToC("vmlas",    ee011e40,     3, (RMQ, RMQ, RR),              mve_vmlas),
25203  mToC("vmulh",    ee010e01,     3, (RMQ, RMQ, RMQ),             mve_vmulh),
25204  mToC("vrmulh",   ee011e01,     3, (RMQ, RMQ, RMQ),             mve_vmulh),
25205  mToC("vpnot",    fe310f4d,     0, (),                          mve_vpnot),
25206  mToC("vpsel",    fe310f01,     3, (RMQ, RMQ, RMQ),             mve_vpsel),
25207
25208  mToC("vqdmladh",  ee000e00,    3, (RMQ, RMQ, RMQ),             mve_vqdmladh),
25209  mToC("vqdmladhx", ee001e00,    3, (RMQ, RMQ, RMQ),             mve_vqdmladh),
25210  mToC("vqrdmladh", ee000e01,    3, (RMQ, RMQ, RMQ),             mve_vqdmladh),
25211  mToC("vqrdmladhx",ee001e01,    3, (RMQ, RMQ, RMQ),             mve_vqdmladh),
25212  mToC("vqdmlsdh",  fe000e00,    3, (RMQ, RMQ, RMQ),             mve_vqdmladh),
25213  mToC("vqdmlsdhx", fe001e00,    3, (RMQ, RMQ, RMQ),             mve_vqdmladh),
25214  mToC("vqrdmlsdh", fe000e01,    3, (RMQ, RMQ, RMQ),             mve_vqdmladh),
25215  mToC("vqrdmlsdhx",fe001e01,    3, (RMQ, RMQ, RMQ),             mve_vqdmladh),
25216  mToC("vqdmlah",   ee000e60,    3, (RMQ, RMQ, RR),              mve_vqdmlah),
25217  mToC("vqdmlash",  ee001e60,    3, (RMQ, RMQ, RR),              mve_vqdmlah),
25218  mToC("vqrdmlash", ee001e40,    3, (RMQ, RMQ, RR),              mve_vqdmlah),
25219  mToC("vqdmullt",  ee301f00,    3, (RMQ, RMQ, RMQRR),           mve_vqdmull),
25220  mToC("vqdmullb",  ee300f00,    3, (RMQ, RMQ, RMQRR),           mve_vqdmull),
25221  mCEF(vqmovnt,    _vqmovnt,     2, (RMQ, RMQ),                  mve_vqmovn),
25222  mCEF(vqmovnb,    _vqmovnb,     2, (RMQ, RMQ),                  mve_vqmovn),
25223  mCEF(vqmovunt,   _vqmovunt,    2, (RMQ, RMQ),                  mve_vqmovn),
25224  mCEF(vqmovunb,   _vqmovunb,    2, (RMQ, RMQ),                  mve_vqmovn),
25225
25226  mCEF(vshrnt,     _vshrnt,      3, (RMQ, RMQ, I32z),    mve_vshrn),
25227  mCEF(vshrnb,     _vshrnb,      3, (RMQ, RMQ, I32z),    mve_vshrn),
25228  mCEF(vrshrnt,    _vrshrnt,     3, (RMQ, RMQ, I32z),    mve_vshrn),
25229  mCEF(vrshrnb,    _vrshrnb,     3, (RMQ, RMQ, I32z),    mve_vshrn),
25230  mCEF(vqshrnt,    _vqrshrnt,    3, (RMQ, RMQ, I32z),    mve_vshrn),
25231  mCEF(vqshrnb,    _vqrshrnb,    3, (RMQ, RMQ, I32z),    mve_vshrn),
25232  mCEF(vqshrunt,   _vqrshrunt,   3, (RMQ, RMQ, I32z),    mve_vshrn),
25233  mCEF(vqshrunb,   _vqrshrunb,   3, (RMQ, RMQ, I32z),    mve_vshrn),
25234  mCEF(vqrshrnt,   _vqrshrnt,    3, (RMQ, RMQ, I32z),    mve_vshrn),
25235  mCEF(vqrshrnb,   _vqrshrnb,    3, (RMQ, RMQ, I32z),    mve_vshrn),
25236  mCEF(vqrshrunt,  _vqrshrunt,   3, (RMQ, RMQ, I32z),    mve_vshrn),
25237  mCEF(vqrshrunb,  _vqrshrunb,   3, (RMQ, RMQ, I32z),    mve_vshrn),
25238
25239  mToC("vshlc",      eea00fc0,      3, (RMQ, RR, I32z),      mve_vshlc),
25240  mToC("vshllt",     ee201e00,      3, (RMQ, RMQ, I32),      mve_vshll),
25241  mToC("vshllb",     ee200e00,      3, (RMQ, RMQ, I32),      mve_vshll),
25242
25243 #undef THUMB_VARIANT
25244 #define THUMB_VARIANT & mve_fp_ext
25245  mToC("vcmul", ee300e00,   4, (RMQ, RMQ, RMQ, EXPi),              mve_vcmul),
25246  mToC("vfmas", ee311e40,   3, (RMQ, RMQ, RR),                     mve_vfmas),
25247  mToC("vmaxnma", ee3f0e81, 2, (RMQ, RMQ),                         mve_vmaxnma_vminnma),
25248  mToC("vminnma", ee3f1e81, 2, (RMQ, RMQ),                         mve_vmaxnma_vminnma),
25249  mToC("vmaxnmv", eeee0f00, 2, (RR, RMQ),                          mve_vmaxnmv),
25250  mToC("vmaxnmav",eeec0f00, 2, (RR, RMQ),                          mve_vmaxnmv),
25251  mToC("vminnmv", eeee0f80, 2, (RR, RMQ),                          mve_vmaxnmv),
25252  mToC("vminnmav",eeec0f80, 2, (RR, RMQ),                          mve_vmaxnmv),
25253
25254 #undef  ARM_VARIANT
25255 #define ARM_VARIANT  & fpu_vfp_ext_v1
25256 #undef  THUMB_VARIANT
25257 #define THUMB_VARIANT  & arm_ext_v6t2
25258  mnCEF(vmla,     _vmla,    3, (RNSDQMQ, oRNSDQMQ, RNSDQ_RNSC_MQ_RR), neon_mac_maybe_scalar),
25259  mnCEF(vmul,     _vmul,    3, (RNSDQMQ, oRNSDQMQ, RNSDQ_RNSC_MQ_RR), neon_mul),
25260
25261  mcCE(fcpyd,    eb00b40, 2, (RVD, RVD),       vfp_dp_rd_rm),
25262
25263 #undef  ARM_VARIANT
25264 #define ARM_VARIANT  & fpu_vfp_ext_v1xd
25265
25266  MNCE(vmov,   0,        1, (VMOV),            neon_mov),
25267  mcCE(fmrs,     e100a10, 2, (RR, RVS),        vfp_reg_from_sp),
25268  mcCE(fmsr,     e000a10, 2, (RVS, RR),        vfp_sp_from_reg),
25269  mcCE(fcpys,    eb00a40, 2, (RVS, RVS),       vfp_sp_monadic),
25270
25271  mCEF(vmullt, _vmullt,  3, (RNSDQMQ, oRNSDQMQ, RNSDQ_RNSC_MQ),  mve_vmull),
25272  mnCEF(vadd,  _vadd,    3, (RNSDQMQ, oRNSDQMQ, RNSDQMQR),       neon_addsub_if_i),
25273  mnCEF(vsub,  _vsub,    3, (RNSDQMQ, oRNSDQMQ, RNSDQMQR),       neon_addsub_if_i),
25274
25275  MNCEF(vabs,  1b10300,  2, (RNSDQMQ, RNSDQMQ),  neon_abs_neg),
25276  MNCEF(vneg,  1b10380,  2, (RNSDQMQ, RNSDQMQ),  neon_abs_neg),
25277
25278  mCEF(vmovlt, _vmovlt,  1, (VMOV),              mve_movl),
25279  mCEF(vmovlb, _vmovlb,  1, (VMOV),              mve_movl),
25280
25281  mnCE(vcmp,      _vcmp,    3, (RVSD_COND, RSVDMQ_FI0, oRMQRZ),    vfp_nsyn_cmp),
25282  mnCE(vcmpe,     _vcmpe,   3, (RVSD_COND, RSVDMQ_FI0, oRMQRZ),    vfp_nsyn_cmp),
25283
25284 #undef  ARM_VARIANT
25285 #define ARM_VARIANT  & fpu_vfp_ext_v2
25286
25287  mcCE(fmsrr,    c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
25288  mcCE(fmrrs,    c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
25289  mcCE(fmdrr,    c400b10, 3, (RVD, RR, RR),    vfp_dp_rm_rd_rn),
25290  mcCE(fmrrd,    c500b10, 3, (RR, RR, RVD),    vfp_dp_rd_rn_rm),
25291
25292 #undef  ARM_VARIANT
25293 #define ARM_VARIANT    & fpu_vfp_ext_armv8xd
25294  mnUF(vcvta,  _vcvta,  2, (RNSDQMQ, oRNSDQMQ),          neon_cvta),
25295  mnUF(vcvtp,  _vcvta,  2, (RNSDQMQ, oRNSDQMQ),          neon_cvtp),
25296  mnUF(vcvtn,  _vcvta,  3, (RNSDQMQ, oRNSDQMQ, oI32z),   neon_cvtn),
25297  mnUF(vcvtm,  _vcvta,  2, (RNSDQMQ, oRNSDQMQ),          neon_cvtm),
25298  mnUF(vmaxnm, _vmaxnm, 3, (RNSDQMQ, oRNSDQMQ, RNSDQMQ), vmaxnm),
25299  mnUF(vminnm, _vminnm, 3, (RNSDQMQ, oRNSDQMQ, RNSDQMQ), vmaxnm),
25300
25301 #undef  ARM_VARIANT
25302 #define ARM_VARIANT & fpu_neon_ext_v1
25303  mnUF(vabd,      _vabd,           3, (RNDQMQ, oRNDQMQ, RNDQMQ), neon_dyadic_if_su),
25304  mnUF(vabdl,     _vabdl,          3, (RNQMQ, RNDMQ, RNDMQ),   neon_dyadic_long),
25305  mnUF(vaddl,     _vaddl,          3, (RNQMQ, RNDMQ, RNDMQR),  neon_dyadic_long),
25306  mnUF(vsubl,     _vsubl,          3, (RNQMQ, RNDMQ, RNDMQR),  neon_dyadic_long),
25307  mnUF(vand,      _vand,           3, (RNDQMQ, oRNDQMQ, RNDQMQ_Ibig), neon_logic),
25308  mnUF(vbic,      _vbic,           3, (RNDQMQ, oRNDQMQ, RNDQMQ_Ibig), neon_logic),
25309  mnUF(vorr,      _vorr,           3, (RNDQMQ, oRNDQMQ, RNDQMQ_Ibig), neon_logic),
25310  mnUF(vorn,      _vorn,           3, (RNDQMQ, oRNDQMQ, RNDQMQ_Ibig), neon_logic),
25311  mnUF(veor,      _veor,           3, (RNDQMQ, oRNDQMQ, RNDQMQ),      neon_logic),
25312  MNUF(vcls,      1b00400,         2, (RNDQMQ, RNDQMQ),               neon_cls),
25313  MNUF(vclz,      1b00480,         2, (RNDQMQ, RNDQMQ),               neon_clz),
25314  mnCE(vdup,      _vdup,           2, (RNDQMQ, RR_RNSC),              neon_dup),
25315  MNUF(vhadd,     00000000,        3, (RNDQMQ, oRNDQMQ, RNDQMQR),  neon_dyadic_i_su),
25316  MNUF(vrhadd,    00000100,        3, (RNDQMQ, oRNDQMQ, RNDQMQ),   neon_dyadic_i_su),
25317  MNUF(vhsub,     00000200,        3, (RNDQMQ, oRNDQMQ, RNDQMQR),  neon_dyadic_i_su),
25318  mnUF(vmin,      _vmin,    3, (RNDQMQ, oRNDQMQ, RNDQMQ), neon_dyadic_if_su),
25319  mnUF(vmax,      _vmax,    3, (RNDQMQ, oRNDQMQ, RNDQMQ), neon_dyadic_if_su),
25320  MNUF(vqadd,     0000010,  3, (RNDQMQ, oRNDQMQ, RNDQMQR), neon_dyadic_i64_su),
25321  MNUF(vqsub,     0000210,  3, (RNDQMQ, oRNDQMQ, RNDQMQR), neon_dyadic_i64_su),
25322  mnUF(vmvn,      _vmvn,    2, (RNDQMQ, RNDQMQ_Ibig), neon_mvn),
25323  MNUF(vqabs,     1b00700,  2, (RNDQMQ, RNDQMQ),     neon_sat_abs_neg),
25324  MNUF(vqneg,     1b00780,  2, (RNDQMQ, RNDQMQ),     neon_sat_abs_neg),
25325  mnUF(vqrdmlah,  _vqrdmlah,3, (RNDQMQ, oRNDQMQ, RNDQ_RNSC_RR), neon_qrdmlah),
25326  mnUF(vqdmulh,   _vqdmulh, 3, (RNDQMQ, oRNDQMQ, RNDQMQ_RNSC_RR), neon_qdmulh),
25327  mnUF(vqrdmulh,  _vqrdmulh,3, (RNDQMQ, oRNDQMQ, RNDQMQ_RNSC_RR), neon_qdmulh),
25328  MNUF(vqrshl,    0000510,  3, (RNDQMQ, oRNDQMQ, RNDQMQR), neon_rshl),
25329  MNUF(vrshl,     0000500,  3, (RNDQMQ, oRNDQMQ, RNDQMQR), neon_rshl),
25330  MNUF(vshr,      0800010,  3, (RNDQMQ, oRNDQMQ, I64z), neon_rshift_round_imm),
25331  MNUF(vrshr,     0800210,  3, (RNDQMQ, oRNDQMQ, I64z), neon_rshift_round_imm),
25332  MNUF(vsli,      1800510,  3, (RNDQMQ, oRNDQMQ, I63),  neon_sli),
25333  MNUF(vsri,      1800410,  3, (RNDQMQ, oRNDQMQ, I64z), neon_sri),
25334  MNUF(vrev64,    1b00000,  2, (RNDQMQ, RNDQMQ),     neon_rev),
25335  MNUF(vrev32,    1b00080,  2, (RNDQMQ, RNDQMQ),     neon_rev),
25336  MNUF(vrev16,    1b00100,  2, (RNDQMQ, RNDQMQ),     neon_rev),
25337  mnUF(vshl,      _vshl,    3, (RNDQMQ, oRNDQMQ, RNDQMQ_I63b_RR), neon_shl),
25338  mnUF(vqshl,     _vqshl,   3, (RNDQMQ, oRNDQMQ, RNDQMQ_I63b_RR), neon_qshl),
25339  MNUF(vqshlu,    1800610,  3, (RNDQMQ, oRNDQMQ, I63),            neon_qshlu_imm),
25340
25341 #undef  ARM_VARIANT
25342 #define ARM_VARIANT & arm_ext_v8_3
25343 #undef  THUMB_VARIANT
25344 #define THUMB_VARIANT & arm_ext_v6t2_v8m
25345  MNUF (vcadd, 0, 4, (RNDQMQ, RNDQMQ, RNDQMQ, EXPi), vcadd),
25346  MNUF (vcmla, 0, 4, (RNDQMQ, RNDQMQ, RNDQMQ_RNSC, EXPi), vcmla),
25347 };
25348 #undef ARM_VARIANT
25349 #undef THUMB_VARIANT
25350 #undef TCE
25351 #undef TUE
25352 #undef TUF
25353 #undef TCC
25354 #undef cCE
25355 #undef cCL
25356 #undef C3E
25357 #undef C3
25358 #undef CE
25359 #undef CM
25360 #undef CL
25361 #undef UE
25362 #undef UF
25363 #undef UT
25364 #undef NUF
25365 #undef nUF
25366 #undef NCE
25367 #undef nCE
25368 #undef OPS0
25369 #undef OPS1
25370 #undef OPS2
25371 #undef OPS3
25372 #undef OPS4
25373 #undef OPS5
25374 #undef OPS6
25375 #undef do_0
25376 #undef ToC
25377 #undef toC
25378 #undef ToU
25379 #undef toU
25380 \f
25381 /* MD interface: bits in the object file.  */
25382
25383 /* Turn an integer of n bytes (in val) into a stream of bytes appropriate
25384    for use in the a.out file, and stores them in the array pointed to by buf.
25385    This knows about the endian-ness of the target machine and does
25386    THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
25387    2 (short) and 4 (long)  Floating numbers are put out as a series of
25388    LITTLENUMS (shorts, here at least).  */
25389
25390 void
25391 md_number_to_chars (char * buf, valueT val, int n)
25392 {
25393   if (target_big_endian)
25394     number_to_chars_bigendian (buf, val, n);
25395   else
25396     number_to_chars_littleendian (buf, val, n);
25397 }
25398
25399 static valueT
25400 md_chars_to_number (char * buf, int n)
25401 {
25402   valueT result = 0;
25403   unsigned char * where = (unsigned char *) buf;
25404
25405   if (target_big_endian)
25406     {
25407       while (n--)
25408         {
25409           result <<= 8;
25410           result |= (*where++ & 255);
25411         }
25412     }
25413   else
25414     {
25415       while (n--)
25416         {
25417           result <<= 8;
25418           result |= (where[n] & 255);
25419         }
25420     }
25421
25422   return result;
25423 }
25424
25425 /* MD interface: Sections.  */
25426
25427 /* Calculate the maximum variable size (i.e., excluding fr_fix)
25428    that an rs_machine_dependent frag may reach.  */
25429
25430 unsigned int
25431 arm_frag_max_var (fragS *fragp)
25432 {
25433   /* We only use rs_machine_dependent for variable-size Thumb instructions,
25434      which are either THUMB_SIZE (2) or INSN_SIZE (4).
25435
25436      Note that we generate relaxable instructions even for cases that don't
25437      really need it, like an immediate that's a trivial constant.  So we're
25438      overestimating the instruction size for some of those cases.  Rather
25439      than putting more intelligence here, it would probably be better to
25440      avoid generating a relaxation frag in the first place when it can be
25441      determined up front that a short instruction will suffice.  */
25442
25443   gas_assert (fragp->fr_type == rs_machine_dependent);
25444   return INSN_SIZE;
25445 }
25446
25447 /* Estimate the size of a frag before relaxing.  Assume everything fits in
25448    2 bytes.  */
25449
25450 int
25451 md_estimate_size_before_relax (fragS * fragp,
25452                                segT    segtype ATTRIBUTE_UNUSED)
25453 {
25454   fragp->fr_var = 2;
25455   return 2;
25456 }
25457
25458 /* Convert a machine dependent frag.  */
25459
25460 void
25461 md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
25462 {
25463   unsigned long insn;
25464   unsigned long old_op;
25465   char *buf;
25466   expressionS exp;
25467   fixS *fixp;
25468   int reloc_type;
25469   int pc_rel;
25470   int opcode;
25471
25472   buf = fragp->fr_literal + fragp->fr_fix;
25473
25474   old_op = bfd_get_16(abfd, buf);
25475   if (fragp->fr_symbol)
25476     {
25477       exp.X_op = O_symbol;
25478       exp.X_add_symbol = fragp->fr_symbol;
25479     }
25480   else
25481     {
25482       exp.X_op = O_constant;
25483     }
25484   exp.X_add_number = fragp->fr_offset;
25485   opcode = fragp->fr_subtype;
25486   switch (opcode)
25487     {
25488     case T_MNEM_ldr_pc:
25489     case T_MNEM_ldr_pc2:
25490     case T_MNEM_ldr_sp:
25491     case T_MNEM_str_sp:
25492     case T_MNEM_ldr:
25493     case T_MNEM_ldrb:
25494     case T_MNEM_ldrh:
25495     case T_MNEM_str:
25496     case T_MNEM_strb:
25497     case T_MNEM_strh:
25498       if (fragp->fr_var == 4)
25499         {
25500           insn = THUMB_OP32 (opcode);
25501           if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
25502             {
25503               insn |= (old_op & 0x700) << 4;
25504             }
25505           else
25506             {
25507               insn |= (old_op & 7) << 12;
25508               insn |= (old_op & 0x38) << 13;
25509             }
25510           insn |= 0x00000c00;
25511           put_thumb32_insn (buf, insn);
25512           reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
25513         }
25514       else
25515         {
25516           reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
25517         }
25518       pc_rel = (opcode == T_MNEM_ldr_pc2);
25519       break;
25520     case T_MNEM_adr:
25521       if (fragp->fr_var == 4)
25522         {
25523           insn = THUMB_OP32 (opcode);
25524           insn |= (old_op & 0xf0) << 4;
25525           put_thumb32_insn (buf, insn);
25526           reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
25527         }
25528       else
25529         {
25530           reloc_type = BFD_RELOC_ARM_THUMB_ADD;
25531           exp.X_add_number -= 4;
25532         }
25533       pc_rel = 1;
25534       break;
25535     case T_MNEM_mov:
25536     case T_MNEM_movs:
25537     case T_MNEM_cmp:
25538     case T_MNEM_cmn:
25539       if (fragp->fr_var == 4)
25540         {
25541           int r0off = (opcode == T_MNEM_mov
25542                        || opcode == T_MNEM_movs) ? 0 : 8;
25543           insn = THUMB_OP32 (opcode);
25544           insn = (insn & 0xe1ffffff) | 0x10000000;
25545           insn |= (old_op & 0x700) << r0off;
25546           put_thumb32_insn (buf, insn);
25547           reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
25548         }
25549       else
25550         {
25551           reloc_type = BFD_RELOC_ARM_THUMB_IMM;
25552         }
25553       pc_rel = 0;
25554       break;
25555     case T_MNEM_b:
25556       if (fragp->fr_var == 4)
25557         {
25558           insn = THUMB_OP32(opcode);
25559           put_thumb32_insn (buf, insn);
25560           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
25561         }
25562       else
25563         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
25564       pc_rel = 1;
25565       break;
25566     case T_MNEM_bcond:
25567       if (fragp->fr_var == 4)
25568         {
25569           insn = THUMB_OP32(opcode);
25570           insn |= (old_op & 0xf00) << 14;
25571           put_thumb32_insn (buf, insn);
25572           reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
25573         }
25574       else
25575         reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
25576       pc_rel = 1;
25577       break;
25578     case T_MNEM_add_sp:
25579     case T_MNEM_add_pc:
25580     case T_MNEM_inc_sp:
25581     case T_MNEM_dec_sp:
25582       if (fragp->fr_var == 4)
25583         {
25584           /* ??? Choose between add and addw.  */
25585           insn = THUMB_OP32 (opcode);
25586           insn |= (old_op & 0xf0) << 4;
25587           put_thumb32_insn (buf, insn);
25588           if (opcode == T_MNEM_add_pc)
25589             reloc_type = BFD_RELOC_ARM_T32_IMM12;
25590           else
25591             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
25592         }
25593       else
25594         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
25595       pc_rel = 0;
25596       break;
25597
25598     case T_MNEM_addi:
25599     case T_MNEM_addis:
25600     case T_MNEM_subi:
25601     case T_MNEM_subis:
25602       if (fragp->fr_var == 4)
25603         {
25604           insn = THUMB_OP32 (opcode);
25605           insn |= (old_op & 0xf0) << 4;
25606           insn |= (old_op & 0xf) << 16;
25607           put_thumb32_insn (buf, insn);
25608           if (insn & (1 << 20))
25609             reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
25610           else
25611             reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
25612         }
25613       else
25614         reloc_type = BFD_RELOC_ARM_THUMB_ADD;
25615       pc_rel = 0;
25616       break;
25617     default:
25618       abort ();
25619     }
25620   fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
25621                       (enum bfd_reloc_code_real) reloc_type);
25622   fixp->fx_file = fragp->fr_file;
25623   fixp->fx_line = fragp->fr_line;
25624   fragp->fr_fix += fragp->fr_var;
25625
25626   /* Set whether we use thumb-2 ISA based on final relaxation results.  */
25627   if (thumb_mode && fragp->fr_var == 4 && no_cpu_selected ()
25628       && !ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_t2))
25629     ARM_MERGE_FEATURE_SETS (arm_arch_used, thumb_arch_used, arm_ext_v6t2);
25630 }
25631
25632 /* Return the size of a relaxable immediate operand instruction.
25633    SHIFT and SIZE specify the form of the allowable immediate.  */
25634 static int
25635 relax_immediate (fragS *fragp, int size, int shift)
25636 {
25637   offsetT offset;
25638   offsetT mask;
25639   offsetT low;
25640
25641   /* ??? Should be able to do better than this.  */
25642   if (fragp->fr_symbol)
25643     return 4;
25644
25645   low = (1 << shift) - 1;
25646   mask = (1 << (shift + size)) - (1 << shift);
25647   offset = fragp->fr_offset;
25648   /* Force misaligned offsets to 32-bit variant.  */
25649   if (offset & low)
25650     return 4;
25651   if (offset & ~mask)
25652     return 4;
25653   return 2;
25654 }
25655
25656 /* Get the address of a symbol during relaxation.  */
25657 static addressT
25658 relaxed_symbol_addr (fragS *fragp, long stretch)
25659 {
25660   fragS *sym_frag;
25661   addressT addr;
25662   symbolS *sym;
25663
25664   sym = fragp->fr_symbol;
25665   sym_frag = symbol_get_frag (sym);
25666   know (S_GET_SEGMENT (sym) != absolute_section
25667         || sym_frag == &zero_address_frag);
25668   addr = S_GET_VALUE (sym) + fragp->fr_offset;
25669
25670   /* If frag has yet to be reached on this pass, assume it will
25671      move by STRETCH just as we did.  If this is not so, it will
25672      be because some frag between grows, and that will force
25673      another pass.  */
25674
25675   if (stretch != 0
25676       && sym_frag->relax_marker != fragp->relax_marker)
25677     {
25678       fragS *f;
25679
25680       /* Adjust stretch for any alignment frag.  Note that if have
25681          been expanding the earlier code, the symbol may be
25682          defined in what appears to be an earlier frag.  FIXME:
25683          This doesn't handle the fr_subtype field, which specifies
25684          a maximum number of bytes to skip when doing an
25685          alignment.  */
25686       for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
25687         {
25688           if (f->fr_type == rs_align || f->fr_type == rs_align_code)
25689             {
25690               if (stretch < 0)
25691                 stretch = - ((- stretch)
25692                              & ~ ((1 << (int) f->fr_offset) - 1));
25693               else
25694                 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
25695               if (stretch == 0)
25696                 break;
25697             }
25698         }
25699       if (f != NULL)
25700         addr += stretch;
25701     }
25702
25703   return addr;
25704 }
25705
25706 /* Return the size of a relaxable adr pseudo-instruction or PC-relative
25707    load.  */
25708 static int
25709 relax_adr (fragS *fragp, asection *sec, long stretch)
25710 {
25711   addressT addr;
25712   offsetT val;
25713
25714   /* Assume worst case for symbols not known to be in the same section.  */
25715   if (fragp->fr_symbol == NULL
25716       || !S_IS_DEFINED (fragp->fr_symbol)
25717       || sec != S_GET_SEGMENT (fragp->fr_symbol)
25718       || S_IS_WEAK (fragp->fr_symbol))
25719     return 4;
25720
25721   val = relaxed_symbol_addr (fragp, stretch);
25722   addr = fragp->fr_address + fragp->fr_fix;
25723   addr = (addr + 4) & ~3;
25724   /* Force misaligned targets to 32-bit variant.  */
25725   if (val & 3)
25726     return 4;
25727   val -= addr;
25728   if (val < 0 || val > 1020)
25729     return 4;
25730   return 2;
25731 }
25732
25733 /* Return the size of a relaxable add/sub immediate instruction.  */
25734 static int
25735 relax_addsub (fragS *fragp, asection *sec)
25736 {
25737   char *buf;
25738   int op;
25739
25740   buf = fragp->fr_literal + fragp->fr_fix;
25741   op = bfd_get_16(sec->owner, buf);
25742   if ((op & 0xf) == ((op >> 4) & 0xf))
25743     return relax_immediate (fragp, 8, 0);
25744   else
25745     return relax_immediate (fragp, 3, 0);
25746 }
25747
25748 /* Return TRUE iff the definition of symbol S could be pre-empted
25749    (overridden) at link or load time.  */
25750 static bfd_boolean
25751 symbol_preemptible (symbolS *s)
25752 {
25753   /* Weak symbols can always be pre-empted.  */
25754   if (S_IS_WEAK (s))
25755     return TRUE;
25756
25757   /* Non-global symbols cannot be pre-empted. */
25758   if (! S_IS_EXTERNAL (s))
25759     return FALSE;
25760
25761 #ifdef OBJ_ELF
25762   /* In ELF, a global symbol can be marked protected, or private.  In that
25763      case it can't be pre-empted (other definitions in the same link unit
25764      would violate the ODR).  */
25765   if (ELF_ST_VISIBILITY (S_GET_OTHER (s)) > STV_DEFAULT)
25766     return FALSE;
25767 #endif
25768
25769   /* Other global symbols might be pre-empted.  */
25770   return TRUE;
25771 }
25772
25773 /* Return the size of a relaxable branch instruction.  BITS is the
25774    size of the offset field in the narrow instruction.  */
25775
25776 static int
25777 relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
25778 {
25779   addressT addr;
25780   offsetT val;
25781   offsetT limit;
25782
25783   /* Assume worst case for symbols not known to be in the same section.  */
25784   if (!S_IS_DEFINED (fragp->fr_symbol)
25785       || sec != S_GET_SEGMENT (fragp->fr_symbol)
25786       || S_IS_WEAK (fragp->fr_symbol))
25787     return 4;
25788
25789 #ifdef OBJ_ELF
25790   /* A branch to a function in ARM state will require interworking.  */
25791   if (S_IS_DEFINED (fragp->fr_symbol)
25792       && ARM_IS_FUNC (fragp->fr_symbol))
25793       return 4;
25794 #endif
25795
25796   if (symbol_preemptible (fragp->fr_symbol))
25797     return 4;
25798
25799   val = relaxed_symbol_addr (fragp, stretch);
25800   addr = fragp->fr_address + fragp->fr_fix + 4;
25801   val -= addr;
25802
25803   /* Offset is a signed value *2 */
25804   limit = 1 << bits;
25805   if (val >= limit || val < -limit)
25806     return 4;
25807   return 2;
25808 }
25809
25810
25811 /* Relax a machine dependent frag.  This returns the amount by which
25812    the current size of the frag should change.  */
25813
25814 int
25815 arm_relax_frag (asection *sec, fragS *fragp, long stretch)
25816 {
25817   int oldsize;
25818   int newsize;
25819
25820   oldsize = fragp->fr_var;
25821   switch (fragp->fr_subtype)
25822     {
25823     case T_MNEM_ldr_pc2:
25824       newsize = relax_adr (fragp, sec, stretch);
25825       break;
25826     case T_MNEM_ldr_pc:
25827     case T_MNEM_ldr_sp:
25828     case T_MNEM_str_sp:
25829       newsize = relax_immediate (fragp, 8, 2);
25830       break;
25831     case T_MNEM_ldr:
25832     case T_MNEM_str:
25833       newsize = relax_immediate (fragp, 5, 2);
25834       break;
25835     case T_MNEM_ldrh:
25836     case T_MNEM_strh:
25837       newsize = relax_immediate (fragp, 5, 1);
25838       break;
25839     case T_MNEM_ldrb:
25840     case T_MNEM_strb:
25841       newsize = relax_immediate (fragp, 5, 0);
25842       break;
25843     case T_MNEM_adr:
25844       newsize = relax_adr (fragp, sec, stretch);
25845       break;
25846     case T_MNEM_mov:
25847     case T_MNEM_movs:
25848     case T_MNEM_cmp:
25849     case T_MNEM_cmn:
25850       newsize = relax_immediate (fragp, 8, 0);
25851       break;
25852     case T_MNEM_b:
25853       newsize = relax_branch (fragp, sec, 11, stretch);
25854       break;
25855     case T_MNEM_bcond:
25856       newsize = relax_branch (fragp, sec, 8, stretch);
25857       break;
25858     case T_MNEM_add_sp:
25859     case T_MNEM_add_pc:
25860       newsize = relax_immediate (fragp, 8, 2);
25861       break;
25862     case T_MNEM_inc_sp:
25863     case T_MNEM_dec_sp:
25864       newsize = relax_immediate (fragp, 7, 2);
25865       break;
25866     case T_MNEM_addi:
25867     case T_MNEM_addis:
25868     case T_MNEM_subi:
25869     case T_MNEM_subis:
25870       newsize = relax_addsub (fragp, sec);
25871       break;
25872     default:
25873       abort ();
25874     }
25875
25876   fragp->fr_var = newsize;
25877   /* Freeze wide instructions that are at or before the same location as
25878      in the previous pass.  This avoids infinite loops.
25879      Don't freeze them unconditionally because targets may be artificially
25880      misaligned by the expansion of preceding frags.  */
25881   if (stretch <= 0 && newsize > 2)
25882     {
25883       md_convert_frag (sec->owner, sec, fragp);
25884       frag_wane (fragp);
25885     }
25886
25887   return newsize - oldsize;
25888 }
25889
25890 /* Round up a section size to the appropriate boundary.  */
25891
25892 valueT
25893 md_section_align (segT   segment ATTRIBUTE_UNUSED,
25894                   valueT size)
25895 {
25896   return size;
25897 }
25898
25899 /* This is called from HANDLE_ALIGN in write.c.  Fill in the contents
25900    of an rs_align_code fragment.  */
25901
25902 void
25903 arm_handle_align (fragS * fragP)
25904 {
25905   static unsigned char const arm_noop[2][2][4] =
25906     {
25907       {  /* ARMv1 */
25908         {0x00, 0x00, 0xa0, 0xe1},  /* LE */
25909         {0xe1, 0xa0, 0x00, 0x00},  /* BE */
25910       },
25911       {  /* ARMv6k */
25912         {0x00, 0xf0, 0x20, 0xe3},  /* LE */
25913         {0xe3, 0x20, 0xf0, 0x00},  /* BE */
25914       },
25915     };
25916   static unsigned char const thumb_noop[2][2][2] =
25917     {
25918       {  /* Thumb-1 */
25919         {0xc0, 0x46},  /* LE */
25920         {0x46, 0xc0},  /* BE */
25921       },
25922       {  /* Thumb-2 */
25923         {0x00, 0xbf},  /* LE */
25924         {0xbf, 0x00}   /* BE */
25925       }
25926     };
25927   static unsigned char const wide_thumb_noop[2][4] =
25928     {  /* Wide Thumb-2 */
25929       {0xaf, 0xf3, 0x00, 0x80},  /* LE */
25930       {0xf3, 0xaf, 0x80, 0x00},  /* BE */
25931     };
25932
25933   unsigned bytes, fix, noop_size;
25934   char * p;
25935   const unsigned char * noop;
25936   const unsigned char *narrow_noop = NULL;
25937 #ifdef OBJ_ELF
25938   enum mstate state;
25939 #endif
25940
25941   if (fragP->fr_type != rs_align_code)
25942     return;
25943
25944   bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
25945   p = fragP->fr_literal + fragP->fr_fix;
25946   fix = 0;
25947
25948   if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
25949     bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
25950
25951   gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
25952
25953   if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
25954     {
25955       if (ARM_CPU_HAS_FEATURE (selected_cpu_name[0]
25956                                ? selected_cpu : arm_arch_none, arm_ext_v6t2))
25957         {
25958           narrow_noop = thumb_noop[1][target_big_endian];
25959           noop = wide_thumb_noop[target_big_endian];
25960         }
25961       else
25962         noop = thumb_noop[0][target_big_endian];
25963       noop_size = 2;
25964 #ifdef OBJ_ELF
25965       state = MAP_THUMB;
25966 #endif
25967     }
25968   else
25969     {
25970       noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu_name[0]
25971                                            ? selected_cpu : arm_arch_none,
25972                                            arm_ext_v6k) != 0]
25973                      [target_big_endian];
25974       noop_size = 4;
25975 #ifdef OBJ_ELF
25976       state = MAP_ARM;
25977 #endif
25978     }
25979
25980   fragP->fr_var = noop_size;
25981
25982   if (bytes & (noop_size - 1))
25983     {
25984       fix = bytes & (noop_size - 1);
25985 #ifdef OBJ_ELF
25986       insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
25987 #endif
25988       memset (p, 0, fix);
25989       p += fix;
25990       bytes -= fix;
25991     }
25992
25993   if (narrow_noop)
25994     {
25995       if (bytes & noop_size)
25996         {
25997           /* Insert a narrow noop.  */
25998           memcpy (p, narrow_noop, noop_size);
25999           p += noop_size;
26000           bytes -= noop_size;
26001           fix += noop_size;
26002         }
26003
26004       /* Use wide noops for the remainder */
26005       noop_size = 4;
26006     }
26007
26008   while (bytes >= noop_size)
26009     {
26010       memcpy (p, noop, noop_size);
26011       p += noop_size;
26012       bytes -= noop_size;
26013       fix += noop_size;
26014     }
26015
26016   fragP->fr_fix += fix;
26017 }
26018
26019 /* Called from md_do_align.  Used to create an alignment
26020    frag in a code section.  */
26021
26022 void
26023 arm_frag_align_code (int n, int max)
26024 {
26025   char * p;
26026
26027   /* We assume that there will never be a requirement
26028      to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes.  */
26029   if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
26030     {
26031       char err_msg[128];
26032
26033       sprintf (err_msg,
26034         _("alignments greater than %d bytes not supported in .text sections."),
26035         MAX_MEM_FOR_RS_ALIGN_CODE + 1);
26036       as_fatal ("%s", err_msg);
26037     }
26038
26039   p = frag_var (rs_align_code,
26040                 MAX_MEM_FOR_RS_ALIGN_CODE,
26041                 1,
26042                 (relax_substateT) max,
26043                 (symbolS *) NULL,
26044                 (offsetT) n,
26045                 (char *) NULL);
26046   *p = 0;
26047 }
26048
26049 /* Perform target specific initialisation of a frag.
26050    Note - despite the name this initialisation is not done when the frag
26051    is created, but only when its type is assigned.  A frag can be created
26052    and used a long time before its type is set, so beware of assuming that
26053    this initialisation is performed first.  */
26054
26055 #ifndef OBJ_ELF
26056 void
26057 arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
26058 {
26059   /* Record whether this frag is in an ARM or a THUMB area.  */
26060   fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
26061 }
26062
26063 #else /* OBJ_ELF is defined.  */
26064 void
26065 arm_init_frag (fragS * fragP, int max_chars)
26066 {
26067   bfd_boolean frag_thumb_mode;
26068
26069   /* If the current ARM vs THUMB mode has not already
26070      been recorded into this frag then do so now.  */
26071   if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
26072     fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
26073
26074   /* PR 21809: Do not set a mapping state for debug sections
26075      - it just confuses other tools.  */
26076   if (bfd_get_section_flags (NULL, now_seg) & SEC_DEBUGGING)
26077     return;
26078
26079   frag_thumb_mode = fragP->tc_frag_data.thumb_mode ^ MODE_RECORDED;
26080
26081   /* Record a mapping symbol for alignment frags.  We will delete this
26082      later if the alignment ends up empty.  */
26083   switch (fragP->fr_type)
26084     {
26085     case rs_align:
26086     case rs_align_test:
26087     case rs_fill:
26088       mapping_state_2 (MAP_DATA, max_chars);
26089       break;
26090     case rs_align_code:
26091       mapping_state_2 (frag_thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
26092       break;
26093     default:
26094       break;
26095     }
26096 }
26097
26098 /* When we change sections we need to issue a new mapping symbol.  */
26099
26100 void
26101 arm_elf_change_section (void)
26102 {
26103   /* Link an unlinked unwind index table section to the .text section.  */
26104   if (elf_section_type (now_seg) == SHT_ARM_EXIDX
26105       && elf_linked_to_section (now_seg) == NULL)
26106     elf_linked_to_section (now_seg) = text_section;
26107 }
26108
26109 int
26110 arm_elf_section_type (const char * str, size_t len)
26111 {
26112   if (len == 5 && strncmp (str, "exidx", 5) == 0)
26113     return SHT_ARM_EXIDX;
26114
26115   return -1;
26116 }
26117 \f
26118 /* Code to deal with unwinding tables.  */
26119
26120 static void add_unwind_adjustsp (offsetT);
26121
26122 /* Generate any deferred unwind frame offset.  */
26123
26124 static void
26125 flush_pending_unwind (void)
26126 {
26127   offsetT offset;
26128
26129   offset = unwind.pending_offset;
26130   unwind.pending_offset = 0;
26131   if (offset != 0)
26132     add_unwind_adjustsp (offset);
26133 }
26134
26135 /* Add an opcode to this list for this function.  Two-byte opcodes should
26136    be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
26137    order.  */
26138
26139 static void
26140 add_unwind_opcode (valueT op, int length)
26141 {
26142   /* Add any deferred stack adjustment.  */
26143   if (unwind.pending_offset)
26144     flush_pending_unwind ();
26145
26146   unwind.sp_restored = 0;
26147
26148   if (unwind.opcode_count + length > unwind.opcode_alloc)
26149     {
26150       unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
26151       if (unwind.opcodes)
26152         unwind.opcodes = XRESIZEVEC (unsigned char, unwind.opcodes,
26153                                      unwind.opcode_alloc);
26154       else
26155         unwind.opcodes = XNEWVEC (unsigned char, unwind.opcode_alloc);
26156     }
26157   while (length > 0)
26158     {
26159       length--;
26160       unwind.opcodes[unwind.opcode_count] = op & 0xff;
26161       op >>= 8;
26162       unwind.opcode_count++;
26163     }
26164 }
26165
26166 /* Add unwind opcodes to adjust the stack pointer.  */
26167
26168 static void
26169 add_unwind_adjustsp (offsetT offset)
26170 {
26171   valueT op;
26172
26173   if (offset > 0x200)
26174     {
26175       /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
26176       char bytes[5];
26177       int n;
26178       valueT o;
26179
26180       /* Long form: 0xb2, uleb128.  */
26181       /* This might not fit in a word so add the individual bytes,
26182          remembering the list is built in reverse order.  */
26183       o = (valueT) ((offset - 0x204) >> 2);
26184       if (o == 0)
26185         add_unwind_opcode (0, 1);
26186
26187       /* Calculate the uleb128 encoding of the offset.  */
26188       n = 0;
26189       while (o)
26190         {
26191           bytes[n] = o & 0x7f;
26192           o >>= 7;
26193           if (o)
26194             bytes[n] |= 0x80;
26195           n++;
26196         }
26197       /* Add the insn.  */
26198       for (; n; n--)
26199         add_unwind_opcode (bytes[n - 1], 1);
26200       add_unwind_opcode (0xb2, 1);
26201     }
26202   else if (offset > 0x100)
26203     {
26204       /* Two short opcodes.  */
26205       add_unwind_opcode (0x3f, 1);
26206       op = (offset - 0x104) >> 2;
26207       add_unwind_opcode (op, 1);
26208     }
26209   else if (offset > 0)
26210     {
26211       /* Short opcode.  */
26212       op = (offset - 4) >> 2;
26213       add_unwind_opcode (op, 1);
26214     }
26215   else if (offset < 0)
26216     {
26217       offset = -offset;
26218       while (offset > 0x100)
26219         {
26220           add_unwind_opcode (0x7f, 1);
26221           offset -= 0x100;
26222         }
26223       op = ((offset - 4) >> 2) | 0x40;
26224       add_unwind_opcode (op, 1);
26225     }
26226 }
26227
26228 /* Finish the list of unwind opcodes for this function.  */
26229
26230 static void
26231 finish_unwind_opcodes (void)
26232 {
26233   valueT op;
26234
26235   if (unwind.fp_used)
26236     {
26237       /* Adjust sp as necessary.  */
26238       unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
26239       flush_pending_unwind ();
26240
26241       /* After restoring sp from the frame pointer.  */
26242       op = 0x90 | unwind.fp_reg;
26243       add_unwind_opcode (op, 1);
26244     }
26245   else
26246     flush_pending_unwind ();
26247 }
26248
26249
26250 /* Start an exception table entry.  If idx is nonzero this is an index table
26251    entry.  */
26252
26253 static void
26254 start_unwind_section (const segT text_seg, int idx)
26255 {
26256   const char * text_name;
26257   const char * prefix;
26258   const char * prefix_once;
26259   const char * group_name;
26260   char * sec_name;
26261   int type;
26262   int flags;
26263   int linkonce;
26264
26265   if (idx)
26266     {
26267       prefix = ELF_STRING_ARM_unwind;
26268       prefix_once = ELF_STRING_ARM_unwind_once;
26269       type = SHT_ARM_EXIDX;
26270     }
26271   else
26272     {
26273       prefix = ELF_STRING_ARM_unwind_info;
26274       prefix_once = ELF_STRING_ARM_unwind_info_once;
26275       type = SHT_PROGBITS;
26276     }
26277
26278   text_name = segment_name (text_seg);
26279   if (streq (text_name, ".text"))
26280     text_name = "";
26281
26282   if (strncmp (text_name, ".gnu.linkonce.t.",
26283                strlen (".gnu.linkonce.t.")) == 0)
26284     {
26285       prefix = prefix_once;
26286       text_name += strlen (".gnu.linkonce.t.");
26287     }
26288
26289   sec_name = concat (prefix, text_name, (char *) NULL);
26290
26291   flags = SHF_ALLOC;
26292   linkonce = 0;
26293   group_name = 0;
26294
26295   /* Handle COMDAT group.  */
26296   if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
26297     {
26298       group_name = elf_group_name (text_seg);
26299       if (group_name == NULL)
26300         {
26301           as_bad (_("Group section `%s' has no group signature"),
26302                   segment_name (text_seg));
26303           ignore_rest_of_line ();
26304           return;
26305         }
26306       flags |= SHF_GROUP;
26307       linkonce = 1;
26308     }
26309
26310   obj_elf_change_section (sec_name, type, 0, flags, 0, group_name,
26311                           linkonce, 0);
26312
26313   /* Set the section link for index tables.  */
26314   if (idx)
26315     elf_linked_to_section (now_seg) = text_seg;
26316 }
26317
26318
26319 /* Start an unwind table entry.  HAVE_DATA is nonzero if we have additional
26320    personality routine data.  Returns zero, or the index table value for
26321    an inline entry.  */
26322
26323 static valueT
26324 create_unwind_entry (int have_data)
26325 {
26326   int size;
26327   addressT where;
26328   char *ptr;
26329   /* The current word of data.  */
26330   valueT data;
26331   /* The number of bytes left in this word.  */
26332   int n;
26333
26334   finish_unwind_opcodes ();
26335
26336   /* Remember the current text section.  */
26337   unwind.saved_seg = now_seg;
26338   unwind.saved_subseg = now_subseg;
26339
26340   start_unwind_section (now_seg, 0);
26341
26342   if (unwind.personality_routine == NULL)
26343     {
26344       if (unwind.personality_index == -2)
26345         {
26346           if (have_data)
26347             as_bad (_("handlerdata in cantunwind frame"));
26348           return 1; /* EXIDX_CANTUNWIND.  */
26349         }
26350
26351       /* Use a default personality routine if none is specified.  */
26352       if (unwind.personality_index == -1)
26353         {
26354           if (unwind.opcode_count > 3)
26355             unwind.personality_index = 1;
26356           else
26357             unwind.personality_index = 0;
26358         }
26359
26360       /* Space for the personality routine entry.  */
26361       if (unwind.personality_index == 0)
26362         {
26363           if (unwind.opcode_count > 3)
26364             as_bad (_("too many unwind opcodes for personality routine 0"));
26365
26366           if (!have_data)
26367             {
26368               /* All the data is inline in the index table.  */
26369               data = 0x80;
26370               n = 3;
26371               while (unwind.opcode_count > 0)
26372                 {
26373                   unwind.opcode_count--;
26374                   data = (data << 8) | unwind.opcodes[unwind.opcode_count];
26375                   n--;
26376                 }
26377
26378               /* Pad with "finish" opcodes.  */
26379               while (n--)
26380                 data = (data << 8) | 0xb0;
26381
26382               return data;
26383             }
26384           size = 0;
26385         }
26386       else
26387         /* We get two opcodes "free" in the first word.  */
26388         size = unwind.opcode_count - 2;
26389     }
26390   else
26391     {
26392       /* PR 16765: Missing or misplaced unwind directives can trigger this.  */
26393       if (unwind.personality_index != -1)
26394         {
26395           as_bad (_("attempt to recreate an unwind entry"));
26396           return 1;
26397         }
26398
26399       /* An extra byte is required for the opcode count.        */
26400       size = unwind.opcode_count + 1;
26401     }
26402
26403   size = (size + 3) >> 2;
26404   if (size > 0xff)
26405     as_bad (_("too many unwind opcodes"));
26406
26407   frag_align (2, 0, 0);
26408   record_alignment (now_seg, 2);
26409   unwind.table_entry = expr_build_dot ();
26410
26411   /* Allocate the table entry.  */
26412   ptr = frag_more ((size << 2) + 4);
26413   /* PR 13449: Zero the table entries in case some of them are not used.  */
26414   memset (ptr, 0, (size << 2) + 4);
26415   where = frag_now_fix () - ((size << 2) + 4);
26416
26417   switch (unwind.personality_index)
26418     {
26419     case -1:
26420       /* ??? Should this be a PLT generating relocation?  */
26421       /* Custom personality routine.  */
26422       fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
26423                BFD_RELOC_ARM_PREL31);
26424
26425       where += 4;
26426       ptr += 4;
26427
26428       /* Set the first byte to the number of additional words.  */
26429       data = size > 0 ? size - 1 : 0;
26430       n = 3;
26431       break;
26432
26433     /* ABI defined personality routines.  */
26434     case 0:
26435       /* Three opcodes bytes are packed into the first word.  */
26436       data = 0x80;
26437       n = 3;
26438       break;
26439
26440     case 1:
26441     case 2:
26442       /* The size and first two opcode bytes go in the first word.  */
26443       data = ((0x80 + unwind.personality_index) << 8) | size;
26444       n = 2;
26445       break;
26446
26447     default:
26448       /* Should never happen.  */
26449       abort ();
26450     }
26451
26452   /* Pack the opcodes into words (MSB first), reversing the list at the same
26453      time.  */
26454   while (unwind.opcode_count > 0)
26455     {
26456       if (n == 0)
26457         {
26458           md_number_to_chars (ptr, data, 4);
26459           ptr += 4;
26460           n = 4;
26461           data = 0;
26462         }
26463       unwind.opcode_count--;
26464       n--;
26465       data = (data << 8) | unwind.opcodes[unwind.opcode_count];
26466     }
26467
26468   /* Finish off the last word.  */
26469   if (n < 4)
26470     {
26471       /* Pad with "finish" opcodes.  */
26472       while (n--)
26473         data = (data << 8) | 0xb0;
26474
26475       md_number_to_chars (ptr, data, 4);
26476     }
26477
26478   if (!have_data)
26479     {
26480       /* Add an empty descriptor if there is no user-specified data.   */
26481       ptr = frag_more (4);
26482       md_number_to_chars (ptr, 0, 4);
26483     }
26484
26485   return 0;
26486 }
26487
26488
26489 /* Initialize the DWARF-2 unwind information for this procedure.  */
26490
26491 void
26492 tc_arm_frame_initial_instructions (void)
26493 {
26494   cfi_add_CFA_def_cfa (REG_SP, 0);
26495 }
26496 #endif /* OBJ_ELF */
26497
26498 /* Convert REGNAME to a DWARF-2 register number.  */
26499
26500 int
26501 tc_arm_regname_to_dw2regnum (char *regname)
26502 {
26503   int reg = arm_reg_parse (&regname, REG_TYPE_RN);
26504   if (reg != FAIL)
26505     return reg;
26506
26507   /* PR 16694: Allow VFP registers as well.  */
26508   reg = arm_reg_parse (&regname, REG_TYPE_VFS);
26509   if (reg != FAIL)
26510     return 64 + reg;
26511
26512   reg = arm_reg_parse (&regname, REG_TYPE_VFD);
26513   if (reg != FAIL)
26514     return reg + 256;
26515
26516   return FAIL;
26517 }
26518
26519 #ifdef TE_PE
26520 void
26521 tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
26522 {
26523   expressionS exp;
26524
26525   exp.X_op = O_secrel;
26526   exp.X_add_symbol = symbol;
26527   exp.X_add_number = 0;
26528   emit_expr (&exp, size);
26529 }
26530 #endif
26531
26532 /* MD interface: Symbol and relocation handling.  */
26533
26534 /* Return the address within the segment that a PC-relative fixup is
26535    relative to.  For ARM, PC-relative fixups applied to instructions
26536    are generally relative to the location of the fixup plus 8 bytes.
26537    Thumb branches are offset by 4, and Thumb loads relative to PC
26538    require special handling.  */
26539
26540 long
26541 md_pcrel_from_section (fixS * fixP, segT seg)
26542 {
26543   offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
26544
26545   /* If this is pc-relative and we are going to emit a relocation
26546      then we just want to put out any pipeline compensation that the linker
26547      will need.  Otherwise we want to use the calculated base.
26548      For WinCE we skip the bias for externals as well, since this
26549      is how the MS ARM-CE assembler behaves and we want to be compatible.  */
26550   if (fixP->fx_pcrel
26551       && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
26552           || (arm_force_relocation (fixP)
26553 #ifdef TE_WINCE
26554               && !S_IS_EXTERNAL (fixP->fx_addsy)
26555 #endif
26556               )))
26557     base = 0;
26558
26559
26560   switch (fixP->fx_r_type)
26561     {
26562       /* PC relative addressing on the Thumb is slightly odd as the
26563          bottom two bits of the PC are forced to zero for the
26564          calculation.  This happens *after* application of the
26565          pipeline offset.  However, Thumb adrl already adjusts for
26566          this, so we need not do it again.  */
26567     case BFD_RELOC_ARM_THUMB_ADD:
26568       return base & ~3;
26569
26570     case BFD_RELOC_ARM_THUMB_OFFSET:
26571     case BFD_RELOC_ARM_T32_OFFSET_IMM:
26572     case BFD_RELOC_ARM_T32_ADD_PC12:
26573     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
26574       return (base + 4) & ~3;
26575
26576       /* Thumb branches are simply offset by +4.  */
26577     case BFD_RELOC_THUMB_PCREL_BRANCH5:
26578     case BFD_RELOC_THUMB_PCREL_BRANCH7:
26579     case BFD_RELOC_THUMB_PCREL_BRANCH9:
26580     case BFD_RELOC_THUMB_PCREL_BRANCH12:
26581     case BFD_RELOC_THUMB_PCREL_BRANCH20:
26582     case BFD_RELOC_THUMB_PCREL_BRANCH25:
26583     case BFD_RELOC_THUMB_PCREL_BFCSEL:
26584     case BFD_RELOC_ARM_THUMB_BF17:
26585     case BFD_RELOC_ARM_THUMB_BF19:
26586     case BFD_RELOC_ARM_THUMB_BF13:
26587     case BFD_RELOC_ARM_THUMB_LOOP12:
26588       return base + 4;
26589
26590     case BFD_RELOC_THUMB_PCREL_BRANCH23:
26591       if (fixP->fx_addsy
26592           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
26593           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
26594           && ARM_IS_FUNC (fixP->fx_addsy)
26595           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
26596         base = fixP->fx_where + fixP->fx_frag->fr_address;
26597        return base + 4;
26598
26599       /* BLX is like branches above, but forces the low two bits of PC to
26600          zero.  */
26601     case BFD_RELOC_THUMB_PCREL_BLX:
26602       if (fixP->fx_addsy
26603           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
26604           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
26605           && THUMB_IS_FUNC (fixP->fx_addsy)
26606           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
26607         base = fixP->fx_where + fixP->fx_frag->fr_address;
26608       return (base + 4) & ~3;
26609
26610       /* ARM mode branches are offset by +8.  However, the Windows CE
26611          loader expects the relocation not to take this into account.  */
26612     case BFD_RELOC_ARM_PCREL_BLX:
26613       if (fixP->fx_addsy
26614           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
26615           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
26616           && ARM_IS_FUNC (fixP->fx_addsy)
26617           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
26618         base = fixP->fx_where + fixP->fx_frag->fr_address;
26619       return base + 8;
26620
26621     case BFD_RELOC_ARM_PCREL_CALL:
26622       if (fixP->fx_addsy
26623           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
26624           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
26625           && THUMB_IS_FUNC (fixP->fx_addsy)
26626           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
26627         base = fixP->fx_where + fixP->fx_frag->fr_address;
26628       return base + 8;
26629
26630     case BFD_RELOC_ARM_PCREL_BRANCH:
26631     case BFD_RELOC_ARM_PCREL_JUMP:
26632     case BFD_RELOC_ARM_PLT32:
26633 #ifdef TE_WINCE
26634       /* When handling fixups immediately, because we have already
26635          discovered the value of a symbol, or the address of the frag involved
26636          we must account for the offset by +8, as the OS loader will never see the reloc.
26637          see fixup_segment() in write.c
26638          The S_IS_EXTERNAL test handles the case of global symbols.
26639          Those need the calculated base, not just the pipe compensation the linker will need.  */
26640       if (fixP->fx_pcrel
26641           && fixP->fx_addsy != NULL
26642           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
26643           && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
26644         return base + 8;
26645       return base;
26646 #else
26647       return base + 8;
26648 #endif
26649
26650
26651       /* ARM mode loads relative to PC are also offset by +8.  Unlike
26652          branches, the Windows CE loader *does* expect the relocation
26653          to take this into account.  */
26654     case BFD_RELOC_ARM_OFFSET_IMM:
26655     case BFD_RELOC_ARM_OFFSET_IMM8:
26656     case BFD_RELOC_ARM_HWLITERAL:
26657     case BFD_RELOC_ARM_LITERAL:
26658     case BFD_RELOC_ARM_CP_OFF_IMM:
26659       return base + 8;
26660
26661
26662       /* Other PC-relative relocations are un-offset.  */
26663     default:
26664       return base;
26665     }
26666 }
26667
26668 static bfd_boolean flag_warn_syms = TRUE;
26669
26670 bfd_boolean
26671 arm_tc_equal_in_insn (int c ATTRIBUTE_UNUSED, char * name)
26672 {
26673   /* PR 18347 - Warn if the user attempts to create a symbol with the same
26674      name as an ARM instruction.  Whilst strictly speaking it is allowed, it
26675      does mean that the resulting code might be very confusing to the reader.
26676      Also this warning can be triggered if the user omits an operand before
26677      an immediate address, eg:
26678
26679        LDR =foo
26680
26681      GAS treats this as an assignment of the value of the symbol foo to a
26682      symbol LDR, and so (without this code) it will not issue any kind of
26683      warning or error message.
26684
26685      Note - ARM instructions are case-insensitive but the strings in the hash
26686      table are all stored in lower case, so we must first ensure that name is
26687      lower case too.  */
26688   if (flag_warn_syms && arm_ops_hsh)
26689     {
26690       char * nbuf = strdup (name);
26691       char * p;
26692
26693       for (p = nbuf; *p; p++)
26694         *p = TOLOWER (*p);
26695       if (hash_find (arm_ops_hsh, nbuf) != NULL)
26696         {
26697           static struct hash_control * already_warned = NULL;
26698
26699           if (already_warned == NULL)
26700             already_warned = hash_new ();
26701           /* Only warn about the symbol once.  To keep the code
26702              simple we let hash_insert do the lookup for us.  */
26703           if (hash_insert (already_warned, nbuf, NULL) == NULL)
26704             as_warn (_("[-mwarn-syms]: Assignment makes a symbol match an ARM instruction: %s"), name);
26705         }
26706       else
26707         free (nbuf);
26708     }
26709
26710   return FALSE;
26711 }
26712
26713 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
26714    Otherwise we have no need to default values of symbols.  */
26715
26716 symbolS *
26717 md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
26718 {
26719 #ifdef OBJ_ELF
26720   if (name[0] == '_' && name[1] == 'G'
26721       && streq (name, GLOBAL_OFFSET_TABLE_NAME))
26722     {
26723       if (!GOT_symbol)
26724         {
26725           if (symbol_find (name))
26726             as_bad (_("GOT already in the symbol table"));
26727
26728           GOT_symbol = symbol_new (name, undefined_section,
26729                                    (valueT) 0, & zero_address_frag);
26730         }
26731
26732       return GOT_symbol;
26733     }
26734 #endif
26735
26736   return NULL;
26737 }
26738
26739 /* Subroutine of md_apply_fix.   Check to see if an immediate can be
26740    computed as two separate immediate values, added together.  We
26741    already know that this value cannot be computed by just one ARM
26742    instruction.  */
26743
26744 static unsigned int
26745 validate_immediate_twopart (unsigned int   val,
26746                             unsigned int * highpart)
26747 {
26748   unsigned int a;
26749   unsigned int i;
26750
26751   for (i = 0; i < 32; i += 2)
26752     if (((a = rotate_left (val, i)) & 0xff) != 0)
26753       {
26754         if (a & 0xff00)
26755           {
26756             if (a & ~ 0xffff)
26757               continue;
26758             * highpart = (a  >> 8) | ((i + 24) << 7);
26759           }
26760         else if (a & 0xff0000)
26761           {
26762             if (a & 0xff000000)
26763               continue;
26764             * highpart = (a >> 16) | ((i + 16) << 7);
26765           }
26766         else
26767           {
26768             gas_assert (a & 0xff000000);
26769             * highpart = (a >> 24) | ((i + 8) << 7);
26770           }
26771
26772         return (a & 0xff) | (i << 7);
26773       }
26774
26775   return FAIL;
26776 }
26777
26778 static int
26779 validate_offset_imm (unsigned int val, int hwse)
26780 {
26781   if ((hwse && val > 255) || val > 4095)
26782     return FAIL;
26783   return val;
26784 }
26785
26786 /* Subroutine of md_apply_fix.   Do those data_ops which can take a
26787    negative immediate constant by altering the instruction.  A bit of
26788    a hack really.
26789         MOV <-> MVN
26790         AND <-> BIC
26791         ADC <-> SBC
26792         by inverting the second operand, and
26793         ADD <-> SUB
26794         CMP <-> CMN
26795         by negating the second operand.  */
26796
26797 static int
26798 negate_data_op (unsigned long * instruction,
26799                 unsigned long   value)
26800 {
26801   int op, new_inst;
26802   unsigned long negated, inverted;
26803
26804   negated = encode_arm_immediate (-value);
26805   inverted = encode_arm_immediate (~value);
26806
26807   op = (*instruction >> DATA_OP_SHIFT) & 0xf;
26808   switch (op)
26809     {
26810       /* First negates.  */
26811     case OPCODE_SUB:             /* ADD <-> SUB  */
26812       new_inst = OPCODE_ADD;
26813       value = negated;
26814       break;
26815
26816     case OPCODE_ADD:
26817       new_inst = OPCODE_SUB;
26818       value = negated;
26819       break;
26820
26821     case OPCODE_CMP:             /* CMP <-> CMN  */
26822       new_inst = OPCODE_CMN;
26823       value = negated;
26824       break;
26825
26826     case OPCODE_CMN:
26827       new_inst = OPCODE_CMP;
26828       value = negated;
26829       break;
26830
26831       /* Now Inverted ops.  */
26832     case OPCODE_MOV:             /* MOV <-> MVN  */
26833       new_inst = OPCODE_MVN;
26834       value = inverted;
26835       break;
26836
26837     case OPCODE_MVN:
26838       new_inst = OPCODE_MOV;
26839       value = inverted;
26840       break;
26841
26842     case OPCODE_AND:             /* AND <-> BIC  */
26843       new_inst = OPCODE_BIC;
26844       value = inverted;
26845       break;
26846
26847     case OPCODE_BIC:
26848       new_inst = OPCODE_AND;
26849       value = inverted;
26850       break;
26851
26852     case OPCODE_ADC:              /* ADC <-> SBC  */
26853       new_inst = OPCODE_SBC;
26854       value = inverted;
26855       break;
26856
26857     case OPCODE_SBC:
26858       new_inst = OPCODE_ADC;
26859       value = inverted;
26860       break;
26861
26862       /* We cannot do anything.  */
26863     default:
26864       return FAIL;
26865     }
26866
26867   if (value == (unsigned) FAIL)
26868     return FAIL;
26869
26870   *instruction &= OPCODE_MASK;
26871   *instruction |= new_inst << DATA_OP_SHIFT;
26872   return value;
26873 }
26874
26875 /* Like negate_data_op, but for Thumb-2.   */
26876
26877 static unsigned int
26878 thumb32_negate_data_op (offsetT *instruction, unsigned int value)
26879 {
26880   int op, new_inst;
26881   int rd;
26882   unsigned int negated, inverted;
26883
26884   negated = encode_thumb32_immediate (-value);
26885   inverted = encode_thumb32_immediate (~value);
26886
26887   rd = (*instruction >> 8) & 0xf;
26888   op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
26889   switch (op)
26890     {
26891       /* ADD <-> SUB.  Includes CMP <-> CMN.  */
26892     case T2_OPCODE_SUB:
26893       new_inst = T2_OPCODE_ADD;
26894       value = negated;
26895       break;
26896
26897     case T2_OPCODE_ADD:
26898       new_inst = T2_OPCODE_SUB;
26899       value = negated;
26900       break;
26901
26902       /* ORR <-> ORN.  Includes MOV <-> MVN.  */
26903     case T2_OPCODE_ORR:
26904       new_inst = T2_OPCODE_ORN;
26905       value = inverted;
26906       break;
26907
26908     case T2_OPCODE_ORN:
26909       new_inst = T2_OPCODE_ORR;
26910       value = inverted;
26911       break;
26912
26913       /* AND <-> BIC.  TST has no inverted equivalent.  */
26914     case T2_OPCODE_AND:
26915       new_inst = T2_OPCODE_BIC;
26916       if (rd == 15)
26917         value = FAIL;
26918       else
26919         value = inverted;
26920       break;
26921
26922     case T2_OPCODE_BIC:
26923       new_inst = T2_OPCODE_AND;
26924       value = inverted;
26925       break;
26926
26927       /* ADC <-> SBC  */
26928     case T2_OPCODE_ADC:
26929       new_inst = T2_OPCODE_SBC;
26930       value = inverted;
26931       break;
26932
26933     case T2_OPCODE_SBC:
26934       new_inst = T2_OPCODE_ADC;
26935       value = inverted;
26936       break;
26937
26938       /* We cannot do anything.  */
26939     default:
26940       return FAIL;
26941     }
26942
26943   if (value == (unsigned int)FAIL)
26944     return FAIL;
26945
26946   *instruction &= T2_OPCODE_MASK;
26947   *instruction |= new_inst << T2_DATA_OP_SHIFT;
26948   return value;
26949 }
26950
26951 /* Read a 32-bit thumb instruction from buf.  */
26952
26953 static unsigned long
26954 get_thumb32_insn (char * buf)
26955 {
26956   unsigned long insn;
26957   insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
26958   insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
26959
26960   return insn;
26961 }
26962
26963 /* We usually want to set the low bit on the address of thumb function
26964    symbols.  In particular .word foo - . should have the low bit set.
26965    Generic code tries to fold the difference of two symbols to
26966    a constant.  Prevent this and force a relocation when the first symbols
26967    is a thumb function.  */
26968
26969 bfd_boolean
26970 arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
26971 {
26972   if (op == O_subtract
26973       && l->X_op == O_symbol
26974       && r->X_op == O_symbol
26975       && THUMB_IS_FUNC (l->X_add_symbol))
26976     {
26977       l->X_op = O_subtract;
26978       l->X_op_symbol = r->X_add_symbol;
26979       l->X_add_number -= r->X_add_number;
26980       return TRUE;
26981     }
26982
26983   /* Process as normal.  */
26984   return FALSE;
26985 }
26986
26987 /* Encode Thumb2 unconditional branches and calls. The encoding
26988    for the 2 are identical for the immediate values.  */
26989
26990 static void
26991 encode_thumb2_b_bl_offset (char * buf, offsetT value)
26992 {
26993 #define T2I1I2MASK  ((1 << 13) | (1 << 11))
26994   offsetT newval;
26995   offsetT newval2;
26996   addressT S, I1, I2, lo, hi;
26997
26998   S = (value >> 24) & 0x01;
26999   I1 = (value >> 23) & 0x01;
27000   I2 = (value >> 22) & 0x01;
27001   hi = (value >> 12) & 0x3ff;
27002   lo = (value >> 1) & 0x7ff;
27003   newval   = md_chars_to_number (buf, THUMB_SIZE);
27004   newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
27005   newval  |= (S << 10) | hi;
27006   newval2 &=  ~T2I1I2MASK;
27007   newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
27008   md_number_to_chars (buf, newval, THUMB_SIZE);
27009   md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
27010 }
27011
27012 void
27013 md_apply_fix (fixS *    fixP,
27014                valueT * valP,
27015                segT     seg)
27016 {
27017   offsetT        value = * valP;
27018   offsetT        newval;
27019   unsigned int   newimm;
27020   unsigned long  temp;
27021   int            sign;
27022   char *         buf = fixP->fx_where + fixP->fx_frag->fr_literal;
27023
27024   gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
27025
27026   /* Note whether this will delete the relocation.  */
27027
27028   if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
27029     fixP->fx_done = 1;
27030
27031   /* On a 64-bit host, silently truncate 'value' to 32 bits for
27032      consistency with the behaviour on 32-bit hosts.  Remember value
27033      for emit_reloc.  */
27034   value &= 0xffffffff;
27035   value ^= 0x80000000;
27036   value -= 0x80000000;
27037
27038   *valP = value;
27039   fixP->fx_addnumber = value;
27040
27041   /* Same treatment for fixP->fx_offset.  */
27042   fixP->fx_offset &= 0xffffffff;
27043   fixP->fx_offset ^= 0x80000000;
27044   fixP->fx_offset -= 0x80000000;
27045
27046   switch (fixP->fx_r_type)
27047     {
27048     case BFD_RELOC_NONE:
27049       /* This will need to go in the object file.  */
27050       fixP->fx_done = 0;
27051       break;
27052
27053     case BFD_RELOC_ARM_IMMEDIATE:
27054       /* We claim that this fixup has been processed here,
27055          even if in fact we generate an error because we do
27056          not have a reloc for it, so tc_gen_reloc will reject it.  */
27057       fixP->fx_done = 1;
27058
27059       if (fixP->fx_addsy)
27060         {
27061           const char *msg = 0;
27062
27063           if (! S_IS_DEFINED (fixP->fx_addsy))
27064             msg = _("undefined symbol %s used as an immediate value");
27065           else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
27066             msg = _("symbol %s is in a different section");
27067           else if (S_IS_WEAK (fixP->fx_addsy))
27068             msg = _("symbol %s is weak and may be overridden later");
27069
27070           if (msg)
27071             {
27072               as_bad_where (fixP->fx_file, fixP->fx_line,
27073                             msg, S_GET_NAME (fixP->fx_addsy));
27074               break;
27075             }
27076         }
27077
27078       temp = md_chars_to_number (buf, INSN_SIZE);
27079
27080       /* If the offset is negative, we should use encoding A2 for ADR.  */
27081       if ((temp & 0xfff0000) == 0x28f0000 && value < 0)
27082         newimm = negate_data_op (&temp, value);
27083       else
27084         {
27085           newimm = encode_arm_immediate (value);
27086
27087           /* If the instruction will fail, see if we can fix things up by
27088              changing the opcode.  */
27089           if (newimm == (unsigned int) FAIL)
27090             newimm = negate_data_op (&temp, value);
27091           /* MOV accepts both ARM modified immediate (A1 encoding) and
27092              UINT16 (A2 encoding) when possible, MOVW only accepts UINT16.
27093              When disassembling, MOV is preferred when there is no encoding
27094              overlap.  */
27095           if (newimm == (unsigned int) FAIL
27096               && ((temp >> DATA_OP_SHIFT) & 0xf) == OPCODE_MOV
27097               && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2)
27098               && !((temp >> SBIT_SHIFT) & 0x1)
27099               && value >= 0 && value <= 0xffff)
27100             {
27101               /* Clear bits[23:20] to change encoding from A1 to A2.  */
27102               temp &= 0xff0fffff;
27103               /* Encoding high 4bits imm.  Code below will encode the remaining
27104                  low 12bits.  */
27105               temp |= (value & 0x0000f000) << 4;
27106               newimm = value & 0x00000fff;
27107             }
27108         }
27109
27110       if (newimm == (unsigned int) FAIL)
27111         {
27112           as_bad_where (fixP->fx_file, fixP->fx_line,
27113                         _("invalid constant (%lx) after fixup"),
27114                         (unsigned long) value);
27115           break;
27116         }
27117
27118       newimm |= (temp & 0xfffff000);
27119       md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
27120       break;
27121
27122     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
27123       {
27124         unsigned int highpart = 0;
27125         unsigned int newinsn  = 0xe1a00000; /* nop.  */
27126
27127         if (fixP->fx_addsy)
27128           {
27129             const char *msg = 0;
27130
27131             if (! S_IS_DEFINED (fixP->fx_addsy))
27132               msg = _("undefined symbol %s used as an immediate value");
27133             else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
27134               msg = _("symbol %s is in a different section");
27135             else if (S_IS_WEAK (fixP->fx_addsy))
27136               msg = _("symbol %s is weak and may be overridden later");
27137
27138             if (msg)
27139               {
27140                 as_bad_where (fixP->fx_file, fixP->fx_line,
27141                               msg, S_GET_NAME (fixP->fx_addsy));
27142                 break;
27143               }
27144           }
27145
27146         newimm = encode_arm_immediate (value);
27147         temp = md_chars_to_number (buf, INSN_SIZE);
27148
27149         /* If the instruction will fail, see if we can fix things up by
27150            changing the opcode.  */
27151         if (newimm == (unsigned int) FAIL
27152             && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
27153           {
27154             /* No ?  OK - try using two ADD instructions to generate
27155                the value.  */
27156             newimm = validate_immediate_twopart (value, & highpart);
27157
27158             /* Yes - then make sure that the second instruction is
27159                also an add.  */
27160             if (newimm != (unsigned int) FAIL)
27161               newinsn = temp;
27162             /* Still No ?  Try using a negated value.  */
27163             else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
27164               temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
27165             /* Otherwise - give up.  */
27166             else
27167               {
27168                 as_bad_where (fixP->fx_file, fixP->fx_line,
27169                               _("unable to compute ADRL instructions for PC offset of 0x%lx"),
27170                               (long) value);
27171                 break;
27172               }
27173
27174             /* Replace the first operand in the 2nd instruction (which
27175                is the PC) with the destination register.  We have
27176                already added in the PC in the first instruction and we
27177                do not want to do it again.  */
27178             newinsn &= ~ 0xf0000;
27179             newinsn |= ((newinsn & 0x0f000) << 4);
27180           }
27181
27182         newimm |= (temp & 0xfffff000);
27183         md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
27184
27185         highpart |= (newinsn & 0xfffff000);
27186         md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
27187       }
27188       break;
27189
27190     case BFD_RELOC_ARM_OFFSET_IMM:
27191       if (!fixP->fx_done && seg->use_rela_p)
27192         value = 0;
27193       /* Fall through.  */
27194
27195     case BFD_RELOC_ARM_LITERAL:
27196       sign = value > 0;
27197
27198       if (value < 0)
27199         value = - value;
27200
27201       if (validate_offset_imm (value, 0) == FAIL)
27202         {
27203           if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
27204             as_bad_where (fixP->fx_file, fixP->fx_line,
27205                           _("invalid literal constant: pool needs to be closer"));
27206           else
27207             as_bad_where (fixP->fx_file, fixP->fx_line,
27208                           _("bad immediate value for offset (%ld)"),
27209                           (long) value);
27210           break;
27211         }
27212
27213       newval = md_chars_to_number (buf, INSN_SIZE);
27214       if (value == 0)
27215         newval &= 0xfffff000;
27216       else
27217         {
27218           newval &= 0xff7ff000;
27219           newval |= value | (sign ? INDEX_UP : 0);
27220         }
27221       md_number_to_chars (buf, newval, INSN_SIZE);
27222       break;
27223
27224     case BFD_RELOC_ARM_OFFSET_IMM8:
27225     case BFD_RELOC_ARM_HWLITERAL:
27226       sign = value > 0;
27227
27228       if (value < 0)
27229         value = - value;
27230
27231       if (validate_offset_imm (value, 1) == FAIL)
27232         {
27233           if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
27234             as_bad_where (fixP->fx_file, fixP->fx_line,
27235                           _("invalid literal constant: pool needs to be closer"));
27236           else
27237             as_bad_where (fixP->fx_file, fixP->fx_line,
27238                           _("bad immediate value for 8-bit offset (%ld)"),
27239                           (long) value);
27240           break;
27241         }
27242
27243       newval = md_chars_to_number (buf, INSN_SIZE);
27244       if (value == 0)
27245         newval &= 0xfffff0f0;
27246       else
27247         {
27248           newval &= 0xff7ff0f0;
27249           newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
27250         }
27251       md_number_to_chars (buf, newval, INSN_SIZE);
27252       break;
27253
27254     case BFD_RELOC_ARM_T32_OFFSET_U8:
27255       if (value < 0 || value > 1020 || value % 4 != 0)
27256         as_bad_where (fixP->fx_file, fixP->fx_line,
27257                       _("bad immediate value for offset (%ld)"), (long) value);
27258       value /= 4;
27259
27260       newval = md_chars_to_number (buf+2, THUMB_SIZE);
27261       newval |= value;
27262       md_number_to_chars (buf+2, newval, THUMB_SIZE);
27263       break;
27264
27265     case BFD_RELOC_ARM_T32_OFFSET_IMM:
27266       /* This is a complicated relocation used for all varieties of Thumb32
27267          load/store instruction with immediate offset:
27268
27269          1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
27270                                                    *4, optional writeback(W)
27271                                                    (doubleword load/store)
27272
27273          1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
27274          1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
27275          1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
27276          1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
27277          1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
27278
27279          Uppercase letters indicate bits that are already encoded at
27280          this point.  Lowercase letters are our problem.  For the
27281          second block of instructions, the secondary opcode nybble
27282          (bits 8..11) is present, and bit 23 is zero, even if this is
27283          a PC-relative operation.  */
27284       newval = md_chars_to_number (buf, THUMB_SIZE);
27285       newval <<= 16;
27286       newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
27287
27288       if ((newval & 0xf0000000) == 0xe0000000)
27289         {
27290           /* Doubleword load/store: 8-bit offset, scaled by 4.  */
27291           if (value >= 0)
27292             newval |= (1 << 23);
27293           else
27294             value = -value;
27295           if (value % 4 != 0)
27296             {
27297               as_bad_where (fixP->fx_file, fixP->fx_line,
27298                             _("offset not a multiple of 4"));
27299               break;
27300             }
27301           value /= 4;
27302           if (value > 0xff)
27303             {
27304               as_bad_where (fixP->fx_file, fixP->fx_line,
27305                             _("offset out of range"));
27306               break;
27307             }
27308           newval &= ~0xff;
27309         }
27310       else if ((newval & 0x000f0000) == 0x000f0000)
27311         {
27312           /* PC-relative, 12-bit offset.  */
27313           if (value >= 0)
27314             newval |= (1 << 23);
27315           else
27316             value = -value;
27317           if (value > 0xfff)
27318             {
27319               as_bad_where (fixP->fx_file, fixP->fx_line,
27320                             _("offset out of range"));
27321               break;
27322             }
27323           newval &= ~0xfff;
27324         }
27325       else if ((newval & 0x00000100) == 0x00000100)
27326         {
27327           /* Writeback: 8-bit, +/- offset.  */
27328           if (value >= 0)
27329             newval |= (1 << 9);
27330           else
27331             value = -value;
27332           if (value > 0xff)
27333             {
27334               as_bad_where (fixP->fx_file, fixP->fx_line,
27335                             _("offset out of range"));
27336               break;
27337             }
27338           newval &= ~0xff;
27339         }
27340       else if ((newval & 0x00000f00) == 0x00000e00)
27341         {
27342           /* T-instruction: positive 8-bit offset.  */
27343           if (value < 0 || value > 0xff)
27344             {
27345               as_bad_where (fixP->fx_file, fixP->fx_line,
27346                             _("offset out of range"));
27347               break;
27348             }
27349           newval &= ~0xff;
27350           newval |= value;
27351         }
27352       else
27353         {
27354           /* Positive 12-bit or negative 8-bit offset.  */
27355           int limit;
27356           if (value >= 0)
27357             {
27358               newval |= (1 << 23);
27359               limit = 0xfff;
27360             }
27361           else
27362             {
27363               value = -value;
27364               limit = 0xff;
27365             }
27366           if (value > limit)
27367             {
27368               as_bad_where (fixP->fx_file, fixP->fx_line,
27369                             _("offset out of range"));
27370               break;
27371             }
27372           newval &= ~limit;
27373         }
27374
27375       newval |= value;
27376       md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
27377       md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
27378       break;
27379
27380     case BFD_RELOC_ARM_SHIFT_IMM:
27381       newval = md_chars_to_number (buf, INSN_SIZE);
27382       if (((unsigned long) value) > 32
27383           || (value == 32
27384               && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
27385         {
27386           as_bad_where (fixP->fx_file, fixP->fx_line,
27387                         _("shift expression is too large"));
27388           break;
27389         }
27390
27391       if (value == 0)
27392         /* Shifts of zero must be done as lsl.  */
27393         newval &= ~0x60;
27394       else if (value == 32)
27395         value = 0;
27396       newval &= 0xfffff07f;
27397       newval |= (value & 0x1f) << 7;
27398       md_number_to_chars (buf, newval, INSN_SIZE);
27399       break;
27400
27401     case BFD_RELOC_ARM_T32_IMMEDIATE:
27402     case BFD_RELOC_ARM_T32_ADD_IMM:
27403     case BFD_RELOC_ARM_T32_IMM12:
27404     case BFD_RELOC_ARM_T32_ADD_PC12:
27405       /* We claim that this fixup has been processed here,
27406          even if in fact we generate an error because we do
27407          not have a reloc for it, so tc_gen_reloc will reject it.  */
27408       fixP->fx_done = 1;
27409
27410       if (fixP->fx_addsy
27411           && ! S_IS_DEFINED (fixP->fx_addsy))
27412         {
27413           as_bad_where (fixP->fx_file, fixP->fx_line,
27414                         _("undefined symbol %s used as an immediate value"),
27415                         S_GET_NAME (fixP->fx_addsy));
27416           break;
27417         }
27418
27419       newval = md_chars_to_number (buf, THUMB_SIZE);
27420       newval <<= 16;
27421       newval |= md_chars_to_number (buf+2, THUMB_SIZE);
27422
27423       newimm = FAIL;
27424       if ((fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
27425            /* ARMv8-M Baseline MOV will reach here, but it doesn't support
27426               Thumb2 modified immediate encoding (T2).  */
27427            && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2))
27428           || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
27429         {
27430           newimm = encode_thumb32_immediate (value);
27431           if (newimm == (unsigned int) FAIL)
27432             newimm = thumb32_negate_data_op (&newval, value);
27433         }
27434       if (newimm == (unsigned int) FAIL)
27435         {
27436           if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE)
27437             {
27438               /* Turn add/sum into addw/subw.  */
27439               if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
27440                 newval = (newval & 0xfeffffff) | 0x02000000;
27441               /* No flat 12-bit imm encoding for addsw/subsw.  */
27442               if ((newval & 0x00100000) == 0)
27443                 {
27444                   /* 12 bit immediate for addw/subw.  */
27445                   if (value < 0)
27446                     {
27447                       value = -value;
27448                       newval ^= 0x00a00000;
27449                     }
27450                   if (value > 0xfff)
27451                     newimm = (unsigned int) FAIL;
27452                   else
27453                     newimm = value;
27454                 }
27455             }
27456           else
27457             {
27458               /* MOV accepts both Thumb2 modified immediate (T2 encoding) and
27459                  UINT16 (T3 encoding), MOVW only accepts UINT16.  When
27460                  disassembling, MOV is preferred when there is no encoding
27461                  overlap.  */
27462               if (((newval >> T2_DATA_OP_SHIFT) & 0xf) == T2_OPCODE_ORR
27463                   /* NOTE: MOV uses the ORR opcode in Thumb 2 mode
27464                      but with the Rn field [19:16] set to 1111.  */
27465                   && (((newval >> 16) & 0xf) == 0xf)
27466                   && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2_v8m)
27467                   && !((newval >> T2_SBIT_SHIFT) & 0x1)
27468                   && value >= 0 && value <= 0xffff)
27469                 {
27470                   /* Toggle bit[25] to change encoding from T2 to T3.  */
27471                   newval ^= 1 << 25;
27472                   /* Clear bits[19:16].  */
27473                   newval &= 0xfff0ffff;
27474                   /* Encoding high 4bits imm.  Code below will encode the
27475                      remaining low 12bits.  */
27476                   newval |= (value & 0x0000f000) << 4;
27477                   newimm = value & 0x00000fff;
27478                 }
27479             }
27480         }
27481
27482       if (newimm == (unsigned int)FAIL)
27483         {
27484           as_bad_where (fixP->fx_file, fixP->fx_line,
27485                         _("invalid constant (%lx) after fixup"),
27486                         (unsigned long) value);
27487           break;
27488         }
27489
27490       newval |= (newimm & 0x800) << 15;
27491       newval |= (newimm & 0x700) << 4;
27492       newval |= (newimm & 0x0ff);
27493
27494       md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
27495       md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
27496       break;
27497
27498     case BFD_RELOC_ARM_SMC:
27499       if (((unsigned long) value) > 0xffff)
27500         as_bad_where (fixP->fx_file, fixP->fx_line,
27501                       _("invalid smc expression"));
27502       newval = md_chars_to_number (buf, INSN_SIZE);
27503       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
27504       md_number_to_chars (buf, newval, INSN_SIZE);
27505       break;
27506
27507     case BFD_RELOC_ARM_HVC:
27508       if (((unsigned long) value) > 0xffff)
27509         as_bad_where (fixP->fx_file, fixP->fx_line,
27510                       _("invalid hvc expression"));
27511       newval = md_chars_to_number (buf, INSN_SIZE);
27512       newval |= (value & 0xf) | ((value & 0xfff0) << 4);
27513       md_number_to_chars (buf, newval, INSN_SIZE);
27514       break;
27515
27516     case BFD_RELOC_ARM_SWI:
27517       if (fixP->tc_fix_data != 0)
27518         {
27519           if (((unsigned long) value) > 0xff)
27520             as_bad_where (fixP->fx_file, fixP->fx_line,
27521                           _("invalid swi expression"));
27522           newval = md_chars_to_number (buf, THUMB_SIZE);
27523           newval |= value;
27524           md_number_to_chars (buf, newval, THUMB_SIZE);
27525         }
27526       else
27527         {
27528           if (((unsigned long) value) > 0x00ffffff)
27529             as_bad_where (fixP->fx_file, fixP->fx_line,
27530                           _("invalid swi expression"));
27531           newval = md_chars_to_number (buf, INSN_SIZE);
27532           newval |= value;
27533           md_number_to_chars (buf, newval, INSN_SIZE);
27534         }
27535       break;
27536
27537     case BFD_RELOC_ARM_MULTI:
27538       if (((unsigned long) value) > 0xffff)
27539         as_bad_where (fixP->fx_file, fixP->fx_line,
27540                       _("invalid expression in load/store multiple"));
27541       newval = value | md_chars_to_number (buf, INSN_SIZE);
27542       md_number_to_chars (buf, newval, INSN_SIZE);
27543       break;
27544
27545 #ifdef OBJ_ELF
27546     case BFD_RELOC_ARM_PCREL_CALL:
27547
27548       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
27549           && fixP->fx_addsy
27550           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
27551           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
27552           && THUMB_IS_FUNC (fixP->fx_addsy))
27553         /* Flip the bl to blx. This is a simple flip
27554            bit here because we generate PCREL_CALL for
27555            unconditional bls.  */
27556         {
27557           newval = md_chars_to_number (buf, INSN_SIZE);
27558           newval = newval | 0x10000000;
27559           md_number_to_chars (buf, newval, INSN_SIZE);
27560           temp = 1;
27561           fixP->fx_done = 1;
27562         }
27563       else
27564         temp = 3;
27565       goto arm_branch_common;
27566
27567     case BFD_RELOC_ARM_PCREL_JUMP:
27568       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
27569           && fixP->fx_addsy
27570           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
27571           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
27572           && THUMB_IS_FUNC (fixP->fx_addsy))
27573         {
27574           /* This would map to a bl<cond>, b<cond>,
27575              b<always> to a Thumb function. We
27576              need to force a relocation for this particular
27577              case.  */
27578           newval = md_chars_to_number (buf, INSN_SIZE);
27579           fixP->fx_done = 0;
27580         }
27581       /* Fall through.  */
27582
27583     case BFD_RELOC_ARM_PLT32:
27584 #endif
27585     case BFD_RELOC_ARM_PCREL_BRANCH:
27586       temp = 3;
27587       goto arm_branch_common;
27588
27589     case BFD_RELOC_ARM_PCREL_BLX:
27590
27591       temp = 1;
27592       if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
27593           && fixP->fx_addsy
27594           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
27595           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
27596           && ARM_IS_FUNC (fixP->fx_addsy))
27597         {
27598           /* Flip the blx to a bl and warn.  */
27599           const char *name = S_GET_NAME (fixP->fx_addsy);
27600           newval = 0xeb000000;
27601           as_warn_where (fixP->fx_file, fixP->fx_line,
27602                          _("blx to '%s' an ARM ISA state function changed to bl"),
27603                           name);
27604           md_number_to_chars (buf, newval, INSN_SIZE);
27605           temp = 3;
27606           fixP->fx_done = 1;
27607         }
27608
27609 #ifdef OBJ_ELF
27610        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
27611          fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
27612 #endif
27613
27614     arm_branch_common:
27615       /* We are going to store value (shifted right by two) in the
27616          instruction, in a 24 bit, signed field.  Bits 26 through 32 either
27617          all clear or all set and bit 0 must be clear.  For B/BL bit 1 must
27618          also be clear.  */
27619       if (value & temp)
27620         as_bad_where (fixP->fx_file, fixP->fx_line,
27621                       _("misaligned branch destination"));
27622       if ((value & (offsetT)0xfe000000) != (offsetT)0
27623           && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
27624         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
27625
27626       if (fixP->fx_done || !seg->use_rela_p)
27627         {
27628           newval = md_chars_to_number (buf, INSN_SIZE);
27629           newval |= (value >> 2) & 0x00ffffff;
27630           /* Set the H bit on BLX instructions.  */
27631           if (temp == 1)
27632             {
27633               if (value & 2)
27634                 newval |= 0x01000000;
27635               else
27636                 newval &= ~0x01000000;
27637             }
27638           md_number_to_chars (buf, newval, INSN_SIZE);
27639         }
27640       break;
27641
27642     case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
27643       /* CBZ can only branch forward.  */
27644
27645       /* Attempts to use CBZ to branch to the next instruction
27646          (which, strictly speaking, are prohibited) will be turned into
27647          no-ops.
27648
27649          FIXME: It may be better to remove the instruction completely and
27650          perform relaxation.  */
27651       if (value == -2)
27652         {
27653           newval = md_chars_to_number (buf, THUMB_SIZE);
27654           newval = 0xbf00; /* NOP encoding T1 */
27655           md_number_to_chars (buf, newval, THUMB_SIZE);
27656         }
27657       else
27658         {
27659           if (value & ~0x7e)
27660             as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
27661
27662           if (fixP->fx_done || !seg->use_rela_p)
27663             {
27664               newval = md_chars_to_number (buf, THUMB_SIZE);
27665               newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
27666               md_number_to_chars (buf, newval, THUMB_SIZE);
27667             }
27668         }
27669       break;
27670
27671     case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.  */
27672       if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
27673         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
27674
27675       if (fixP->fx_done || !seg->use_rela_p)
27676         {
27677           newval = md_chars_to_number (buf, THUMB_SIZE);
27678           newval |= (value & 0x1ff) >> 1;
27679           md_number_to_chars (buf, newval, THUMB_SIZE);
27680         }
27681       break;
27682
27683     case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
27684       if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
27685         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
27686
27687       if (fixP->fx_done || !seg->use_rela_p)
27688         {
27689           newval = md_chars_to_number (buf, THUMB_SIZE);
27690           newval |= (value & 0xfff) >> 1;
27691           md_number_to_chars (buf, newval, THUMB_SIZE);
27692         }
27693       break;
27694
27695     case BFD_RELOC_THUMB_PCREL_BRANCH20:
27696       if (fixP->fx_addsy
27697           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
27698           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
27699           && ARM_IS_FUNC (fixP->fx_addsy)
27700           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
27701         {
27702           /* Force a relocation for a branch 20 bits wide.  */
27703           fixP->fx_done = 0;
27704         }
27705       if ((value & ~0x1fffff) && ((value & ~0x0fffff) != ~0x0fffff))
27706         as_bad_where (fixP->fx_file, fixP->fx_line,
27707                       _("conditional branch out of range"));
27708
27709       if (fixP->fx_done || !seg->use_rela_p)
27710         {
27711           offsetT newval2;
27712           addressT S, J1, J2, lo, hi;
27713
27714           S  = (value & 0x00100000) >> 20;
27715           J2 = (value & 0x00080000) >> 19;
27716           J1 = (value & 0x00040000) >> 18;
27717           hi = (value & 0x0003f000) >> 12;
27718           lo = (value & 0x00000ffe) >> 1;
27719
27720           newval   = md_chars_to_number (buf, THUMB_SIZE);
27721           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
27722           newval  |= (S << 10) | hi;
27723           newval2 |= (J1 << 13) | (J2 << 11) | lo;
27724           md_number_to_chars (buf, newval, THUMB_SIZE);
27725           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
27726         }
27727       break;
27728
27729     case BFD_RELOC_THUMB_PCREL_BLX:
27730       /* If there is a blx from a thumb state function to
27731          another thumb function flip this to a bl and warn
27732          about it.  */
27733
27734       if (fixP->fx_addsy
27735           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
27736           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
27737           && THUMB_IS_FUNC (fixP->fx_addsy))
27738         {
27739           const char *name = S_GET_NAME (fixP->fx_addsy);
27740           as_warn_where (fixP->fx_file, fixP->fx_line,
27741                          _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
27742                          name);
27743           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
27744           newval = newval | 0x1000;
27745           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
27746           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
27747           fixP->fx_done = 1;
27748         }
27749
27750
27751       goto thumb_bl_common;
27752
27753     case BFD_RELOC_THUMB_PCREL_BRANCH23:
27754       /* A bl from Thumb state ISA to an internal ARM state function
27755          is converted to a blx.  */
27756       if (fixP->fx_addsy
27757           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
27758           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
27759           && ARM_IS_FUNC (fixP->fx_addsy)
27760           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
27761         {
27762           newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
27763           newval = newval & ~0x1000;
27764           md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
27765           fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
27766           fixP->fx_done = 1;
27767         }
27768
27769     thumb_bl_common:
27770
27771       if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
27772         /* For a BLX instruction, make sure that the relocation is rounded up
27773            to a word boundary.  This follows the semantics of the instruction
27774            which specifies that bit 1 of the target address will come from bit
27775            1 of the base address.  */
27776         value = (value + 3) & ~ 3;
27777
27778 #ifdef OBJ_ELF
27779        if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4
27780            && fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
27781          fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
27782 #endif
27783
27784       if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
27785         {
27786           if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2)))
27787             as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
27788           else if ((value & ~0x1ffffff)
27789                    && ((value & ~0x1ffffff) != ~0x1ffffff))
27790             as_bad_where (fixP->fx_file, fixP->fx_line,
27791                           _("Thumb2 branch out of range"));
27792         }
27793
27794       if (fixP->fx_done || !seg->use_rela_p)
27795         encode_thumb2_b_bl_offset (buf, value);
27796
27797       break;
27798
27799     case BFD_RELOC_THUMB_PCREL_BRANCH25:
27800       if ((value & ~0x0ffffff) && ((value & ~0x0ffffff) != ~0x0ffffff))
27801         as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
27802
27803       if (fixP->fx_done || !seg->use_rela_p)
27804           encode_thumb2_b_bl_offset (buf, value);
27805
27806       break;
27807
27808     case BFD_RELOC_8:
27809       if (fixP->fx_done || !seg->use_rela_p)
27810         *buf = value;
27811       break;
27812
27813     case BFD_RELOC_16:
27814       if (fixP->fx_done || !seg->use_rela_p)
27815         md_number_to_chars (buf, value, 2);
27816       break;
27817
27818 #ifdef OBJ_ELF
27819     case BFD_RELOC_ARM_TLS_CALL:
27820     case BFD_RELOC_ARM_THM_TLS_CALL:
27821     case BFD_RELOC_ARM_TLS_DESCSEQ:
27822     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
27823     case BFD_RELOC_ARM_TLS_GOTDESC:
27824     case BFD_RELOC_ARM_TLS_GD32:
27825     case BFD_RELOC_ARM_TLS_LE32:
27826     case BFD_RELOC_ARM_TLS_IE32:
27827     case BFD_RELOC_ARM_TLS_LDM32:
27828     case BFD_RELOC_ARM_TLS_LDO32:
27829       S_SET_THREAD_LOCAL (fixP->fx_addsy);
27830       break;
27831
27832       /* Same handling as above, but with the arm_fdpic guard.  */
27833     case BFD_RELOC_ARM_TLS_GD32_FDPIC:
27834     case BFD_RELOC_ARM_TLS_IE32_FDPIC:
27835     case BFD_RELOC_ARM_TLS_LDM32_FDPIC:
27836       if (arm_fdpic)
27837         {
27838           S_SET_THREAD_LOCAL (fixP->fx_addsy);
27839         }
27840       else
27841         {
27842           as_bad_where (fixP->fx_file, fixP->fx_line,
27843                         _("Relocation supported only in FDPIC mode"));
27844         }
27845       break;
27846
27847     case BFD_RELOC_ARM_GOT32:
27848     case BFD_RELOC_ARM_GOTOFF:
27849       break;
27850
27851     case BFD_RELOC_ARM_GOT_PREL:
27852       if (fixP->fx_done || !seg->use_rela_p)
27853         md_number_to_chars (buf, value, 4);
27854       break;
27855
27856     case BFD_RELOC_ARM_TARGET2:
27857       /* TARGET2 is not partial-inplace, so we need to write the
27858          addend here for REL targets, because it won't be written out
27859          during reloc processing later.  */
27860       if (fixP->fx_done || !seg->use_rela_p)
27861         md_number_to_chars (buf, fixP->fx_offset, 4);
27862       break;
27863
27864       /* Relocations for FDPIC.  */
27865     case BFD_RELOC_ARM_GOTFUNCDESC:
27866     case BFD_RELOC_ARM_GOTOFFFUNCDESC:
27867     case BFD_RELOC_ARM_FUNCDESC:
27868       if (arm_fdpic)
27869         {
27870           if (fixP->fx_done || !seg->use_rela_p)
27871             md_number_to_chars (buf, 0, 4);
27872         }
27873       else
27874         {
27875           as_bad_where (fixP->fx_file, fixP->fx_line,
27876                         _("Relocation supported only in FDPIC mode"));
27877       }
27878       break;
27879 #endif
27880
27881     case BFD_RELOC_RVA:
27882     case BFD_RELOC_32:
27883     case BFD_RELOC_ARM_TARGET1:
27884     case BFD_RELOC_ARM_ROSEGREL32:
27885     case BFD_RELOC_ARM_SBREL32:
27886     case BFD_RELOC_32_PCREL:
27887 #ifdef TE_PE
27888     case BFD_RELOC_32_SECREL:
27889 #endif
27890       if (fixP->fx_done || !seg->use_rela_p)
27891 #ifdef TE_WINCE
27892         /* For WinCE we only do this for pcrel fixups.  */
27893         if (fixP->fx_done || fixP->fx_pcrel)
27894 #endif
27895           md_number_to_chars (buf, value, 4);
27896       break;
27897
27898 #ifdef OBJ_ELF
27899     case BFD_RELOC_ARM_PREL31:
27900       if (fixP->fx_done || !seg->use_rela_p)
27901         {
27902           newval = md_chars_to_number (buf, 4) & 0x80000000;
27903           if ((value ^ (value >> 1)) & 0x40000000)
27904             {
27905               as_bad_where (fixP->fx_file, fixP->fx_line,
27906                             _("rel31 relocation overflow"));
27907             }
27908           newval |= value & 0x7fffffff;
27909           md_number_to_chars (buf, newval, 4);
27910         }
27911       break;
27912 #endif
27913
27914     case BFD_RELOC_ARM_CP_OFF_IMM:
27915     case BFD_RELOC_ARM_T32_CP_OFF_IMM:
27916     case BFD_RELOC_ARM_T32_VLDR_VSTR_OFF_IMM:
27917       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM)
27918         newval = md_chars_to_number (buf, INSN_SIZE);
27919       else
27920         newval = get_thumb32_insn (buf);
27921       if ((newval & 0x0f200f00) == 0x0d000900)
27922         {
27923           /* This is a fp16 vstr/vldr.  The immediate offset in the mnemonic
27924              has permitted values that are multiples of 2, in the range 0
27925              to 510.  */
27926           if (value < -510 || value > 510 || (value & 1))
27927             as_bad_where (fixP->fx_file, fixP->fx_line,
27928                           _("co-processor offset out of range"));
27929         }
27930       else if ((newval & 0xfe001f80) == 0xec000f80)
27931         {
27932           if (value < -511 || value > 512 || (value & 3))
27933             as_bad_where (fixP->fx_file, fixP->fx_line,
27934                           _("co-processor offset out of range"));
27935         }
27936       else if (value < -1023 || value > 1023 || (value & 3))
27937         as_bad_where (fixP->fx_file, fixP->fx_line,
27938                       _("co-processor offset out of range"));
27939     cp_off_common:
27940       sign = value > 0;
27941       if (value < 0)
27942         value = -value;
27943       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
27944           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
27945         newval = md_chars_to_number (buf, INSN_SIZE);
27946       else
27947         newval = get_thumb32_insn (buf);
27948       if (value == 0)
27949         {
27950           if (fixP->fx_r_type == BFD_RELOC_ARM_T32_VLDR_VSTR_OFF_IMM)
27951             newval &= 0xffffff80;
27952           else
27953             newval &= 0xffffff00;
27954         }
27955       else
27956         {
27957           if (fixP->fx_r_type == BFD_RELOC_ARM_T32_VLDR_VSTR_OFF_IMM)
27958             newval &= 0xff7fff80;
27959           else
27960             newval &= 0xff7fff00;
27961           if ((newval & 0x0f200f00) == 0x0d000900)
27962             {
27963               /* This is a fp16 vstr/vldr.
27964
27965                  It requires the immediate offset in the instruction is shifted
27966                  left by 1 to be a half-word offset.
27967
27968                  Here, left shift by 1 first, and later right shift by 2
27969                  should get the right offset.  */
27970               value <<= 1;
27971             }
27972           newval |= (value >> 2) | (sign ? INDEX_UP : 0);
27973         }
27974       if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
27975           || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
27976         md_number_to_chars (buf, newval, INSN_SIZE);
27977       else
27978         put_thumb32_insn (buf, newval);
27979       break;
27980
27981     case BFD_RELOC_ARM_CP_OFF_IMM_S2:
27982     case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
27983       if (value < -255 || value > 255)
27984         as_bad_where (fixP->fx_file, fixP->fx_line,
27985                       _("co-processor offset out of range"));
27986       value *= 4;
27987       goto cp_off_common;
27988
27989     case BFD_RELOC_ARM_THUMB_OFFSET:
27990       newval = md_chars_to_number (buf, THUMB_SIZE);
27991       /* Exactly what ranges, and where the offset is inserted depends
27992          on the type of instruction, we can establish this from the
27993          top 4 bits.  */
27994       switch (newval >> 12)
27995         {
27996         case 4: /* PC load.  */
27997           /* Thumb PC loads are somewhat odd, bit 1 of the PC is
27998              forced to zero for these loads; md_pcrel_from has already
27999              compensated for this.  */
28000           if (value & 3)
28001             as_bad_where (fixP->fx_file, fixP->fx_line,
28002                           _("invalid offset, target not word aligned (0x%08lX)"),
28003                           (((unsigned long) fixP->fx_frag->fr_address
28004                             + (unsigned long) fixP->fx_where) & ~3)
28005                           + (unsigned long) value);
28006
28007           if (value & ~0x3fc)
28008             as_bad_where (fixP->fx_file, fixP->fx_line,
28009                           _("invalid offset, value too big (0x%08lX)"),
28010                           (long) value);
28011
28012           newval |= value >> 2;
28013           break;
28014
28015         case 9: /* SP load/store.  */
28016           if (value & ~0x3fc)
28017             as_bad_where (fixP->fx_file, fixP->fx_line,
28018                           _("invalid offset, value too big (0x%08lX)"),
28019                           (long) value);
28020           newval |= value >> 2;
28021           break;
28022
28023         case 6: /* Word load/store.  */
28024           if (value & ~0x7c)
28025             as_bad_where (fixP->fx_file, fixP->fx_line,
28026                           _("invalid offset, value too big (0x%08lX)"),
28027                           (long) value);
28028           newval |= value << 4; /* 6 - 2.  */
28029           break;
28030
28031         case 7: /* Byte load/store.  */
28032           if (value & ~0x1f)
28033             as_bad_where (fixP->fx_file, fixP->fx_line,
28034                           _("invalid offset, value too big (0x%08lX)"),
28035                           (long) value);
28036           newval |= value << 6;
28037           break;
28038
28039         case 8: /* Halfword load/store.  */
28040           if (value & ~0x3e)
28041             as_bad_where (fixP->fx_file, fixP->fx_line,
28042                           _("invalid offset, value too big (0x%08lX)"),
28043                           (long) value);
28044           newval |= value << 5; /* 6 - 1.  */
28045           break;
28046
28047         default:
28048           as_bad_where (fixP->fx_file, fixP->fx_line,
28049                         "Unable to process relocation for thumb opcode: %lx",
28050                         (unsigned long) newval);
28051           break;
28052         }
28053       md_number_to_chars (buf, newval, THUMB_SIZE);
28054       break;
28055
28056     case BFD_RELOC_ARM_THUMB_ADD:
28057       /* This is a complicated relocation, since we use it for all of
28058          the following immediate relocations:
28059
28060             3bit ADD/SUB
28061             8bit ADD/SUB
28062             9bit ADD/SUB SP word-aligned
28063            10bit ADD PC/SP word-aligned
28064
28065          The type of instruction being processed is encoded in the
28066          instruction field:
28067
28068            0x8000  SUB
28069            0x00F0  Rd
28070            0x000F  Rs
28071       */
28072       newval = md_chars_to_number (buf, THUMB_SIZE);
28073       {
28074         int rd = (newval >> 4) & 0xf;
28075         int rs = newval & 0xf;
28076         int subtract = !!(newval & 0x8000);
28077
28078         /* Check for HI regs, only very restricted cases allowed:
28079            Adjusting SP, and using PC or SP to get an address.  */
28080         if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
28081             || (rs > 7 && rs != REG_SP && rs != REG_PC))
28082           as_bad_where (fixP->fx_file, fixP->fx_line,
28083                         _("invalid Hi register with immediate"));
28084
28085         /* If value is negative, choose the opposite instruction.  */
28086         if (value < 0)
28087           {
28088             value = -value;
28089             subtract = !subtract;
28090             if (value < 0)
28091               as_bad_where (fixP->fx_file, fixP->fx_line,
28092                             _("immediate value out of range"));
28093           }
28094
28095         if (rd == REG_SP)
28096           {
28097             if (value & ~0x1fc)
28098               as_bad_where (fixP->fx_file, fixP->fx_line,
28099                             _("invalid immediate for stack address calculation"));
28100             newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
28101             newval |= value >> 2;
28102           }
28103         else if (rs == REG_PC || rs == REG_SP)
28104           {
28105             /* PR gas/18541.  If the addition is for a defined symbol
28106                within range of an ADR instruction then accept it.  */
28107             if (subtract
28108                 && value == 4
28109                 && fixP->fx_addsy != NULL)
28110               {
28111                 subtract = 0;
28112
28113                 if (! S_IS_DEFINED (fixP->fx_addsy)
28114                     || S_GET_SEGMENT (fixP->fx_addsy) != seg
28115                     || S_IS_WEAK (fixP->fx_addsy))
28116                   {
28117                     as_bad_where (fixP->fx_file, fixP->fx_line,
28118                                   _("address calculation needs a strongly defined nearby symbol"));
28119                   }
28120                 else
28121                   {
28122                     offsetT v = fixP->fx_where + fixP->fx_frag->fr_address;
28123
28124                     /* Round up to the next 4-byte boundary.  */
28125                     if (v & 3)
28126                       v = (v + 3) & ~ 3;
28127                     else
28128                       v += 4;
28129                     v = S_GET_VALUE (fixP->fx_addsy) - v;
28130
28131                     if (v & ~0x3fc)
28132                       {
28133                         as_bad_where (fixP->fx_file, fixP->fx_line,
28134                                       _("symbol too far away"));
28135                       }
28136                     else
28137                       {
28138                         fixP->fx_done = 1;
28139                         value = v;
28140                       }
28141                   }
28142               }
28143
28144             if (subtract || value & ~0x3fc)
28145               as_bad_where (fixP->fx_file, fixP->fx_line,
28146                             _("invalid immediate for address calculation (value = 0x%08lX)"),
28147                             (unsigned long) (subtract ? - value : value));
28148             newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
28149             newval |= rd << 8;
28150             newval |= value >> 2;
28151           }
28152         else if (rs == rd)
28153           {
28154             if (value & ~0xff)
28155               as_bad_where (fixP->fx_file, fixP->fx_line,
28156                             _("immediate value out of range"));
28157             newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
28158             newval |= (rd << 8) | value;
28159           }
28160         else
28161           {
28162             if (value & ~0x7)
28163               as_bad_where (fixP->fx_file, fixP->fx_line,
28164                             _("immediate value out of range"));
28165             newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
28166             newval |= rd | (rs << 3) | (value << 6);
28167           }
28168       }
28169       md_number_to_chars (buf, newval, THUMB_SIZE);
28170       break;
28171
28172     case BFD_RELOC_ARM_THUMB_IMM:
28173       newval = md_chars_to_number (buf, THUMB_SIZE);
28174       if (value < 0 || value > 255)
28175         as_bad_where (fixP->fx_file, fixP->fx_line,
28176                       _("invalid immediate: %ld is out of range"),
28177                       (long) value);
28178       newval |= value;
28179       md_number_to_chars (buf, newval, THUMB_SIZE);
28180       break;
28181
28182     case BFD_RELOC_ARM_THUMB_SHIFT:
28183       /* 5bit shift value (0..32).  LSL cannot take 32.  */
28184       newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
28185       temp = newval & 0xf800;
28186       if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
28187         as_bad_where (fixP->fx_file, fixP->fx_line,
28188                       _("invalid shift value: %ld"), (long) value);
28189       /* Shifts of zero must be encoded as LSL.  */
28190       if (value == 0)
28191         newval = (newval & 0x003f) | T_OPCODE_LSL_I;
28192       /* Shifts of 32 are encoded as zero.  */
28193       else if (value == 32)
28194         value = 0;
28195       newval |= value << 6;
28196       md_number_to_chars (buf, newval, THUMB_SIZE);
28197       break;
28198
28199     case BFD_RELOC_VTABLE_INHERIT:
28200     case BFD_RELOC_VTABLE_ENTRY:
28201       fixP->fx_done = 0;
28202       return;
28203
28204     case BFD_RELOC_ARM_MOVW:
28205     case BFD_RELOC_ARM_MOVT:
28206     case BFD_RELOC_ARM_THUMB_MOVW:
28207     case BFD_RELOC_ARM_THUMB_MOVT:
28208       if (fixP->fx_done || !seg->use_rela_p)
28209         {
28210           /* REL format relocations are limited to a 16-bit addend.  */
28211           if (!fixP->fx_done)
28212             {
28213               if (value < -0x8000 || value > 0x7fff)
28214                   as_bad_where (fixP->fx_file, fixP->fx_line,
28215                                 _("offset out of range"));
28216             }
28217           else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
28218                    || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
28219             {
28220               value >>= 16;
28221             }
28222
28223           if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
28224               || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
28225             {
28226               newval = get_thumb32_insn (buf);
28227               newval &= 0xfbf08f00;
28228               newval |= (value & 0xf000) << 4;
28229               newval |= (value & 0x0800) << 15;
28230               newval |= (value & 0x0700) << 4;
28231               newval |= (value & 0x00ff);
28232               put_thumb32_insn (buf, newval);
28233             }
28234           else
28235             {
28236               newval = md_chars_to_number (buf, 4);
28237               newval &= 0xfff0f000;
28238               newval |= value & 0x0fff;
28239               newval |= (value & 0xf000) << 4;
28240               md_number_to_chars (buf, newval, 4);
28241             }
28242         }
28243       return;
28244
28245    case BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC:
28246    case BFD_RELOC_ARM_THUMB_ALU_ABS_G1_NC:
28247    case BFD_RELOC_ARM_THUMB_ALU_ABS_G2_NC:
28248    case BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC:
28249       gas_assert (!fixP->fx_done);
28250       {
28251         bfd_vma insn;
28252         bfd_boolean is_mov;
28253         bfd_vma encoded_addend = value;
28254
28255         /* Check that addend can be encoded in instruction.  */
28256         if (!seg->use_rela_p && (value < 0 || value > 255))
28257           as_bad_where (fixP->fx_file, fixP->fx_line,
28258                         _("the offset 0x%08lX is not representable"),
28259                         (unsigned long) encoded_addend);
28260
28261         /* Extract the instruction.  */
28262         insn = md_chars_to_number (buf, THUMB_SIZE);
28263         is_mov = (insn & 0xf800) == 0x2000;
28264
28265         /* Encode insn.  */
28266         if (is_mov)
28267           {
28268             if (!seg->use_rela_p)
28269               insn |= encoded_addend;
28270           }
28271         else
28272           {
28273             int rd, rs;
28274
28275             /* Extract the instruction.  */
28276              /* Encoding is the following
28277                 0x8000  SUB
28278                 0x00F0  Rd
28279                 0x000F  Rs
28280              */
28281              /* The following conditions must be true :
28282                 - ADD
28283                 - Rd == Rs
28284                 - Rd <= 7
28285              */
28286             rd = (insn >> 4) & 0xf;
28287             rs = insn & 0xf;
28288             if ((insn & 0x8000) || (rd != rs) || rd > 7)
28289               as_bad_where (fixP->fx_file, fixP->fx_line,
28290                         _("Unable to process relocation for thumb opcode: %lx"),
28291                         (unsigned long) insn);
28292
28293             /* Encode as ADD immediate8 thumb 1 code.  */
28294             insn = 0x3000 | (rd << 8);
28295
28296             /* Place the encoded addend into the first 8 bits of the
28297                instruction.  */
28298             if (!seg->use_rela_p)
28299               insn |= encoded_addend;
28300           }
28301
28302         /* Update the instruction.  */
28303         md_number_to_chars (buf, insn, THUMB_SIZE);
28304       }
28305       break;
28306
28307    case BFD_RELOC_ARM_ALU_PC_G0_NC:
28308    case BFD_RELOC_ARM_ALU_PC_G0:
28309    case BFD_RELOC_ARM_ALU_PC_G1_NC:
28310    case BFD_RELOC_ARM_ALU_PC_G1:
28311    case BFD_RELOC_ARM_ALU_PC_G2:
28312    case BFD_RELOC_ARM_ALU_SB_G0_NC:
28313    case BFD_RELOC_ARM_ALU_SB_G0:
28314    case BFD_RELOC_ARM_ALU_SB_G1_NC:
28315    case BFD_RELOC_ARM_ALU_SB_G1:
28316    case BFD_RELOC_ARM_ALU_SB_G2:
28317      gas_assert (!fixP->fx_done);
28318      if (!seg->use_rela_p)
28319        {
28320          bfd_vma insn;
28321          bfd_vma encoded_addend;
28322          bfd_vma addend_abs = llabs (value);
28323
28324          /* Check that the absolute value of the addend can be
28325             expressed as an 8-bit constant plus a rotation.  */
28326          encoded_addend = encode_arm_immediate (addend_abs);
28327          if (encoded_addend == (unsigned int) FAIL)
28328            as_bad_where (fixP->fx_file, fixP->fx_line,
28329                          _("the offset 0x%08lX is not representable"),
28330                          (unsigned long) addend_abs);
28331
28332          /* Extract the instruction.  */
28333          insn = md_chars_to_number (buf, INSN_SIZE);
28334
28335          /* If the addend is positive, use an ADD instruction.
28336             Otherwise use a SUB.  Take care not to destroy the S bit.  */
28337          insn &= 0xff1fffff;
28338          if (value < 0)
28339            insn |= 1 << 22;
28340          else
28341            insn |= 1 << 23;
28342
28343          /* Place the encoded addend into the first 12 bits of the
28344             instruction.  */
28345          insn &= 0xfffff000;
28346          insn |= encoded_addend;
28347
28348          /* Update the instruction.  */
28349          md_number_to_chars (buf, insn, INSN_SIZE);
28350        }
28351      break;
28352
28353     case BFD_RELOC_ARM_LDR_PC_G0:
28354     case BFD_RELOC_ARM_LDR_PC_G1:
28355     case BFD_RELOC_ARM_LDR_PC_G2:
28356     case BFD_RELOC_ARM_LDR_SB_G0:
28357     case BFD_RELOC_ARM_LDR_SB_G1:
28358     case BFD_RELOC_ARM_LDR_SB_G2:
28359       gas_assert (!fixP->fx_done);
28360       if (!seg->use_rela_p)
28361         {
28362           bfd_vma insn;
28363           bfd_vma addend_abs = llabs (value);
28364
28365           /* Check that the absolute value of the addend can be
28366              encoded in 12 bits.  */
28367           if (addend_abs >= 0x1000)
28368             as_bad_where (fixP->fx_file, fixP->fx_line,
28369                           _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
28370                           (unsigned long) addend_abs);
28371
28372           /* Extract the instruction.  */
28373           insn = md_chars_to_number (buf, INSN_SIZE);
28374
28375           /* If the addend is negative, clear bit 23 of the instruction.
28376              Otherwise set it.  */
28377           if (value < 0)
28378             insn &= ~(1 << 23);
28379           else
28380             insn |= 1 << 23;
28381
28382           /* Place the absolute value of the addend into the first 12 bits
28383              of the instruction.  */
28384           insn &= 0xfffff000;
28385           insn |= addend_abs;
28386
28387           /* Update the instruction.  */
28388           md_number_to_chars (buf, insn, INSN_SIZE);
28389         }
28390       break;
28391
28392     case BFD_RELOC_ARM_LDRS_PC_G0:
28393     case BFD_RELOC_ARM_LDRS_PC_G1:
28394     case BFD_RELOC_ARM_LDRS_PC_G2:
28395     case BFD_RELOC_ARM_LDRS_SB_G0:
28396     case BFD_RELOC_ARM_LDRS_SB_G1:
28397     case BFD_RELOC_ARM_LDRS_SB_G2:
28398       gas_assert (!fixP->fx_done);
28399       if (!seg->use_rela_p)
28400         {
28401           bfd_vma insn;
28402           bfd_vma addend_abs = llabs (value);
28403
28404           /* Check that the absolute value of the addend can be
28405              encoded in 8 bits.  */
28406           if (addend_abs >= 0x100)
28407             as_bad_where (fixP->fx_file, fixP->fx_line,
28408                           _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
28409                           (unsigned long) addend_abs);
28410
28411           /* Extract the instruction.  */
28412           insn = md_chars_to_number (buf, INSN_SIZE);
28413
28414           /* If the addend is negative, clear bit 23 of the instruction.
28415              Otherwise set it.  */
28416           if (value < 0)
28417             insn &= ~(1 << 23);
28418           else
28419             insn |= 1 << 23;
28420
28421           /* Place the first four bits of the absolute value of the addend
28422              into the first 4 bits of the instruction, and the remaining
28423              four into bits 8 .. 11.  */
28424           insn &= 0xfffff0f0;
28425           insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
28426
28427           /* Update the instruction.  */
28428           md_number_to_chars (buf, insn, INSN_SIZE);
28429         }
28430       break;
28431
28432     case BFD_RELOC_ARM_LDC_PC_G0:
28433     case BFD_RELOC_ARM_LDC_PC_G1:
28434     case BFD_RELOC_ARM_LDC_PC_G2:
28435     case BFD_RELOC_ARM_LDC_SB_G0:
28436     case BFD_RELOC_ARM_LDC_SB_G1:
28437     case BFD_RELOC_ARM_LDC_SB_G2:
28438       gas_assert (!fixP->fx_done);
28439       if (!seg->use_rela_p)
28440         {
28441           bfd_vma insn;
28442           bfd_vma addend_abs = llabs (value);
28443
28444           /* Check that the absolute value of the addend is a multiple of
28445              four and, when divided by four, fits in 8 bits.  */
28446           if (addend_abs & 0x3)
28447             as_bad_where (fixP->fx_file, fixP->fx_line,
28448                           _("bad offset 0x%08lX (must be word-aligned)"),
28449                           (unsigned long) addend_abs);
28450
28451           if ((addend_abs >> 2) > 0xff)
28452             as_bad_where (fixP->fx_file, fixP->fx_line,
28453                           _("bad offset 0x%08lX (must be an 8-bit number of words)"),
28454                           (unsigned long) addend_abs);
28455
28456           /* Extract the instruction.  */
28457           insn = md_chars_to_number (buf, INSN_SIZE);
28458
28459           /* If the addend is negative, clear bit 23 of the instruction.
28460              Otherwise set it.  */
28461           if (value < 0)
28462             insn &= ~(1 << 23);
28463           else
28464             insn |= 1 << 23;
28465
28466           /* Place the addend (divided by four) into the first eight
28467              bits of the instruction.  */
28468           insn &= 0xfffffff0;
28469           insn |= addend_abs >> 2;
28470
28471           /* Update the instruction.  */
28472           md_number_to_chars (buf, insn, INSN_SIZE);
28473         }
28474       break;
28475
28476     case BFD_RELOC_THUMB_PCREL_BRANCH5:
28477       if (fixP->fx_addsy
28478           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
28479           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
28480           && ARM_IS_FUNC (fixP->fx_addsy)
28481           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v8_1m_main))
28482         {
28483           /* Force a relocation for a branch 5 bits wide.  */
28484           fixP->fx_done = 0;
28485         }
28486       if (v8_1_branch_value_check (value, 5, FALSE) == FAIL)
28487         as_bad_where (fixP->fx_file, fixP->fx_line,
28488                       BAD_BRANCH_OFF);
28489
28490       if (fixP->fx_done || !seg->use_rela_p)
28491         {
28492           addressT boff = value >> 1;
28493
28494           newval  = md_chars_to_number (buf, THUMB_SIZE);
28495           newval |= (boff << 7);
28496           md_number_to_chars (buf, newval, THUMB_SIZE);
28497         }
28498       break;
28499
28500     case BFD_RELOC_THUMB_PCREL_BFCSEL:
28501       if (fixP->fx_addsy
28502           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
28503           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
28504           && ARM_IS_FUNC (fixP->fx_addsy)
28505           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v8_1m_main))
28506         {
28507           fixP->fx_done = 0;
28508         }
28509       if ((value & ~0x7f) && ((value & ~0x3f) != ~0x3f))
28510         as_bad_where (fixP->fx_file, fixP->fx_line,
28511                       _("branch out of range"));
28512
28513       if (fixP->fx_done || !seg->use_rela_p)
28514         {
28515           newval  = md_chars_to_number (buf, THUMB_SIZE);
28516
28517           addressT boff = ((newval & 0x0780) >> 7) << 1;
28518           addressT diff = value - boff;
28519
28520           if (diff == 4)
28521             {
28522               newval |= 1 << 1; /* T bit.  */
28523             }
28524           else if (diff != 2)
28525             {
28526               as_bad_where (fixP->fx_file, fixP->fx_line,
28527                             _("out of range label-relative fixup value"));
28528             }
28529           md_number_to_chars (buf, newval, THUMB_SIZE);
28530         }
28531       break;
28532
28533     case BFD_RELOC_ARM_THUMB_BF17:
28534       if (fixP->fx_addsy
28535           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
28536           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
28537           && ARM_IS_FUNC (fixP->fx_addsy)
28538           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v8_1m_main))
28539         {
28540           /* Force a relocation for a branch 17 bits wide.  */
28541           fixP->fx_done = 0;
28542         }
28543
28544       if (v8_1_branch_value_check (value, 17, TRUE) == FAIL)
28545         as_bad_where (fixP->fx_file, fixP->fx_line,
28546                       BAD_BRANCH_OFF);
28547
28548       if (fixP->fx_done || !seg->use_rela_p)
28549         {
28550           offsetT newval2;
28551           addressT immA, immB, immC;
28552
28553           immA = (value & 0x0001f000) >> 12;
28554           immB = (value & 0x00000ffc) >> 2;
28555           immC = (value & 0x00000002) >> 1;
28556
28557           newval   = md_chars_to_number (buf, THUMB_SIZE);
28558           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
28559           newval  |= immA;
28560           newval2 |= (immC << 11) | (immB << 1);
28561           md_number_to_chars (buf, newval, THUMB_SIZE);
28562           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
28563         }
28564       break;
28565
28566     case BFD_RELOC_ARM_THUMB_BF19:
28567       if (fixP->fx_addsy
28568           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
28569           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
28570           && ARM_IS_FUNC (fixP->fx_addsy)
28571           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v8_1m_main))
28572         {
28573           /* Force a relocation for a branch 19 bits wide.  */
28574           fixP->fx_done = 0;
28575         }
28576
28577       if (v8_1_branch_value_check (value, 19, TRUE) == FAIL)
28578         as_bad_where (fixP->fx_file, fixP->fx_line,
28579                       BAD_BRANCH_OFF);
28580
28581       if (fixP->fx_done || !seg->use_rela_p)
28582         {
28583           offsetT newval2;
28584           addressT immA, immB, immC;
28585
28586           immA = (value & 0x0007f000) >> 12;
28587           immB = (value & 0x00000ffc) >> 2;
28588           immC = (value & 0x00000002) >> 1;
28589
28590           newval   = md_chars_to_number (buf, THUMB_SIZE);
28591           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
28592           newval  |= immA;
28593           newval2 |= (immC << 11) | (immB << 1);
28594           md_number_to_chars (buf, newval, THUMB_SIZE);
28595           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
28596         }
28597       break;
28598
28599     case BFD_RELOC_ARM_THUMB_BF13:
28600       if (fixP->fx_addsy
28601           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
28602           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
28603           && ARM_IS_FUNC (fixP->fx_addsy)
28604           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v8_1m_main))
28605         {
28606           /* Force a relocation for a branch 13 bits wide.  */
28607           fixP->fx_done = 0;
28608         }
28609
28610       if (v8_1_branch_value_check (value, 13, TRUE) == FAIL)
28611         as_bad_where (fixP->fx_file, fixP->fx_line,
28612                       BAD_BRANCH_OFF);
28613
28614       if (fixP->fx_done || !seg->use_rela_p)
28615         {
28616           offsetT newval2;
28617           addressT immA, immB, immC;
28618
28619           immA = (value & 0x00001000) >> 12;
28620           immB = (value & 0x00000ffc) >> 2;
28621           immC = (value & 0x00000002) >> 1;
28622
28623           newval   = md_chars_to_number (buf, THUMB_SIZE);
28624           newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
28625           newval  |= immA;
28626           newval2 |= (immC << 11) | (immB << 1);
28627           md_number_to_chars (buf, newval, THUMB_SIZE);
28628           md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
28629         }
28630       break;
28631
28632     case BFD_RELOC_ARM_THUMB_LOOP12:
28633       if (fixP->fx_addsy
28634           && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
28635           && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
28636           && ARM_IS_FUNC (fixP->fx_addsy)
28637           && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v8_1m_main))
28638         {
28639           /* Force a relocation for a branch 12 bits wide.  */
28640           fixP->fx_done = 0;
28641         }
28642
28643       bfd_vma insn = get_thumb32_insn (buf);
28644       /* le lr, <label> or le <label> */
28645       if (((insn & 0xffffffff) == 0xf00fc001)
28646           || ((insn & 0xffffffff) == 0xf02fc001))
28647         value = -value;
28648
28649       if (v8_1_branch_value_check (value, 12, FALSE) == FAIL)
28650         as_bad_where (fixP->fx_file, fixP->fx_line,
28651                       BAD_BRANCH_OFF);
28652       if (fixP->fx_done || !seg->use_rela_p)
28653         {
28654           addressT imml, immh;
28655
28656           immh = (value & 0x00000ffc) >> 2;
28657           imml = (value & 0x00000002) >> 1;
28658
28659           newval  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
28660           newval |= (imml << 11) | (immh << 1);
28661           md_number_to_chars (buf + THUMB_SIZE, newval, THUMB_SIZE);
28662         }
28663       break;
28664
28665     case BFD_RELOC_ARM_V4BX:
28666       /* This will need to go in the object file.  */
28667       fixP->fx_done = 0;
28668       break;
28669
28670     case BFD_RELOC_UNUSED:
28671     default:
28672       as_bad_where (fixP->fx_file, fixP->fx_line,
28673                     _("bad relocation fixup type (%d)"), fixP->fx_r_type);
28674     }
28675 }
28676
28677 /* Translate internal representation of relocation info to BFD target
28678    format.  */
28679
28680 arelent *
28681 tc_gen_reloc (asection *section, fixS *fixp)
28682 {
28683   arelent * reloc;
28684   bfd_reloc_code_real_type code;
28685
28686   reloc = XNEW (arelent);
28687
28688   reloc->sym_ptr_ptr = XNEW (asymbol *);
28689   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
28690   reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
28691
28692   if (fixp->fx_pcrel)
28693     {
28694       if (section->use_rela_p)
28695         fixp->fx_offset -= md_pcrel_from_section (fixp, section);
28696       else
28697         fixp->fx_offset = reloc->address;
28698     }
28699   reloc->addend = fixp->fx_offset;
28700
28701   switch (fixp->fx_r_type)
28702     {
28703     case BFD_RELOC_8:
28704       if (fixp->fx_pcrel)
28705         {
28706           code = BFD_RELOC_8_PCREL;
28707           break;
28708         }
28709       /* Fall through.  */
28710
28711     case BFD_RELOC_16:
28712       if (fixp->fx_pcrel)
28713         {
28714           code = BFD_RELOC_16_PCREL;
28715           break;
28716         }
28717       /* Fall through.  */
28718
28719     case BFD_RELOC_32:
28720       if (fixp->fx_pcrel)
28721         {
28722           code = BFD_RELOC_32_PCREL;
28723           break;
28724         }
28725       /* Fall through.  */
28726
28727     case BFD_RELOC_ARM_MOVW:
28728       if (fixp->fx_pcrel)
28729         {
28730           code = BFD_RELOC_ARM_MOVW_PCREL;
28731           break;
28732         }
28733       /* Fall through.  */
28734
28735     case BFD_RELOC_ARM_MOVT:
28736       if (fixp->fx_pcrel)
28737         {
28738           code = BFD_RELOC_ARM_MOVT_PCREL;
28739           break;
28740         }
28741       /* Fall through.  */
28742
28743     case BFD_RELOC_ARM_THUMB_MOVW:
28744       if (fixp->fx_pcrel)
28745         {
28746           code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
28747           break;
28748         }
28749       /* Fall through.  */
28750
28751     case BFD_RELOC_ARM_THUMB_MOVT:
28752       if (fixp->fx_pcrel)
28753         {
28754           code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
28755           break;
28756         }
28757       /* Fall through.  */
28758
28759     case BFD_RELOC_NONE:
28760     case BFD_RELOC_ARM_PCREL_BRANCH:
28761     case BFD_RELOC_ARM_PCREL_BLX:
28762     case BFD_RELOC_RVA:
28763     case BFD_RELOC_THUMB_PCREL_BRANCH7:
28764     case BFD_RELOC_THUMB_PCREL_BRANCH9:
28765     case BFD_RELOC_THUMB_PCREL_BRANCH12:
28766     case BFD_RELOC_THUMB_PCREL_BRANCH20:
28767     case BFD_RELOC_THUMB_PCREL_BRANCH23:
28768     case BFD_RELOC_THUMB_PCREL_BRANCH25:
28769     case BFD_RELOC_VTABLE_ENTRY:
28770     case BFD_RELOC_VTABLE_INHERIT:
28771 #ifdef TE_PE
28772     case BFD_RELOC_32_SECREL:
28773 #endif
28774       code = fixp->fx_r_type;
28775       break;
28776
28777     case BFD_RELOC_THUMB_PCREL_BLX:
28778 #ifdef OBJ_ELF
28779       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
28780         code = BFD_RELOC_THUMB_PCREL_BRANCH23;
28781       else
28782 #endif
28783         code = BFD_RELOC_THUMB_PCREL_BLX;
28784       break;
28785
28786     case BFD_RELOC_ARM_LITERAL:
28787     case BFD_RELOC_ARM_HWLITERAL:
28788       /* If this is called then the a literal has
28789          been referenced across a section boundary.  */
28790       as_bad_where (fixp->fx_file, fixp->fx_line,
28791                     _("literal referenced across section boundary"));
28792       return NULL;
28793
28794 #ifdef OBJ_ELF
28795     case BFD_RELOC_ARM_TLS_CALL:
28796     case BFD_RELOC_ARM_THM_TLS_CALL:
28797     case BFD_RELOC_ARM_TLS_DESCSEQ:
28798     case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
28799     case BFD_RELOC_ARM_GOT32:
28800     case BFD_RELOC_ARM_GOTOFF:
28801     case BFD_RELOC_ARM_GOT_PREL:
28802     case BFD_RELOC_ARM_PLT32:
28803     case BFD_RELOC_ARM_TARGET1:
28804     case BFD_RELOC_ARM_ROSEGREL32:
28805     case BFD_RELOC_ARM_SBREL32:
28806     case BFD_RELOC_ARM_PREL31:
28807     case BFD_RELOC_ARM_TARGET2:
28808     case BFD_RELOC_ARM_TLS_LDO32:
28809     case BFD_RELOC_ARM_PCREL_CALL:
28810     case BFD_RELOC_ARM_PCREL_JUMP:
28811     case BFD_RELOC_ARM_ALU_PC_G0_NC:
28812     case BFD_RELOC_ARM_ALU_PC_G0:
28813     case BFD_RELOC_ARM_ALU_PC_G1_NC:
28814     case BFD_RELOC_ARM_ALU_PC_G1:
28815     case BFD_RELOC_ARM_ALU_PC_G2:
28816     case BFD_RELOC_ARM_LDR_PC_G0:
28817     case BFD_RELOC_ARM_LDR_PC_G1:
28818     case BFD_RELOC_ARM_LDR_PC_G2:
28819     case BFD_RELOC_ARM_LDRS_PC_G0:
28820     case BFD_RELOC_ARM_LDRS_PC_G1:
28821     case BFD_RELOC_ARM_LDRS_PC_G2:
28822     case BFD_RELOC_ARM_LDC_PC_G0:
28823     case BFD_RELOC_ARM_LDC_PC_G1:
28824     case BFD_RELOC_ARM_LDC_PC_G2:
28825     case BFD_RELOC_ARM_ALU_SB_G0_NC:
28826     case BFD_RELOC_ARM_ALU_SB_G0:
28827     case BFD_RELOC_ARM_ALU_SB_G1_NC:
28828     case BFD_RELOC_ARM_ALU_SB_G1:
28829     case BFD_RELOC_ARM_ALU_SB_G2:
28830     case BFD_RELOC_ARM_LDR_SB_G0:
28831     case BFD_RELOC_ARM_LDR_SB_G1:
28832     case BFD_RELOC_ARM_LDR_SB_G2:
28833     case BFD_RELOC_ARM_LDRS_SB_G0:
28834     case BFD_RELOC_ARM_LDRS_SB_G1:
28835     case BFD_RELOC_ARM_LDRS_SB_G2:
28836     case BFD_RELOC_ARM_LDC_SB_G0:
28837     case BFD_RELOC_ARM_LDC_SB_G1:
28838     case BFD_RELOC_ARM_LDC_SB_G2:
28839     case BFD_RELOC_ARM_V4BX:
28840     case BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC:
28841     case BFD_RELOC_ARM_THUMB_ALU_ABS_G1_NC:
28842     case BFD_RELOC_ARM_THUMB_ALU_ABS_G2_NC:
28843     case BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC:
28844     case BFD_RELOC_ARM_GOTFUNCDESC:
28845     case BFD_RELOC_ARM_GOTOFFFUNCDESC:
28846     case BFD_RELOC_ARM_FUNCDESC:
28847     case BFD_RELOC_ARM_THUMB_BF17:
28848     case BFD_RELOC_ARM_THUMB_BF19:
28849     case BFD_RELOC_ARM_THUMB_BF13:
28850       code = fixp->fx_r_type;
28851       break;
28852
28853     case BFD_RELOC_ARM_TLS_GOTDESC:
28854     case BFD_RELOC_ARM_TLS_GD32:
28855     case BFD_RELOC_ARM_TLS_GD32_FDPIC:
28856     case BFD_RELOC_ARM_TLS_LE32:
28857     case BFD_RELOC_ARM_TLS_IE32:
28858     case BFD_RELOC_ARM_TLS_IE32_FDPIC:
28859     case BFD_RELOC_ARM_TLS_LDM32:
28860     case BFD_RELOC_ARM_TLS_LDM32_FDPIC:
28861       /* BFD will include the symbol's address in the addend.
28862          But we don't want that, so subtract it out again here.  */
28863       if (!S_IS_COMMON (fixp->fx_addsy))
28864         reloc->addend -= (*reloc->sym_ptr_ptr)->value;
28865       code = fixp->fx_r_type;
28866       break;
28867 #endif
28868
28869     case BFD_RELOC_ARM_IMMEDIATE:
28870       as_bad_where (fixp->fx_file, fixp->fx_line,
28871                     _("internal relocation (type: IMMEDIATE) not fixed up"));
28872       return NULL;
28873
28874     case BFD_RELOC_ARM_ADRL_IMMEDIATE:
28875       as_bad_where (fixp->fx_file, fixp->fx_line,
28876                     _("ADRL used for a symbol not defined in the same file"));
28877       return NULL;
28878
28879     case BFD_RELOC_THUMB_PCREL_BRANCH5:
28880     case BFD_RELOC_THUMB_PCREL_BFCSEL:
28881     case BFD_RELOC_ARM_THUMB_LOOP12:
28882       as_bad_where (fixp->fx_file, fixp->fx_line,
28883                     _("%s used for a symbol not defined in the same file"),
28884                     bfd_get_reloc_code_name (fixp->fx_r_type));
28885       return NULL;
28886
28887     case BFD_RELOC_ARM_OFFSET_IMM:
28888       if (section->use_rela_p)
28889         {
28890           code = fixp->fx_r_type;
28891           break;
28892         }
28893
28894       if (fixp->fx_addsy != NULL
28895           && !S_IS_DEFINED (fixp->fx_addsy)
28896           && S_IS_LOCAL (fixp->fx_addsy))
28897         {
28898           as_bad_where (fixp->fx_file, fixp->fx_line,
28899                         _("undefined local label `%s'"),
28900                         S_GET_NAME (fixp->fx_addsy));
28901           return NULL;
28902         }
28903
28904       as_bad_where (fixp->fx_file, fixp->fx_line,
28905                     _("internal_relocation (type: OFFSET_IMM) not fixed up"));
28906       return NULL;
28907
28908     default:
28909       {
28910         const char * type;
28911
28912         switch (fixp->fx_r_type)
28913           {
28914           case BFD_RELOC_NONE:             type = "NONE";         break;
28915           case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
28916           case BFD_RELOC_ARM_SHIFT_IMM:    type = "SHIFT_IMM";    break;
28917           case BFD_RELOC_ARM_SMC:          type = "SMC";          break;
28918           case BFD_RELOC_ARM_SWI:          type = "SWI";          break;
28919           case BFD_RELOC_ARM_MULTI:        type = "MULTI";        break;
28920           case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";   break;
28921           case BFD_RELOC_ARM_T32_OFFSET_IMM: type = "T32_OFFSET_IMM"; break;
28922           case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
28923           case BFD_RELOC_ARM_THUMB_ADD:    type = "THUMB_ADD";    break;
28924           case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
28925           case BFD_RELOC_ARM_THUMB_IMM:    type = "THUMB_IMM";    break;
28926           case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
28927           default:                         type = _("<unknown>"); break;
28928           }
28929         as_bad_where (fixp->fx_file, fixp->fx_line,
28930                       _("cannot represent %s relocation in this object file format"),
28931                       type);
28932         return NULL;
28933       }
28934     }
28935
28936 #ifdef OBJ_ELF
28937   if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
28938       && GOT_symbol
28939       && fixp->fx_addsy == GOT_symbol)
28940     {
28941       code = BFD_RELOC_ARM_GOTPC;
28942       reloc->addend = fixp->fx_offset = reloc->address;
28943     }
28944 #endif
28945
28946   reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
28947
28948   if (reloc->howto == NULL)
28949     {
28950       as_bad_where (fixp->fx_file, fixp->fx_line,
28951                     _("cannot represent %s relocation in this object file format"),
28952                     bfd_get_reloc_code_name (code));
28953       return NULL;
28954     }
28955
28956   /* HACK: Since arm ELF uses Rel instead of Rela, encode the
28957      vtable entry to be used in the relocation's section offset.  */
28958   if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
28959     reloc->address = fixp->fx_offset;
28960
28961   return reloc;
28962 }
28963
28964 /* This fix_new is called by cons via TC_CONS_FIX_NEW.  */
28965
28966 void
28967 cons_fix_new_arm (fragS *       frag,
28968                   int           where,
28969                   int           size,
28970                   expressionS * exp,
28971                   bfd_reloc_code_real_type reloc)
28972 {
28973   int pcrel = 0;
28974
28975   /* Pick a reloc.
28976      FIXME: @@ Should look at CPU word size.  */
28977   switch (size)
28978     {
28979     case 1:
28980       reloc = BFD_RELOC_8;
28981       break;
28982     case 2:
28983       reloc = BFD_RELOC_16;
28984       break;
28985     case 4:
28986     default:
28987       reloc = BFD_RELOC_32;
28988       break;
28989     case 8:
28990       reloc = BFD_RELOC_64;
28991       break;
28992     }
28993
28994 #ifdef TE_PE
28995   if (exp->X_op == O_secrel)
28996   {
28997     exp->X_op = O_symbol;
28998     reloc = BFD_RELOC_32_SECREL;
28999   }
29000 #endif
29001
29002   fix_new_exp (frag, where, size, exp, pcrel, reloc);
29003 }
29004
29005 #if defined (OBJ_COFF)
29006 void
29007 arm_validate_fix (fixS * fixP)
29008 {
29009   /* If the destination of the branch is a defined symbol which does not have
29010      the THUMB_FUNC attribute, then we must be calling a function which has
29011      the (interfacearm) attribute.  We look for the Thumb entry point to that
29012      function and change the branch to refer to that function instead.  */
29013   if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
29014       && fixP->fx_addsy != NULL
29015       && S_IS_DEFINED (fixP->fx_addsy)
29016       && ! THUMB_IS_FUNC (fixP->fx_addsy))
29017     {
29018       fixP->fx_addsy = find_real_start (fixP->fx_addsy);
29019     }
29020 }
29021 #endif
29022
29023
29024 int
29025 arm_force_relocation (struct fix * fixp)
29026 {
29027 #if defined (OBJ_COFF) && defined (TE_PE)
29028   if (fixp->fx_r_type == BFD_RELOC_RVA)
29029     return 1;
29030 #endif
29031
29032   /* In case we have a call or a branch to a function in ARM ISA mode from
29033      a thumb function or vice-versa force the relocation. These relocations
29034      are cleared off for some cores that might have blx and simple transformations
29035      are possible.  */
29036
29037 #ifdef OBJ_ELF
29038   switch (fixp->fx_r_type)
29039     {
29040     case BFD_RELOC_ARM_PCREL_JUMP:
29041     case BFD_RELOC_ARM_PCREL_CALL:
29042     case BFD_RELOC_THUMB_PCREL_BLX:
29043       if (THUMB_IS_FUNC (fixp->fx_addsy))
29044         return 1;
29045       break;
29046
29047     case BFD_RELOC_ARM_PCREL_BLX:
29048     case BFD_RELOC_THUMB_PCREL_BRANCH25:
29049     case BFD_RELOC_THUMB_PCREL_BRANCH20:
29050     case BFD_RELOC_THUMB_PCREL_BRANCH23:
29051       if (ARM_IS_FUNC (fixp->fx_addsy))
29052         return 1;
29053       break;
29054
29055     default:
29056       break;
29057     }
29058 #endif
29059
29060   /* Resolve these relocations even if the symbol is extern or weak.
29061      Technically this is probably wrong due to symbol preemption.
29062      In practice these relocations do not have enough range to be useful
29063      at dynamic link time, and some code (e.g. in the Linux kernel)
29064      expects these references to be resolved.  */
29065   if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
29066       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
29067       || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM8
29068       || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
29069       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
29070       || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2
29071       || fixp->fx_r_type == BFD_RELOC_ARM_THUMB_OFFSET
29072       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
29073       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
29074       || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
29075       || fixp->fx_r_type == BFD_RELOC_ARM_T32_OFFSET_IMM
29076       || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12
29077       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM
29078       || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM_S2)
29079     return 0;
29080
29081   /* Always leave these relocations for the linker.  */
29082   if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
29083        && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
29084       || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
29085     return 1;
29086
29087   /* Always generate relocations against function symbols.  */
29088   if (fixp->fx_r_type == BFD_RELOC_32
29089       && fixp->fx_addsy
29090       && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
29091     return 1;
29092
29093   return generic_force_reloc (fixp);
29094 }
29095
29096 #if defined (OBJ_ELF) || defined (OBJ_COFF)
29097 /* Relocations against function names must be left unadjusted,
29098    so that the linker can use this information to generate interworking
29099    stubs.  The MIPS version of this function
29100    also prevents relocations that are mips-16 specific, but I do not
29101    know why it does this.
29102
29103    FIXME:
29104    There is one other problem that ought to be addressed here, but
29105    which currently is not:  Taking the address of a label (rather
29106    than a function) and then later jumping to that address.  Such
29107    addresses also ought to have their bottom bit set (assuming that
29108    they reside in Thumb code), but at the moment they will not.  */
29109
29110 bfd_boolean
29111 arm_fix_adjustable (fixS * fixP)
29112 {
29113   if (fixP->fx_addsy == NULL)
29114     return 1;
29115
29116   /* Preserve relocations against symbols with function type.  */
29117   if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
29118     return FALSE;
29119
29120   if (THUMB_IS_FUNC (fixP->fx_addsy)
29121       && fixP->fx_subsy == NULL)
29122     return FALSE;
29123
29124   /* We need the symbol name for the VTABLE entries.  */
29125   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
29126       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
29127     return FALSE;
29128
29129   /* Don't allow symbols to be discarded on GOT related relocs.  */
29130   if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
29131       || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
29132       || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
29133       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
29134       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32_FDPIC
29135       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
29136       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
29137       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32_FDPIC
29138       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
29139       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32_FDPIC
29140       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
29141       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GOTDESC
29142       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_CALL
29143       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_CALL
29144       || fixP->fx_r_type == BFD_RELOC_ARM_TLS_DESCSEQ
29145       || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_DESCSEQ
29146       || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
29147     return FALSE;
29148
29149   /* Similarly for group relocations.  */
29150   if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
29151        && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
29152       || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
29153     return FALSE;
29154
29155   /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols.  */
29156   if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
29157       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
29158       || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
29159       || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
29160       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
29161       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
29162       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
29163       || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
29164     return FALSE;
29165
29166   /* BFD_RELOC_ARM_THUMB_ALU_ABS_Gx_NC relocations have VERY limited
29167      offsets, so keep these symbols.  */
29168   if (fixP->fx_r_type >= BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC
29169       && fixP->fx_r_type <= BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC)
29170     return FALSE;
29171
29172   return TRUE;
29173 }
29174 #endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
29175
29176 #ifdef OBJ_ELF
29177 const char *
29178 elf32_arm_target_format (void)
29179 {
29180 #ifdef TE_SYMBIAN
29181   return (target_big_endian
29182           ? "elf32-bigarm-symbian"
29183           : "elf32-littlearm-symbian");
29184 #elif defined (TE_VXWORKS)
29185   return (target_big_endian
29186           ? "elf32-bigarm-vxworks"
29187           : "elf32-littlearm-vxworks");
29188 #elif defined (TE_NACL)
29189   return (target_big_endian
29190           ? "elf32-bigarm-nacl"
29191           : "elf32-littlearm-nacl");
29192 #else
29193   if (arm_fdpic)
29194     {
29195       if (target_big_endian)
29196         return "elf32-bigarm-fdpic";
29197       else
29198         return "elf32-littlearm-fdpic";
29199     }
29200   else
29201     {
29202       if (target_big_endian)
29203         return "elf32-bigarm";
29204       else
29205         return "elf32-littlearm";
29206     }
29207 #endif
29208 }
29209
29210 void
29211 armelf_frob_symbol (symbolS * symp,
29212                     int *     puntp)
29213 {
29214   elf_frob_symbol (symp, puntp);
29215 }
29216 #endif
29217
29218 /* MD interface: Finalization.  */
29219
29220 void
29221 arm_cleanup (void)
29222 {
29223   literal_pool * pool;
29224
29225   /* Ensure that all the predication blocks are properly closed.  */
29226   check_pred_blocks_finished ();
29227
29228   for (pool = list_of_pools; pool; pool = pool->next)
29229     {
29230       /* Put it at the end of the relevant section.  */
29231       subseg_set (pool->section, pool->sub_section);
29232 #ifdef OBJ_ELF
29233       arm_elf_change_section ();
29234 #endif
29235       s_ltorg (0);
29236     }
29237 }
29238
29239 #ifdef OBJ_ELF
29240 /* Remove any excess mapping symbols generated for alignment frags in
29241    SEC.  We may have created a mapping symbol before a zero byte
29242    alignment; remove it if there's a mapping symbol after the
29243    alignment.  */
29244 static void
29245 check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
29246                        void *dummy ATTRIBUTE_UNUSED)
29247 {
29248   segment_info_type *seginfo = seg_info (sec);
29249   fragS *fragp;
29250
29251   if (seginfo == NULL || seginfo->frchainP == NULL)
29252     return;
29253
29254   for (fragp = seginfo->frchainP->frch_root;
29255        fragp != NULL;
29256        fragp = fragp->fr_next)
29257     {
29258       symbolS *sym = fragp->tc_frag_data.last_map;
29259       fragS *next = fragp->fr_next;
29260
29261       /* Variable-sized frags have been converted to fixed size by
29262          this point.  But if this was variable-sized to start with,
29263          there will be a fixed-size frag after it.  So don't handle
29264          next == NULL.  */
29265       if (sym == NULL || next == NULL)
29266         continue;
29267
29268       if (S_GET_VALUE (sym) < next->fr_address)
29269         /* Not at the end of this frag.  */
29270         continue;
29271       know (S_GET_VALUE (sym) == next->fr_address);
29272
29273       do
29274         {
29275           if (next->tc_frag_data.first_map != NULL)
29276             {
29277               /* Next frag starts with a mapping symbol.  Discard this
29278                  one.  */
29279               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
29280               break;
29281             }
29282
29283           if (next->fr_next == NULL)
29284             {
29285               /* This mapping symbol is at the end of the section.  Discard
29286                  it.  */
29287               know (next->fr_fix == 0 && next->fr_var == 0);
29288               symbol_remove (sym, &symbol_rootP, &symbol_lastP);
29289               break;
29290             }
29291
29292           /* As long as we have empty frags without any mapping symbols,
29293              keep looking.  */
29294           /* If the next frag is non-empty and does not start with a
29295              mapping symbol, then this mapping symbol is required.  */
29296           if (next->fr_address != next->fr_next->fr_address)
29297             break;
29298
29299           next = next->fr_next;
29300         }
29301       while (next != NULL);
29302     }
29303 }
29304 #endif
29305
29306 /* Adjust the symbol table.  This marks Thumb symbols as distinct from
29307    ARM ones.  */
29308
29309 void
29310 arm_adjust_symtab (void)
29311 {
29312 #ifdef OBJ_COFF
29313   symbolS * sym;
29314
29315   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
29316     {
29317       if (ARM_IS_THUMB (sym))
29318         {
29319           if (THUMB_IS_FUNC (sym))
29320             {
29321               /* Mark the symbol as a Thumb function.  */
29322               if (   S_GET_STORAGE_CLASS (sym) == C_STAT
29323                   || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!  */
29324                 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
29325
29326               else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
29327                 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
29328               else
29329                 as_bad (_("%s: unexpected function type: %d"),
29330                         S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
29331             }
29332           else switch (S_GET_STORAGE_CLASS (sym))
29333             {
29334             case C_EXT:
29335               S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
29336               break;
29337             case C_STAT:
29338               S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
29339               break;
29340             case C_LABEL:
29341               S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
29342               break;
29343             default:
29344               /* Do nothing.  */
29345               break;
29346             }
29347         }
29348
29349       if (ARM_IS_INTERWORK (sym))
29350         coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
29351     }
29352 #endif
29353 #ifdef OBJ_ELF
29354   symbolS * sym;
29355   char      bind;
29356
29357   for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
29358     {
29359       if (ARM_IS_THUMB (sym))
29360         {
29361           elf_symbol_type * elf_sym;
29362
29363           elf_sym = elf_symbol (symbol_get_bfdsym (sym));
29364           bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
29365
29366           if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
29367                 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
29368             {
29369               /* If it's a .thumb_func, declare it as so,
29370                  otherwise tag label as .code 16.  */
29371               if (THUMB_IS_FUNC (sym))
29372                 ARM_SET_SYM_BRANCH_TYPE (elf_sym->internal_elf_sym.st_target_internal,
29373                                          ST_BRANCH_TO_THUMB);
29374               else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
29375                 elf_sym->internal_elf_sym.st_info =
29376                   ELF_ST_INFO (bind, STT_ARM_16BIT);
29377             }
29378         }
29379     }
29380
29381   /* Remove any overlapping mapping symbols generated by alignment frags.  */
29382   bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
29383   /* Now do generic ELF adjustments.  */
29384   elf_adjust_symtab ();
29385 #endif
29386 }
29387
29388 /* MD interface: Initialization.  */
29389
29390 static void
29391 set_constant_flonums (void)
29392 {
29393   int i;
29394
29395   for (i = 0; i < NUM_FLOAT_VALS; i++)
29396     if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
29397       abort ();
29398 }
29399
29400 /* Auto-select Thumb mode if it's the only available instruction set for the
29401    given architecture.  */
29402
29403 static void
29404 autoselect_thumb_from_cpu_variant (void)
29405 {
29406   if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
29407     opcode_select (16);
29408 }
29409
29410 void
29411 md_begin (void)
29412 {
29413   unsigned mach;
29414   unsigned int i;
29415
29416   if (   (arm_ops_hsh = hash_new ()) == NULL
29417       || (arm_cond_hsh = hash_new ()) == NULL
29418       || (arm_vcond_hsh = hash_new ()) == NULL
29419       || (arm_shift_hsh = hash_new ()) == NULL
29420       || (arm_psr_hsh = hash_new ()) == NULL
29421       || (arm_v7m_psr_hsh = hash_new ()) == NULL
29422       || (arm_reg_hsh = hash_new ()) == NULL
29423       || (arm_reloc_hsh = hash_new ()) == NULL
29424       || (arm_barrier_opt_hsh = hash_new ()) == NULL)
29425     as_fatal (_("virtual memory exhausted"));
29426
29427   for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
29428     hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
29429   for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
29430     hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
29431   for (i = 0; i < sizeof (vconds) / sizeof (struct asm_cond); i++)
29432     hash_insert (arm_vcond_hsh, vconds[i].template_name, (void *) (vconds + i));
29433   for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
29434     hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
29435   for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
29436     hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
29437   for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
29438     hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
29439                  (void *) (v7m_psrs + i));
29440   for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
29441     hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
29442   for (i = 0;
29443        i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
29444        i++)
29445     hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
29446                  (void *) (barrier_opt_names + i));
29447 #ifdef OBJ_ELF
29448   for (i = 0; i < ARRAY_SIZE (reloc_names); i++)
29449     {
29450       struct reloc_entry * entry = reloc_names + i;
29451
29452       if (arm_is_eabi() && entry->reloc == BFD_RELOC_ARM_PLT32)
29453         /* This makes encode_branch() use the EABI versions of this relocation.  */
29454         entry->reloc = BFD_RELOC_UNUSED;
29455
29456       hash_insert (arm_reloc_hsh, entry->name, (void *) entry);
29457     }
29458 #endif
29459
29460   set_constant_flonums ();
29461
29462   /* Set the cpu variant based on the command-line options.  We prefer
29463      -mcpu= over -march= if both are set (as for GCC); and we prefer
29464      -mfpu= over any other way of setting the floating point unit.
29465      Use of legacy options with new options are faulted.  */
29466   if (legacy_cpu)
29467     {
29468       if (mcpu_cpu_opt || march_cpu_opt)
29469         as_bad (_("use of old and new-style options to set CPU type"));
29470
29471       selected_arch = *legacy_cpu;
29472     }
29473   else if (mcpu_cpu_opt)
29474     {
29475       selected_arch = *mcpu_cpu_opt;
29476       selected_ext = *mcpu_ext_opt;
29477     }
29478   else if (march_cpu_opt)
29479     {
29480       selected_arch = *march_cpu_opt;
29481       selected_ext = *march_ext_opt;
29482     }
29483   ARM_MERGE_FEATURE_SETS (selected_cpu, selected_arch, selected_ext);
29484
29485   if (legacy_fpu)
29486     {
29487       if (mfpu_opt)
29488         as_bad (_("use of old and new-style options to set FPU type"));
29489
29490       selected_fpu = *legacy_fpu;
29491     }
29492   else if (mfpu_opt)
29493     selected_fpu = *mfpu_opt;
29494   else
29495     {
29496 #if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
29497         || defined (TE_NetBSD) || defined (TE_VXWORKS))
29498       /* Some environments specify a default FPU.  If they don't, infer it
29499          from the processor.  */
29500       if (mcpu_fpu_opt)
29501         selected_fpu = *mcpu_fpu_opt;
29502       else if (march_fpu_opt)
29503         selected_fpu = *march_fpu_opt;
29504 #else
29505       selected_fpu = fpu_default;
29506 #endif
29507     }
29508
29509   if (ARM_FEATURE_ZERO (selected_fpu))
29510     {
29511       if (!no_cpu_selected ())
29512         selected_fpu = fpu_default;
29513       else
29514         selected_fpu = fpu_arch_fpa;
29515     }
29516
29517 #ifdef CPU_DEFAULT
29518   if (ARM_FEATURE_ZERO (selected_arch))
29519     {
29520       selected_arch = cpu_default;
29521       selected_cpu = selected_arch;
29522     }
29523   ARM_MERGE_FEATURE_SETS (cpu_variant, selected_cpu, selected_fpu);
29524 #else
29525   /*  Autodection of feature mode: allow all features in cpu_variant but leave
29526       selected_cpu unset.  It will be set in aeabi_set_public_attributes ()
29527       after all instruction have been processed and we can decide what CPU
29528       should be selected.  */
29529   if (ARM_FEATURE_ZERO (selected_arch))
29530     ARM_MERGE_FEATURE_SETS (cpu_variant, arm_arch_any, selected_fpu);
29531   else
29532     ARM_MERGE_FEATURE_SETS (cpu_variant, selected_cpu, selected_fpu);
29533 #endif
29534
29535   autoselect_thumb_from_cpu_variant ();
29536
29537   arm_arch_used = thumb_arch_used = arm_arch_none;
29538
29539 #if defined OBJ_COFF || defined OBJ_ELF
29540   {
29541     unsigned int flags = 0;
29542
29543 #if defined OBJ_ELF
29544     flags = meabi_flags;
29545
29546     switch (meabi_flags)
29547       {
29548       case EF_ARM_EABI_UNKNOWN:
29549 #endif
29550         /* Set the flags in the private structure.  */
29551         if (uses_apcs_26)      flags |= F_APCS26;
29552         if (support_interwork) flags |= F_INTERWORK;
29553         if (uses_apcs_float)   flags |= F_APCS_FLOAT;
29554         if (pic_code)          flags |= F_PIC;
29555         if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
29556           flags |= F_SOFT_FLOAT;
29557
29558         switch (mfloat_abi_opt)
29559           {
29560           case ARM_FLOAT_ABI_SOFT:
29561           case ARM_FLOAT_ABI_SOFTFP:
29562             flags |= F_SOFT_FLOAT;
29563             break;
29564
29565           case ARM_FLOAT_ABI_HARD:
29566             if (flags & F_SOFT_FLOAT)
29567               as_bad (_("hard-float conflicts with specified fpu"));
29568             break;
29569           }
29570
29571         /* Using pure-endian doubles (even if soft-float).      */
29572         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
29573           flags |= F_VFP_FLOAT;
29574
29575 #if defined OBJ_ELF
29576         if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
29577             flags |= EF_ARM_MAVERICK_FLOAT;
29578         break;
29579
29580       case EF_ARM_EABI_VER4:
29581       case EF_ARM_EABI_VER5:
29582         /* No additional flags to set.  */
29583         break;
29584
29585       default:
29586         abort ();
29587       }
29588 #endif
29589     bfd_set_private_flags (stdoutput, flags);
29590
29591     /* We have run out flags in the COFF header to encode the
29592        status of ATPCS support, so instead we create a dummy,
29593        empty, debug section called .arm.atpcs.  */
29594     if (atpcs)
29595       {
29596         asection * sec;
29597
29598         sec = bfd_make_section (stdoutput, ".arm.atpcs");
29599
29600         if (sec != NULL)
29601           {
29602             bfd_set_section_flags
29603               (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
29604             bfd_set_section_size (stdoutput, sec, 0);
29605             bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
29606           }
29607       }
29608   }
29609 #endif
29610
29611   /* Record the CPU type as well.  */
29612   if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
29613     mach = bfd_mach_arm_iWMMXt2;
29614   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
29615     mach = bfd_mach_arm_iWMMXt;
29616   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
29617     mach = bfd_mach_arm_XScale;
29618   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
29619     mach = bfd_mach_arm_ep9312;
29620   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
29621     mach = bfd_mach_arm_5TE;
29622   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
29623     {
29624       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
29625         mach = bfd_mach_arm_5T;
29626       else
29627         mach = bfd_mach_arm_5;
29628     }
29629   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
29630     {
29631       if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
29632         mach = bfd_mach_arm_4T;
29633       else
29634         mach = bfd_mach_arm_4;
29635     }
29636   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
29637     mach = bfd_mach_arm_3M;
29638   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
29639     mach = bfd_mach_arm_3;
29640   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
29641     mach = bfd_mach_arm_2a;
29642   else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
29643     mach = bfd_mach_arm_2;
29644   else
29645     mach = bfd_mach_arm_unknown;
29646
29647   bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
29648 }
29649
29650 /* Command line processing.  */
29651
29652 /* md_parse_option
29653       Invocation line includes a switch not recognized by the base assembler.
29654       See if it's a processor-specific option.
29655
29656       This routine is somewhat complicated by the need for backwards
29657       compatibility (since older releases of gcc can't be changed).
29658       The new options try to make the interface as compatible as
29659       possible with GCC.
29660
29661       New options (supported) are:
29662
29663               -mcpu=<cpu name>           Assemble for selected processor
29664               -march=<architecture name> Assemble for selected architecture
29665               -mfpu=<fpu architecture>   Assemble for selected FPU.
29666               -EB/-mbig-endian           Big-endian
29667               -EL/-mlittle-endian        Little-endian
29668               -k                         Generate PIC code
29669               -mthumb                    Start in Thumb mode
29670               -mthumb-interwork          Code supports ARM/Thumb interworking
29671
29672               -m[no-]warn-deprecated     Warn about deprecated features
29673               -m[no-]warn-syms           Warn when symbols match instructions
29674
29675       For now we will also provide support for:
29676
29677               -mapcs-32                  32-bit Program counter
29678               -mapcs-26                  26-bit Program counter
29679               -macps-float               Floats passed in FP registers
29680               -mapcs-reentrant           Reentrant code
29681               -matpcs
29682       (sometime these will probably be replaced with -mapcs=<list of options>
29683       and -matpcs=<list of options>)
29684
29685       The remaining options are only supported for back-wards compatibility.
29686       Cpu variants, the arm part is optional:
29687               -m[arm]1                Currently not supported.
29688               -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
29689               -m[arm]3                Arm 3 processor
29690               -m[arm]6[xx],           Arm 6 processors
29691               -m[arm]7[xx][t][[d]m]   Arm 7 processors
29692               -m[arm]8[10]            Arm 8 processors
29693               -m[arm]9[20][tdmi]      Arm 9 processors
29694               -mstrongarm[110[0]]     StrongARM processors
29695               -mxscale                XScale processors
29696               -m[arm]v[2345[t[e]]]    Arm architectures
29697               -mall                   All (except the ARM1)
29698       FP variants:
29699               -mfpa10, -mfpa11        FPA10 and 11 co-processor instructions
29700               -mfpe-old               (No float load/store multiples)
29701               -mvfpxd                 VFP Single precision
29702               -mvfp                   All VFP
29703               -mno-fpu                Disable all floating point instructions
29704
29705       The following CPU names are recognized:
29706               arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
29707               arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
29708               arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
29709               arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
29710               arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
29711               arm10t arm10e, arm1020t, arm1020e, arm10200e,
29712               strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
29713
29714       */
29715
29716 const char * md_shortopts = "m:k";
29717
29718 #ifdef ARM_BI_ENDIAN
29719 #define OPTION_EB (OPTION_MD_BASE + 0)
29720 #define OPTION_EL (OPTION_MD_BASE + 1)
29721 #else
29722 #if TARGET_BYTES_BIG_ENDIAN
29723 #define OPTION_EB (OPTION_MD_BASE + 0)
29724 #else
29725 #define OPTION_EL (OPTION_MD_BASE + 1)
29726 #endif
29727 #endif
29728 #define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
29729 #define OPTION_FDPIC (OPTION_MD_BASE + 3)
29730
29731 struct option md_longopts[] =
29732 {
29733 #ifdef OPTION_EB
29734   {"EB", no_argument, NULL, OPTION_EB},
29735 #endif
29736 #ifdef OPTION_EL
29737   {"EL", no_argument, NULL, OPTION_EL},
29738 #endif
29739   {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
29740 #ifdef OBJ_ELF
29741   {"fdpic", no_argument, NULL, OPTION_FDPIC},
29742 #endif
29743   {NULL, no_argument, NULL, 0}
29744 };
29745
29746 size_t md_longopts_size = sizeof (md_longopts);
29747
29748 struct arm_option_table
29749 {
29750   const char *  option;         /* Option name to match.  */
29751   const char *  help;           /* Help information.  */
29752   int *         var;            /* Variable to change.  */
29753   int           value;          /* What to change it to.  */
29754   const char *  deprecated;     /* If non-null, print this message.  */
29755 };
29756
29757 struct arm_option_table arm_opts[] =
29758 {
29759   {"k",      N_("generate PIC code"),      &pic_code,    1, NULL},
29760   {"mthumb", N_("assemble Thumb code"),    &thumb_mode,  1, NULL},
29761   {"mthumb-interwork", N_("support ARM/Thumb interworking"),
29762    &support_interwork, 1, NULL},
29763   {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
29764   {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
29765   {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
29766    1, NULL},
29767   {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
29768   {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
29769   {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
29770   {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
29771    NULL},
29772
29773   /* These are recognized by the assembler, but have no affect on code.  */
29774   {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
29775   {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
29776
29777   {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
29778   {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
29779    &warn_on_deprecated, 0, NULL},
29780   {"mwarn-syms", N_("warn about symbols that match instruction names [default]"), (int *) (& flag_warn_syms), TRUE, NULL},
29781   {"mno-warn-syms", N_("disable warnings about symobls that match instructions"), (int *) (& flag_warn_syms), FALSE, NULL},
29782   {NULL, NULL, NULL, 0, NULL}
29783 };
29784
29785 struct arm_legacy_option_table
29786 {
29787   const char *              option;             /* Option name to match.  */
29788   const arm_feature_set **  var;                /* Variable to change.  */
29789   const arm_feature_set     value;              /* What to change it to.  */
29790   const char *              deprecated;         /* If non-null, print this message.  */
29791 };
29792
29793 const struct arm_legacy_option_table arm_legacy_opts[] =
29794 {
29795   /* DON'T add any new processors to this list -- we want the whole list
29796      to go away...  Add them to the processors table instead.  */
29797   {"marm1",      &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
29798   {"m1",         &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
29799   {"marm2",      &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
29800   {"m2",         &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
29801   {"marm250",    &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
29802   {"m250",       &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
29803   {"marm3",      &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
29804   {"m3",         &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
29805   {"marm6",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
29806   {"m6",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
29807   {"marm600",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
29808   {"m600",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
29809   {"marm610",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
29810   {"m610",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
29811   {"marm620",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
29812   {"m620",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
29813   {"marm7",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
29814   {"m7",         &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
29815   {"marm70",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
29816   {"m70",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
29817   {"marm700",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
29818   {"m700",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
29819   {"marm700i",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
29820   {"m700i",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
29821   {"marm710",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
29822   {"m710",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
29823   {"marm710c",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
29824   {"m710c",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
29825   {"marm720",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
29826   {"m720",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
29827   {"marm7d",     &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
29828   {"m7d",        &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
29829   {"marm7di",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
29830   {"m7di",       &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
29831   {"marm7m",     &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
29832   {"m7m",        &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
29833   {"marm7dm",    &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
29834   {"m7dm",       &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
29835   {"marm7dmi",   &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
29836   {"m7dmi",      &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
29837   {"marm7100",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
29838   {"m7100",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
29839   {"marm7500",   &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
29840   {"m7500",      &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
29841   {"marm7500fe", &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
29842   {"m7500fe",    &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
29843   {"marm7t",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
29844   {"m7t",        &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
29845   {"marm7tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
29846   {"m7tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
29847   {"marm710t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
29848   {"m710t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
29849   {"marm720t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
29850   {"m720t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
29851   {"marm740t",   &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
29852   {"m740t",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
29853   {"marm8",      &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
29854   {"m8",         &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
29855   {"marm810",    &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
29856   {"m810",       &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
29857   {"marm9",      &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
29858   {"m9",         &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
29859   {"marm9tdmi",  &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
29860   {"m9tdmi",     &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
29861   {"marm920",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
29862   {"m920",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
29863   {"marm940",    &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
29864   {"m940",       &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
29865   {"mstrongarm", &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
29866   {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
29867    N_("use -mcpu=strongarm110")},
29868   {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
29869    N_("use -mcpu=strongarm1100")},
29870   {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
29871    N_("use -mcpu=strongarm1110")},
29872   {"mxscale",    &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
29873   {"miwmmxt",    &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
29874   {"mall",       &legacy_cpu, ARM_ANY,         N_("use -mcpu=all")},
29875
29876   /* Architecture variants -- don't add any more to this list either.  */
29877   {"mv2",        &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
29878   {"marmv2",     &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
29879   {"mv2a",       &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
29880   {"marmv2a",    &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
29881   {"mv3",        &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
29882   {"marmv3",     &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
29883   {"mv3m",       &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
29884   {"marmv3m",    &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
29885   {"mv4",        &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
29886   {"marmv4",     &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
29887   {"mv4t",       &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
29888   {"marmv4t",    &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
29889   {"mv5",        &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
29890   {"marmv5",     &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
29891   {"mv5t",       &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
29892   {"marmv5t",    &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
29893   {"mv5e",       &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
29894   {"marmv5e",    &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
29895
29896   /* Floating point variants -- don't add any more to this list either.  */
29897   {"mfpe-old",   &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
29898   {"mfpa10",     &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
29899   {"mfpa11",     &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
29900   {"mno-fpu",    &legacy_fpu, ARM_ARCH_NONE,
29901    N_("use either -mfpu=softfpa or -mfpu=softvfp")},
29902
29903   {NULL, NULL, ARM_ARCH_NONE, NULL}
29904 };
29905
29906 struct arm_cpu_option_table
29907 {
29908   const char *           name;
29909   size_t                 name_len;
29910   const arm_feature_set  value;
29911   const arm_feature_set  ext;
29912   /* For some CPUs we assume an FPU unless the user explicitly sets
29913      -mfpu=...  */
29914   const arm_feature_set  default_fpu;
29915   /* The canonical name of the CPU, or NULL to use NAME converted to upper
29916      case.  */
29917   const char *           canonical_name;
29918 };
29919
29920 /* This list should, at a minimum, contain all the cpu names
29921    recognized by GCC.  */
29922 #define ARM_CPU_OPT(N, CN, V, E, DF) { N, sizeof (N) - 1, V, E, DF, CN }
29923
29924 static const struct arm_cpu_option_table arm_cpus[] =
29925 {
29926   ARM_CPU_OPT ("all",             NULL,                ARM_ANY,
29927                ARM_ARCH_NONE,
29928                FPU_ARCH_FPA),
29929   ARM_CPU_OPT ("arm1",            NULL,                ARM_ARCH_V1,
29930                ARM_ARCH_NONE,
29931                FPU_ARCH_FPA),
29932   ARM_CPU_OPT ("arm2",            NULL,                ARM_ARCH_V2,
29933                ARM_ARCH_NONE,
29934                FPU_ARCH_FPA),
29935   ARM_CPU_OPT ("arm250",          NULL,                ARM_ARCH_V2S,
29936                ARM_ARCH_NONE,
29937                FPU_ARCH_FPA),
29938   ARM_CPU_OPT ("arm3",            NULL,                ARM_ARCH_V2S,
29939                ARM_ARCH_NONE,
29940                FPU_ARCH_FPA),
29941   ARM_CPU_OPT ("arm6",            NULL,                ARM_ARCH_V3,
29942                ARM_ARCH_NONE,
29943                FPU_ARCH_FPA),
29944   ARM_CPU_OPT ("arm60",           NULL,                ARM_ARCH_V3,
29945                ARM_ARCH_NONE,
29946                FPU_ARCH_FPA),
29947   ARM_CPU_OPT ("arm600",          NULL,                ARM_ARCH_V3,
29948                ARM_ARCH_NONE,
29949                FPU_ARCH_FPA),
29950   ARM_CPU_OPT ("arm610",          NULL,                ARM_ARCH_V3,
29951                ARM_ARCH_NONE,
29952                FPU_ARCH_FPA),
29953   ARM_CPU_OPT ("arm620",          NULL,                ARM_ARCH_V3,
29954                ARM_ARCH_NONE,
29955                FPU_ARCH_FPA),
29956   ARM_CPU_OPT ("arm7",            NULL,                ARM_ARCH_V3,
29957                ARM_ARCH_NONE,
29958                FPU_ARCH_FPA),
29959   ARM_CPU_OPT ("arm7m",           NULL,                ARM_ARCH_V3M,
29960                ARM_ARCH_NONE,
29961                FPU_ARCH_FPA),
29962   ARM_CPU_OPT ("arm7d",           NULL,                ARM_ARCH_V3,
29963                ARM_ARCH_NONE,
29964                FPU_ARCH_FPA),
29965   ARM_CPU_OPT ("arm7dm",          NULL,                ARM_ARCH_V3M,
29966                ARM_ARCH_NONE,
29967                FPU_ARCH_FPA),
29968   ARM_CPU_OPT ("arm7di",          NULL,                ARM_ARCH_V3,
29969                ARM_ARCH_NONE,
29970                FPU_ARCH_FPA),
29971   ARM_CPU_OPT ("arm7dmi",         NULL,                ARM_ARCH_V3M,
29972                ARM_ARCH_NONE,
29973                FPU_ARCH_FPA),
29974   ARM_CPU_OPT ("arm70",           NULL,                ARM_ARCH_V3,
29975                ARM_ARCH_NONE,
29976                FPU_ARCH_FPA),
29977   ARM_CPU_OPT ("arm700",          NULL,                ARM_ARCH_V3,
29978                ARM_ARCH_NONE,
29979                FPU_ARCH_FPA),
29980   ARM_CPU_OPT ("arm700i",         NULL,                ARM_ARCH_V3,
29981                ARM_ARCH_NONE,
29982                FPU_ARCH_FPA),
29983   ARM_CPU_OPT ("arm710",          NULL,                ARM_ARCH_V3,
29984                ARM_ARCH_NONE,
29985                FPU_ARCH_FPA),
29986   ARM_CPU_OPT ("arm710t",         NULL,                ARM_ARCH_V4T,
29987                ARM_ARCH_NONE,
29988                FPU_ARCH_FPA),
29989   ARM_CPU_OPT ("arm720",          NULL,                ARM_ARCH_V3,
29990                ARM_ARCH_NONE,
29991                FPU_ARCH_FPA),
29992   ARM_CPU_OPT ("arm720t",         NULL,                ARM_ARCH_V4T,
29993                ARM_ARCH_NONE,
29994                FPU_ARCH_FPA),
29995   ARM_CPU_OPT ("arm740t",         NULL,                ARM_ARCH_V4T,
29996                ARM_ARCH_NONE,
29997                FPU_ARCH_FPA),
29998   ARM_CPU_OPT ("arm710c",         NULL,                ARM_ARCH_V3,
29999                ARM_ARCH_NONE,
30000                FPU_ARCH_FPA),
30001   ARM_CPU_OPT ("arm7100",         NULL,                ARM_ARCH_V3,
30002                ARM_ARCH_NONE,
30003                FPU_ARCH_FPA),
30004   ARM_CPU_OPT ("arm7500",         NULL,                ARM_ARCH_V3,
30005                ARM_ARCH_NONE,
30006                FPU_ARCH_FPA),
30007   ARM_CPU_OPT ("arm7500fe",       NULL,                ARM_ARCH_V3,
30008                ARM_ARCH_NONE,
30009                FPU_ARCH_FPA),
30010   ARM_CPU_OPT ("arm7t",           NULL,                ARM_ARCH_V4T,
30011                ARM_ARCH_NONE,
30012                FPU_ARCH_FPA),
30013   ARM_CPU_OPT ("arm7tdmi",        NULL,                ARM_ARCH_V4T,
30014                ARM_ARCH_NONE,
30015                FPU_ARCH_FPA),
30016   ARM_CPU_OPT ("arm7tdmi-s",      NULL,                ARM_ARCH_V4T,
30017                ARM_ARCH_NONE,
30018                FPU_ARCH_FPA),
30019   ARM_CPU_OPT ("arm8",            NULL,                ARM_ARCH_V4,
30020                ARM_ARCH_NONE,
30021                FPU_ARCH_FPA),
30022   ARM_CPU_OPT ("arm810",          NULL,                ARM_ARCH_V4,
30023                ARM_ARCH_NONE,
30024                FPU_ARCH_FPA),
30025   ARM_CPU_OPT ("strongarm",       NULL,                ARM_ARCH_V4,
30026                ARM_ARCH_NONE,
30027                FPU_ARCH_FPA),
30028   ARM_CPU_OPT ("strongarm1",      NULL,                ARM_ARCH_V4,
30029                ARM_ARCH_NONE,
30030                FPU_ARCH_FPA),
30031   ARM_CPU_OPT ("strongarm110",    NULL,                ARM_ARCH_V4,
30032                ARM_ARCH_NONE,
30033                FPU_ARCH_FPA),
30034   ARM_CPU_OPT ("strongarm1100",   NULL,                ARM_ARCH_V4,
30035                ARM_ARCH_NONE,
30036                FPU_ARCH_FPA),
30037   ARM_CPU_OPT ("strongarm1110",   NULL,                ARM_ARCH_V4,
30038                ARM_ARCH_NONE,
30039                FPU_ARCH_FPA),
30040   ARM_CPU_OPT ("arm9",            NULL,                ARM_ARCH_V4T,
30041                ARM_ARCH_NONE,
30042                FPU_ARCH_FPA),
30043   ARM_CPU_OPT ("arm920",          "ARM920T",           ARM_ARCH_V4T,
30044                ARM_ARCH_NONE,
30045                FPU_ARCH_FPA),
30046   ARM_CPU_OPT ("arm920t",         NULL,                ARM_ARCH_V4T,
30047                ARM_ARCH_NONE,
30048                FPU_ARCH_FPA),
30049   ARM_CPU_OPT ("arm922t",         NULL,                ARM_ARCH_V4T,
30050                ARM_ARCH_NONE,
30051                FPU_ARCH_FPA),
30052   ARM_CPU_OPT ("arm940t",         NULL,                ARM_ARCH_V4T,
30053                ARM_ARCH_NONE,
30054                FPU_ARCH_FPA),
30055   ARM_CPU_OPT ("arm9tdmi",        NULL,                ARM_ARCH_V4T,
30056                ARM_ARCH_NONE,
30057                FPU_ARCH_FPA),
30058   ARM_CPU_OPT ("fa526",           NULL,                ARM_ARCH_V4,
30059                ARM_ARCH_NONE,
30060                FPU_ARCH_FPA),
30061   ARM_CPU_OPT ("fa626",           NULL,                ARM_ARCH_V4,
30062                ARM_ARCH_NONE,
30063                FPU_ARCH_FPA),
30064
30065   /* For V5 or later processors we default to using VFP; but the user
30066      should really set the FPU type explicitly.  */
30067   ARM_CPU_OPT ("arm9e-r0",        NULL,                ARM_ARCH_V5TExP,
30068                ARM_ARCH_NONE,
30069                FPU_ARCH_VFP_V2),
30070   ARM_CPU_OPT ("arm9e",           NULL,                ARM_ARCH_V5TE,
30071                ARM_ARCH_NONE,
30072                FPU_ARCH_VFP_V2),
30073   ARM_CPU_OPT ("arm926ej",        "ARM926EJ-S",        ARM_ARCH_V5TEJ,
30074                ARM_ARCH_NONE,
30075                FPU_ARCH_VFP_V2),
30076   ARM_CPU_OPT ("arm926ejs",       "ARM926EJ-S",        ARM_ARCH_V5TEJ,
30077                ARM_ARCH_NONE,
30078                FPU_ARCH_VFP_V2),
30079   ARM_CPU_OPT ("arm926ej-s",      NULL,                ARM_ARCH_V5TEJ,
30080                ARM_ARCH_NONE,
30081                FPU_ARCH_VFP_V2),
30082   ARM_CPU_OPT ("arm946e-r0",      NULL,                ARM_ARCH_V5TExP,
30083                ARM_ARCH_NONE,
30084                FPU_ARCH_VFP_V2),
30085   ARM_CPU_OPT ("arm946e",         "ARM946E-S",         ARM_ARCH_V5TE,
30086                ARM_ARCH_NONE,
30087                FPU_ARCH_VFP_V2),
30088   ARM_CPU_OPT ("arm946e-s",       NULL,                ARM_ARCH_V5TE,
30089                ARM_ARCH_NONE,
30090                FPU_ARCH_VFP_V2),
30091   ARM_CPU_OPT ("arm966e-r0",      NULL,                ARM_ARCH_V5TExP,
30092                ARM_ARCH_NONE,
30093                FPU_ARCH_VFP_V2),
30094   ARM_CPU_OPT ("arm966e",         "ARM966E-S",         ARM_ARCH_V5TE,
30095                ARM_ARCH_NONE,
30096                FPU_ARCH_VFP_V2),
30097   ARM_CPU_OPT ("arm966e-s",       NULL,                ARM_ARCH_V5TE,
30098                ARM_ARCH_NONE,
30099                FPU_ARCH_VFP_V2),
30100   ARM_CPU_OPT ("arm968e-s",       NULL,                ARM_ARCH_V5TE,
30101                ARM_ARCH_NONE,
30102                FPU_ARCH_VFP_V2),
30103   ARM_CPU_OPT ("arm10t",          NULL,                ARM_ARCH_V5T,
30104                ARM_ARCH_NONE,
30105                FPU_ARCH_VFP_V1),
30106   ARM_CPU_OPT ("arm10tdmi",       NULL,                ARM_ARCH_V5T,
30107                ARM_ARCH_NONE,
30108                FPU_ARCH_VFP_V1),
30109   ARM_CPU_OPT ("arm10e",          NULL,                ARM_ARCH_V5TE,
30110                ARM_ARCH_NONE,
30111                FPU_ARCH_VFP_V2),
30112   ARM_CPU_OPT ("arm1020",         "ARM1020E",          ARM_ARCH_V5TE,
30113                ARM_ARCH_NONE,
30114                FPU_ARCH_VFP_V2),
30115   ARM_CPU_OPT ("arm1020t",        NULL,                ARM_ARCH_V5T,
30116                ARM_ARCH_NONE,
30117                FPU_ARCH_VFP_V1),
30118   ARM_CPU_OPT ("arm1020e",        NULL,                ARM_ARCH_V5TE,
30119                ARM_ARCH_NONE,
30120                FPU_ARCH_VFP_V2),
30121   ARM_CPU_OPT ("arm1022e",        NULL,                ARM_ARCH_V5TE,
30122                ARM_ARCH_NONE,
30123                FPU_ARCH_VFP_V2),
30124   ARM_CPU_OPT ("arm1026ejs",      "ARM1026EJ-S",       ARM_ARCH_V5TEJ,
30125                ARM_ARCH_NONE,
30126                FPU_ARCH_VFP_V2),
30127   ARM_CPU_OPT ("arm1026ej-s",     NULL,                ARM_ARCH_V5TEJ,
30128                ARM_ARCH_NONE,
30129                FPU_ARCH_VFP_V2),
30130   ARM_CPU_OPT ("fa606te",         NULL,                ARM_ARCH_V5TE,
30131                ARM_ARCH_NONE,
30132                FPU_ARCH_VFP_V2),
30133   ARM_CPU_OPT ("fa616te",         NULL,                ARM_ARCH_V5TE,
30134                ARM_ARCH_NONE,
30135                FPU_ARCH_VFP_V2),
30136   ARM_CPU_OPT ("fa626te",         NULL,                ARM_ARCH_V5TE,
30137                ARM_ARCH_NONE,
30138                FPU_ARCH_VFP_V2),
30139   ARM_CPU_OPT ("fmp626",          NULL,                ARM_ARCH_V5TE,
30140                ARM_ARCH_NONE,
30141                FPU_ARCH_VFP_V2),
30142   ARM_CPU_OPT ("fa726te",         NULL,                ARM_ARCH_V5TE,
30143                ARM_ARCH_NONE,
30144                FPU_ARCH_VFP_V2),
30145   ARM_CPU_OPT ("arm1136js",       "ARM1136J-S",        ARM_ARCH_V6,
30146                ARM_ARCH_NONE,
30147                FPU_NONE),
30148   ARM_CPU_OPT ("arm1136j-s",      NULL,                ARM_ARCH_V6,
30149                ARM_ARCH_NONE,
30150                FPU_NONE),
30151   ARM_CPU_OPT ("arm1136jfs",      "ARM1136JF-S",       ARM_ARCH_V6,
30152                ARM_ARCH_NONE,
30153                FPU_ARCH_VFP_V2),
30154   ARM_CPU_OPT ("arm1136jf-s",     NULL,                ARM_ARCH_V6,
30155                ARM_ARCH_NONE,
30156                FPU_ARCH_VFP_V2),
30157   ARM_CPU_OPT ("mpcore",          "MPCore",            ARM_ARCH_V6K,
30158                ARM_ARCH_NONE,
30159                FPU_ARCH_VFP_V2),
30160   ARM_CPU_OPT ("mpcorenovfp",     "MPCore",            ARM_ARCH_V6K,
30161                ARM_ARCH_NONE,
30162                FPU_NONE),
30163   ARM_CPU_OPT ("arm1156t2-s",     NULL,                ARM_ARCH_V6T2,
30164                ARM_ARCH_NONE,
30165                FPU_NONE),
30166   ARM_CPU_OPT ("arm1156t2f-s",    NULL,                ARM_ARCH_V6T2,
30167                ARM_ARCH_NONE,
30168                FPU_ARCH_VFP_V2),
30169   ARM_CPU_OPT ("arm1176jz-s",     NULL,                ARM_ARCH_V6KZ,
30170                ARM_ARCH_NONE,
30171                FPU_NONE),
30172   ARM_CPU_OPT ("arm1176jzf-s",    NULL,                ARM_ARCH_V6KZ,
30173                ARM_ARCH_NONE,
30174                FPU_ARCH_VFP_V2),
30175   ARM_CPU_OPT ("cortex-a5",       "Cortex-A5",         ARM_ARCH_V7A,
30176                ARM_FEATURE_CORE_LOW (ARM_EXT_MP | ARM_EXT_SEC),
30177                FPU_NONE),
30178   ARM_CPU_OPT ("cortex-a7",       "Cortex-A7",         ARM_ARCH_V7VE,
30179                ARM_ARCH_NONE,
30180                FPU_ARCH_NEON_VFP_V4),
30181   ARM_CPU_OPT ("cortex-a8",       "Cortex-A8",         ARM_ARCH_V7A,
30182                ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
30183                ARM_FEATURE_COPROC (FPU_VFP_V3 | FPU_NEON_EXT_V1)),
30184   ARM_CPU_OPT ("cortex-a9",       "Cortex-A9",         ARM_ARCH_V7A,
30185                ARM_FEATURE_CORE_LOW (ARM_EXT_MP | ARM_EXT_SEC),
30186                ARM_FEATURE_COPROC (FPU_VFP_V3 | FPU_NEON_EXT_V1)),
30187   ARM_CPU_OPT ("cortex-a12",      "Cortex-A12",        ARM_ARCH_V7VE,
30188                ARM_ARCH_NONE,
30189                FPU_ARCH_NEON_VFP_V4),
30190   ARM_CPU_OPT ("cortex-a15",      "Cortex-A15",        ARM_ARCH_V7VE,
30191                ARM_ARCH_NONE,
30192                FPU_ARCH_NEON_VFP_V4),
30193   ARM_CPU_OPT ("cortex-a17",      "Cortex-A17",        ARM_ARCH_V7VE,
30194                ARM_ARCH_NONE,
30195                FPU_ARCH_NEON_VFP_V4),
30196   ARM_CPU_OPT ("cortex-a32",      "Cortex-A32",        ARM_ARCH_V8A,
30197                ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
30198                FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
30199   ARM_CPU_OPT ("cortex-a35",      "Cortex-A35",        ARM_ARCH_V8A,
30200                ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
30201                FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
30202   ARM_CPU_OPT ("cortex-a53",      "Cortex-A53",        ARM_ARCH_V8A,
30203                ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
30204                FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
30205   ARM_CPU_OPT ("cortex-a55",    "Cortex-A55",          ARM_ARCH_V8_2A,
30206                ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
30207                FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_DOTPROD),
30208   ARM_CPU_OPT ("cortex-a57",      "Cortex-A57",        ARM_ARCH_V8A,
30209                ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
30210                FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
30211   ARM_CPU_OPT ("cortex-a72",      "Cortex-A72",        ARM_ARCH_V8A,
30212               ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
30213               FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
30214   ARM_CPU_OPT ("cortex-a73",      "Cortex-A73",        ARM_ARCH_V8A,
30215               ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
30216               FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
30217   ARM_CPU_OPT ("cortex-a75",    "Cortex-A75",          ARM_ARCH_V8_2A,
30218                ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
30219                FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_DOTPROD),
30220   ARM_CPU_OPT ("cortex-a76",    "Cortex-A76",          ARM_ARCH_V8_2A,
30221                ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
30222                FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_DOTPROD),
30223   ARM_CPU_OPT ("ares",    "Ares",              ARM_ARCH_V8_2A,
30224                ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
30225                FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_DOTPROD),
30226   ARM_CPU_OPT ("cortex-r4",       "Cortex-R4",         ARM_ARCH_V7R,
30227                ARM_ARCH_NONE,
30228                FPU_NONE),
30229   ARM_CPU_OPT ("cortex-r4f",      "Cortex-R4F",        ARM_ARCH_V7R,
30230                ARM_ARCH_NONE,
30231                FPU_ARCH_VFP_V3D16),
30232   ARM_CPU_OPT ("cortex-r5",       "Cortex-R5",         ARM_ARCH_V7R,
30233                ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
30234                FPU_NONE),
30235   ARM_CPU_OPT ("cortex-r7",       "Cortex-R7",         ARM_ARCH_V7R,
30236                ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
30237                FPU_ARCH_VFP_V3D16),
30238   ARM_CPU_OPT ("cortex-r8",       "Cortex-R8",         ARM_ARCH_V7R,
30239                ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
30240                FPU_ARCH_VFP_V3D16),
30241   ARM_CPU_OPT ("cortex-r52",      "Cortex-R52",        ARM_ARCH_V8R,
30242               ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
30243               FPU_ARCH_NEON_VFP_ARMV8),
30244   ARM_CPU_OPT ("cortex-m33",      "Cortex-M33",        ARM_ARCH_V8M_MAIN,
30245                ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP),
30246                FPU_NONE),
30247   ARM_CPU_OPT ("cortex-m23",      "Cortex-M23",        ARM_ARCH_V8M_BASE,
30248                ARM_ARCH_NONE,
30249                FPU_NONE),
30250   ARM_CPU_OPT ("cortex-m7",       "Cortex-M7",         ARM_ARCH_V7EM,
30251                ARM_ARCH_NONE,
30252                FPU_NONE),
30253   ARM_CPU_OPT ("cortex-m4",       "Cortex-M4",         ARM_ARCH_V7EM,
30254                ARM_ARCH_NONE,
30255                FPU_NONE),
30256   ARM_CPU_OPT ("cortex-m3",       "Cortex-M3",         ARM_ARCH_V7M,
30257                ARM_ARCH_NONE,
30258                FPU_NONE),
30259   ARM_CPU_OPT ("cortex-m1",       "Cortex-M1",         ARM_ARCH_V6SM,
30260                ARM_ARCH_NONE,
30261                FPU_NONE),
30262   ARM_CPU_OPT ("cortex-m0",       "Cortex-M0",         ARM_ARCH_V6SM,
30263                ARM_ARCH_NONE,
30264                FPU_NONE),
30265   ARM_CPU_OPT ("cortex-m0plus",   "Cortex-M0+",        ARM_ARCH_V6SM,
30266                ARM_ARCH_NONE,
30267                FPU_NONE),
30268   ARM_CPU_OPT ("exynos-m1",       "Samsung Exynos M1", ARM_ARCH_V8A,
30269                ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
30270                FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
30271   ARM_CPU_OPT ("neoverse-n1",    "Neoverse N1",        ARM_ARCH_V8_2A,
30272                ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
30273                FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_DOTPROD),
30274   /* ??? XSCALE is really an architecture.  */
30275   ARM_CPU_OPT ("xscale",          NULL,                ARM_ARCH_XSCALE,
30276                ARM_ARCH_NONE,
30277                FPU_ARCH_VFP_V2),
30278
30279   /* ??? iwmmxt is not a processor.  */
30280   ARM_CPU_OPT ("iwmmxt",          NULL,                ARM_ARCH_IWMMXT,
30281                ARM_ARCH_NONE,
30282                FPU_ARCH_VFP_V2),
30283   ARM_CPU_OPT ("iwmmxt2",         NULL,                ARM_ARCH_IWMMXT2,
30284                ARM_ARCH_NONE,
30285                FPU_ARCH_VFP_V2),
30286   ARM_CPU_OPT ("i80200",          NULL,                ARM_ARCH_XSCALE,
30287                ARM_ARCH_NONE,
30288                FPU_ARCH_VFP_V2),
30289
30290   /* Maverick.  */
30291   ARM_CPU_OPT ("ep9312",          "ARM920T",
30292                ARM_FEATURE_LOW (ARM_AEXT_V4T, ARM_CEXT_MAVERICK),
30293                ARM_ARCH_NONE, FPU_ARCH_MAVERICK),
30294
30295   /* Marvell processors.  */
30296   ARM_CPU_OPT ("marvell-pj4",     NULL,                ARM_ARCH_V7A,
30297                ARM_FEATURE_CORE_LOW (ARM_EXT_MP | ARM_EXT_SEC),
30298                FPU_ARCH_VFP_V3D16),
30299   ARM_CPU_OPT ("marvell-whitney", NULL,                ARM_ARCH_V7A,
30300                ARM_FEATURE_CORE_LOW (ARM_EXT_MP | ARM_EXT_SEC),
30301                FPU_ARCH_NEON_VFP_V4),
30302
30303   /* APM X-Gene family.  */
30304   ARM_CPU_OPT ("xgene1",          "APM X-Gene 1",      ARM_ARCH_V8A,
30305                ARM_ARCH_NONE,
30306                FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
30307   ARM_CPU_OPT ("xgene2",          "APM X-Gene 2",      ARM_ARCH_V8A,
30308                ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
30309                FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
30310
30311   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL }
30312 };
30313 #undef ARM_CPU_OPT
30314
30315 struct arm_ext_table
30316 {
30317   const char *            name;
30318   size_t                  name_len;
30319   const arm_feature_set   merge;
30320   const arm_feature_set   clear;
30321 };
30322
30323 struct arm_arch_option_table
30324 {
30325   const char *                  name;
30326   size_t                        name_len;
30327   const arm_feature_set         value;
30328   const arm_feature_set         default_fpu;
30329   const struct arm_ext_table *  ext_table;
30330 };
30331
30332 /* Used to add support for +E and +noE extension.  */
30333 #define ARM_EXT(E, M, C) { E, sizeof (E) - 1, M, C }
30334 /* Used to add support for a +E extension.  */
30335 #define ARM_ADD(E, M) { E, sizeof(E) - 1, M, ARM_ARCH_NONE }
30336 /* Used to add support for a +noE extension.  */
30337 #define ARM_REMOVE(E, C) { E, sizeof(E) -1, ARM_ARCH_NONE, C }
30338
30339 #define ALL_FP ARM_FEATURE (0, ARM_EXT2_FP16_INST | ARM_EXT2_FP16_FML, \
30340                             ~0 & ~FPU_ENDIAN_PURE)
30341
30342 static const struct arm_ext_table armv5te_ext_table[] =
30343 {
30344   ARM_EXT ("fp", FPU_ARCH_VFP_V2, ALL_FP),
30345   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30346 };
30347
30348 static const struct arm_ext_table armv7_ext_table[] =
30349 {
30350   ARM_EXT ("fp", FPU_ARCH_VFP_V3D16, ALL_FP),
30351   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30352 };
30353
30354 static const struct arm_ext_table armv7ve_ext_table[] =
30355 {
30356   ARM_EXT ("fp", FPU_ARCH_VFP_V4D16, ALL_FP),
30357   ARM_ADD ("vfpv3-d16", FPU_ARCH_VFP_V3D16),
30358   ARM_ADD ("vfpv3", FPU_ARCH_VFP_V3),
30359   ARM_ADD ("vfpv3-d16-fp16", FPU_ARCH_VFP_V3D16_FP16),
30360   ARM_ADD ("vfpv3-fp16", FPU_ARCH_VFP_V3_FP16),
30361   ARM_ADD ("vfpv4-d16", FPU_ARCH_VFP_V4D16),  /* Alias for +fp.  */
30362   ARM_ADD ("vfpv4", FPU_ARCH_VFP_V4),
30363
30364   ARM_EXT ("simd", FPU_ARCH_NEON_VFP_V4,
30365            ARM_FEATURE_COPROC (FPU_NEON_EXT_V1 | FPU_NEON_EXT_FMA)),
30366
30367   /* Aliases for +simd.  */
30368   ARM_ADD ("neon-vfpv4", FPU_ARCH_NEON_VFP_V4),
30369
30370   ARM_ADD ("neon", FPU_ARCH_VFP_V3_PLUS_NEON_V1),
30371   ARM_ADD ("neon-vfpv3", FPU_ARCH_VFP_V3_PLUS_NEON_V1),
30372   ARM_ADD ("neon-fp16", FPU_ARCH_NEON_FP16),
30373
30374   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30375 };
30376
30377 static const struct arm_ext_table armv7a_ext_table[] =
30378 {
30379   ARM_EXT ("fp", FPU_ARCH_VFP_V3D16, ALL_FP),
30380   ARM_ADD ("vfpv3-d16", FPU_ARCH_VFP_V3D16), /* Alias for +fp.  */
30381   ARM_ADD ("vfpv3", FPU_ARCH_VFP_V3),
30382   ARM_ADD ("vfpv3-d16-fp16", FPU_ARCH_VFP_V3D16_FP16),
30383   ARM_ADD ("vfpv3-fp16", FPU_ARCH_VFP_V3_FP16),
30384   ARM_ADD ("vfpv4-d16", FPU_ARCH_VFP_V4D16),
30385   ARM_ADD ("vfpv4", FPU_ARCH_VFP_V4),
30386
30387   ARM_EXT ("simd", FPU_ARCH_VFP_V3_PLUS_NEON_V1,
30388            ARM_FEATURE_COPROC (FPU_NEON_EXT_V1 | FPU_NEON_EXT_FMA)),
30389
30390   /* Aliases for +simd.  */
30391   ARM_ADD ("neon", FPU_ARCH_VFP_V3_PLUS_NEON_V1),
30392   ARM_ADD ("neon-vfpv3", FPU_ARCH_VFP_V3_PLUS_NEON_V1),
30393
30394   ARM_ADD ("neon-fp16", FPU_ARCH_NEON_FP16),
30395   ARM_ADD ("neon-vfpv4", FPU_ARCH_NEON_VFP_V4),
30396
30397   ARM_ADD ("mp", ARM_FEATURE_CORE_LOW (ARM_EXT_MP)),
30398   ARM_ADD ("sec", ARM_FEATURE_CORE_LOW (ARM_EXT_SEC)),
30399   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30400 };
30401
30402 static const struct arm_ext_table armv7r_ext_table[] =
30403 {
30404   ARM_ADD ("fp.sp", FPU_ARCH_VFP_V3xD),
30405   ARM_ADD ("vfpv3xd", FPU_ARCH_VFP_V3xD), /* Alias for +fp.sp.  */
30406   ARM_EXT ("fp", FPU_ARCH_VFP_V3D16, ALL_FP),
30407   ARM_ADD ("vfpv3-d16", FPU_ARCH_VFP_V3D16), /* Alias for +fp.  */
30408   ARM_ADD ("vfpv3xd-fp16", FPU_ARCH_VFP_V3xD_FP16),
30409   ARM_ADD ("vfpv3-d16-fp16", FPU_ARCH_VFP_V3D16_FP16),
30410   ARM_EXT ("idiv", ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV | ARM_EXT_DIV),
30411            ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV | ARM_EXT_DIV)),
30412   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30413 };
30414
30415 static const struct arm_ext_table armv7em_ext_table[] =
30416 {
30417   ARM_EXT ("fp", FPU_ARCH_VFP_V4_SP_D16, ALL_FP),
30418   /* Alias for +fp, used to be known as fpv4-sp-d16.  */
30419   ARM_ADD ("vfpv4-sp-d16", FPU_ARCH_VFP_V4_SP_D16),
30420   ARM_ADD ("fpv5", FPU_ARCH_VFP_V5_SP_D16),
30421   ARM_ADD ("fp.dp", FPU_ARCH_VFP_V5D16),
30422   ARM_ADD ("fpv5-d16", FPU_ARCH_VFP_V5D16),
30423   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30424 };
30425
30426 static const struct arm_ext_table armv8a_ext_table[] =
30427 {
30428   ARM_ADD ("crc", ARCH_CRC_ARMV8),
30429   ARM_ADD ("simd", FPU_ARCH_NEON_VFP_ARMV8),
30430   ARM_EXT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
30431            ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8)),
30432
30433   /* Armv8-a does not allow an FP implementation without SIMD, so the user
30434      should use the +simd option to turn on FP.  */
30435   ARM_REMOVE ("fp", ALL_FP),
30436   ARM_ADD ("sb", ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB)),
30437   ARM_ADD ("predres", ARM_FEATURE_CORE_HIGH (ARM_EXT2_PREDRES)),
30438   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30439 };
30440
30441
30442 static const struct arm_ext_table armv81a_ext_table[] =
30443 {
30444   ARM_ADD ("simd", FPU_ARCH_NEON_VFP_ARMV8_1),
30445   ARM_EXT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_1,
30446            ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8)),
30447
30448   /* Armv8-a does not allow an FP implementation without SIMD, so the user
30449      should use the +simd option to turn on FP.  */
30450   ARM_REMOVE ("fp", ALL_FP),
30451   ARM_ADD ("sb", ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB)),
30452   ARM_ADD ("predres", ARM_FEATURE_CORE_HIGH (ARM_EXT2_PREDRES)),
30453   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30454 };
30455
30456 static const struct arm_ext_table armv82a_ext_table[] =
30457 {
30458   ARM_ADD ("simd", FPU_ARCH_NEON_VFP_ARMV8_1),
30459   ARM_ADD ("fp16", FPU_ARCH_NEON_VFP_ARMV8_2_FP16),
30460   ARM_ADD ("fp16fml", FPU_ARCH_NEON_VFP_ARMV8_2_FP16FML),
30461   ARM_EXT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_1,
30462            ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8)),
30463   ARM_ADD ("dotprod", FPU_ARCH_DOTPROD_NEON_VFP_ARMV8),
30464
30465   /* Armv8-a does not allow an FP implementation without SIMD, so the user
30466      should use the +simd option to turn on FP.  */
30467   ARM_REMOVE ("fp", ALL_FP),
30468   ARM_ADD ("sb", ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB)),
30469   ARM_ADD ("predres", ARM_FEATURE_CORE_HIGH (ARM_EXT2_PREDRES)),
30470   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30471 };
30472
30473 static const struct arm_ext_table armv84a_ext_table[] =
30474 {
30475   ARM_ADD ("simd", FPU_ARCH_DOTPROD_NEON_VFP_ARMV8),
30476   ARM_ADD ("fp16", FPU_ARCH_NEON_VFP_ARMV8_4_FP16FML),
30477   ARM_EXT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_4,
30478            ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8)),
30479
30480   /* Armv8-a does not allow an FP implementation without SIMD, so the user
30481      should use the +simd option to turn on FP.  */
30482   ARM_REMOVE ("fp", ALL_FP),
30483   ARM_ADD ("sb", ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB)),
30484   ARM_ADD ("predres", ARM_FEATURE_CORE_HIGH (ARM_EXT2_PREDRES)),
30485   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30486 };
30487
30488 static const struct arm_ext_table armv85a_ext_table[] =
30489 {
30490   ARM_ADD ("simd", FPU_ARCH_DOTPROD_NEON_VFP_ARMV8),
30491   ARM_ADD ("fp16", FPU_ARCH_NEON_VFP_ARMV8_4_FP16FML),
30492   ARM_EXT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_4,
30493            ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8)),
30494
30495   /* Armv8-a does not allow an FP implementation without SIMD, so the user
30496      should use the +simd option to turn on FP.  */
30497   ARM_REMOVE ("fp", ALL_FP),
30498   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30499 };
30500
30501 static const struct arm_ext_table armv8m_main_ext_table[] =
30502 {
30503   ARM_EXT ("dsp", ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP),
30504                   ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP)),
30505   ARM_EXT ("fp", FPU_ARCH_VFP_V5_SP_D16, ALL_FP),
30506   ARM_ADD ("fp.dp", FPU_ARCH_VFP_V5D16),
30507   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30508 };
30509
30510 static const struct arm_ext_table armv8_1m_main_ext_table[] =
30511 {
30512   ARM_EXT ("dsp", ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP),
30513                   ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP)),
30514   ARM_EXT ("fp",
30515            ARM_FEATURE (0, ARM_EXT2_FP16_INST,
30516                         FPU_VFP_V5_SP_D16 | FPU_VFP_EXT_FP16 | FPU_VFP_EXT_FMA),
30517            ALL_FP),
30518   ARM_ADD ("fp.dp",
30519            ARM_FEATURE (0, ARM_EXT2_FP16_INST,
30520                         FPU_VFP_V5D16 | FPU_VFP_EXT_FP16 | FPU_VFP_EXT_FMA)),
30521   ARM_EXT ("mve", ARM_FEATURE_COPROC (FPU_MVE),
30522            ARM_FEATURE_COPROC (FPU_MVE | FPU_MVE_FP)),
30523   ARM_ADD ("mve.fp",
30524            ARM_FEATURE (0, ARM_EXT2_FP16_INST,
30525                         FPU_MVE | FPU_MVE_FP | FPU_VFP_V5_SP_D16 |
30526                         FPU_VFP_EXT_FP16 | FPU_VFP_EXT_FMA)),
30527   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30528 };
30529
30530 static const struct arm_ext_table armv8r_ext_table[] =
30531 {
30532   ARM_ADD ("crc", ARCH_CRC_ARMV8),
30533   ARM_ADD ("simd", FPU_ARCH_NEON_VFP_ARMV8),
30534   ARM_EXT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
30535            ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8)),
30536   ARM_REMOVE ("fp", ALL_FP),
30537   ARM_ADD ("fp.sp", FPU_ARCH_VFP_V5_SP_D16),
30538   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
30539 };
30540
30541 /* This list should, at a minimum, contain all the architecture names
30542    recognized by GCC.  */
30543 #define ARM_ARCH_OPT(N, V, DF) { N, sizeof (N) - 1, V, DF, NULL }
30544 #define ARM_ARCH_OPT2(N, V, DF, ext) \
30545   { N, sizeof (N) - 1, V, DF, ext##_ext_table }
30546
30547 static const struct arm_arch_option_table arm_archs[] =
30548 {
30549   ARM_ARCH_OPT ("all",            ARM_ANY,              FPU_ARCH_FPA),
30550   ARM_ARCH_OPT ("armv1",          ARM_ARCH_V1,          FPU_ARCH_FPA),
30551   ARM_ARCH_OPT ("armv2",          ARM_ARCH_V2,          FPU_ARCH_FPA),
30552   ARM_ARCH_OPT ("armv2a",         ARM_ARCH_V2S,         FPU_ARCH_FPA),
30553   ARM_ARCH_OPT ("armv2s",         ARM_ARCH_V2S,         FPU_ARCH_FPA),
30554   ARM_ARCH_OPT ("armv3",          ARM_ARCH_V3,          FPU_ARCH_FPA),
30555   ARM_ARCH_OPT ("armv3m",         ARM_ARCH_V3M,         FPU_ARCH_FPA),
30556   ARM_ARCH_OPT ("armv4",          ARM_ARCH_V4,          FPU_ARCH_FPA),
30557   ARM_ARCH_OPT ("armv4xm",        ARM_ARCH_V4xM,        FPU_ARCH_FPA),
30558   ARM_ARCH_OPT ("armv4t",         ARM_ARCH_V4T,         FPU_ARCH_FPA),
30559   ARM_ARCH_OPT ("armv4txm",       ARM_ARCH_V4TxM,       FPU_ARCH_FPA),
30560   ARM_ARCH_OPT ("armv5",          ARM_ARCH_V5,          FPU_ARCH_VFP),
30561   ARM_ARCH_OPT ("armv5t",         ARM_ARCH_V5T,         FPU_ARCH_VFP),
30562   ARM_ARCH_OPT ("armv5txm",       ARM_ARCH_V5TxM,       FPU_ARCH_VFP),
30563   ARM_ARCH_OPT2 ("armv5te",       ARM_ARCH_V5TE,        FPU_ARCH_VFP,   armv5te),
30564   ARM_ARCH_OPT2 ("armv5texp",     ARM_ARCH_V5TExP,      FPU_ARCH_VFP, armv5te),
30565   ARM_ARCH_OPT2 ("armv5tej",      ARM_ARCH_V5TEJ,       FPU_ARCH_VFP,   armv5te),
30566   ARM_ARCH_OPT2 ("armv6",         ARM_ARCH_V6,          FPU_ARCH_VFP,   armv5te),
30567   ARM_ARCH_OPT2 ("armv6j",        ARM_ARCH_V6,          FPU_ARCH_VFP,   armv5te),
30568   ARM_ARCH_OPT2 ("armv6k",        ARM_ARCH_V6K,         FPU_ARCH_VFP,   armv5te),
30569   ARM_ARCH_OPT2 ("armv6z",        ARM_ARCH_V6Z,         FPU_ARCH_VFP,   armv5te),
30570   /* The official spelling of this variant is ARMv6KZ, the name "armv6zk" is
30571      kept to preserve existing behaviour.  */
30572   ARM_ARCH_OPT2 ("armv6kz",       ARM_ARCH_V6KZ,        FPU_ARCH_VFP,   armv5te),
30573   ARM_ARCH_OPT2 ("armv6zk",       ARM_ARCH_V6KZ,        FPU_ARCH_VFP,   armv5te),
30574   ARM_ARCH_OPT2 ("armv6t2",       ARM_ARCH_V6T2,        FPU_ARCH_VFP,   armv5te),
30575   ARM_ARCH_OPT2 ("armv6kt2",      ARM_ARCH_V6KT2,       FPU_ARCH_VFP,   armv5te),
30576   ARM_ARCH_OPT2 ("armv6zt2",      ARM_ARCH_V6ZT2,       FPU_ARCH_VFP,   armv5te),
30577   /* The official spelling of this variant is ARMv6KZ, the name "armv6zkt2" is
30578      kept to preserve existing behaviour.  */
30579   ARM_ARCH_OPT2 ("armv6kzt2",     ARM_ARCH_V6KZT2,      FPU_ARCH_VFP,   armv5te),
30580   ARM_ARCH_OPT2 ("armv6zkt2",     ARM_ARCH_V6KZT2,      FPU_ARCH_VFP,   armv5te),
30581   ARM_ARCH_OPT ("armv6-m",        ARM_ARCH_V6M,         FPU_ARCH_VFP),
30582   ARM_ARCH_OPT ("armv6s-m",       ARM_ARCH_V6SM,        FPU_ARCH_VFP),
30583   ARM_ARCH_OPT2 ("armv7",         ARM_ARCH_V7,          FPU_ARCH_VFP, armv7),
30584   /* The official spelling of the ARMv7 profile variants is the dashed form.
30585      Accept the non-dashed form for compatibility with old toolchains.  */
30586   ARM_ARCH_OPT2 ("armv7a",        ARM_ARCH_V7A,         FPU_ARCH_VFP, armv7a),
30587   ARM_ARCH_OPT2 ("armv7ve",       ARM_ARCH_V7VE,        FPU_ARCH_VFP, armv7ve),
30588   ARM_ARCH_OPT2 ("armv7r",        ARM_ARCH_V7R,         FPU_ARCH_VFP, armv7r),
30589   ARM_ARCH_OPT ("armv7m",         ARM_ARCH_V7M,         FPU_ARCH_VFP),
30590   ARM_ARCH_OPT2 ("armv7-a",       ARM_ARCH_V7A,         FPU_ARCH_VFP, armv7a),
30591   ARM_ARCH_OPT2 ("armv7-r",       ARM_ARCH_V7R,         FPU_ARCH_VFP, armv7r),
30592   ARM_ARCH_OPT ("armv7-m",        ARM_ARCH_V7M,         FPU_ARCH_VFP),
30593   ARM_ARCH_OPT2 ("armv7e-m",      ARM_ARCH_V7EM,        FPU_ARCH_VFP, armv7em),
30594   ARM_ARCH_OPT ("armv8-m.base",   ARM_ARCH_V8M_BASE,    FPU_ARCH_VFP),
30595   ARM_ARCH_OPT2 ("armv8-m.main",  ARM_ARCH_V8M_MAIN,    FPU_ARCH_VFP,
30596                  armv8m_main),
30597   ARM_ARCH_OPT2 ("armv8.1-m.main", ARM_ARCH_V8_1M_MAIN, FPU_ARCH_VFP,
30598                  armv8_1m_main),
30599   ARM_ARCH_OPT2 ("armv8-a",       ARM_ARCH_V8A,         FPU_ARCH_VFP, armv8a),
30600   ARM_ARCH_OPT2 ("armv8.1-a",     ARM_ARCH_V8_1A,       FPU_ARCH_VFP, armv81a),
30601   ARM_ARCH_OPT2 ("armv8.2-a",     ARM_ARCH_V8_2A,       FPU_ARCH_VFP, armv82a),
30602   ARM_ARCH_OPT2 ("armv8.3-a",     ARM_ARCH_V8_3A,       FPU_ARCH_VFP, armv82a),
30603   ARM_ARCH_OPT2 ("armv8-r",       ARM_ARCH_V8R,         FPU_ARCH_VFP, armv8r),
30604   ARM_ARCH_OPT2 ("armv8.4-a",     ARM_ARCH_V8_4A,       FPU_ARCH_VFP, armv84a),
30605   ARM_ARCH_OPT2 ("armv8.5-a",     ARM_ARCH_V8_5A,       FPU_ARCH_VFP, armv85a),
30606   ARM_ARCH_OPT ("xscale",         ARM_ARCH_XSCALE,      FPU_ARCH_VFP),
30607   ARM_ARCH_OPT ("iwmmxt",         ARM_ARCH_IWMMXT,      FPU_ARCH_VFP),
30608   ARM_ARCH_OPT ("iwmmxt2",        ARM_ARCH_IWMMXT2,     FPU_ARCH_VFP),
30609   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL }
30610 };
30611 #undef ARM_ARCH_OPT
30612
30613 /* ISA extensions in the co-processor and main instruction set space.  */
30614
30615 struct arm_option_extension_value_table
30616 {
30617   const char *           name;
30618   size_t                 name_len;
30619   const arm_feature_set  merge_value;
30620   const arm_feature_set  clear_value;
30621   /* List of architectures for which an extension is available.  ARM_ARCH_NONE
30622      indicates that an extension is available for all architectures while
30623      ARM_ANY marks an empty entry.  */
30624   const arm_feature_set  allowed_archs[2];
30625 };
30626
30627 /* The following table must be in alphabetical order with a NULL last entry.  */
30628
30629 #define ARM_EXT_OPT(N, M, C, AA) { N, sizeof (N) - 1, M, C, { AA, ARM_ANY } }
30630 #define ARM_EXT_OPT2(N, M, C, AA1, AA2) { N, sizeof (N) - 1, M, C, {AA1, AA2} }
30631
30632 /* DEPRECATED: Refrain from using this table to add any new extensions, instead
30633    use the context sensitive approach using arm_ext_table's.  */
30634 static const struct arm_option_extension_value_table arm_extensions[] =
30635 {
30636   ARM_EXT_OPT ("crc",  ARCH_CRC_ARMV8, ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
30637                          ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
30638   ARM_EXT_OPT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
30639                          ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8),
30640                                    ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
30641   ARM_EXT_OPT ("dotprod", FPU_ARCH_DOTPROD_NEON_VFP_ARMV8,
30642                           ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
30643                           ARM_ARCH_V8_2A),
30644   ARM_EXT_OPT ("dsp",   ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP),
30645                         ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP),
30646                         ARM_FEATURE_CORE (ARM_EXT_V7M, ARM_EXT2_V8M)),
30647   ARM_EXT_OPT ("fp",     FPU_ARCH_VFP_ARMV8, ARM_FEATURE_COPROC (FPU_VFP_ARMV8),
30648                                    ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
30649   ARM_EXT_OPT ("fp16",  ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
30650                         ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
30651                         ARM_ARCH_V8_2A),
30652   ARM_EXT_OPT ("fp16fml",  ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
30653                                                   | ARM_EXT2_FP16_FML),
30654                            ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
30655                                                   | ARM_EXT2_FP16_FML),
30656                            ARM_ARCH_V8_2A),
30657   ARM_EXT_OPT2 ("idiv", ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV | ARM_EXT_DIV),
30658                         ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV | ARM_EXT_DIV),
30659                         ARM_FEATURE_CORE_LOW (ARM_EXT_V7A),
30660                         ARM_FEATURE_CORE_LOW (ARM_EXT_V7R)),
30661   /* Duplicate entry for the purpose of allowing ARMv7 to match in presence of
30662      Thumb divide instruction.  Due to this having the same name as the
30663      previous entry, this will be ignored when doing command-line parsing and
30664      only considered by build attribute selection code.  */
30665   ARM_EXT_OPT ("idiv",  ARM_FEATURE_CORE_LOW (ARM_EXT_DIV),
30666                         ARM_FEATURE_CORE_LOW (ARM_EXT_DIV),
30667                         ARM_FEATURE_CORE_LOW (ARM_EXT_V7)),
30668   ARM_EXT_OPT ("iwmmxt",ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT),
30669                         ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT), ARM_ARCH_NONE),
30670   ARM_EXT_OPT ("iwmmxt2", ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT2),
30671                         ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT2), ARM_ARCH_NONE),
30672   ARM_EXT_OPT ("maverick", ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
30673                         ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), ARM_ARCH_NONE),
30674   ARM_EXT_OPT2 ("mp",   ARM_FEATURE_CORE_LOW (ARM_EXT_MP),
30675                         ARM_FEATURE_CORE_LOW (ARM_EXT_MP),
30676                         ARM_FEATURE_CORE_LOW (ARM_EXT_V7A),
30677                         ARM_FEATURE_CORE_LOW (ARM_EXT_V7R)),
30678   ARM_EXT_OPT ("os",    ARM_FEATURE_CORE_LOW (ARM_EXT_OS),
30679                         ARM_FEATURE_CORE_LOW (ARM_EXT_OS),
30680                                    ARM_FEATURE_CORE_LOW (ARM_EXT_V6M)),
30681   ARM_EXT_OPT ("pan",   ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN),
30682                         ARM_FEATURE (ARM_EXT_V8, ARM_EXT2_PAN, 0),
30683                         ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8A)),
30684   ARM_EXT_OPT ("predres", ARM_FEATURE_CORE_HIGH (ARM_EXT2_PREDRES),
30685                         ARM_FEATURE_CORE_HIGH (ARM_EXT2_PREDRES),
30686                         ARM_ARCH_V8A),
30687   ARM_EXT_OPT ("ras",   ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS),
30688                         ARM_FEATURE (ARM_EXT_V8, ARM_EXT2_RAS, 0),
30689                         ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8A)),
30690   ARM_EXT_OPT ("rdma",  FPU_ARCH_NEON_VFP_ARMV8_1,
30691                         ARM_FEATURE_COPROC (FPU_NEON_ARMV8 | FPU_NEON_EXT_RDMA),
30692                         ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8A)),
30693   ARM_EXT_OPT ("sb",    ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB),
30694                         ARM_FEATURE_CORE_HIGH (ARM_EXT2_SB),
30695                         ARM_ARCH_V8A),
30696   ARM_EXT_OPT2 ("sec",  ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
30697                         ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
30698                         ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
30699                         ARM_FEATURE_CORE_LOW (ARM_EXT_V7A)),
30700   ARM_EXT_OPT ("simd",  FPU_ARCH_NEON_VFP_ARMV8,
30701                         ARM_FEATURE_COPROC (FPU_NEON_ARMV8),
30702                         ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
30703   ARM_EXT_OPT ("virt",  ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT | ARM_EXT_ADIV
30704                                      | ARM_EXT_DIV),
30705                         ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT),
30706                                    ARM_FEATURE_CORE_LOW (ARM_EXT_V7A)),
30707   ARM_EXT_OPT ("xscale",ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
30708                         ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), ARM_ARCH_NONE),
30709   { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, { ARM_ARCH_NONE, ARM_ARCH_NONE } }
30710 };
30711 #undef ARM_EXT_OPT
30712
30713 /* ISA floating-point and Advanced SIMD extensions.  */
30714 struct arm_option_fpu_value_table
30715 {
30716   const char *           name;
30717   const arm_feature_set  value;
30718 };
30719
30720 /* This list should, at a minimum, contain all the fpu names
30721    recognized by GCC.  */
30722 static const struct arm_option_fpu_value_table arm_fpus[] =
30723 {
30724   {"softfpa",           FPU_NONE},
30725   {"fpe",               FPU_ARCH_FPE},
30726   {"fpe2",              FPU_ARCH_FPE},
30727   {"fpe3",              FPU_ARCH_FPA},  /* Third release supports LFM/SFM.  */
30728   {"fpa",               FPU_ARCH_FPA},
30729   {"fpa10",             FPU_ARCH_FPA},
30730   {"fpa11",             FPU_ARCH_FPA},
30731   {"arm7500fe",         FPU_ARCH_FPA},
30732   {"softvfp",           FPU_ARCH_VFP},
30733   {"softvfp+vfp",       FPU_ARCH_VFP_V2},
30734   {"vfp",               FPU_ARCH_VFP_V2},
30735   {"vfp9",              FPU_ARCH_VFP_V2},
30736   {"vfp3",              FPU_ARCH_VFP_V3}, /* Undocumented, use vfpv3.  */
30737   {"vfp10",             FPU_ARCH_VFP_V2},
30738   {"vfp10-r0",          FPU_ARCH_VFP_V1},
30739   {"vfpxd",             FPU_ARCH_VFP_V1xD},
30740   {"vfpv2",             FPU_ARCH_VFP_V2},
30741   {"vfpv3",             FPU_ARCH_VFP_V3},
30742   {"vfpv3-fp16",        FPU_ARCH_VFP_V3_FP16},
30743   {"vfpv3-d16",         FPU_ARCH_VFP_V3D16},
30744   {"vfpv3-d16-fp16",    FPU_ARCH_VFP_V3D16_FP16},
30745   {"vfpv3xd",           FPU_ARCH_VFP_V3xD},
30746   {"vfpv3xd-fp16",      FPU_ARCH_VFP_V3xD_FP16},
30747   {"arm1020t",          FPU_ARCH_VFP_V1},
30748   {"arm1020e",          FPU_ARCH_VFP_V2},
30749   {"arm1136jfs",        FPU_ARCH_VFP_V2}, /* Undocumented, use arm1136jf-s.  */
30750   {"arm1136jf-s",       FPU_ARCH_VFP_V2},
30751   {"maverick",          FPU_ARCH_MAVERICK},
30752   {"neon",              FPU_ARCH_VFP_V3_PLUS_NEON_V1},
30753   {"neon-vfpv3",        FPU_ARCH_VFP_V3_PLUS_NEON_V1},
30754   {"neon-fp16",         FPU_ARCH_NEON_FP16},
30755   {"vfpv4",             FPU_ARCH_VFP_V4},
30756   {"vfpv4-d16",         FPU_ARCH_VFP_V4D16},
30757   {"fpv4-sp-d16",       FPU_ARCH_VFP_V4_SP_D16},
30758   {"fpv5-d16",          FPU_ARCH_VFP_V5D16},
30759   {"fpv5-sp-d16",       FPU_ARCH_VFP_V5_SP_D16},
30760   {"neon-vfpv4",        FPU_ARCH_NEON_VFP_V4},
30761   {"fp-armv8",          FPU_ARCH_VFP_ARMV8},
30762   {"neon-fp-armv8",     FPU_ARCH_NEON_VFP_ARMV8},
30763   {"crypto-neon-fp-armv8",
30764                         FPU_ARCH_CRYPTO_NEON_VFP_ARMV8},
30765   {"neon-fp-armv8.1",   FPU_ARCH_NEON_VFP_ARMV8_1},
30766   {"crypto-neon-fp-armv8.1",
30767                         FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_1},
30768   {NULL,                ARM_ARCH_NONE}
30769 };
30770
30771 struct arm_option_value_table
30772 {
30773   const char *name;
30774   long value;
30775 };
30776
30777 static const struct arm_option_value_table arm_float_abis[] =
30778 {
30779   {"hard",      ARM_FLOAT_ABI_HARD},
30780   {"softfp",    ARM_FLOAT_ABI_SOFTFP},
30781   {"soft",      ARM_FLOAT_ABI_SOFT},
30782   {NULL,        0}
30783 };
30784
30785 #ifdef OBJ_ELF
30786 /* We only know how to output GNU and ver 4/5 (AAELF) formats.  */
30787 static const struct arm_option_value_table arm_eabis[] =
30788 {
30789   {"gnu",       EF_ARM_EABI_UNKNOWN},
30790   {"4",         EF_ARM_EABI_VER4},
30791   {"5",         EF_ARM_EABI_VER5},
30792   {NULL,        0}
30793 };
30794 #endif
30795
30796 struct arm_long_option_table
30797 {
30798   const char * option;                  /* Substring to match.  */
30799   const char * help;                    /* Help information.  */
30800   int (* func) (const char * subopt);   /* Function to decode sub-option.  */
30801   const char * deprecated;              /* If non-null, print this message.  */
30802 };
30803
30804 static bfd_boolean
30805 arm_parse_extension (const char *str, const arm_feature_set *opt_set,
30806                      arm_feature_set *ext_set,
30807                      const struct arm_ext_table *ext_table)
30808 {
30809   /* We insist on extensions being specified in alphabetical order, and with
30810      extensions being added before being removed.  We achieve this by having
30811      the global ARM_EXTENSIONS table in alphabetical order, and using the
30812      ADDING_VALUE variable to indicate whether we are adding an extension (1)
30813      or removing it (0) and only allowing it to change in the order
30814      -1 -> 1 -> 0.  */
30815   const struct arm_option_extension_value_table * opt = NULL;
30816   const arm_feature_set arm_any = ARM_ANY;
30817   int adding_value = -1;
30818
30819   while (str != NULL && *str != 0)
30820     {
30821       const char *ext;
30822       size_t len;
30823
30824       if (*str != '+')
30825         {
30826           as_bad (_("invalid architectural extension"));
30827           return FALSE;
30828         }
30829
30830       str++;
30831       ext = strchr (str, '+');
30832
30833       if (ext != NULL)
30834         len = ext - str;
30835       else
30836         len = strlen (str);
30837
30838       if (len >= 2 && strncmp (str, "no", 2) == 0)
30839         {
30840           if (adding_value != 0)
30841             {
30842               adding_value = 0;
30843               opt = arm_extensions;
30844             }
30845
30846           len -= 2;
30847           str += 2;
30848         }
30849       else if (len > 0)
30850         {
30851           if (adding_value == -1)
30852             {
30853               adding_value = 1;
30854               opt = arm_extensions;
30855             }
30856           else if (adding_value != 1)
30857             {
30858               as_bad (_("must specify extensions to add before specifying "
30859                         "those to remove"));
30860               return FALSE;
30861             }
30862         }
30863
30864       if (len == 0)
30865         {
30866           as_bad (_("missing architectural extension"));
30867           return FALSE;
30868         }
30869
30870       gas_assert (adding_value != -1);
30871       gas_assert (opt != NULL);
30872
30873       if (ext_table != NULL)
30874         {
30875           const struct arm_ext_table * ext_opt = ext_table;
30876           bfd_boolean found = FALSE;
30877           for (; ext_opt->name != NULL; ext_opt++)
30878             if (ext_opt->name_len == len
30879                 && strncmp (ext_opt->name, str, len) == 0)
30880               {
30881                 if (adding_value)
30882                   {
30883                     if (ARM_FEATURE_ZERO (ext_opt->merge))
30884                         /* TODO: Option not supported.  When we remove the
30885                            legacy table this case should error out.  */
30886                         continue;
30887
30888                     ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, ext_opt->merge);
30889                   }
30890                 else
30891                   {
30892                     if (ARM_FEATURE_ZERO (ext_opt->clear))
30893                         /* TODO: Option not supported.  When we remove the
30894                            legacy table this case should error out.  */
30895                         continue;
30896                     ARM_CLEAR_FEATURE (*ext_set, *ext_set, ext_opt->clear);
30897                   }
30898                 found = TRUE;
30899                 break;
30900               }
30901           if (found)
30902             {
30903               str = ext;
30904               continue;
30905             }
30906         }
30907
30908       /* Scan over the options table trying to find an exact match. */
30909       for (; opt->name != NULL; opt++)
30910         if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
30911           {
30912             int i, nb_allowed_archs =
30913               sizeof (opt->allowed_archs) / sizeof (opt->allowed_archs[0]);
30914             /* Check we can apply the extension to this architecture.  */
30915             for (i = 0; i < nb_allowed_archs; i++)
30916               {
30917                 /* Empty entry.  */
30918                 if (ARM_FEATURE_EQUAL (opt->allowed_archs[i], arm_any))
30919                   continue;
30920                 if (ARM_FSET_CPU_SUBSET (opt->allowed_archs[i], *opt_set))
30921                   break;
30922               }
30923             if (i == nb_allowed_archs)
30924               {
30925                 as_bad (_("extension does not apply to the base architecture"));
30926                 return FALSE;
30927               }
30928
30929             /* Add or remove the extension.  */
30930             if (adding_value)
30931               ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->merge_value);
30932             else
30933               ARM_CLEAR_FEATURE (*ext_set, *ext_set, opt->clear_value);
30934
30935             /* Allowing Thumb division instructions for ARMv7 in autodetection
30936                rely on this break so that duplicate extensions (extensions
30937                with the same name as a previous extension in the list) are not
30938                considered for command-line parsing.  */
30939             break;
30940           }
30941
30942       if (opt->name == NULL)
30943         {
30944           /* Did we fail to find an extension because it wasn't specified in
30945              alphabetical order, or because it does not exist?  */
30946
30947           for (opt = arm_extensions; opt->name != NULL; opt++)
30948             if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
30949               break;
30950
30951           if (opt->name == NULL)
30952             as_bad (_("unknown architectural extension `%s'"), str);
30953           else
30954             as_bad (_("architectural extensions must be specified in "
30955                       "alphabetical order"));
30956
30957           return FALSE;
30958         }
30959       else
30960         {
30961           /* We should skip the extension we've just matched the next time
30962              round.  */
30963           opt++;
30964         }
30965
30966       str = ext;
30967     };
30968
30969   return TRUE;
30970 }
30971
30972 static bfd_boolean
30973 arm_parse_cpu (const char *str)
30974 {
30975   const struct arm_cpu_option_table *opt;
30976   const char *ext = strchr (str, '+');
30977   size_t len;
30978
30979   if (ext != NULL)
30980     len = ext - str;
30981   else
30982     len = strlen (str);
30983
30984   if (len == 0)
30985     {
30986       as_bad (_("missing cpu name `%s'"), str);
30987       return FALSE;
30988     }
30989
30990   for (opt = arm_cpus; opt->name != NULL; opt++)
30991     if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
30992       {
30993         mcpu_cpu_opt = &opt->value;
30994         if (mcpu_ext_opt == NULL)
30995           mcpu_ext_opt = XNEW (arm_feature_set);
30996         *mcpu_ext_opt = opt->ext;
30997         mcpu_fpu_opt = &opt->default_fpu;
30998         if (opt->canonical_name)
30999           {
31000             gas_assert (sizeof selected_cpu_name > strlen (opt->canonical_name));
31001             strcpy (selected_cpu_name, opt->canonical_name);
31002           }
31003         else
31004           {
31005             size_t i;
31006
31007             if (len >= sizeof selected_cpu_name)
31008               len = (sizeof selected_cpu_name) - 1;
31009
31010             for (i = 0; i < len; i++)
31011               selected_cpu_name[i] = TOUPPER (opt->name[i]);
31012             selected_cpu_name[i] = 0;
31013           }
31014
31015         if (ext != NULL)
31016           return arm_parse_extension (ext, mcpu_cpu_opt, mcpu_ext_opt, NULL);
31017
31018         return TRUE;
31019       }
31020
31021   as_bad (_("unknown cpu `%s'"), str);
31022   return FALSE;
31023 }
31024
31025 static bfd_boolean
31026 arm_parse_arch (const char *str)
31027 {
31028   const struct arm_arch_option_table *opt;
31029   const char *ext = strchr (str, '+');
31030   size_t len;
31031
31032   if (ext != NULL)
31033     len = ext - str;
31034   else
31035     len = strlen (str);
31036
31037   if (len == 0)
31038     {
31039       as_bad (_("missing architecture name `%s'"), str);
31040       return FALSE;
31041     }
31042
31043   for (opt = arm_archs; opt->name != NULL; opt++)
31044     if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
31045       {
31046         march_cpu_opt = &opt->value;
31047         if (march_ext_opt == NULL)
31048           march_ext_opt = XNEW (arm_feature_set);
31049         *march_ext_opt = arm_arch_none;
31050         march_fpu_opt = &opt->default_fpu;
31051         strcpy (selected_cpu_name, opt->name);
31052
31053         if (ext != NULL)
31054           return arm_parse_extension (ext, march_cpu_opt, march_ext_opt,
31055                                       opt->ext_table);
31056
31057         return TRUE;
31058       }
31059
31060   as_bad (_("unknown architecture `%s'\n"), str);
31061   return FALSE;
31062 }
31063
31064 static bfd_boolean
31065 arm_parse_fpu (const char * str)
31066 {
31067   const struct arm_option_fpu_value_table * opt;
31068
31069   for (opt = arm_fpus; opt->name != NULL; opt++)
31070     if (streq (opt->name, str))
31071       {
31072         mfpu_opt = &opt->value;
31073         return TRUE;
31074       }
31075
31076   as_bad (_("unknown floating point format `%s'\n"), str);
31077   return FALSE;
31078 }
31079
31080 static bfd_boolean
31081 arm_parse_float_abi (const char * str)
31082 {
31083   const struct arm_option_value_table * opt;
31084
31085   for (opt = arm_float_abis; opt->name != NULL; opt++)
31086     if (streq (opt->name, str))
31087       {
31088         mfloat_abi_opt = opt->value;
31089         return TRUE;
31090       }
31091
31092   as_bad (_("unknown floating point abi `%s'\n"), str);
31093   return FALSE;
31094 }
31095
31096 #ifdef OBJ_ELF
31097 static bfd_boolean
31098 arm_parse_eabi (const char * str)
31099 {
31100   const struct arm_option_value_table *opt;
31101
31102   for (opt = arm_eabis; opt->name != NULL; opt++)
31103     if (streq (opt->name, str))
31104       {
31105         meabi_flags = opt->value;
31106         return TRUE;
31107       }
31108   as_bad (_("unknown EABI `%s'\n"), str);
31109   return FALSE;
31110 }
31111 #endif
31112
31113 static bfd_boolean
31114 arm_parse_it_mode (const char * str)
31115 {
31116   bfd_boolean ret = TRUE;
31117
31118   if (streq ("arm", str))
31119     implicit_it_mode = IMPLICIT_IT_MODE_ARM;
31120   else if (streq ("thumb", str))
31121     implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
31122   else if (streq ("always", str))
31123     implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
31124   else if (streq ("never", str))
31125     implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
31126   else
31127     {
31128       as_bad (_("unknown implicit IT mode `%s', should be "\
31129                 "arm, thumb, always, or never."), str);
31130       ret = FALSE;
31131     }
31132
31133   return ret;
31134 }
31135
31136 static bfd_boolean
31137 arm_ccs_mode (const char * unused ATTRIBUTE_UNUSED)
31138 {
31139   codecomposer_syntax = TRUE;
31140   arm_comment_chars[0] = ';';
31141   arm_line_separator_chars[0] = 0;
31142   return TRUE;
31143 }
31144
31145 struct arm_long_option_table arm_long_opts[] =
31146 {
31147   {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
31148    arm_parse_cpu, NULL},
31149   {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
31150    arm_parse_arch, NULL},
31151   {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
31152    arm_parse_fpu, NULL},
31153   {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
31154    arm_parse_float_abi, NULL},
31155 #ifdef OBJ_ELF
31156   {"meabi=", N_("<ver>\t\t  assemble for eabi version <ver>"),
31157    arm_parse_eabi, NULL},
31158 #endif
31159   {"mimplicit-it=", N_("<mode>\t  controls implicit insertion of IT instructions"),
31160    arm_parse_it_mode, NULL},
31161   {"mccs", N_("\t\t\t  TI CodeComposer Studio syntax compatibility mode"),
31162    arm_ccs_mode, NULL},
31163   {NULL, NULL, 0, NULL}
31164 };
31165
31166 int
31167 md_parse_option (int c, const char * arg)
31168 {
31169   struct arm_option_table *opt;
31170   const struct arm_legacy_option_table *fopt;
31171   struct arm_long_option_table *lopt;
31172
31173   switch (c)
31174     {
31175 #ifdef OPTION_EB
31176     case OPTION_EB:
31177       target_big_endian = 1;
31178       break;
31179 #endif
31180
31181 #ifdef OPTION_EL
31182     case OPTION_EL:
31183       target_big_endian = 0;
31184       break;
31185 #endif
31186
31187     case OPTION_FIX_V4BX:
31188       fix_v4bx = TRUE;
31189       break;
31190
31191 #ifdef OBJ_ELF
31192     case OPTION_FDPIC:
31193       arm_fdpic = TRUE;
31194       break;
31195 #endif /* OBJ_ELF */
31196
31197     case 'a':
31198       /* Listing option.  Just ignore these, we don't support additional
31199          ones.  */
31200       return 0;
31201
31202     default:
31203       for (opt = arm_opts; opt->option != NULL; opt++)
31204         {
31205           if (c == opt->option[0]
31206               && ((arg == NULL && opt->option[1] == 0)
31207                   || streq (arg, opt->option + 1)))
31208             {
31209               /* If the option is deprecated, tell the user.  */
31210               if (warn_on_deprecated && opt->deprecated != NULL)
31211                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
31212                            arg ? arg : "", _(opt->deprecated));
31213
31214               if (opt->var != NULL)
31215                 *opt->var = opt->value;
31216
31217               return 1;
31218             }
31219         }
31220
31221       for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
31222         {
31223           if (c == fopt->option[0]
31224               && ((arg == NULL && fopt->option[1] == 0)
31225                   || streq (arg, fopt->option + 1)))
31226             {
31227               /* If the option is deprecated, tell the user.  */
31228               if (warn_on_deprecated && fopt->deprecated != NULL)
31229                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
31230                            arg ? arg : "", _(fopt->deprecated));
31231
31232               if (fopt->var != NULL)
31233                 *fopt->var = &fopt->value;
31234
31235               return 1;
31236             }
31237         }
31238
31239       for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
31240         {
31241           /* These options are expected to have an argument.  */
31242           if (c == lopt->option[0]
31243               && arg != NULL
31244               && strncmp (arg, lopt->option + 1,
31245                           strlen (lopt->option + 1)) == 0)
31246             {
31247               /* If the option is deprecated, tell the user.  */
31248               if (warn_on_deprecated && lopt->deprecated != NULL)
31249                 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
31250                            _(lopt->deprecated));
31251
31252               /* Call the sup-option parser.  */
31253               return lopt->func (arg + strlen (lopt->option) - 1);
31254             }
31255         }
31256
31257       return 0;
31258     }
31259
31260   return 1;
31261 }
31262
31263 void
31264 md_show_usage (FILE * fp)
31265 {
31266   struct arm_option_table *opt;
31267   struct arm_long_option_table *lopt;
31268
31269   fprintf (fp, _(" ARM-specific assembler options:\n"));
31270
31271   for (opt = arm_opts; opt->option != NULL; opt++)
31272     if (opt->help != NULL)
31273       fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
31274
31275   for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
31276     if (lopt->help != NULL)
31277       fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
31278
31279 #ifdef OPTION_EB
31280   fprintf (fp, _("\
31281   -EB                     assemble code for a big-endian cpu\n"));
31282 #endif
31283
31284 #ifdef OPTION_EL
31285   fprintf (fp, _("\
31286   -EL                     assemble code for a little-endian cpu\n"));
31287 #endif
31288
31289   fprintf (fp, _("\
31290   --fix-v4bx              Allow BX in ARMv4 code\n"));
31291
31292 #ifdef OBJ_ELF
31293   fprintf (fp, _("\
31294   --fdpic                 generate an FDPIC object file\n"));
31295 #endif /* OBJ_ELF */
31296 }
31297
31298 #ifdef OBJ_ELF
31299
31300 typedef struct
31301 {
31302   int val;
31303   arm_feature_set flags;
31304 } cpu_arch_ver_table;
31305
31306 /* Mapping from CPU features to EABI CPU arch values.  Table must be sorted
31307    chronologically for architectures, with an exception for ARMv6-M and
31308    ARMv6S-M due to legacy reasons.  No new architecture should have a
31309    special case.  This allows for build attribute selection results to be
31310    stable when new architectures are added.  */
31311 static const cpu_arch_ver_table cpu_arch_ver[] =
31312 {
31313     {TAG_CPU_ARCH_PRE_V4,     ARM_ARCH_V1},
31314     {TAG_CPU_ARCH_PRE_V4,     ARM_ARCH_V2},
31315     {TAG_CPU_ARCH_PRE_V4,     ARM_ARCH_V2S},
31316     {TAG_CPU_ARCH_PRE_V4,     ARM_ARCH_V3},
31317     {TAG_CPU_ARCH_PRE_V4,     ARM_ARCH_V3M},
31318     {TAG_CPU_ARCH_V4,         ARM_ARCH_V4xM},
31319     {TAG_CPU_ARCH_V4,         ARM_ARCH_V4},
31320     {TAG_CPU_ARCH_V4T,        ARM_ARCH_V4TxM},
31321     {TAG_CPU_ARCH_V4T,        ARM_ARCH_V4T},
31322     {TAG_CPU_ARCH_V5T,        ARM_ARCH_V5xM},
31323     {TAG_CPU_ARCH_V5T,        ARM_ARCH_V5},
31324     {TAG_CPU_ARCH_V5T,        ARM_ARCH_V5TxM},
31325     {TAG_CPU_ARCH_V5T,        ARM_ARCH_V5T},
31326     {TAG_CPU_ARCH_V5TE,       ARM_ARCH_V5TExP},
31327     {TAG_CPU_ARCH_V5TE,       ARM_ARCH_V5TE},
31328     {TAG_CPU_ARCH_V5TEJ,      ARM_ARCH_V5TEJ},
31329     {TAG_CPU_ARCH_V6,         ARM_ARCH_V6},
31330     {TAG_CPU_ARCH_V6KZ,       ARM_ARCH_V6Z},
31331     {TAG_CPU_ARCH_V6KZ,       ARM_ARCH_V6KZ},
31332     {TAG_CPU_ARCH_V6K,        ARM_ARCH_V6K},
31333     {TAG_CPU_ARCH_V6T2,       ARM_ARCH_V6T2},
31334     {TAG_CPU_ARCH_V6T2,       ARM_ARCH_V6KT2},
31335     {TAG_CPU_ARCH_V6T2,       ARM_ARCH_V6ZT2},
31336     {TAG_CPU_ARCH_V6T2,       ARM_ARCH_V6KZT2},
31337
31338     /* When assembling a file with only ARMv6-M or ARMv6S-M instruction, GNU as
31339        always selected build attributes to match those of ARMv6-M
31340        (resp. ARMv6S-M).  However, due to these architectures being a strict
31341        subset of ARMv7-M in terms of instructions available, ARMv7-M attributes
31342        would be selected when fully respecting chronology of architectures.
31343        It is thus necessary to make a special case of ARMv6-M and ARMv6S-M and
31344        move them before ARMv7 architectures.  */
31345     {TAG_CPU_ARCH_V6_M,       ARM_ARCH_V6M},
31346     {TAG_CPU_ARCH_V6S_M,      ARM_ARCH_V6SM},
31347
31348     {TAG_CPU_ARCH_V7,         ARM_ARCH_V7},
31349     {TAG_CPU_ARCH_V7,         ARM_ARCH_V7A},
31350     {TAG_CPU_ARCH_V7,         ARM_ARCH_V7R},
31351     {TAG_CPU_ARCH_V7,         ARM_ARCH_V7M},
31352     {TAG_CPU_ARCH_V7,         ARM_ARCH_V7VE},
31353     {TAG_CPU_ARCH_V7E_M,      ARM_ARCH_V7EM},
31354     {TAG_CPU_ARCH_V8,         ARM_ARCH_V8A},
31355     {TAG_CPU_ARCH_V8,         ARM_ARCH_V8_1A},
31356     {TAG_CPU_ARCH_V8,         ARM_ARCH_V8_2A},
31357     {TAG_CPU_ARCH_V8,         ARM_ARCH_V8_3A},
31358     {TAG_CPU_ARCH_V8M_BASE,   ARM_ARCH_V8M_BASE},
31359     {TAG_CPU_ARCH_V8M_MAIN,   ARM_ARCH_V8M_MAIN},
31360     {TAG_CPU_ARCH_V8R,        ARM_ARCH_V8R},
31361     {TAG_CPU_ARCH_V8,         ARM_ARCH_V8_4A},
31362     {TAG_CPU_ARCH_V8,         ARM_ARCH_V8_5A},
31363     {TAG_CPU_ARCH_V8_1M_MAIN, ARM_ARCH_V8_1M_MAIN},
31364     {-1,                      ARM_ARCH_NONE}
31365 };
31366
31367 /* Set an attribute if it has not already been set by the user.  */
31368
31369 static void
31370 aeabi_set_attribute_int (int tag, int value)
31371 {
31372   if (tag < 1
31373       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
31374       || !attributes_set_explicitly[tag])
31375     bfd_elf_add_proc_attr_int (stdoutput, tag, value);
31376 }
31377
31378 static void
31379 aeabi_set_attribute_string (int tag, const char *value)
31380 {
31381   if (tag < 1
31382       || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
31383       || !attributes_set_explicitly[tag])
31384     bfd_elf_add_proc_attr_string (stdoutput, tag, value);
31385 }
31386
31387 /* Return whether features in the *NEEDED feature set are available via
31388    extensions for the architecture whose feature set is *ARCH_FSET.  */
31389
31390 static bfd_boolean
31391 have_ext_for_needed_feat_p (const arm_feature_set *arch_fset,
31392                             const arm_feature_set *needed)
31393 {
31394   int i, nb_allowed_archs;
31395   arm_feature_set ext_fset;
31396   const struct arm_option_extension_value_table *opt;
31397
31398   ext_fset = arm_arch_none;
31399   for (opt = arm_extensions; opt->name != NULL; opt++)
31400     {
31401       /* Extension does not provide any feature we need.  */
31402       if (!ARM_CPU_HAS_FEATURE (*needed, opt->merge_value))
31403         continue;
31404
31405       nb_allowed_archs =
31406         sizeof (opt->allowed_archs) / sizeof (opt->allowed_archs[0]);
31407       for (i = 0; i < nb_allowed_archs; i++)
31408         {
31409           /* Empty entry.  */
31410           if (ARM_FEATURE_EQUAL (opt->allowed_archs[i], arm_arch_any))
31411             break;
31412
31413           /* Extension is available, add it.  */
31414           if (ARM_FSET_CPU_SUBSET (opt->allowed_archs[i], *arch_fset))
31415             ARM_MERGE_FEATURE_SETS (ext_fset, ext_fset, opt->merge_value);
31416         }
31417     }
31418
31419   /* Can we enable all features in *needed?  */
31420   return ARM_FSET_CPU_SUBSET (*needed, ext_fset);
31421 }
31422
31423 /* Select value for Tag_CPU_arch and Tag_CPU_arch_profile build attributes for
31424    a given architecture feature set *ARCH_EXT_FSET including extension feature
31425    set *EXT_FSET.  Selection logic used depend on EXACT_MATCH:
31426    - if true, check for an exact match of the architecture modulo extensions;
31427    - otherwise, select build attribute value of the first superset
31428      architecture released so that results remains stable when new architectures
31429      are added.
31430    For -march/-mcpu=all the build attribute value of the most featureful
31431    architecture is returned.  Tag_CPU_arch_profile result is returned in
31432    PROFILE.  */
31433
31434 static int
31435 get_aeabi_cpu_arch_from_fset (const arm_feature_set *arch_ext_fset,
31436                               const arm_feature_set *ext_fset,
31437                               char *profile, int exact_match)
31438 {
31439   arm_feature_set arch_fset;
31440   const cpu_arch_ver_table *p_ver, *p_ver_ret = NULL;
31441
31442   /* Select most featureful architecture with all its extensions if building
31443      for -march=all as the feature sets used to set build attributes.  */
31444   if (ARM_FEATURE_EQUAL (*arch_ext_fset, arm_arch_any))
31445     {
31446       /* Force revisiting of decision for each new architecture.  */
31447       gas_assert (MAX_TAG_CPU_ARCH <= TAG_CPU_ARCH_V8_1M_MAIN);
31448       *profile = 'A';
31449       return TAG_CPU_ARCH_V8;
31450     }
31451
31452   ARM_CLEAR_FEATURE (arch_fset, *arch_ext_fset, *ext_fset);
31453
31454   for (p_ver = cpu_arch_ver; p_ver->val != -1; p_ver++)
31455     {
31456       arm_feature_set known_arch_fset;
31457
31458       ARM_CLEAR_FEATURE (known_arch_fset, p_ver->flags, fpu_any);
31459       if (exact_match)
31460         {
31461           /* Base architecture match user-specified architecture and
31462              extensions, eg. ARMv6S-M matching -march=armv6-m+os.  */
31463           if (ARM_FEATURE_EQUAL (*arch_ext_fset, known_arch_fset))
31464             {
31465               p_ver_ret = p_ver;
31466               goto found;
31467             }
31468           /* Base architecture match user-specified architecture only
31469              (eg. ARMv6-M in the same case as above).  Record it in case we
31470              find a match with above condition.  */
31471           else if (p_ver_ret == NULL
31472                    && ARM_FEATURE_EQUAL (arch_fset, known_arch_fset))
31473             p_ver_ret = p_ver;
31474         }
31475       else
31476         {
31477
31478           /* Architecture has all features wanted.  */
31479           if (ARM_FSET_CPU_SUBSET (arch_fset, known_arch_fset))
31480             {
31481               arm_feature_set added_fset;
31482
31483               /* Compute features added by this architecture over the one
31484                  recorded in p_ver_ret.  */
31485               if (p_ver_ret != NULL)
31486                 ARM_CLEAR_FEATURE (added_fset, known_arch_fset,
31487                                    p_ver_ret->flags);
31488               /* First architecture that match incl. with extensions, or the
31489                  only difference in features over the recorded match is
31490                  features that were optional and are now mandatory.  */
31491               if (p_ver_ret == NULL
31492                   || ARM_FSET_CPU_SUBSET (added_fset, arch_fset))
31493                 {
31494                   p_ver_ret = p_ver;
31495                   goto found;
31496                 }
31497             }
31498           else if (p_ver_ret == NULL)
31499             {
31500               arm_feature_set needed_ext_fset;
31501
31502               ARM_CLEAR_FEATURE (needed_ext_fset, arch_fset, known_arch_fset);
31503
31504               /* Architecture has all features needed when using some
31505                  extensions.  Record it and continue searching in case there
31506                  exist an architecture providing all needed features without
31507                  the need for extensions (eg. ARMv6S-M Vs ARMv6-M with
31508                  OS extension).  */
31509               if (have_ext_for_needed_feat_p (&known_arch_fset,
31510                                               &needed_ext_fset))
31511                 p_ver_ret = p_ver;
31512             }
31513         }
31514     }
31515
31516   if (p_ver_ret == NULL)
31517     return -1;
31518
31519 found:
31520   /* Tag_CPU_arch_profile.  */
31521   if (ARM_CPU_HAS_FEATURE (p_ver_ret->flags, arm_ext_v7a)
31522       || ARM_CPU_HAS_FEATURE (p_ver_ret->flags, arm_ext_v8)
31523       || (ARM_CPU_HAS_FEATURE (p_ver_ret->flags, arm_ext_atomics)
31524           && !ARM_CPU_HAS_FEATURE (p_ver_ret->flags, arm_ext_v8m_m_only)))
31525     *profile = 'A';
31526   else if (ARM_CPU_HAS_FEATURE (p_ver_ret->flags, arm_ext_v7r))
31527     *profile = 'R';
31528   else if (ARM_CPU_HAS_FEATURE (p_ver_ret->flags, arm_ext_m))
31529     *profile = 'M';
31530   else
31531     *profile = '\0';
31532   return p_ver_ret->val;
31533 }
31534
31535 /* Set the public EABI object attributes.  */
31536
31537 static void
31538 aeabi_set_public_attributes (void)
31539 {
31540   char profile = '\0';
31541   int arch = -1;
31542   int virt_sec = 0;
31543   int fp16_optional = 0;
31544   int skip_exact_match = 0;
31545   arm_feature_set flags, flags_arch, flags_ext;
31546
31547   /* Autodetection mode, choose the architecture based the instructions
31548      actually used.  */
31549   if (no_cpu_selected ())
31550     {
31551       ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
31552
31553       if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any))
31554         ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v1);
31555
31556       if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_any))
31557         ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v4t);
31558
31559       /* Code run during relaxation relies on selected_cpu being set.  */
31560       ARM_CLEAR_FEATURE (flags_arch, flags, fpu_any);
31561       flags_ext = arm_arch_none;
31562       ARM_CLEAR_FEATURE (selected_arch, flags_arch, flags_ext);
31563       selected_ext = flags_ext;
31564       selected_cpu = flags;
31565     }
31566   /* Otherwise, choose the architecture based on the capabilities of the
31567      requested cpu.  */
31568   else
31569     {
31570       ARM_MERGE_FEATURE_SETS (flags_arch, selected_arch, selected_ext);
31571       ARM_CLEAR_FEATURE (flags_arch, flags_arch, fpu_any);
31572       flags_ext = selected_ext;
31573       flags = selected_cpu;
31574     }
31575   ARM_MERGE_FEATURE_SETS (flags, flags, selected_fpu);
31576
31577   /* Allow the user to override the reported architecture.  */
31578   if (!ARM_FEATURE_ZERO (selected_object_arch))
31579     {
31580       ARM_CLEAR_FEATURE (flags_arch, selected_object_arch, fpu_any);
31581       flags_ext = arm_arch_none;
31582     }
31583   else
31584     skip_exact_match = ARM_FEATURE_EQUAL (selected_cpu, arm_arch_any);
31585
31586   /* When this function is run again after relaxation has happened there is no
31587      way to determine whether an architecture or CPU was specified by the user:
31588      - selected_cpu is set above for relaxation to work;
31589      - march_cpu_opt is not set if only -mcpu or .cpu is used;
31590      - mcpu_cpu_opt is set to arm_arch_any for autodetection.
31591      Therefore, if not in -march=all case we first try an exact match and fall
31592      back to autodetection.  */
31593   if (!skip_exact_match)
31594     arch = get_aeabi_cpu_arch_from_fset (&flags_arch, &flags_ext, &profile, 1);
31595   if (arch == -1)
31596     arch = get_aeabi_cpu_arch_from_fset (&flags_arch, &flags_ext, &profile, 0);
31597   if (arch == -1)
31598     as_bad (_("no architecture contains all the instructions used\n"));
31599
31600   /* Tag_CPU_name.  */
31601   if (selected_cpu_name[0])
31602     {
31603       char *q;
31604
31605       q = selected_cpu_name;
31606       if (strncmp (q, "armv", 4) == 0)
31607         {
31608           int i;
31609
31610           q += 4;
31611           for (i = 0; q[i]; i++)
31612             q[i] = TOUPPER (q[i]);
31613         }
31614       aeabi_set_attribute_string (Tag_CPU_name, q);
31615     }
31616
31617   /* Tag_CPU_arch.  */
31618   aeabi_set_attribute_int (Tag_CPU_arch, arch);
31619
31620   /* Tag_CPU_arch_profile.  */
31621   if (profile != '\0')
31622     aeabi_set_attribute_int (Tag_CPU_arch_profile, profile);
31623
31624   /* Tag_DSP_extension.  */
31625   if (ARM_CPU_HAS_FEATURE (selected_ext, arm_ext_dsp))
31626     aeabi_set_attribute_int (Tag_DSP_extension, 1);
31627
31628   ARM_CLEAR_FEATURE (flags_arch, flags, fpu_any);
31629   /* Tag_ARM_ISA_use.  */
31630   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
31631       || ARM_FEATURE_ZERO (flags_arch))
31632     aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
31633
31634   /* Tag_THUMB_ISA_use.  */
31635   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
31636       || ARM_FEATURE_ZERO (flags_arch))
31637     {
31638       int thumb_isa_use;
31639
31640       if (!ARM_CPU_HAS_FEATURE (flags, arm_ext_v8)
31641           && ARM_CPU_HAS_FEATURE (flags, arm_ext_v8m_m_only))
31642         thumb_isa_use = 3;
31643       else if (ARM_CPU_HAS_FEATURE (flags, arm_arch_t2))
31644         thumb_isa_use = 2;
31645       else
31646         thumb_isa_use = 1;
31647       aeabi_set_attribute_int (Tag_THUMB_ISA_use, thumb_isa_use);
31648     }
31649
31650   /* Tag_VFP_arch.  */
31651   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_armv8xd))
31652     aeabi_set_attribute_int (Tag_VFP_arch,
31653                              ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
31654                              ? 7 : 8);
31655   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
31656     aeabi_set_attribute_int (Tag_VFP_arch,
31657                              ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
31658                              ? 5 : 6);
31659   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
31660     {
31661       fp16_optional = 1;
31662       aeabi_set_attribute_int (Tag_VFP_arch, 3);
31663     }
31664   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
31665     {
31666       aeabi_set_attribute_int (Tag_VFP_arch, 4);
31667       fp16_optional = 1;
31668     }
31669   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
31670     aeabi_set_attribute_int (Tag_VFP_arch, 2);
31671   else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
31672            || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
31673     aeabi_set_attribute_int (Tag_VFP_arch, 1);
31674
31675   /* Tag_ABI_HardFP_use.  */
31676   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd)
31677       && !ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1))
31678     aeabi_set_attribute_int (Tag_ABI_HardFP_use, 1);
31679
31680   /* Tag_WMMX_arch.  */
31681   if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
31682     aeabi_set_attribute_int (Tag_WMMX_arch, 2);
31683   else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
31684     aeabi_set_attribute_int (Tag_WMMX_arch, 1);
31685
31686   /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch).  */
31687   if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v8_1))
31688     aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 4);
31689   else if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_armv8))
31690     aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 3);
31691   else if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
31692     {
31693       if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma))
31694         {
31695           aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 2);
31696         }
31697       else
31698         {
31699           aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 1);
31700           fp16_optional = 1;
31701         }
31702     }
31703
31704   if (ARM_CPU_HAS_FEATURE (flags, mve_fp_ext))
31705     aeabi_set_attribute_int (Tag_MVE_arch, 2);
31706   else if (ARM_CPU_HAS_FEATURE (flags, mve_ext))
31707     aeabi_set_attribute_int (Tag_MVE_arch, 1);
31708
31709   /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch).  */
31710   if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16) && fp16_optional)
31711     aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
31712
31713   /* Tag_DIV_use.
31714
31715      We set Tag_DIV_use to two when integer divide instructions have been used
31716      in ARM state, or when Thumb integer divide instructions have been used,
31717      but we have no architecture profile set, nor have we any ARM instructions.
31718
31719      For ARMv8-A and ARMv8-M we set the tag to 0 as integer divide is implied
31720      by the base architecture.
31721
31722      For new architectures we will have to check these tests.  */
31723   gas_assert (arch <= TAG_CPU_ARCH_V8_1M_MAIN);
31724   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v8)
31725       || ARM_CPU_HAS_FEATURE (flags, arm_ext_v8m))
31726     aeabi_set_attribute_int (Tag_DIV_use, 0);
31727   else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_adiv)
31728            || (profile == '\0'
31729                && ARM_CPU_HAS_FEATURE (flags, arm_ext_div)
31730                && !ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any)))
31731     aeabi_set_attribute_int (Tag_DIV_use, 2);
31732
31733   /* Tag_MP_extension_use.  */
31734   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_mp))
31735     aeabi_set_attribute_int (Tag_MPextension_use, 1);
31736
31737   /* Tag Virtualization_use.  */
31738   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_sec))
31739     virt_sec |= 1;
31740   if (ARM_CPU_HAS_FEATURE (flags, arm_ext_virt))
31741     virt_sec |= 2;
31742   if (virt_sec != 0)
31743     aeabi_set_attribute_int (Tag_Virtualization_use, virt_sec);
31744 }
31745
31746 /* Post relaxation hook.  Recompute ARM attributes now that relaxation is
31747    finished and free extension feature bits which will not be used anymore.  */
31748
31749 void
31750 arm_md_post_relax (void)
31751 {
31752   aeabi_set_public_attributes ();
31753   XDELETE (mcpu_ext_opt);
31754   mcpu_ext_opt = NULL;
31755   XDELETE (march_ext_opt);
31756   march_ext_opt = NULL;
31757 }
31758
31759 /* Add the default contents for the .ARM.attributes section.  */
31760
31761 void
31762 arm_md_end (void)
31763 {
31764   if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
31765     return;
31766
31767   aeabi_set_public_attributes ();
31768 }
31769 #endif /* OBJ_ELF */
31770
31771 /* Parse a .cpu directive.  */
31772
31773 static void
31774 s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
31775 {
31776   const struct arm_cpu_option_table *opt;
31777   char *name;
31778   char saved_char;
31779
31780   name = input_line_pointer;
31781   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
31782     input_line_pointer++;
31783   saved_char = *input_line_pointer;
31784   *input_line_pointer = 0;
31785
31786   /* Skip the first "all" entry.  */
31787   for (opt = arm_cpus + 1; opt->name != NULL; opt++)
31788     if (streq (opt->name, name))
31789       {
31790         selected_arch = opt->value;
31791         selected_ext = opt->ext;
31792         ARM_MERGE_FEATURE_SETS (selected_cpu, selected_arch, selected_ext);
31793         if (opt->canonical_name)
31794           strcpy (selected_cpu_name, opt->canonical_name);
31795         else
31796           {
31797             int i;
31798             for (i = 0; opt->name[i]; i++)
31799               selected_cpu_name[i] = TOUPPER (opt->name[i]);
31800
31801             selected_cpu_name[i] = 0;
31802           }
31803         ARM_MERGE_FEATURE_SETS (cpu_variant, selected_cpu, selected_fpu);
31804
31805         *input_line_pointer = saved_char;
31806         demand_empty_rest_of_line ();
31807         return;
31808       }
31809   as_bad (_("unknown cpu `%s'"), name);
31810   *input_line_pointer = saved_char;
31811   ignore_rest_of_line ();
31812 }
31813
31814 /* Parse a .arch directive.  */
31815
31816 static void
31817 s_arm_arch (int ignored ATTRIBUTE_UNUSED)
31818 {
31819   const struct arm_arch_option_table *opt;
31820   char saved_char;
31821   char *name;
31822
31823   name = input_line_pointer;
31824   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
31825     input_line_pointer++;
31826   saved_char = *input_line_pointer;
31827   *input_line_pointer = 0;
31828
31829   /* Skip the first "all" entry.  */
31830   for (opt = arm_archs + 1; opt->name != NULL; opt++)
31831     if (streq (opt->name, name))
31832       {
31833         selected_arch = opt->value;
31834         selected_ext = arm_arch_none;
31835         selected_cpu = selected_arch;
31836         strcpy (selected_cpu_name, opt->name);
31837         ARM_MERGE_FEATURE_SETS (cpu_variant, selected_cpu, selected_fpu);
31838         *input_line_pointer = saved_char;
31839         demand_empty_rest_of_line ();
31840         return;
31841       }
31842
31843   as_bad (_("unknown architecture `%s'\n"), name);
31844   *input_line_pointer = saved_char;
31845   ignore_rest_of_line ();
31846 }
31847
31848 /* Parse a .object_arch directive.  */
31849
31850 static void
31851 s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
31852 {
31853   const struct arm_arch_option_table *opt;
31854   char saved_char;
31855   char *name;
31856
31857   name = input_line_pointer;
31858   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
31859     input_line_pointer++;
31860   saved_char = *input_line_pointer;
31861   *input_line_pointer = 0;
31862
31863   /* Skip the first "all" entry.  */
31864   for (opt = arm_archs + 1; opt->name != NULL; opt++)
31865     if (streq (opt->name, name))
31866       {
31867         selected_object_arch = opt->value;
31868         *input_line_pointer = saved_char;
31869         demand_empty_rest_of_line ();
31870         return;
31871       }
31872
31873   as_bad (_("unknown architecture `%s'\n"), name);
31874   *input_line_pointer = saved_char;
31875   ignore_rest_of_line ();
31876 }
31877
31878 /* Parse a .arch_extension directive.  */
31879
31880 static void
31881 s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
31882 {
31883   const struct arm_option_extension_value_table *opt;
31884   char saved_char;
31885   char *name;
31886   int adding_value = 1;
31887
31888   name = input_line_pointer;
31889   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
31890     input_line_pointer++;
31891   saved_char = *input_line_pointer;
31892   *input_line_pointer = 0;
31893
31894   if (strlen (name) >= 2
31895       && strncmp (name, "no", 2) == 0)
31896     {
31897       adding_value = 0;
31898       name += 2;
31899     }
31900
31901   for (opt = arm_extensions; opt->name != NULL; opt++)
31902     if (streq (opt->name, name))
31903       {
31904         int i, nb_allowed_archs =
31905           sizeof (opt->allowed_archs) / sizeof (opt->allowed_archs[i]);
31906         for (i = 0; i < nb_allowed_archs; i++)
31907           {
31908             /* Empty entry.  */
31909             if (ARM_CPU_IS_ANY (opt->allowed_archs[i]))
31910               continue;
31911             if (ARM_FSET_CPU_SUBSET (opt->allowed_archs[i], selected_arch))
31912               break;
31913           }
31914
31915         if (i == nb_allowed_archs)
31916           {
31917             as_bad (_("architectural extension `%s' is not allowed for the "
31918                       "current base architecture"), name);
31919             break;
31920           }
31921
31922         if (adding_value)
31923           ARM_MERGE_FEATURE_SETS (selected_ext, selected_ext,
31924                                   opt->merge_value);
31925         else
31926           ARM_CLEAR_FEATURE (selected_ext, selected_ext, opt->clear_value);
31927
31928         ARM_MERGE_FEATURE_SETS (selected_cpu, selected_arch, selected_ext);
31929         ARM_MERGE_FEATURE_SETS (cpu_variant, selected_cpu, selected_fpu);
31930         *input_line_pointer = saved_char;
31931         demand_empty_rest_of_line ();
31932         /* Allowing Thumb division instructions for ARMv7 in autodetection rely
31933            on this return so that duplicate extensions (extensions with the
31934            same name as a previous extension in the list) are not considered
31935            for command-line parsing.  */
31936         return;
31937       }
31938
31939   if (opt->name == NULL)
31940     as_bad (_("unknown architecture extension `%s'\n"), name);
31941
31942   *input_line_pointer = saved_char;
31943   ignore_rest_of_line ();
31944 }
31945
31946 /* Parse a .fpu directive.  */
31947
31948 static void
31949 s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
31950 {
31951   const struct arm_option_fpu_value_table *opt;
31952   char saved_char;
31953   char *name;
31954
31955   name = input_line_pointer;
31956   while (*input_line_pointer && !ISSPACE (*input_line_pointer))
31957     input_line_pointer++;
31958   saved_char = *input_line_pointer;
31959   *input_line_pointer = 0;
31960
31961   for (opt = arm_fpus; opt->name != NULL; opt++)
31962     if (streq (opt->name, name))
31963       {
31964         selected_fpu = opt->value;
31965 #ifndef CPU_DEFAULT
31966         if (no_cpu_selected ())
31967           ARM_MERGE_FEATURE_SETS (cpu_variant, arm_arch_any, selected_fpu);
31968         else
31969 #endif
31970           ARM_MERGE_FEATURE_SETS (cpu_variant, selected_cpu, selected_fpu);
31971         *input_line_pointer = saved_char;
31972         demand_empty_rest_of_line ();
31973         return;
31974       }
31975
31976   as_bad (_("unknown floating point format `%s'\n"), name);
31977   *input_line_pointer = saved_char;
31978   ignore_rest_of_line ();
31979 }
31980
31981 /* Copy symbol information.  */
31982
31983 void
31984 arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
31985 {
31986   ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
31987 }
31988
31989 #ifdef OBJ_ELF
31990 /* Given a symbolic attribute NAME, return the proper integer value.
31991    Returns -1 if the attribute is not known.  */
31992
31993 int
31994 arm_convert_symbolic_attribute (const char *name)
31995 {
31996   static const struct
31997   {
31998     const char * name;
31999     const int    tag;
32000   }
32001   attribute_table[] =
32002     {
32003       /* When you modify this table you should
32004          also modify the list in doc/c-arm.texi.  */
32005 #define T(tag) {#tag, tag}
32006       T (Tag_CPU_raw_name),
32007       T (Tag_CPU_name),
32008       T (Tag_CPU_arch),
32009       T (Tag_CPU_arch_profile),
32010       T (Tag_ARM_ISA_use),
32011       T (Tag_THUMB_ISA_use),
32012       T (Tag_FP_arch),
32013       T (Tag_VFP_arch),
32014       T (Tag_WMMX_arch),
32015       T (Tag_Advanced_SIMD_arch),
32016       T (Tag_PCS_config),
32017       T (Tag_ABI_PCS_R9_use),
32018       T (Tag_ABI_PCS_RW_data),
32019       T (Tag_ABI_PCS_RO_data),
32020       T (Tag_ABI_PCS_GOT_use),
32021       T (Tag_ABI_PCS_wchar_t),
32022       T (Tag_ABI_FP_rounding),
32023       T (Tag_ABI_FP_denormal),
32024       T (Tag_ABI_FP_exceptions),
32025       T (Tag_ABI_FP_user_exceptions),
32026       T (Tag_ABI_FP_number_model),
32027       T (Tag_ABI_align_needed),
32028       T (Tag_ABI_align8_needed),
32029       T (Tag_ABI_align_preserved),
32030       T (Tag_ABI_align8_preserved),
32031       T (Tag_ABI_enum_size),
32032       T (Tag_ABI_HardFP_use),
32033       T (Tag_ABI_VFP_args),
32034       T (Tag_ABI_WMMX_args),
32035       T (Tag_ABI_optimization_goals),
32036       T (Tag_ABI_FP_optimization_goals),
32037       T (Tag_compatibility),
32038       T (Tag_CPU_unaligned_access),
32039       T (Tag_FP_HP_extension),
32040       T (Tag_VFP_HP_extension),
32041       T (Tag_ABI_FP_16bit_format),
32042       T (Tag_MPextension_use),
32043       T (Tag_DIV_use),
32044       T (Tag_nodefaults),
32045       T (Tag_also_compatible_with),
32046       T (Tag_conformance),
32047       T (Tag_T2EE_use),
32048       T (Tag_Virtualization_use),
32049       T (Tag_DSP_extension),
32050       T (Tag_MVE_arch),
32051       /* We deliberately do not include Tag_MPextension_use_legacy.  */
32052 #undef T
32053     };
32054   unsigned int i;
32055
32056   if (name == NULL)
32057     return -1;
32058
32059   for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
32060     if (streq (name, attribute_table[i].name))
32061       return attribute_table[i].tag;
32062
32063   return -1;
32064 }
32065
32066 /* Apply sym value for relocations only in the case that they are for
32067    local symbols in the same segment as the fixup and you have the
32068    respective architectural feature for blx and simple switches.  */
32069
32070 int
32071 arm_apply_sym_value (struct fix * fixP, segT this_seg)
32072 {
32073   if (fixP->fx_addsy
32074       && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
32075       /* PR 17444: If the local symbol is in a different section then a reloc
32076          will always be generated for it, so applying the symbol value now
32077          will result in a double offset being stored in the relocation.  */
32078       && (S_GET_SEGMENT (fixP->fx_addsy) == this_seg)
32079       && !S_FORCE_RELOC (fixP->fx_addsy, TRUE))
32080     {
32081       switch (fixP->fx_r_type)
32082         {
32083         case BFD_RELOC_ARM_PCREL_BLX:
32084         case BFD_RELOC_THUMB_PCREL_BRANCH23:
32085           if (ARM_IS_FUNC (fixP->fx_addsy))
32086             return 1;
32087           break;
32088
32089         case BFD_RELOC_ARM_PCREL_CALL:
32090         case BFD_RELOC_THUMB_PCREL_BLX:
32091           if (THUMB_IS_FUNC (fixP->fx_addsy))
32092             return 1;
32093           break;
32094
32095         default:
32096           break;
32097         }
32098
32099     }
32100   return 0;
32101 }
32102 #endif /* OBJ_ELF */