tc-arm.c revision 1.6
1/* tc-arm.c -- Assemble for the ARM
2   Copyright (C) 1994-2018 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
49static 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.  */
79static int arm_fdpic;
80
81#endif /* OBJ_ELF */
82
83/* Results from operand parsing worker functions.  */
84
85typedef enum
86{
87  PARSE_OPERAND_SUCCESS,
88  PARSE_OPERAND_FAIL,
89  PARSE_OPERAND_FAIL_NO_BACKTRACK
90} parse_operand_result;
91
92enum 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.  */
132static 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.  */
135static arm_feature_set arm_arch_used;
136static arm_feature_set thumb_arch_used;
137
138/* Flags stored in private area of BFD structure.  */
139static int uses_apcs_26	     = FALSE;
140static int atpcs	     = FALSE;
141static int support_interwork = FALSE;
142static int uses_apcs_float   = FALSE;
143static int pic_code	     = FALSE;
144static int fix_v4bx	     = FALSE;
145/* Warn on using deprecated features.  */
146static int warn_on_deprecated = TRUE;
147
148/* Understand CodeComposer Studio assembly syntax.  */
149bfd_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).  */
157static const arm_feature_set *legacy_cpu = NULL;
158static const arm_feature_set *legacy_fpu = NULL;
159
160/* CPU, extension and FPU feature bits selected by -mcpu.  */
161static const arm_feature_set *mcpu_cpu_opt = NULL;
162static arm_feature_set *mcpu_ext_opt = NULL;
163static const arm_feature_set *mcpu_fpu_opt = NULL;
164
165/* CPU, extension and FPU feature bits selected by -march.  */
166static const arm_feature_set *march_cpu_opt = NULL;
167static arm_feature_set *march_ext_opt = NULL;
168static const arm_feature_set *march_fpu_opt = NULL;
169
170/* Feature bits selected by -mfpu.  */
171static const arm_feature_set *mfpu_opt = NULL;
172
173/* Constants for known architecture features.  */
174static const arm_feature_set fpu_default = FPU_DEFAULT;
175static const arm_feature_set fpu_arch_vfp_v1 ATTRIBUTE_UNUSED = FPU_ARCH_VFP_V1;
176static const arm_feature_set fpu_arch_vfp_v2 = FPU_ARCH_VFP_V2;
177static const arm_feature_set fpu_arch_vfp_v3 ATTRIBUTE_UNUSED = FPU_ARCH_VFP_V3;
178static const arm_feature_set fpu_arch_neon_v1 ATTRIBUTE_UNUSED = FPU_ARCH_NEON_V1;
179static const arm_feature_set fpu_arch_fpa = FPU_ARCH_FPA;
180static const arm_feature_set fpu_any_hard = FPU_ANY_HARD;
181#ifdef OBJ_ELF
182static const arm_feature_set fpu_arch_maverick = FPU_ARCH_MAVERICK;
183#endif
184static const arm_feature_set fpu_endian_pure = FPU_ARCH_ENDIAN_PURE;
185
186#ifdef CPU_DEFAULT
187static const arm_feature_set cpu_default = CPU_DEFAULT;
188#endif
189
190static const arm_feature_set arm_ext_v1 = ARM_FEATURE_CORE_LOW (ARM_EXT_V1);
191static const arm_feature_set arm_ext_v2 = ARM_FEATURE_CORE_LOW (ARM_EXT_V2);
192static const arm_feature_set arm_ext_v2s = ARM_FEATURE_CORE_LOW (ARM_EXT_V2S);
193static const arm_feature_set arm_ext_v3 = ARM_FEATURE_CORE_LOW (ARM_EXT_V3);
194static const arm_feature_set arm_ext_v3m = ARM_FEATURE_CORE_LOW (ARM_EXT_V3M);
195static const arm_feature_set arm_ext_v4 = ARM_FEATURE_CORE_LOW (ARM_EXT_V4);
196static const arm_feature_set arm_ext_v4t = ARM_FEATURE_CORE_LOW (ARM_EXT_V4T);
197static const arm_feature_set arm_ext_v5 = ARM_FEATURE_CORE_LOW (ARM_EXT_V5);
198static const arm_feature_set arm_ext_v4t_5 =
199  ARM_FEATURE_CORE_LOW (ARM_EXT_V4T | ARM_EXT_V5);
200static const arm_feature_set arm_ext_v5t = ARM_FEATURE_CORE_LOW (ARM_EXT_V5T);
201static const arm_feature_set arm_ext_v5e = ARM_FEATURE_CORE_LOW (ARM_EXT_V5E);
202static const arm_feature_set arm_ext_v5exp = ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP);
203static const arm_feature_set arm_ext_v5j = ARM_FEATURE_CORE_LOW (ARM_EXT_V5J);
204static const arm_feature_set arm_ext_v6 = ARM_FEATURE_CORE_LOW (ARM_EXT_V6);
205static const arm_feature_set arm_ext_v6k = ARM_FEATURE_CORE_LOW (ARM_EXT_V6K);
206static const arm_feature_set arm_ext_v6t2 = ARM_FEATURE_CORE_LOW (ARM_EXT_V6T2);
207static const arm_feature_set arm_ext_v6_notm =
208  ARM_FEATURE_CORE_LOW (ARM_EXT_V6_NOTM);
209static const arm_feature_set arm_ext_v6_dsp =
210  ARM_FEATURE_CORE_LOW (ARM_EXT_V6_DSP);
211static const arm_feature_set arm_ext_barrier =
212  ARM_FEATURE_CORE_LOW (ARM_EXT_BARRIER);
213static const arm_feature_set arm_ext_msr =
214  ARM_FEATURE_CORE_LOW (ARM_EXT_THUMB_MSR);
215static const arm_feature_set arm_ext_div = ARM_FEATURE_CORE_LOW (ARM_EXT_DIV);
216static const arm_feature_set arm_ext_v7 = ARM_FEATURE_CORE_LOW (ARM_EXT_V7);
217static const arm_feature_set arm_ext_v7a = ARM_FEATURE_CORE_LOW (ARM_EXT_V7A);
218static const arm_feature_set arm_ext_v7r = ARM_FEATURE_CORE_LOW (ARM_EXT_V7R);
219#ifdef OBJ_ELF
220static const arm_feature_set ATTRIBUTE_UNUSED arm_ext_v7m = ARM_FEATURE_CORE_LOW (ARM_EXT_V7M);
221#endif
222static const arm_feature_set arm_ext_v8 = ARM_FEATURE_CORE_LOW (ARM_EXT_V8);
223static const arm_feature_set arm_ext_m =
224  ARM_FEATURE_CORE (ARM_EXT_V6M | ARM_EXT_V7M,
225		    ARM_EXT2_V8M | ARM_EXT2_V8M_MAIN);
226static const arm_feature_set arm_ext_mp = ARM_FEATURE_CORE_LOW (ARM_EXT_MP);
227static const arm_feature_set arm_ext_sec = ARM_FEATURE_CORE_LOW (ARM_EXT_SEC);
228static const arm_feature_set arm_ext_os = ARM_FEATURE_CORE_LOW (ARM_EXT_OS);
229static const arm_feature_set arm_ext_adiv = ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV);
230static const arm_feature_set arm_ext_virt = ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT);
231static const arm_feature_set arm_ext_pan = ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN);
232static const arm_feature_set arm_ext_v8m = ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M);
233static const arm_feature_set arm_ext_v8m_main =
234  ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M_MAIN);
235/* Instructions in ARMv8-M only found in M profile architectures.  */
236static const arm_feature_set arm_ext_v8m_m_only =
237  ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8M | ARM_EXT2_V8M_MAIN);
238static const arm_feature_set arm_ext_v6t2_v8m =
239  ARM_FEATURE_CORE_HIGH (ARM_EXT2_V6T2_V8M);
240/* Instructions shared between ARMv8-A and ARMv8-M.  */
241static const arm_feature_set arm_ext_atomics =
242  ARM_FEATURE_CORE_HIGH (ARM_EXT2_ATOMICS);
243#ifdef OBJ_ELF
244/* DSP instructions Tag_DSP_extension refers to.  */
245static const arm_feature_set arm_ext_dsp =
246  ARM_FEATURE_CORE_LOW (ARM_EXT_V5E | ARM_EXT_V5ExP | ARM_EXT_V6_DSP);
247#endif
248static const arm_feature_set arm_ext_ras =
249  ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS);
250/* FP16 instructions.  */
251static const arm_feature_set arm_ext_fp16 =
252  ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST);
253static const arm_feature_set arm_ext_fp16_fml =
254  ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_FML);
255static const arm_feature_set arm_ext_v8_2 =
256  ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_2A);
257static const arm_feature_set arm_ext_v8_3 =
258  ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8_3A);
259
260static const arm_feature_set arm_arch_any = ARM_ANY;
261#ifdef OBJ_ELF
262static const arm_feature_set fpu_any = FPU_ANY;
263#endif
264static const arm_feature_set arm_arch_full ATTRIBUTE_UNUSED = ARM_FEATURE (-1, -1, -1);
265static const arm_feature_set arm_arch_t2 = ARM_ARCH_THUMB2;
266static const arm_feature_set arm_arch_none = ARM_ARCH_NONE;
267
268static const arm_feature_set arm_cext_iwmmxt2 =
269  ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT2);
270static const arm_feature_set arm_cext_iwmmxt =
271  ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT);
272static const arm_feature_set arm_cext_xscale =
273  ARM_FEATURE_COPROC (ARM_CEXT_XSCALE);
274static const arm_feature_set arm_cext_maverick =
275  ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK);
276static const arm_feature_set fpu_fpa_ext_v1 =
277  ARM_FEATURE_COPROC (FPU_FPA_EXT_V1);
278static const arm_feature_set fpu_fpa_ext_v2 =
279  ARM_FEATURE_COPROC (FPU_FPA_EXT_V2);
280static const arm_feature_set fpu_vfp_ext_v1xd =
281  ARM_FEATURE_COPROC (FPU_VFP_EXT_V1xD);
282static const arm_feature_set fpu_vfp_ext_v1 =
283  ARM_FEATURE_COPROC (FPU_VFP_EXT_V1);
284static const arm_feature_set fpu_vfp_ext_v2 =
285  ARM_FEATURE_COPROC (FPU_VFP_EXT_V2);
286static const arm_feature_set fpu_vfp_ext_v3xd =
287  ARM_FEATURE_COPROC (FPU_VFP_EXT_V3xD);
288static const arm_feature_set fpu_vfp_ext_v3 =
289  ARM_FEATURE_COPROC (FPU_VFP_EXT_V3);
290static const arm_feature_set fpu_vfp_ext_d32 =
291  ARM_FEATURE_COPROC (FPU_VFP_EXT_D32);
292static const arm_feature_set fpu_neon_ext_v1 =
293  ARM_FEATURE_COPROC (FPU_NEON_EXT_V1);
294static const arm_feature_set fpu_vfp_v3_or_neon_ext =
295  ARM_FEATURE_COPROC (FPU_NEON_EXT_V1 | FPU_VFP_EXT_V3);
296#ifdef OBJ_ELF
297static const arm_feature_set fpu_vfp_fp16 =
298  ARM_FEATURE_COPROC (FPU_VFP_EXT_FP16);
299static const arm_feature_set fpu_neon_ext_fma =
300  ARM_FEATURE_COPROC (FPU_NEON_EXT_FMA);
301#endif
302static const arm_feature_set fpu_vfp_ext_fma =
303  ARM_FEATURE_COPROC (FPU_VFP_EXT_FMA);
304static const arm_feature_set fpu_vfp_ext_armv8 =
305  ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8);
306static const arm_feature_set fpu_vfp_ext_armv8xd =
307  ARM_FEATURE_COPROC (FPU_VFP_EXT_ARMV8xD);
308static const arm_feature_set fpu_neon_ext_armv8 =
309  ARM_FEATURE_COPROC (FPU_NEON_EXT_ARMV8);
310static const arm_feature_set fpu_crypto_ext_armv8 =
311  ARM_FEATURE_COPROC (FPU_CRYPTO_EXT_ARMV8);
312static const arm_feature_set crc_ext_armv8 =
313  ARM_FEATURE_COPROC (CRC_EXT_ARMV8);
314static const arm_feature_set fpu_neon_ext_v8_1 =
315  ARM_FEATURE_COPROC (FPU_NEON_EXT_RDMA);
316static const arm_feature_set fpu_neon_ext_dotprod =
317  ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD);
318
319static int mfloat_abi_opt = -1;
320/* Architecture feature bits selected by the last -mcpu/-march or .cpu/.arch
321   directive.  */
322static arm_feature_set selected_arch = ARM_ARCH_NONE;
323/* Extension feature bits selected by the last -mcpu/-march or .arch_extension
324   directive.  */
325static arm_feature_set selected_ext = ARM_ARCH_NONE;
326/* Feature bits selected by the last -mcpu/-march or by the combination of the
327   last .cpu/.arch directive .arch_extension directives since that
328   directive.  */
329static arm_feature_set selected_cpu = ARM_ARCH_NONE;
330/* FPU feature bits selected by the last -mfpu or .fpu directive.  */
331static arm_feature_set selected_fpu = FPU_NONE;
332/* Feature bits selected by the last .object_arch directive.  */
333static arm_feature_set selected_object_arch = ARM_ARCH_NONE;
334/* Must be long enough to hold any of the names in arm_cpus.  */
335static char selected_cpu_name[20];
336
337extern FLONUM_TYPE generic_floating_point_number;
338
339/* Return if no cpu was selected on command-line.  */
340static bfd_boolean
341no_cpu_selected (void)
342{
343  return ARM_FEATURE_EQUAL (selected_cpu, arm_arch_none);
344}
345
346#ifdef OBJ_ELF
347# ifdef EABI_DEFAULT
348static int meabi_flags = EABI_DEFAULT;
349# else
350static int meabi_flags = EF_ARM_EABI_UNKNOWN;
351# endif
352
353static int attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
354
355bfd_boolean
356arm_is_eabi (void)
357{
358  return (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4);
359}
360#endif
361
362#ifdef OBJ_ELF
363/* Pre-defined "_GLOBAL_OFFSET_TABLE_"	*/
364symbolS * GOT_symbol;
365#endif
366
367/* 0: assemble for ARM,
368   1: assemble for Thumb,
369   2: assemble for Thumb even though target CPU does not support thumb
370      instructions.  */
371static int thumb_mode = 0;
372/* A value distinct from the possible values for thumb_mode that we
373   can use to record whether thumb_mode has been copied into the
374   tc_frag_data field of a frag.  */
375#define MODE_RECORDED (1 << 4)
376
377/* Specifies the intrinsic IT insn behavior mode.  */
378enum implicit_it_mode
379{
380  IMPLICIT_IT_MODE_NEVER  = 0x00,
381  IMPLICIT_IT_MODE_ARM    = 0x01,
382  IMPLICIT_IT_MODE_THUMB  = 0x02,
383  IMPLICIT_IT_MODE_ALWAYS = (IMPLICIT_IT_MODE_ARM | IMPLICIT_IT_MODE_THUMB)
384};
385static int implicit_it_mode = IMPLICIT_IT_MODE_ARM;
386
387/* If unified_syntax is true, we are processing the new unified
388   ARM/Thumb syntax.  Important differences from the old ARM mode:
389
390     - Immediate operands do not require a # prefix.
391     - Conditional affixes always appear at the end of the
392       instruction.  (For backward compatibility, those instructions
393       that formerly had them in the middle, continue to accept them
394       there.)
395     - The IT instruction may appear, and if it does is validated
396       against subsequent conditional affixes.  It does not generate
397       machine code.
398
399   Important differences from the old Thumb mode:
400
401     - Immediate operands do not require a # prefix.
402     - Most of the V6T2 instructions are only available in unified mode.
403     - The .N and .W suffixes are recognized and honored (it is an error
404       if they cannot be honored).
405     - All instructions set the flags if and only if they have an 's' affix.
406     - Conditional affixes may be used.  They are validated against
407       preceding IT instructions.  Unlike ARM mode, you cannot use a
408       conditional affix except in the scope of an IT instruction.  */
409
410static bfd_boolean unified_syntax = FALSE;
411
412/* An immediate operand can start with #, and ld*, st*, pld operands
413   can contain [ and ].  We need to tell APP not to elide whitespace
414   before a [, which can appear as the first operand for pld.
415   Likewise, a { can appear as the first operand for push, pop, vld*, etc.  */
416const char arm_symbol_chars[] = "#[]{}";
417
418enum neon_el_type
419{
420  NT_invtype,
421  NT_untyped,
422  NT_integer,
423  NT_float,
424  NT_poly,
425  NT_signed,
426  NT_unsigned
427};
428
429struct neon_type_el
430{
431  enum neon_el_type type;
432  unsigned size;
433};
434
435#define NEON_MAX_TYPE_ELS 4
436
437struct neon_type
438{
439  struct neon_type_el el[NEON_MAX_TYPE_ELS];
440  unsigned elems;
441};
442
443enum it_instruction_type
444{
445   OUTSIDE_IT_INSN,
446   INSIDE_IT_INSN,
447   INSIDE_IT_LAST_INSN,
448   IF_INSIDE_IT_LAST_INSN, /* Either outside or inside;
449			      if inside, should be the last one.  */
450   NEUTRAL_IT_INSN,        /* This could be either inside or outside,
451			      i.e. BKPT and NOP.  */
452   IT_INSN                 /* The IT insn has been parsed.  */
453};
454
455/* The maximum number of operands we need.  */
456#define ARM_IT_MAX_OPERANDS 6
457
458struct arm_it
459{
460  const char *	error;
461  unsigned long instruction;
462  int		size;
463  int		size_req;
464  int		cond;
465  /* "uncond_value" is set to the value in place of the conditional field in
466     unconditional versions of the instruction, or -1 if nothing is
467     appropriate.  */
468  int		uncond_value;
469  struct neon_type vectype;
470  /* This does not indicate an actual NEON instruction, only that
471     the mnemonic accepts neon-style type suffixes.  */
472  int		is_neon;
473  /* Set to the opcode if the instruction needs relaxation.
474     Zero if the instruction is not relaxed.  */
475  unsigned long	relax;
476  struct
477  {
478    bfd_reloc_code_real_type type;
479    expressionS		     exp;
480    int			     pc_rel;
481  } reloc;
482
483  enum it_instruction_type it_insn_type;
484
485  struct
486  {
487    unsigned reg;
488    signed int imm;
489    struct neon_type_el vectype;
490    unsigned present	: 1;  /* Operand present.  */
491    unsigned isreg	: 1;  /* Operand was a register.  */
492    unsigned immisreg	: 1;  /* .imm field is a second register.  */
493    unsigned isscalar   : 1;  /* Operand is a (Neon) scalar.  */
494    unsigned immisalign : 1;  /* Immediate is an alignment specifier.  */
495    unsigned immisfloat : 1;  /* Immediate was parsed as a float.  */
496    /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
497       instructions. This allows us to disambiguate ARM <-> vector insns.  */
498    unsigned regisimm   : 1;  /* 64-bit immediate, reg forms high 32 bits.  */
499    unsigned isvec      : 1;  /* Is a single, double or quad VFP/Neon reg.  */
500    unsigned isquad     : 1;  /* Operand is Neon quad-precision register.  */
501    unsigned issingle   : 1;  /* Operand is VFP single-precision register.  */
502    unsigned hasreloc	: 1;  /* Operand has relocation suffix.  */
503    unsigned writeback	: 1;  /* Operand has trailing !  */
504    unsigned preind	: 1;  /* Preindexed address.  */
505    unsigned postind	: 1;  /* Postindexed address.  */
506    unsigned negative	: 1;  /* Index register was negated.  */
507    unsigned shifted	: 1;  /* Shift applied to operation.  */
508    unsigned shift_kind : 3;  /* Shift operation (enum shift_kind).  */
509  } operands[ARM_IT_MAX_OPERANDS];
510};
511
512static struct arm_it inst;
513
514#define NUM_FLOAT_VALS 8
515
516const char * fp_const[] =
517{
518  "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
519};
520
521/* Number of littlenums required to hold an extended precision number.	*/
522#define MAX_LITTLENUMS 6
523
524LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
525
526#define FAIL	(-1)
527#define SUCCESS (0)
528
529#define SUFF_S 1
530#define SUFF_D 2
531#define SUFF_E 3
532#define SUFF_P 4
533
534#define CP_T_X	 0x00008000
535#define CP_T_Y	 0x00400000
536
537#define CONDS_BIT	 0x00100000
538#define LOAD_BIT	 0x00100000
539
540#define DOUBLE_LOAD_FLAG 0x00000001
541
542struct asm_cond
543{
544  const char *	 template_name;
545  unsigned long  value;
546};
547
548#define COND_ALWAYS 0xE
549
550struct asm_psr
551{
552  const char *   template_name;
553  unsigned long  field;
554};
555
556struct asm_barrier_opt
557{
558  const char *    template_name;
559  unsigned long   value;
560  const arm_feature_set arch;
561};
562
563/* The bit that distinguishes CPSR and SPSR.  */
564#define SPSR_BIT   (1 << 22)
565
566/* The individual PSR flag bits.  */
567#define PSR_c	(1 << 16)
568#define PSR_x	(1 << 17)
569#define PSR_s	(1 << 18)
570#define PSR_f	(1 << 19)
571
572struct reloc_entry
573{
574  const char *              name;
575  bfd_reloc_code_real_type  reloc;
576};
577
578enum vfp_reg_pos
579{
580  VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
581  VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
582};
583
584enum vfp_ldstm_type
585{
586  VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
587};
588
589/* Bits for DEFINED field in neon_typed_alias.  */
590#define NTA_HASTYPE  1
591#define NTA_HASINDEX 2
592
593struct neon_typed_alias
594{
595  unsigned char        defined;
596  unsigned char        index;
597  struct neon_type_el  eltype;
598};
599
600/* ARM register categories.  This includes coprocessor numbers and various
601   architecture extensions' registers.  Each entry should have an error message
602   in reg_expected_msgs below.  */
603enum arm_reg_type
604{
605  REG_TYPE_RN,
606  REG_TYPE_CP,
607  REG_TYPE_CN,
608  REG_TYPE_FN,
609  REG_TYPE_VFS,
610  REG_TYPE_VFD,
611  REG_TYPE_NQ,
612  REG_TYPE_VFSD,
613  REG_TYPE_NDQ,
614  REG_TYPE_NSD,
615  REG_TYPE_NSDQ,
616  REG_TYPE_VFC,
617  REG_TYPE_MVF,
618  REG_TYPE_MVD,
619  REG_TYPE_MVFX,
620  REG_TYPE_MVDX,
621  REG_TYPE_MVAX,
622  REG_TYPE_DSPSC,
623  REG_TYPE_MMXWR,
624  REG_TYPE_MMXWC,
625  REG_TYPE_MMXWCG,
626  REG_TYPE_XSCALE,
627  REG_TYPE_RNB
628};
629
630/* Structure for a hash table entry for a register.
631   If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
632   information which states whether a vector type or index is specified (for a
633   register alias created with .dn or .qn). Otherwise NEON should be NULL.  */
634struct reg_entry
635{
636  const char *               name;
637  unsigned int               number;
638  unsigned char              type;
639  unsigned char              builtin;
640  struct neon_typed_alias *  neon;
641};
642
643/* Diagnostics used when we don't get a register of the expected type.	*/
644const char * const reg_expected_msgs[] =
645{
646  [REG_TYPE_RN]	    = N_("ARM register expected"),
647  [REG_TYPE_CP]	    = N_("bad or missing co-processor number"),
648  [REG_TYPE_CN]	    = N_("co-processor register expected"),
649  [REG_TYPE_FN]	    = N_("FPA register expected"),
650  [REG_TYPE_VFS]    = N_("VFP single precision register expected"),
651  [REG_TYPE_VFD]    = N_("VFP/Neon double precision register expected"),
652  [REG_TYPE_NQ]	    = N_("Neon quad precision register expected"),
653  [REG_TYPE_VFSD]   = N_("VFP single or double precision register expected"),
654  [REG_TYPE_NDQ]    = N_("Neon double or quad precision register expected"),
655  [REG_TYPE_NSD]    = N_("Neon single or double precision register expected"),
656  [REG_TYPE_NSDQ]   = N_("VFP single, double or Neon quad precision register"
657			 " expected"),
658  [REG_TYPE_VFC]    = N_("VFP system register expected"),
659  [REG_TYPE_MVF]    = N_("Maverick MVF register expected"),
660  [REG_TYPE_MVD]    = N_("Maverick MVD register expected"),
661  [REG_TYPE_MVFX]   = N_("Maverick MVFX register expected"),
662  [REG_TYPE_MVDX]   = N_("Maverick MVDX register expected"),
663  [REG_TYPE_MVAX]   = N_("Maverick MVAX register expected"),
664  [REG_TYPE_DSPSC]  = N_("Maverick DSPSC register expected"),
665  [REG_TYPE_MMXWR]  = N_("iWMMXt data register expected"),
666  [REG_TYPE_MMXWC]  = N_("iWMMXt control register expected"),
667  [REG_TYPE_MMXWCG] = N_("iWMMXt scalar register expected"),
668  [REG_TYPE_XSCALE] = N_("XScale accumulator register expected"),
669  [REG_TYPE_RNB]    = N_("")
670};
671
672/* Some well known registers that we refer to directly elsewhere.  */
673#define REG_R12	12
674#define REG_SP	13
675#define REG_LR	14
676#define REG_PC	15
677
678/* ARM instructions take 4bytes in the object file, Thumb instructions
679   take 2:  */
680#define INSN_SIZE	4
681
682struct asm_opcode
683{
684  /* Basic string to match.  */
685  const char * template_name;
686
687  /* Parameters to instruction.	 */
688  unsigned int operands[8];
689
690  /* Conditional tag - see opcode_lookup.  */
691  unsigned int tag : 4;
692
693  /* Basic instruction code.  */
694  unsigned int avalue : 28;
695
696  /* Thumb-format instruction code.  */
697  unsigned int tvalue;
698
699  /* Which architecture variant provides this instruction.  */
700  const arm_feature_set * avariant;
701  const arm_feature_set * tvariant;
702
703  /* Function to call to encode instruction in ARM format.  */
704  void (* aencode) (void);
705
706  /* Function to call to encode instruction in Thumb format.  */
707  void (* tencode) (void);
708};
709
710/* Defines for various bits that we will want to toggle.  */
711#define INST_IMMEDIATE	0x02000000
712#define OFFSET_REG	0x02000000
713#define HWOFFSET_IMM	0x00400000
714#define SHIFT_BY_REG	0x00000010
715#define PRE_INDEX	0x01000000
716#define INDEX_UP	0x00800000
717#define WRITE_BACK	0x00200000
718#define LDM_TYPE_2_OR_3	0x00400000
719#define CPSI_MMOD	0x00020000
720
721#define LITERAL_MASK	0xf000f000
722#define OPCODE_MASK	0xfe1fffff
723#define V4_STR_BIT	0x00000020
724#define VLDR_VMOV_SAME	0x0040f000
725
726#define T2_SUBS_PC_LR	0xf3de8f00
727
728#define DATA_OP_SHIFT	21
729#define SBIT_SHIFT	20
730
731#define T2_OPCODE_MASK	0xfe1fffff
732#define T2_DATA_OP_SHIFT 21
733#define T2_SBIT_SHIFT	 20
734
735#define A_COND_MASK         0xf0000000
736#define A_PUSH_POP_OP_MASK  0x0fff0000
737
738/* Opcodes for pushing/poping registers to/from the stack.  */
739#define A1_OPCODE_PUSH    0x092d0000
740#define A2_OPCODE_PUSH    0x052d0004
741#define A2_OPCODE_POP     0x049d0004
742
743/* Codes to distinguish the arithmetic instructions.  */
744#define OPCODE_AND	0
745#define OPCODE_EOR	1
746#define OPCODE_SUB	2
747#define OPCODE_RSB	3
748#define OPCODE_ADD	4
749#define OPCODE_ADC	5
750#define OPCODE_SBC	6
751#define OPCODE_RSC	7
752#define OPCODE_TST	8
753#define OPCODE_TEQ	9
754#define OPCODE_CMP	10
755#define OPCODE_CMN	11
756#define OPCODE_ORR	12
757#define OPCODE_MOV	13
758#define OPCODE_BIC	14
759#define OPCODE_MVN	15
760
761#define T2_OPCODE_AND	0
762#define T2_OPCODE_BIC	1
763#define T2_OPCODE_ORR	2
764#define T2_OPCODE_ORN	3
765#define T2_OPCODE_EOR	4
766#define T2_OPCODE_ADD	8
767#define T2_OPCODE_ADC	10
768#define T2_OPCODE_SBC	11
769#define T2_OPCODE_SUB	13
770#define T2_OPCODE_RSB	14
771
772#define T_OPCODE_MUL 0x4340
773#define T_OPCODE_TST 0x4200
774#define T_OPCODE_CMN 0x42c0
775#define T_OPCODE_NEG 0x4240
776#define T_OPCODE_MVN 0x43c0
777
778#define T_OPCODE_ADD_R3	0x1800
779#define T_OPCODE_SUB_R3 0x1a00
780#define T_OPCODE_ADD_HI 0x4400
781#define T_OPCODE_ADD_ST 0xb000
782#define T_OPCODE_SUB_ST 0xb080
783#define T_OPCODE_ADD_SP 0xa800
784#define T_OPCODE_ADD_PC 0xa000
785#define T_OPCODE_ADD_I8 0x3000
786#define T_OPCODE_SUB_I8 0x3800
787#define T_OPCODE_ADD_I3 0x1c00
788#define T_OPCODE_SUB_I3 0x1e00
789
790#define T_OPCODE_ASR_R	0x4100
791#define T_OPCODE_LSL_R	0x4080
792#define T_OPCODE_LSR_R	0x40c0
793#define T_OPCODE_ROR_R	0x41c0
794#define T_OPCODE_ASR_I	0x1000
795#define T_OPCODE_LSL_I	0x0000
796#define T_OPCODE_LSR_I	0x0800
797
798#define T_OPCODE_MOV_I8	0x2000
799#define T_OPCODE_CMP_I8 0x2800
800#define T_OPCODE_CMP_LR 0x4280
801#define T_OPCODE_MOV_HR 0x4600
802#define T_OPCODE_CMP_HR 0x4500
803
804#define T_OPCODE_LDR_PC 0x4800
805#define T_OPCODE_LDR_SP 0x9800
806#define T_OPCODE_STR_SP 0x9000
807#define T_OPCODE_LDR_IW 0x6800
808#define T_OPCODE_STR_IW 0x6000
809#define T_OPCODE_LDR_IH 0x8800
810#define T_OPCODE_STR_IH 0x8000
811#define T_OPCODE_LDR_IB 0x7800
812#define T_OPCODE_STR_IB 0x7000
813#define T_OPCODE_LDR_RW 0x5800
814#define T_OPCODE_STR_RW 0x5000
815#define T_OPCODE_LDR_RH 0x5a00
816#define T_OPCODE_STR_RH 0x5200
817#define T_OPCODE_LDR_RB 0x5c00
818#define T_OPCODE_STR_RB 0x5400
819
820#define T_OPCODE_PUSH	0xb400
821#define T_OPCODE_POP	0xbc00
822
823#define T_OPCODE_BRANCH 0xe000
824
825#define THUMB_SIZE	2	/* Size of thumb instruction.  */
826#define THUMB_PP_PC_LR 0x0100
827#define THUMB_LOAD_BIT 0x0800
828#define THUMB2_LOAD_BIT 0x00100000
829
830#define BAD_ARGS	_("bad arguments to instruction")
831#define BAD_SP          _("r13 not allowed here")
832#define BAD_PC		_("r15 not allowed here")
833#define BAD_COND	_("instruction cannot be conditional")
834#define BAD_OVERLAP	_("registers may not be the same")
835#define BAD_HIREG	_("lo register required")
836#define BAD_THUMB32	_("instruction not supported in Thumb16 mode")
837#define BAD_ADDR_MODE   _("instruction does not accept this addressing mode");
838#define BAD_BRANCH	_("branch must be last instruction in IT block")
839#define BAD_NOT_IT	_("instruction not allowed in IT block")
840#define BAD_FPU		_("selected FPU does not support instruction")
841#define BAD_OUT_IT 	_("thumb conditional instruction should be in IT block")
842#define BAD_IT_COND	_("incorrect condition in IT block")
843#define BAD_IT_IT 	_("IT falling in the range of a previous IT block")
844#define MISSING_FNSTART	_("missing .fnstart before unwinding directive")
845#define BAD_PC_ADDRESSING \
846	_("cannot use register index with PC-relative addressing")
847#define BAD_PC_WRITEBACK \
848	_("cannot use writeback with PC-relative addressing")
849#define BAD_RANGE	_("branch out of range")
850#define BAD_FP16	_("selected processor does not support fp16 instruction")
851#define UNPRED_REG(R)	_("using " R " results in unpredictable behaviour")
852#define THUMB1_RELOC_ONLY  _("relocation valid in thumb1 code only")
853
854static struct hash_control * arm_ops_hsh;
855static struct hash_control * arm_cond_hsh;
856static struct hash_control * arm_shift_hsh;
857static struct hash_control * arm_psr_hsh;
858static struct hash_control * arm_v7m_psr_hsh;
859static struct hash_control * arm_reg_hsh;
860static struct hash_control * arm_reloc_hsh;
861static struct hash_control * arm_barrier_opt_hsh;
862
863/* Stuff needed to resolve the label ambiguity
864   As:
865     ...
866     label:   <insn>
867   may differ from:
868     ...
869     label:
870	      <insn>  */
871
872symbolS *  last_label_seen;
873static int label_is_thumb_function_name = FALSE;
874
875/* Literal pool structure.  Held on a per-section
876   and per-sub-section basis.  */
877
878#define MAX_LITERAL_POOL_SIZE 1024
879typedef struct literal_pool
880{
881  expressionS	         literals [MAX_LITERAL_POOL_SIZE];
882  unsigned int	         next_free_entry;
883  unsigned int	         id;
884  symbolS *	         symbol;
885  segT		         section;
886  subsegT	         sub_section;
887#ifdef OBJ_ELF
888  struct dwarf2_line_info locs [MAX_LITERAL_POOL_SIZE];
889#endif
890  struct literal_pool *  next;
891  unsigned int		 alignment;
892} literal_pool;
893
894/* Pointer to a linked list of literal pools.  */
895literal_pool * list_of_pools = NULL;
896
897typedef enum asmfunc_states
898{
899  OUTSIDE_ASMFUNC,
900  WAITING_ASMFUNC_NAME,
901  WAITING_ENDASMFUNC
902} asmfunc_states;
903
904static asmfunc_states asmfunc_state = OUTSIDE_ASMFUNC;
905
906#ifdef OBJ_ELF
907#  define now_it seg_info (now_seg)->tc_segment_info_data.current_it
908#else
909static struct current_it now_it;
910#endif
911
912static inline int
913now_it_compatible (int cond)
914{
915  return (cond & ~1) == (now_it.cc & ~1);
916}
917
918static inline int
919conditional_insn (void)
920{
921  return inst.cond != COND_ALWAYS;
922}
923
924static int in_it_block (void);
925
926static int handle_it_state (void);
927
928static void force_automatic_it_block_close (void);
929
930static void it_fsm_post_encode (void);
931
932#define set_it_insn_type(type)			\
933  do						\
934    {						\
935      inst.it_insn_type = type;			\
936      if (handle_it_state () == FAIL)		\
937	return;					\
938    }						\
939  while (0)
940
941#define set_it_insn_type_nonvoid(type, failret) \
942  do						\
943    {                                           \
944      inst.it_insn_type = type;			\
945      if (handle_it_state () == FAIL)		\
946	return failret;				\
947    }						\
948  while(0)
949
950#define set_it_insn_type_last()				\
951  do							\
952    {							\
953      if (inst.cond == COND_ALWAYS)			\
954	set_it_insn_type (IF_INSIDE_IT_LAST_INSN);	\
955      else						\
956	set_it_insn_type (INSIDE_IT_LAST_INSN);		\
957    }							\
958  while (0)
959
960/* Pure syntax.	 */
961
962/* This array holds the chars that always start a comment.  If the
963   pre-processor is disabled, these aren't very useful.	 */
964char arm_comment_chars[] = "@";
965
966/* This array holds the chars that only start a comment at the beginning of
967   a line.  If the line seems to have the form '# 123 filename'
968   .line and .file directives will appear in the pre-processed output.	*/
969/* Note that input_file.c hand checks for '#' at the beginning of the
970   first line of the input file.  This is because the compiler outputs
971   #NO_APP at the beginning of its output.  */
972/* Also note that comments like this one will always work.  */
973const char line_comment_chars[] = "#";
974
975char arm_line_separator_chars[] = ";";
976
977/* Chars that can be used to separate mant
978   from exp in floating point numbers.	*/
979const char EXP_CHARS[] = "eE";
980
981/* Chars that mean this number is a floating point constant.  */
982/* As in 0f12.456  */
983/* or	 0d1.2345e12  */
984
985const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
986
987/* Prefix characters that indicate the start of an immediate
988   value.  */
989#define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
990
991/* Separator character handling.  */
992
993#define skip_whitespace(str)  do { if (*(str) == ' ') ++(str); } while (0)
994
995static inline int
996skip_past_char (char ** str, char c)
997{
998  /* PR gas/14987: Allow for whitespace before the expected character.  */
999  skip_whitespace (*str);
1000
1001  if (**str == c)
1002    {
1003      (*str)++;
1004      return SUCCESS;
1005    }
1006  else
1007    return FAIL;
1008}
1009
1010#define skip_past_comma(str) skip_past_char (str, ',')
1011
1012/* Arithmetic expressions (possibly involving symbols).	 */
1013
1014/* Return TRUE if anything in the expression is a bignum.  */
1015
1016static bfd_boolean
1017walk_no_bignums (symbolS * sp)
1018{
1019  if (symbol_get_value_expression (sp)->X_op == O_big)
1020    return TRUE;
1021
1022  if (symbol_get_value_expression (sp)->X_add_symbol)
1023    {
1024      return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
1025	      || (symbol_get_value_expression (sp)->X_op_symbol
1026		  && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
1027    }
1028
1029  return FALSE;
1030}
1031
1032static bfd_boolean in_my_get_expression = FALSE;
1033
1034/* Third argument to my_get_expression.	 */
1035#define GE_NO_PREFIX 0
1036#define GE_IMM_PREFIX 1
1037#define GE_OPT_PREFIX 2
1038/* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
1039   immediates, as can be used in Neon VMVN and VMOV immediate instructions.  */
1040#define GE_OPT_PREFIX_BIG 3
1041
1042static int
1043my_get_expression (expressionS * ep, char ** str, int prefix_mode)
1044{
1045  char * save_in;
1046
1047  /* In unified syntax, all prefixes are optional.  */
1048  if (unified_syntax)
1049    prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
1050		  : GE_OPT_PREFIX;
1051
1052  switch (prefix_mode)
1053    {
1054    case GE_NO_PREFIX: break;
1055    case GE_IMM_PREFIX:
1056      if (!is_immediate_prefix (**str))
1057	{
1058	  inst.error = _("immediate expression requires a # prefix");
1059	  return FAIL;
1060	}
1061      (*str)++;
1062      break;
1063    case GE_OPT_PREFIX:
1064    case GE_OPT_PREFIX_BIG:
1065      if (is_immediate_prefix (**str))
1066	(*str)++;
1067      break;
1068    default:
1069      abort ();
1070    }
1071
1072  memset (ep, 0, sizeof (expressionS));
1073
1074  save_in = input_line_pointer;
1075  input_line_pointer = *str;
1076  in_my_get_expression = TRUE;
1077  expression (ep);
1078  in_my_get_expression = FALSE;
1079
1080  if (ep->X_op == O_illegal || ep->X_op == O_absent)
1081    {
1082      /* We found a bad or missing expression in md_operand().  */
1083      *str = input_line_pointer;
1084      input_line_pointer = save_in;
1085      if (inst.error == NULL)
1086	inst.error = (ep->X_op == O_absent
1087		      ? _("missing expression") :_("bad expression"));
1088      return 1;
1089    }
1090
1091  /* Get rid of any bignums now, so that we don't generate an error for which
1092     we can't establish a line number later on.	 Big numbers are never valid
1093     in instructions, which is where this routine is always called.  */
1094  if (prefix_mode != GE_OPT_PREFIX_BIG
1095      && (ep->X_op == O_big
1096	  || (ep->X_add_symbol
1097	      && (walk_no_bignums (ep->X_add_symbol)
1098		  || (ep->X_op_symbol
1099		      && walk_no_bignums (ep->X_op_symbol))))))
1100    {
1101      inst.error = _("invalid constant");
1102      *str = input_line_pointer;
1103      input_line_pointer = save_in;
1104      return 1;
1105    }
1106
1107  *str = input_line_pointer;
1108  input_line_pointer = save_in;
1109  return SUCCESS;
1110}
1111
1112/* Turn a string in input_line_pointer into a floating point constant
1113   of type TYPE, and store the appropriate bytes in *LITP.  The number
1114   of LITTLENUMS emitted is stored in *SIZEP.  An error message is
1115   returned, or NULL on OK.
1116
1117   Note that fp constants aren't represent in the normal way on the ARM.
1118   In big endian mode, things are as expected.	However, in little endian
1119   mode fp constants are big-endian word-wise, and little-endian byte-wise
1120   within the words.  For example, (double) 1.1 in big endian mode is
1121   the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
1122   the byte sequence 99 99 f1 3f 9a 99 99 99.
1123
1124   ??? The format of 12 byte floats is uncertain according to gcc's arm.h.  */
1125
1126const char *
1127md_atof (int type, char * litP, int * sizeP)
1128{
1129  int prec;
1130  LITTLENUM_TYPE words[MAX_LITTLENUMS];
1131  char *t;
1132  int i;
1133
1134  switch (type)
1135    {
1136    case 'f':
1137    case 'F':
1138    case 's':
1139    case 'S':
1140      prec = 2;
1141      break;
1142
1143    case 'd':
1144    case 'D':
1145    case 'r':
1146    case 'R':
1147      prec = 4;
1148      break;
1149
1150    case 'x':
1151    case 'X':
1152      prec = 5;
1153      break;
1154
1155    case 'p':
1156    case 'P':
1157      prec = 5;
1158      break;
1159
1160    default:
1161      *sizeP = 0;
1162      return _("Unrecognized or unsupported floating point constant");
1163    }
1164
1165  t = atof_ieee (input_line_pointer, type, words);
1166  if (t)
1167    input_line_pointer = t;
1168  *sizeP = prec * sizeof (LITTLENUM_TYPE);
1169
1170  if (target_big_endian)
1171    {
1172      for (i = 0; i < prec; i++)
1173	{
1174	  md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1175	  litP += sizeof (LITTLENUM_TYPE);
1176	}
1177    }
1178  else
1179    {
1180      if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
1181	for (i = prec - 1; i >= 0; i--)
1182	  {
1183	    md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1184	    litP += sizeof (LITTLENUM_TYPE);
1185	  }
1186      else
1187	/* For a 4 byte float the order of elements in `words' is 1 0.
1188	   For an 8 byte float the order is 1 0 3 2.  */
1189	for (i = 0; i < prec; i += 2)
1190	  {
1191	    md_number_to_chars (litP, (valueT) words[i + 1],
1192				sizeof (LITTLENUM_TYPE));
1193	    md_number_to_chars (litP + sizeof (LITTLENUM_TYPE),
1194				(valueT) words[i], sizeof (LITTLENUM_TYPE));
1195	    litP += 2 * sizeof (LITTLENUM_TYPE);
1196	  }
1197    }
1198
1199  return NULL;
1200}
1201
1202/* We handle all bad expressions here, so that we can report the faulty
1203   instruction in the error message.  */
1204
1205void
1206md_operand (expressionS * exp)
1207{
1208  if (in_my_get_expression)
1209    exp->X_op = O_illegal;
1210}
1211
1212/* Immediate values.  */
1213
1214#ifdef OBJ_ELF
1215/* Generic immediate-value read function for use in directives.
1216   Accepts anything that 'expression' can fold to a constant.
1217   *val receives the number.  */
1218
1219static int
1220immediate_for_directive (int *val)
1221{
1222  expressionS exp;
1223  exp.X_op = O_illegal;
1224
1225  if (is_immediate_prefix (*input_line_pointer))
1226    {
1227      input_line_pointer++;
1228      expression (&exp);
1229    }
1230
1231  if (exp.X_op != O_constant)
1232    {
1233      as_bad (_("expected #constant"));
1234      ignore_rest_of_line ();
1235      return FAIL;
1236    }
1237  *val = exp.X_add_number;
1238  return SUCCESS;
1239}
1240#endif
1241
1242/* Register parsing.  */
1243
1244/* Generic register parser.  CCP points to what should be the
1245   beginning of a register name.  If it is indeed a valid register
1246   name, advance CCP over it and return the reg_entry structure;
1247   otherwise return NULL.  Does not issue diagnostics.	*/
1248
1249static struct reg_entry *
1250arm_reg_parse_multi (char **ccp)
1251{
1252  char *start = *ccp;
1253  char *p;
1254  struct reg_entry *reg;
1255
1256  skip_whitespace (start);
1257
1258#ifdef REGISTER_PREFIX
1259  if (*start != REGISTER_PREFIX)
1260    return NULL;
1261  start++;
1262#endif
1263#ifdef OPTIONAL_REGISTER_PREFIX
1264  if (*start == OPTIONAL_REGISTER_PREFIX)
1265    start++;
1266#endif
1267
1268  p = start;
1269  if (!ISALPHA (*p) || !is_name_beginner (*p))
1270    return NULL;
1271
1272  do
1273    p++;
1274  while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1275
1276  reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1277
1278  if (!reg)
1279    return NULL;
1280
1281  *ccp = p;
1282  return reg;
1283}
1284
1285static int
1286arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
1287		    enum arm_reg_type type)
1288{
1289  /* Alternative syntaxes are accepted for a few register classes.  */
1290  switch (type)
1291    {
1292    case REG_TYPE_MVF:
1293    case REG_TYPE_MVD:
1294    case REG_TYPE_MVFX:
1295    case REG_TYPE_MVDX:
1296      /* Generic coprocessor register names are allowed for these.  */
1297      if (reg && reg->type == REG_TYPE_CN)
1298	return reg->number;
1299      break;
1300
1301    case REG_TYPE_CP:
1302      /* For backward compatibility, a bare number is valid here.  */
1303      {
1304	unsigned long processor = strtoul (start, ccp, 10);
1305	if (*ccp != start && processor <= 15)
1306	  return processor;
1307      }
1308      /* Fall through.  */
1309
1310    case REG_TYPE_MMXWC:
1311      /* WC includes WCG.  ??? I'm not sure this is true for all
1312	 instructions that take WC registers.  */
1313      if (reg && reg->type == REG_TYPE_MMXWCG)
1314	return reg->number;
1315      break;
1316
1317    default:
1318      break;
1319    }
1320
1321  return FAIL;
1322}
1323
1324/* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1325   return value is the register number or FAIL.  */
1326
1327static int
1328arm_reg_parse (char **ccp, enum arm_reg_type type)
1329{
1330  char *start = *ccp;
1331  struct reg_entry *reg = arm_reg_parse_multi (ccp);
1332  int ret;
1333
1334  /* Do not allow a scalar (reg+index) to parse as a register.  */
1335  if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1336    return FAIL;
1337
1338  if (reg && reg->type == type)
1339    return reg->number;
1340
1341  if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1342    return ret;
1343
1344  *ccp = start;
1345  return FAIL;
1346}
1347
1348/* Parse a Neon type specifier. *STR should point at the leading '.'
1349   character. Does no verification at this stage that the type fits the opcode
1350   properly. E.g.,
1351
1352     .i32.i32.s16
1353     .s32.f32
1354     .u16
1355
1356   Can all be legally parsed by this function.
1357
1358   Fills in neon_type struct pointer with parsed information, and updates STR
1359   to point after the parsed type specifier. Returns SUCCESS if this was a legal
1360   type, FAIL if not.  */
1361
1362static int
1363parse_neon_type (struct neon_type *type, char **str)
1364{
1365  char *ptr = *str;
1366
1367  if (type)
1368    type->elems = 0;
1369
1370  while (type->elems < NEON_MAX_TYPE_ELS)
1371    {
1372      enum neon_el_type thistype = NT_untyped;
1373      unsigned thissize = -1u;
1374
1375      if (*ptr != '.')
1376	break;
1377
1378      ptr++;
1379
1380      /* Just a size without an explicit type.  */
1381      if (ISDIGIT (*ptr))
1382	goto parsesize;
1383
1384      switch (TOLOWER (*ptr))
1385	{
1386	case 'i': thistype = NT_integer; break;
1387	case 'f': thistype = NT_float; break;
1388	case 'p': thistype = NT_poly; break;
1389	case 's': thistype = NT_signed; break;
1390	case 'u': thistype = NT_unsigned; break;
1391	case 'd':
1392	  thistype = NT_float;
1393	  thissize = 64;
1394	  ptr++;
1395	  goto done;
1396	default:
1397	  as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1398	  return FAIL;
1399	}
1400
1401      ptr++;
1402
1403      /* .f is an abbreviation for .f32.  */
1404      if (thistype == NT_float && !ISDIGIT (*ptr))
1405	thissize = 32;
1406      else
1407	{
1408	parsesize:
1409	  thissize = strtoul (ptr, &ptr, 10);
1410
1411	  if (thissize != 8 && thissize != 16 && thissize != 32
1412	      && thissize != 64)
1413	    {
1414	      as_bad (_("bad size %d in type specifier"), thissize);
1415	      return FAIL;
1416	    }
1417	}
1418
1419      done:
1420      if (type)
1421	{
1422	  type->el[type->elems].type = thistype;
1423	  type->el[type->elems].size = thissize;
1424	  type->elems++;
1425	}
1426    }
1427
1428  /* Empty/missing type is not a successful parse.  */
1429  if (type->elems == 0)
1430    return FAIL;
1431
1432  *str = ptr;
1433
1434  return SUCCESS;
1435}
1436
1437/* Errors may be set multiple times during parsing or bit encoding
1438   (particularly in the Neon bits), but usually the earliest error which is set
1439   will be the most meaningful. Avoid overwriting it with later (cascading)
1440   errors by calling this function.  */
1441
1442static void
1443first_error (const char *err)
1444{
1445  if (!inst.error)
1446    inst.error = err;
1447}
1448
1449/* Parse a single type, e.g. ".s32", leading period included.  */
1450static int
1451parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1452{
1453  char *str = *ccp;
1454  struct neon_type optype;
1455
1456  if (*str == '.')
1457    {
1458      if (parse_neon_type (&optype, &str) == SUCCESS)
1459	{
1460	  if (optype.elems == 1)
1461	    *vectype = optype.el[0];
1462	  else
1463	    {
1464	      first_error (_("only one type should be specified for operand"));
1465	      return FAIL;
1466	    }
1467	}
1468      else
1469	{
1470	  first_error (_("vector type expected"));
1471	  return FAIL;
1472	}
1473    }
1474  else
1475    return FAIL;
1476
1477  *ccp = str;
1478
1479  return SUCCESS;
1480}
1481
1482/* Special meanings for indices (which have a range of 0-7), which will fit into
1483   a 4-bit integer.  */
1484
1485#define NEON_ALL_LANES		15
1486#define NEON_INTERLEAVE_LANES	14
1487
1488/* Parse either a register or a scalar, with an optional type. Return the
1489   register number, and optionally fill in the actual type of the register
1490   when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1491   type/index information in *TYPEINFO.  */
1492
1493static int
1494parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
1495			   enum arm_reg_type *rtype,
1496			   struct neon_typed_alias *typeinfo)
1497{
1498  char *str = *ccp;
1499  struct reg_entry *reg = arm_reg_parse_multi (&str);
1500  struct neon_typed_alias atype;
1501  struct neon_type_el parsetype;
1502
1503  atype.defined = 0;
1504  atype.index = -1;
1505  atype.eltype.type = NT_invtype;
1506  atype.eltype.size = -1;
1507
1508  /* Try alternate syntax for some types of register. Note these are mutually
1509     exclusive with the Neon syntax extensions.  */
1510  if (reg == NULL)
1511    {
1512      int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1513      if (altreg != FAIL)
1514	*ccp = str;
1515      if (typeinfo)
1516	*typeinfo = atype;
1517      return altreg;
1518    }
1519
1520  /* Undo polymorphism when a set of register types may be accepted.  */
1521  if ((type == REG_TYPE_NDQ
1522       && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1523      || (type == REG_TYPE_VFSD
1524	  && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1525      || (type == REG_TYPE_NSDQ
1526	  && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
1527	      || reg->type == REG_TYPE_NQ))
1528      || (type == REG_TYPE_NSD
1529	  && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1530      || (type == REG_TYPE_MMXWC
1531	  && (reg->type == REG_TYPE_MMXWCG)))
1532    type = (enum arm_reg_type) reg->type;
1533
1534  if (type != reg->type)
1535    return FAIL;
1536
1537  if (reg->neon)
1538    atype = *reg->neon;
1539
1540  if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1541    {
1542      if ((atype.defined & NTA_HASTYPE) != 0)
1543	{
1544	  first_error (_("can't redefine type for operand"));
1545	  return FAIL;
1546	}
1547      atype.defined |= NTA_HASTYPE;
1548      atype.eltype = parsetype;
1549    }
1550
1551  if (skip_past_char (&str, '[') == SUCCESS)
1552    {
1553      if (type != REG_TYPE_VFD
1554	  && !(type == REG_TYPE_VFS
1555	       && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8_2)))
1556	{
1557	  first_error (_("only D registers may be indexed"));
1558	  return FAIL;
1559	}
1560
1561      if ((atype.defined & NTA_HASINDEX) != 0)
1562	{
1563	  first_error (_("can't change index for operand"));
1564	  return FAIL;
1565	}
1566
1567      atype.defined |= NTA_HASINDEX;
1568
1569      if (skip_past_char (&str, ']') == SUCCESS)
1570	atype.index = NEON_ALL_LANES;
1571      else
1572	{
1573	  expressionS exp;
1574
1575	  my_get_expression (&exp, &str, GE_NO_PREFIX);
1576
1577	  if (exp.X_op != O_constant)
1578	    {
1579	      first_error (_("constant expression required"));
1580	      return FAIL;
1581	    }
1582
1583	  if (skip_past_char (&str, ']') == FAIL)
1584	    return FAIL;
1585
1586	  atype.index = exp.X_add_number;
1587	}
1588    }
1589
1590  if (typeinfo)
1591    *typeinfo = atype;
1592
1593  if (rtype)
1594    *rtype = type;
1595
1596  *ccp = str;
1597
1598  return reg->number;
1599}
1600
1601/* Like arm_reg_parse, but allow allow the following extra features:
1602    - If RTYPE is non-zero, return the (possibly restricted) type of the
1603      register (e.g. Neon double or quad reg when either has been requested).
1604    - If this is a Neon vector type with additional type information, fill
1605      in the struct pointed to by VECTYPE (if non-NULL).
1606   This function will fault on encountering a scalar.  */
1607
1608static int
1609arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
1610		     enum arm_reg_type *rtype, struct neon_type_el *vectype)
1611{
1612  struct neon_typed_alias atype;
1613  char *str = *ccp;
1614  int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1615
1616  if (reg == FAIL)
1617    return FAIL;
1618
1619  /* Do not allow regname(... to parse as a register.  */
1620  if (*str == '(')
1621    return FAIL;
1622
1623  /* Do not allow a scalar (reg+index) to parse as a register.  */
1624  if ((atype.defined & NTA_HASINDEX) != 0)
1625    {
1626      first_error (_("register operand expected, but got scalar"));
1627      return FAIL;
1628    }
1629
1630  if (vectype)
1631    *vectype = atype.eltype;
1632
1633  *ccp = str;
1634
1635  return reg;
1636}
1637
1638#define NEON_SCALAR_REG(X)	((X) >> 4)
1639#define NEON_SCALAR_INDEX(X)	((X) & 15)
1640
1641/* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1642   have enough information to be able to do a good job bounds-checking. So, we
1643   just do easy checks here, and do further checks later.  */
1644
1645static int
1646parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
1647{
1648  int reg;
1649  char *str = *ccp;
1650  struct neon_typed_alias atype;
1651  enum arm_reg_type reg_type = REG_TYPE_VFD;
1652
1653  if (elsize == 4)
1654    reg_type = REG_TYPE_VFS;
1655
1656  reg = parse_typed_reg_or_scalar (&str, reg_type, NULL, &atype);
1657
1658  if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
1659    return FAIL;
1660
1661  if (atype.index == NEON_ALL_LANES)
1662    {
1663      first_error (_("scalar must have an index"));
1664      return FAIL;
1665    }
1666  else if (atype.index >= 64 / elsize)
1667    {
1668      first_error (_("scalar index out of range"));
1669      return FAIL;
1670    }
1671
1672  if (type)
1673    *type = atype.eltype;
1674
1675  *ccp = str;
1676
1677  return reg * 16 + atype.index;
1678}
1679
1680/* Parse an ARM register list.  Returns the bitmask, or FAIL.  */
1681
1682static long
1683parse_reg_list (char ** strp)
1684{
1685  char * str = * strp;
1686  long	 range = 0;
1687  int	 another_range;
1688
1689  /* We come back here if we get ranges concatenated by '+' or '|'.  */
1690  do
1691    {
1692      skip_whitespace (str);
1693
1694      another_range = 0;
1695
1696      if (*str == '{')
1697	{
1698	  int in_range = 0;
1699	  int cur_reg = -1;
1700
1701	  str++;
1702	  do
1703	    {
1704	      int reg;
1705
1706	      if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
1707		{
1708		  first_error (_(reg_expected_msgs[REG_TYPE_RN]));
1709		  return FAIL;
1710		}
1711
1712	      if (in_range)
1713		{
1714		  int i;
1715
1716		  if (reg <= cur_reg)
1717		    {
1718		      first_error (_("bad range in register list"));
1719		      return FAIL;
1720		    }
1721
1722		  for (i = cur_reg + 1; i < reg; i++)
1723		    {
1724		      if (range & (1 << i))
1725			as_tsktsk
1726			  (_("Warning: duplicated register (r%d) in register list"),
1727			   i);
1728		      else
1729			range |= 1 << i;
1730		    }
1731		  in_range = 0;
1732		}
1733
1734	      if (range & (1 << reg))
1735		as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1736			   reg);
1737	      else if (reg <= cur_reg)
1738		as_tsktsk (_("Warning: register range not in ascending order"));
1739
1740	      range |= 1 << reg;
1741	      cur_reg = reg;
1742	    }
1743	  while (skip_past_comma (&str) != FAIL
1744		 || (in_range = 1, *str++ == '-'));
1745	  str--;
1746
1747	  if (skip_past_char (&str, '}') == FAIL)
1748	    {
1749	      first_error (_("missing `}'"));
1750	      return FAIL;
1751	    }
1752	}
1753      else
1754	{
1755	  expressionS exp;
1756
1757	  if (my_get_expression (&exp, &str, GE_NO_PREFIX))
1758	    return FAIL;
1759
1760	  if (exp.X_op == O_constant)
1761	    {
1762	      if (exp.X_add_number
1763		  != (exp.X_add_number & 0x0000ffff))
1764		{
1765		  inst.error = _("invalid register mask");
1766		  return FAIL;
1767		}
1768
1769	      if ((range & exp.X_add_number) != 0)
1770		{
1771		  int regno = range & exp.X_add_number;
1772
1773		  regno &= -regno;
1774		  regno = (1 << regno) - 1;
1775		  as_tsktsk
1776		    (_("Warning: duplicated register (r%d) in register list"),
1777		     regno);
1778		}
1779
1780	      range |= exp.X_add_number;
1781	    }
1782	  else
1783	    {
1784	      if (inst.reloc.type != 0)
1785		{
1786		  inst.error = _("expression too complex");
1787		  return FAIL;
1788		}
1789
1790	      memcpy (&inst.reloc.exp, &exp, sizeof (expressionS));
1791	      inst.reloc.type = BFD_RELOC_ARM_MULTI;
1792	      inst.reloc.pc_rel = 0;
1793	    }
1794	}
1795
1796      if (*str == '|' || *str == '+')
1797	{
1798	  str++;
1799	  another_range = 1;
1800	}
1801    }
1802  while (another_range);
1803
1804  *strp = str;
1805  return range;
1806}
1807
1808/* Types of registers in a list.  */
1809
1810enum reg_list_els
1811{
1812  REGLIST_VFP_S,
1813  REGLIST_VFP_D,
1814  REGLIST_NEON_D
1815};
1816
1817/* Parse a VFP register list.  If the string is invalid return FAIL.
1818   Otherwise return the number of registers, and set PBASE to the first
1819   register.  Parses registers of type ETYPE.
1820   If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1821     - Q registers can be used to specify pairs of D registers
1822     - { } can be omitted from around a singleton register list
1823	 FIXME: This is not implemented, as it would require backtracking in
1824	 some cases, e.g.:
1825	   vtbl.8 d3,d4,d5
1826	 This could be done (the meaning isn't really ambiguous), but doesn't
1827	 fit in well with the current parsing framework.
1828     - 32 D registers may be used (also true for VFPv3).
1829   FIXME: Types are ignored in these register lists, which is probably a
1830   bug.  */
1831
1832static int
1833parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype)
1834{
1835  char *str = *ccp;
1836  int base_reg;
1837  int new_base;
1838  enum arm_reg_type regtype = (enum arm_reg_type) 0;
1839  int max_regs = 0;
1840  int count = 0;
1841  int warned = 0;
1842  unsigned long mask = 0;
1843  int i;
1844
1845  if (skip_past_char (&str, '{') == FAIL)
1846    {
1847      inst.error = _("expecting {");
1848      return FAIL;
1849    }
1850
1851  switch (etype)
1852    {
1853    case REGLIST_VFP_S:
1854      regtype = REG_TYPE_VFS;
1855      max_regs = 32;
1856      break;
1857
1858    case REGLIST_VFP_D:
1859      regtype = REG_TYPE_VFD;
1860      break;
1861
1862    case REGLIST_NEON_D:
1863      regtype = REG_TYPE_NDQ;
1864      break;
1865    }
1866
1867  if (etype != REGLIST_VFP_S)
1868    {
1869      /* VFPv3 allows 32 D registers, except for the VFPv3-D16 variant.  */
1870      if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
1871	{
1872	  max_regs = 32;
1873	  if (thumb_mode)
1874	    ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
1875				    fpu_vfp_ext_d32);
1876	  else
1877	    ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
1878				    fpu_vfp_ext_d32);
1879	}
1880      else
1881	max_regs = 16;
1882    }
1883
1884  base_reg = max_regs;
1885
1886  do
1887    {
1888      int setmask = 1, addregs = 1;
1889
1890      new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
1891
1892      if (new_base == FAIL)
1893	{
1894	  first_error (_(reg_expected_msgs[regtype]));
1895	  return FAIL;
1896	}
1897
1898      if (new_base >= max_regs)
1899	{
1900	  first_error (_("register out of range in list"));
1901	  return FAIL;
1902	}
1903
1904      /* Note: a value of 2 * n is returned for the register Q<n>.  */
1905      if (regtype == REG_TYPE_NQ)
1906	{
1907	  setmask = 3;
1908	  addregs = 2;
1909	}
1910
1911      if (new_base < base_reg)
1912	base_reg = new_base;
1913
1914      if (mask & (setmask << new_base))
1915	{
1916	  first_error (_("invalid register list"));
1917	  return FAIL;
1918	}
1919
1920      if ((mask >> new_base) != 0 && ! warned)
1921	{
1922	  as_tsktsk (_("register list not in ascending order"));
1923	  warned = 1;
1924	}
1925
1926      mask |= setmask << new_base;
1927      count += addregs;
1928
1929      if (*str == '-') /* We have the start of a range expression */
1930	{
1931	  int high_range;
1932
1933	  str++;
1934
1935	  if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
1936	      == FAIL)
1937	    {
1938	      inst.error = gettext (reg_expected_msgs[regtype]);
1939	      return FAIL;
1940	    }
1941
1942	  if (high_range >= max_regs)
1943	    {
1944	      first_error (_("register out of range in list"));
1945	      return FAIL;
1946	    }
1947
1948	  if (regtype == REG_TYPE_NQ)
1949	    high_range = high_range + 1;
1950
1951	  if (high_range <= new_base)
1952	    {
1953	      inst.error = _("register range not in ascending order");
1954	      return FAIL;
1955	    }
1956
1957	  for (new_base += addregs; new_base <= high_range; new_base += addregs)
1958	    {
1959	      if (mask & (setmask << new_base))
1960		{
1961		  inst.error = _("invalid register list");
1962		  return FAIL;
1963		}
1964
1965	      mask |= setmask << new_base;
1966	      count += addregs;
1967	    }
1968	}
1969    }
1970  while (skip_past_comma (&str) != FAIL);
1971
1972  str++;
1973
1974  /* Sanity check -- should have raised a parse error above.  */
1975  if (count == 0 || count > max_regs)
1976    abort ();
1977
1978  *pbase = base_reg;
1979
1980  /* Final test -- the registers must be consecutive.  */
1981  mask >>= base_reg;
1982  for (i = 0; i < count; i++)
1983    {
1984      if ((mask & (1u << i)) == 0)
1985	{
1986	  inst.error = _("non-contiguous register range");
1987	  return FAIL;
1988	}
1989    }
1990
1991  *ccp = str;
1992
1993  return count;
1994}
1995
1996/* True if two alias types are the same.  */
1997
1998static bfd_boolean
1999neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
2000{
2001  if (!a && !b)
2002    return TRUE;
2003
2004  if (!a || !b)
2005    return FALSE;
2006
2007  if (a->defined != b->defined)
2008    return FALSE;
2009
2010  if ((a->defined & NTA_HASTYPE) != 0
2011      && (a->eltype.type != b->eltype.type
2012	  || a->eltype.size != b->eltype.size))
2013    return FALSE;
2014
2015  if ((a->defined & NTA_HASINDEX) != 0
2016      && (a->index != b->index))
2017    return FALSE;
2018
2019  return TRUE;
2020}
2021
2022/* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
2023   The base register is put in *PBASE.
2024   The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
2025   the return value.
2026   The register stride (minus one) is put in bit 4 of the return value.
2027   Bits [6:5] encode the list length (minus one).
2028   The type of the list elements is put in *ELTYPE, if non-NULL.  */
2029
2030#define NEON_LANE(X)		((X) & 0xf)
2031#define NEON_REG_STRIDE(X)	((((X) >> 4) & 1) + 1)
2032#define NEON_REGLIST_LENGTH(X)	((((X) >> 5) & 3) + 1)
2033
2034static int
2035parse_neon_el_struct_list (char **str, unsigned *pbase,
2036			   struct neon_type_el *eltype)
2037{
2038  char *ptr = *str;
2039  int base_reg = -1;
2040  int reg_incr = -1;
2041  int count = 0;
2042  int lane = -1;
2043  int leading_brace = 0;
2044  enum arm_reg_type rtype = REG_TYPE_NDQ;
2045  const char *const incr_error = _("register stride must be 1 or 2");
2046  const char *const type_error = _("mismatched element/structure types in list");
2047  struct neon_typed_alias firsttype;
2048  firsttype.defined = 0;
2049  firsttype.eltype.type = NT_invtype;
2050  firsttype.eltype.size = -1;
2051  firsttype.index = -1;
2052
2053  if (skip_past_char (&ptr, '{') == SUCCESS)
2054    leading_brace = 1;
2055
2056  do
2057    {
2058      struct neon_typed_alias atype;
2059      int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
2060
2061      if (getreg == FAIL)
2062	{
2063	  first_error (_(reg_expected_msgs[rtype]));
2064	  return FAIL;
2065	}
2066
2067      if (base_reg == -1)
2068	{
2069	  base_reg = getreg;
2070	  if (rtype == REG_TYPE_NQ)
2071	    {
2072	      reg_incr = 1;
2073	    }
2074	  firsttype = atype;
2075	}
2076      else if (reg_incr == -1)
2077	{
2078	  reg_incr = getreg - base_reg;
2079	  if (reg_incr < 1 || reg_incr > 2)
2080	    {
2081	      first_error (_(incr_error));
2082	      return FAIL;
2083	    }
2084	}
2085      else if (getreg != base_reg + reg_incr * count)
2086	{
2087	  first_error (_(incr_error));
2088	  return FAIL;
2089	}
2090
2091      if (! neon_alias_types_same (&atype, &firsttype))
2092	{
2093	  first_error (_(type_error));
2094	  return FAIL;
2095	}
2096
2097      /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
2098	 modes.  */
2099      if (ptr[0] == '-')
2100	{
2101	  struct neon_typed_alias htype;
2102	  int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
2103	  if (lane == -1)
2104	    lane = NEON_INTERLEAVE_LANES;
2105	  else if (lane != NEON_INTERLEAVE_LANES)
2106	    {
2107	      first_error (_(type_error));
2108	      return FAIL;
2109	    }
2110	  if (reg_incr == -1)
2111	    reg_incr = 1;
2112	  else if (reg_incr != 1)
2113	    {
2114	      first_error (_("don't use Rn-Rm syntax with non-unit stride"));
2115	      return FAIL;
2116	    }
2117	  ptr++;
2118	  hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
2119	  if (hireg == FAIL)
2120	    {
2121	      first_error (_(reg_expected_msgs[rtype]));
2122	      return FAIL;
2123	    }
2124	  if (! neon_alias_types_same (&htype, &firsttype))
2125	    {
2126	      first_error (_(type_error));
2127	      return FAIL;
2128	    }
2129	  count += hireg + dregs - getreg;
2130	  continue;
2131	}
2132
2133      /* If we're using Q registers, we can't use [] or [n] syntax.  */
2134      if (rtype == REG_TYPE_NQ)
2135	{
2136	  count += 2;
2137	  continue;
2138	}
2139
2140      if ((atype.defined & NTA_HASINDEX) != 0)
2141	{
2142	  if (lane == -1)
2143	    lane = atype.index;
2144	  else if (lane != atype.index)
2145	    {
2146	      first_error (_(type_error));
2147	      return FAIL;
2148	    }
2149	}
2150      else if (lane == -1)
2151	lane = NEON_INTERLEAVE_LANES;
2152      else if (lane != NEON_INTERLEAVE_LANES)
2153	{
2154	  first_error (_(type_error));
2155	  return FAIL;
2156	}
2157      count++;
2158    }
2159  while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
2160
2161  /* No lane set by [x]. We must be interleaving structures.  */
2162  if (lane == -1)
2163    lane = NEON_INTERLEAVE_LANES;
2164
2165  /* Sanity check.  */
2166  if (lane == -1 || base_reg == -1 || count < 1 || count > 4
2167      || (count > 1 && reg_incr == -1))
2168    {
2169      first_error (_("error parsing element/structure list"));
2170      return FAIL;
2171    }
2172
2173  if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
2174    {
2175      first_error (_("expected }"));
2176      return FAIL;
2177    }
2178
2179  if (reg_incr == -1)
2180    reg_incr = 1;
2181
2182  if (eltype)
2183    *eltype = firsttype.eltype;
2184
2185  *pbase = base_reg;
2186  *str = ptr;
2187
2188  return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
2189}
2190
2191/* Parse an explicit relocation suffix on an expression.  This is
2192   either nothing, or a word in parentheses.  Note that if !OBJ_ELF,
2193   arm_reloc_hsh contains no entries, so this function can only
2194   succeed if there is no () after the word.  Returns -1 on error,
2195   BFD_RELOC_UNUSED if there wasn't any suffix.	 */
2196
2197static int
2198parse_reloc (char **str)
2199{
2200  struct reloc_entry *r;
2201  char *p, *q;
2202
2203  if (**str != '(')
2204    return BFD_RELOC_UNUSED;
2205
2206  p = *str + 1;
2207  q = p;
2208
2209  while (*q && *q != ')' && *q != ',')
2210    q++;
2211  if (*q != ')')
2212    return -1;
2213
2214  if ((r = (struct reloc_entry *)
2215       hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
2216    return -1;
2217
2218  *str = q + 1;
2219  return r->reloc;
2220}
2221
2222/* Directives: register aliases.  */
2223
2224static struct reg_entry *
2225insert_reg_alias (char *str, unsigned number, int type)
2226{
2227  struct reg_entry *new_reg;
2228  const char *name;
2229
2230  if ((new_reg = (struct reg_entry *) hash_find (arm_reg_hsh, str)) != 0)
2231    {
2232      if (new_reg->builtin)
2233	as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
2234
2235      /* Only warn about a redefinition if it's not defined as the
2236	 same register.	 */
2237      else if (new_reg->number != number || new_reg->type != type)
2238	as_warn (_("ignoring redefinition of register alias '%s'"), str);
2239
2240      return NULL;
2241    }
2242
2243  name = xstrdup (str);
2244  new_reg = XNEW (struct reg_entry);
2245
2246  new_reg->name = name;
2247  new_reg->number = number;
2248  new_reg->type = type;
2249  new_reg->builtin = FALSE;
2250  new_reg->neon = NULL;
2251
2252  if (hash_insert (arm_reg_hsh, name, (void *) new_reg))
2253    abort ();
2254
2255  return new_reg;
2256}
2257
2258static void
2259insert_neon_reg_alias (char *str, int number, int type,
2260		       struct neon_typed_alias *atype)
2261{
2262  struct reg_entry *reg = insert_reg_alias (str, number, type);
2263
2264  if (!reg)
2265    {
2266      first_error (_("attempt to redefine typed alias"));
2267      return;
2268    }
2269
2270  if (atype)
2271    {
2272      reg->neon = XNEW (struct neon_typed_alias);
2273      *reg->neon = *atype;
2274    }
2275}
2276
2277/* Look for the .req directive.	 This is of the form:
2278
2279	new_register_name .req existing_register_name
2280
2281   If we find one, or if it looks sufficiently like one that we want to
2282   handle any error here, return TRUE.  Otherwise return FALSE.  */
2283
2284static bfd_boolean
2285create_register_alias (char * newname, char *p)
2286{
2287  struct reg_entry *old;
2288  char *oldname, *nbuf;
2289  size_t nlen;
2290
2291  /* The input scrubber ensures that whitespace after the mnemonic is
2292     collapsed to single spaces.  */
2293  oldname = p;
2294  if (strncmp (oldname, " .req ", 6) != 0)
2295    return FALSE;
2296
2297  oldname += 6;
2298  if (*oldname == '\0')
2299    return FALSE;
2300
2301  old = (struct reg_entry *) hash_find (arm_reg_hsh, oldname);
2302  if (!old)
2303    {
2304      as_warn (_("unknown register '%s' -- .req ignored"), oldname);
2305      return TRUE;
2306    }
2307
2308  /* If TC_CASE_SENSITIVE is defined, then newname already points to
2309     the desired alias name, and p points to its end.  If not, then
2310     the desired alias name is in the global original_case_string.  */
2311#ifdef TC_CASE_SENSITIVE
2312  nlen = p - newname;
2313#else
2314  newname = original_case_string;
2315  nlen = strlen (newname);
2316#endif
2317
2318  nbuf = xmemdup0 (newname, nlen);
2319
2320  /* Create aliases under the new name as stated; an all-lowercase
2321     version of the new name; and an all-uppercase version of the new
2322     name.  */
2323  if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
2324    {
2325      for (p = nbuf; *p; p++)
2326	*p = TOUPPER (*p);
2327
2328      if (strncmp (nbuf, newname, nlen))
2329	{
2330	  /* If this attempt to create an additional alias fails, do not bother
2331	     trying to create the all-lower case alias.  We will fail and issue
2332	     a second, duplicate error message.  This situation arises when the
2333	     programmer does something like:
2334	       foo .req r0
2335	       Foo .req r1
2336	     The second .req creates the "Foo" alias but then fails to create
2337	     the artificial FOO alias because it has already been created by the
2338	     first .req.  */
2339	  if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
2340	    {
2341	      free (nbuf);
2342	      return TRUE;
2343	    }
2344	}
2345
2346      for (p = nbuf; *p; p++)
2347	*p = TOLOWER (*p);
2348
2349      if (strncmp (nbuf, newname, nlen))
2350	insert_reg_alias (nbuf, old->number, old->type);
2351    }
2352
2353  free (nbuf);
2354  return TRUE;
2355}
2356
2357/* Create a Neon typed/indexed register alias using directives, e.g.:
2358     X .dn d5.s32[1]
2359     Y .qn 6.s16
2360     Z .dn d7
2361     T .dn Z[0]
2362   These typed registers can be used instead of the types specified after the
2363   Neon mnemonic, so long as all operands given have types. Types can also be
2364   specified directly, e.g.:
2365     vadd d0.s32, d1.s32, d2.s32  */
2366
2367static bfd_boolean
2368create_neon_reg_alias (char *newname, char *p)
2369{
2370  enum arm_reg_type basetype;
2371  struct reg_entry *basereg;
2372  struct reg_entry mybasereg;
2373  struct neon_type ntype;
2374  struct neon_typed_alias typeinfo;
2375  char *namebuf, *nameend ATTRIBUTE_UNUSED;
2376  int namelen;
2377
2378  typeinfo.defined = 0;
2379  typeinfo.eltype.type = NT_invtype;
2380  typeinfo.eltype.size = -1;
2381  typeinfo.index = -1;
2382
2383  nameend = p;
2384
2385  if (strncmp (p, " .dn ", 5) == 0)
2386    basetype = REG_TYPE_VFD;
2387  else if (strncmp (p, " .qn ", 5) == 0)
2388    basetype = REG_TYPE_NQ;
2389  else
2390    return FALSE;
2391
2392  p += 5;
2393
2394  if (*p == '\0')
2395    return FALSE;
2396
2397  basereg = arm_reg_parse_multi (&p);
2398
2399  if (basereg && basereg->type != basetype)
2400    {
2401      as_bad (_("bad type for register"));
2402      return FALSE;
2403    }
2404
2405  if (basereg == NULL)
2406    {
2407      expressionS exp;
2408      /* Try parsing as an integer.  */
2409      my_get_expression (&exp, &p, GE_NO_PREFIX);
2410      if (exp.X_op != O_constant)
2411	{
2412	  as_bad (_("expression must be constant"));
2413	  return FALSE;
2414	}
2415      basereg = &mybasereg;
2416      basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
2417						  : exp.X_add_number;
2418      basereg->neon = 0;
2419    }
2420
2421  if (basereg->neon)
2422    typeinfo = *basereg->neon;
2423
2424  if (parse_neon_type (&ntype, &p) == SUCCESS)
2425    {
2426      /* We got a type.  */
2427      if (typeinfo.defined & NTA_HASTYPE)
2428	{
2429	  as_bad (_("can't redefine the type of a register alias"));
2430	  return FALSE;
2431	}
2432
2433      typeinfo.defined |= NTA_HASTYPE;
2434      if (ntype.elems != 1)
2435	{
2436	  as_bad (_("you must specify a single type only"));
2437	  return FALSE;
2438	}
2439      typeinfo.eltype = ntype.el[0];
2440    }
2441
2442  if (skip_past_char (&p, '[') == SUCCESS)
2443    {
2444      expressionS exp;
2445      /* We got a scalar index.  */
2446
2447      if (typeinfo.defined & NTA_HASINDEX)
2448	{
2449	  as_bad (_("can't redefine the index of a scalar alias"));
2450	  return FALSE;
2451	}
2452
2453      my_get_expression (&exp, &p, GE_NO_PREFIX);
2454
2455      if (exp.X_op != O_constant)
2456	{
2457	  as_bad (_("scalar index must be constant"));
2458	  return FALSE;
2459	}
2460
2461      typeinfo.defined |= NTA_HASINDEX;
2462      typeinfo.index = exp.X_add_number;
2463
2464      if (skip_past_char (&p, ']') == FAIL)
2465	{
2466	  as_bad (_("expecting ]"));
2467	  return FALSE;
2468	}
2469    }
2470
2471  /* If TC_CASE_SENSITIVE is defined, then newname already points to
2472     the desired alias name, and p points to its end.  If not, then
2473     the desired alias name is in the global original_case_string.  */
2474#ifdef TC_CASE_SENSITIVE
2475  namelen = nameend - newname;
2476#else
2477  newname = original_case_string;
2478  namelen = strlen (newname);
2479#endif
2480
2481  namebuf = xmemdup0 (newname, namelen);
2482
2483  insert_neon_reg_alias (namebuf, basereg->number, basetype,
2484			 typeinfo.defined != 0 ? &typeinfo : NULL);
2485
2486  /* Insert name in all uppercase.  */
2487  for (p = namebuf; *p; p++)
2488    *p = TOUPPER (*p);
2489
2490  if (strncmp (namebuf, newname, namelen))
2491    insert_neon_reg_alias (namebuf, basereg->number, basetype,
2492			   typeinfo.defined != 0 ? &typeinfo : NULL);
2493
2494  /* Insert name in all lowercase.  */
2495  for (p = namebuf; *p; p++)
2496    *p = TOLOWER (*p);
2497
2498  if (strncmp (namebuf, newname, namelen))
2499    insert_neon_reg_alias (namebuf, basereg->number, basetype,
2500			   typeinfo.defined != 0 ? &typeinfo : NULL);
2501
2502  free (namebuf);
2503  return TRUE;
2504}
2505
2506/* Should never be called, as .req goes between the alias and the
2507   register name, not at the beginning of the line.  */
2508
2509static void
2510s_req (int a ATTRIBUTE_UNUSED)
2511{
2512  as_bad (_("invalid syntax for .req directive"));
2513}
2514
2515static void
2516s_dn (int a ATTRIBUTE_UNUSED)
2517{
2518  as_bad (_("invalid syntax for .dn directive"));
2519}
2520
2521static void
2522s_qn (int a ATTRIBUTE_UNUSED)
2523{
2524  as_bad (_("invalid syntax for .qn directive"));
2525}
2526
2527/* The .unreq directive deletes an alias which was previously defined
2528   by .req.  For example:
2529
2530       my_alias .req r11
2531       .unreq my_alias	  */
2532
2533static void
2534s_unreq (int a ATTRIBUTE_UNUSED)
2535{
2536  char * name;
2537  char saved_char;
2538
2539  name = input_line_pointer;
2540
2541  while (*input_line_pointer != 0
2542	 && *input_line_pointer != ' '
2543	 && *input_line_pointer != '\n')
2544    ++input_line_pointer;
2545
2546  saved_char = *input_line_pointer;
2547  *input_line_pointer = 0;
2548
2549  if (!*name)
2550    as_bad (_("invalid syntax for .unreq directive"));
2551  else
2552    {
2553      struct reg_entry *reg = (struct reg_entry *) hash_find (arm_reg_hsh,
2554							      name);
2555
2556      if (!reg)
2557	as_bad (_("unknown register alias '%s'"), name);
2558      else if (reg->builtin)
2559	as_warn (_("ignoring attempt to use .unreq on fixed register name: '%s'"),
2560		 name);
2561      else
2562	{
2563	  char * p;
2564	  char * nbuf;
2565
2566	  hash_delete (arm_reg_hsh, name, FALSE);
2567	  free ((char *) reg->name);
2568	  if (reg->neon)
2569	    free (reg->neon);
2570	  free (reg);
2571
2572	  /* Also locate the all upper case and all lower case versions.
2573	     Do not complain if we cannot find one or the other as it
2574	     was probably deleted above.  */
2575
2576	  nbuf = strdup (name);
2577	  for (p = nbuf; *p; p++)
2578	    *p = TOUPPER (*p);
2579	  reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2580	  if (reg)
2581	    {
2582	      hash_delete (arm_reg_hsh, nbuf, FALSE);
2583	      free ((char *) reg->name);
2584	      if (reg->neon)
2585		free (reg->neon);
2586	      free (reg);
2587	    }
2588
2589	  for (p = nbuf; *p; p++)
2590	    *p = TOLOWER (*p);
2591	  reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
2592	  if (reg)
2593	    {
2594	      hash_delete (arm_reg_hsh, nbuf, FALSE);
2595	      free ((char *) reg->name);
2596	      if (reg->neon)
2597		free (reg->neon);
2598	      free (reg);
2599	    }
2600
2601	  free (nbuf);
2602	}
2603    }
2604
2605  *input_line_pointer = saved_char;
2606  demand_empty_rest_of_line ();
2607}
2608
2609/* Directives: Instruction set selection.  */
2610
2611#ifdef OBJ_ELF
2612/* This code is to handle mapping symbols as defined in the ARM ELF spec.
2613   (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2614   Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2615   and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped.  */
2616
2617/* Create a new mapping symbol for the transition to STATE.  */
2618
2619static void
2620make_mapping_symbol (enum mstate state, valueT value, fragS *frag)
2621{
2622  symbolS * symbolP;
2623  const char * symname;
2624  int type;
2625
2626  switch (state)
2627    {
2628    case MAP_DATA:
2629      symname = "$d";
2630      type = BSF_NO_FLAGS;
2631      break;
2632    case MAP_ARM:
2633      symname = "$a";
2634      type = BSF_NO_FLAGS;
2635      break;
2636    case MAP_THUMB:
2637      symname = "$t";
2638      type = BSF_NO_FLAGS;
2639      break;
2640    default:
2641      abort ();
2642    }
2643
2644  symbolP = symbol_new (symname, now_seg, value, frag);
2645  symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2646
2647  switch (state)
2648    {
2649    case MAP_ARM:
2650      THUMB_SET_FUNC (symbolP, 0);
2651      ARM_SET_THUMB (symbolP, 0);
2652      ARM_SET_INTERWORK (symbolP, support_interwork);
2653      break;
2654
2655    case MAP_THUMB:
2656      THUMB_SET_FUNC (symbolP, 1);
2657      ARM_SET_THUMB (symbolP, 1);
2658      ARM_SET_INTERWORK (symbolP, support_interwork);
2659      break;
2660
2661    case MAP_DATA:
2662    default:
2663      break;
2664    }
2665
2666  /* Save the mapping symbols for future reference.  Also check that
2667     we do not place two mapping symbols at the same offset within a
2668     frag.  We'll handle overlap between frags in
2669     check_mapping_symbols.
2670
2671     If .fill or other data filling directive generates zero sized data,
2672     the mapping symbol for the following code will have the same value
2673     as the one generated for the data filling directive.  In this case,
2674     we replace the old symbol with the new one at the same address.  */
2675  if (value == 0)
2676    {
2677      if (frag->tc_frag_data.first_map != NULL)
2678	{
2679	  know (S_GET_VALUE (frag->tc_frag_data.first_map) == 0);
2680	  symbol_remove (frag->tc_frag_data.first_map, &symbol_rootP, &symbol_lastP);
2681	}
2682      frag->tc_frag_data.first_map = symbolP;
2683    }
2684  if (frag->tc_frag_data.last_map != NULL)
2685    {
2686      know (S_GET_VALUE (frag->tc_frag_data.last_map) <= S_GET_VALUE (symbolP));
2687      if (S_GET_VALUE (frag->tc_frag_data.last_map) == S_GET_VALUE (symbolP))
2688	symbol_remove (frag->tc_frag_data.last_map, &symbol_rootP, &symbol_lastP);
2689    }
2690  frag->tc_frag_data.last_map = symbolP;
2691}
2692
2693/* We must sometimes convert a region marked as code to data during
2694   code alignment, if an odd number of bytes have to be padded.  The
2695   code mapping symbol is pushed to an aligned address.  */
2696
2697static void
2698insert_data_mapping_symbol (enum mstate state,
2699			    valueT value, fragS *frag, offsetT bytes)
2700{
2701  /* If there was already a mapping symbol, remove it.  */
2702  if (frag->tc_frag_data.last_map != NULL
2703      && S_GET_VALUE (frag->tc_frag_data.last_map) == frag->fr_address + value)
2704    {
2705      symbolS *symp = frag->tc_frag_data.last_map;
2706
2707      if (value == 0)
2708	{
2709	  know (frag->tc_frag_data.first_map == symp);
2710	  frag->tc_frag_data.first_map = NULL;
2711	}
2712      frag->tc_frag_data.last_map = NULL;
2713      symbol_remove (symp, &symbol_rootP, &symbol_lastP);
2714    }
2715
2716  make_mapping_symbol (MAP_DATA, value, frag);
2717  make_mapping_symbol (state, value + bytes, frag);
2718}
2719
2720static void mapping_state_2 (enum mstate state, int max_chars);
2721
2722/* Set the mapping state to STATE.  Only call this when about to
2723   emit some STATE bytes to the file.  */
2724
2725#define TRANSITION(from, to) (mapstate == (from) && state == (to))
2726void
2727mapping_state (enum mstate state)
2728{
2729  enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2730
2731  if (mapstate == state)
2732    /* The mapping symbol has already been emitted.
2733       There is nothing else to do.  */
2734    return;
2735
2736  if (state == MAP_ARM || state == MAP_THUMB)
2737    /*  PR gas/12931
2738	All ARM instructions require 4-byte alignment.
2739	(Almost) all Thumb instructions require 2-byte alignment.
2740
2741	When emitting instructions into any section, mark the section
2742	appropriately.
2743
2744	Some Thumb instructions are alignment-sensitive modulo 4 bytes,
2745	but themselves require 2-byte alignment; this applies to some
2746	PC- relative forms.  However, these cases will involve implicit
2747	literal pool generation or an explicit .align >=2, both of
2748	which will cause the section to me marked with sufficient
2749	alignment.  Thus, we don't handle those cases here.  */
2750    record_alignment (now_seg, state == MAP_ARM ? 2 : 1);
2751
2752  if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
2753    /* This case will be evaluated later.  */
2754    return;
2755
2756  mapping_state_2 (state, 0);
2757}
2758
2759/* Same as mapping_state, but MAX_CHARS bytes have already been
2760   allocated.  Put the mapping symbol that far back.  */
2761
2762static void
2763mapping_state_2 (enum mstate state, int max_chars)
2764{
2765  enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2766
2767  if (!SEG_NORMAL (now_seg))
2768    return;
2769
2770  if (mapstate == state)
2771    /* The mapping symbol has already been emitted.
2772       There is nothing else to do.  */
2773    return;
2774
2775  if (TRANSITION (MAP_UNDEFINED, MAP_ARM)
2776	  || TRANSITION (MAP_UNDEFINED, MAP_THUMB))
2777    {
2778      struct frag * const frag_first = seg_info (now_seg)->frchainP->frch_root;
2779      const int add_symbol = (frag_now != frag_first) || (frag_now_fix () > 0);
2780
2781      if (add_symbol)
2782	make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
2783    }
2784
2785  seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2786  make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
2787}
2788#undef TRANSITION
2789#else
2790#define mapping_state(x) ((void)0)
2791#define mapping_state_2(x, y) ((void)0)
2792#endif
2793
2794/* Find the real, Thumb encoded start of a Thumb function.  */
2795
2796#ifdef OBJ_COFF
2797static symbolS *
2798find_real_start (symbolS * symbolP)
2799{
2800  char *       real_start;
2801  const char * name = S_GET_NAME (symbolP);
2802  symbolS *    new_target;
2803
2804  /* This definition must agree with the one in gcc/config/arm/thumb.c.	 */
2805#define STUB_NAME ".real_start_of"
2806
2807  if (name == NULL)
2808    abort ();
2809
2810  /* The compiler may generate BL instructions to local labels because
2811     it needs to perform a branch to a far away location. These labels
2812     do not have a corresponding ".real_start_of" label.  We check
2813     both for S_IS_LOCAL and for a leading dot, to give a way to bypass
2814     the ".real_start_of" convention for nonlocal branches.  */
2815  if (S_IS_LOCAL (symbolP) || name[0] == '.')
2816    return symbolP;
2817
2818  real_start = concat (STUB_NAME, name, NULL);
2819  new_target = symbol_find (real_start);
2820  free (real_start);
2821
2822  if (new_target == NULL)
2823    {
2824      as_warn (_("Failed to find real start of function: %s\n"), name);
2825      new_target = symbolP;
2826    }
2827
2828  return new_target;
2829}
2830#endif
2831
2832static void
2833opcode_select (int width)
2834{
2835  switch (width)
2836    {
2837    case 16:
2838      if (! thumb_mode)
2839	{
2840	  if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
2841	    as_bad (_("selected processor does not support THUMB opcodes"));
2842
2843	  thumb_mode = 1;
2844	  /* No need to force the alignment, since we will have been
2845	     coming from ARM mode, which is word-aligned.  */
2846	  record_alignment (now_seg, 1);
2847	}
2848      break;
2849
2850    case 32:
2851      if (thumb_mode)
2852	{
2853	  if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
2854	    as_bad (_("selected processor does not support ARM opcodes"));
2855
2856	  thumb_mode = 0;
2857
2858	  if (!need_pass_2)
2859	    frag_align (2, 0, 0);
2860
2861	  record_alignment (now_seg, 1);
2862	}
2863      break;
2864
2865    default:
2866      as_bad (_("invalid instruction size selected (%d)"), width);
2867    }
2868}
2869
2870static void
2871s_arm (int ignore ATTRIBUTE_UNUSED)
2872{
2873  opcode_select (32);
2874  demand_empty_rest_of_line ();
2875}
2876
2877static void
2878s_thumb (int ignore ATTRIBUTE_UNUSED)
2879{
2880  opcode_select (16);
2881  demand_empty_rest_of_line ();
2882}
2883
2884static void
2885s_code (int unused ATTRIBUTE_UNUSED)
2886{
2887  int temp;
2888
2889  temp = get_absolute_expression ();
2890  switch (temp)
2891    {
2892    case 16:
2893    case 32:
2894      opcode_select (temp);
2895      break;
2896
2897    default:
2898      as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
2899    }
2900}
2901
2902static void
2903s_force_thumb (int ignore ATTRIBUTE_UNUSED)
2904{
2905  /* If we are not already in thumb mode go into it, EVEN if
2906     the target processor does not support thumb instructions.
2907     This is used by gcc/config/arm/lib1funcs.asm for example
2908     to compile interworking support functions even if the
2909     target processor should not support interworking.	*/
2910  if (! thumb_mode)
2911    {
2912      thumb_mode = 2;
2913      record_alignment (now_seg, 1);
2914    }
2915
2916  demand_empty_rest_of_line ();
2917}
2918
2919static void
2920s_thumb_func (int ignore ATTRIBUTE_UNUSED)
2921{
2922  s_thumb (0);
2923
2924  /* The following label is the name/address of the start of a Thumb function.
2925     We need to know this for the interworking support.	 */
2926  label_is_thumb_function_name = TRUE;
2927}
2928
2929/* Perform a .set directive, but also mark the alias as
2930   being a thumb function.  */
2931
2932static void
2933s_thumb_set (int equiv)
2934{
2935  /* XXX the following is a duplicate of the code for s_set() in read.c
2936     We cannot just call that code as we need to get at the symbol that
2937     is created.  */
2938  char *    name;
2939  char	    delim;
2940  char *    end_name;
2941  symbolS * symbolP;
2942
2943  /* Especial apologies for the random logic:
2944     This just grew, and could be parsed much more simply!
2945     Dean - in haste.  */
2946  delim	    = get_symbol_name (& name);
2947  end_name  = input_line_pointer;
2948  (void) restore_line_pointer (delim);
2949
2950  if (*input_line_pointer != ',')
2951    {
2952      *end_name = 0;
2953      as_bad (_("expected comma after name \"%s\""), name);
2954      *end_name = delim;
2955      ignore_rest_of_line ();
2956      return;
2957    }
2958
2959  input_line_pointer++;
2960  *end_name = 0;
2961
2962  if (name[0] == '.' && name[1] == '\0')
2963    {
2964      /* XXX - this should not happen to .thumb_set.  */
2965      abort ();
2966    }
2967
2968  if ((symbolP = symbol_find (name)) == NULL
2969      && (symbolP = md_undefined_symbol (name)) == NULL)
2970    {
2971#ifndef NO_LISTING
2972      /* When doing symbol listings, play games with dummy fragments living
2973	 outside the normal fragment chain to record the file and line info
2974	 for this symbol.  */
2975      if (listing & LISTING_SYMBOLS)
2976	{
2977	  extern struct list_info_struct * listing_tail;
2978	  fragS * dummy_frag = (fragS * ) xmalloc (sizeof (fragS));
2979
2980	  memset (dummy_frag, 0, sizeof (fragS));
2981	  dummy_frag->fr_type = rs_fill;
2982	  dummy_frag->line = listing_tail;
2983	  symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2984	  dummy_frag->fr_symbol = symbolP;
2985	}
2986      else
2987#endif
2988	symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2989
2990#ifdef OBJ_COFF
2991      /* "set" symbols are local unless otherwise specified.  */
2992      SF_SET_LOCAL (symbolP);
2993#endif /* OBJ_COFF  */
2994    }				/* Make a new symbol.  */
2995
2996  symbol_table_insert (symbolP);
2997
2998  * end_name = delim;
2999
3000  if (equiv
3001      && S_IS_DEFINED (symbolP)
3002      && S_GET_SEGMENT (symbolP) != reg_section)
3003    as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
3004
3005  pseudo_set (symbolP);
3006
3007  demand_empty_rest_of_line ();
3008
3009  /* XXX Now we come to the Thumb specific bit of code.	 */
3010
3011  THUMB_SET_FUNC (symbolP, 1);
3012  ARM_SET_THUMB (symbolP, 1);
3013#if defined OBJ_ELF || defined OBJ_COFF
3014  ARM_SET_INTERWORK (symbolP, support_interwork);
3015#endif
3016}
3017
3018/* Directives: Mode selection.  */
3019
3020/* .syntax [unified|divided] - choose the new unified syntax
3021   (same for Arm and Thumb encoding, modulo slight differences in what
3022   can be represented) or the old divergent syntax for each mode.  */
3023static void
3024s_syntax (int unused ATTRIBUTE_UNUSED)
3025{
3026  char *name, delim;
3027
3028  delim = get_symbol_name (& name);
3029
3030  if (!strcasecmp (name, "unified"))
3031    unified_syntax = TRUE;
3032  else if (!strcasecmp (name, "divided"))
3033    unified_syntax = FALSE;
3034  else
3035    {
3036      as_bad (_("unrecognized syntax mode \"%s\""), name);
3037      return;
3038    }
3039  (void) restore_line_pointer (delim);
3040  demand_empty_rest_of_line ();
3041}
3042
3043/* Directives: sectioning and alignment.  */
3044
3045static void
3046s_bss (int ignore ATTRIBUTE_UNUSED)
3047{
3048  /* We don't support putting frags in the BSS segment, we fake it by
3049     marking in_bss, then looking at s_skip for clues.	*/
3050  subseg_set (bss_section, 0);
3051  demand_empty_rest_of_line ();
3052
3053#ifdef md_elf_section_change_hook
3054  md_elf_section_change_hook ();
3055#endif
3056}
3057
3058static void
3059s_even (int ignore ATTRIBUTE_UNUSED)
3060{
3061  /* Never make frag if expect extra pass.  */
3062  if (!need_pass_2)
3063    frag_align (1, 0, 0);
3064
3065  record_alignment (now_seg, 1);
3066
3067  demand_empty_rest_of_line ();
3068}
3069
3070/* Directives: CodeComposer Studio.  */
3071
3072/*  .ref  (for CodeComposer Studio syntax only).  */
3073static void
3074s_ccs_ref (int unused ATTRIBUTE_UNUSED)
3075{
3076  if (codecomposer_syntax)
3077    ignore_rest_of_line ();
3078  else
3079    as_bad (_(".ref pseudo-op only available with -mccs flag."));
3080}
3081
3082/*  If name is not NULL, then it is used for marking the beginning of a
3083    function, whereas if it is NULL then it means the function end.  */
3084static void
3085asmfunc_debug (const char * name)
3086{
3087  static const char * last_name = NULL;
3088
3089  if (name != NULL)
3090    {
3091      gas_assert (last_name == NULL);
3092      last_name = name;
3093
3094      if (debug_type == DEBUG_STABS)
3095         stabs_generate_asm_func (name, name);
3096    }
3097  else
3098    {
3099      gas_assert (last_name != NULL);
3100
3101      if (debug_type == DEBUG_STABS)
3102        stabs_generate_asm_endfunc (last_name, last_name);
3103
3104      last_name = NULL;
3105    }
3106}
3107
3108static void
3109s_ccs_asmfunc (int unused ATTRIBUTE_UNUSED)
3110{
3111  if (codecomposer_syntax)
3112    {
3113      switch (asmfunc_state)
3114	{
3115	case OUTSIDE_ASMFUNC:
3116	  asmfunc_state = WAITING_ASMFUNC_NAME;
3117	  break;
3118
3119	case WAITING_ASMFUNC_NAME:
3120	  as_bad (_(".asmfunc repeated."));
3121	  break;
3122
3123	case WAITING_ENDASMFUNC:
3124	  as_bad (_(".asmfunc without function."));
3125	  break;
3126	}
3127      demand_empty_rest_of_line ();
3128    }
3129  else
3130    as_bad (_(".asmfunc pseudo-op only available with -mccs flag."));
3131}
3132
3133static void
3134s_ccs_endasmfunc (int unused ATTRIBUTE_UNUSED)
3135{
3136  if (codecomposer_syntax)
3137    {
3138      switch (asmfunc_state)
3139	{
3140	case OUTSIDE_ASMFUNC:
3141	  as_bad (_(".endasmfunc without a .asmfunc."));
3142	  break;
3143
3144	case WAITING_ASMFUNC_NAME:
3145	  as_bad (_(".endasmfunc without function."));
3146	  break;
3147
3148	case WAITING_ENDASMFUNC:
3149	  asmfunc_state = OUTSIDE_ASMFUNC;
3150	  asmfunc_debug (NULL);
3151	  break;
3152	}
3153      demand_empty_rest_of_line ();
3154    }
3155  else
3156    as_bad (_(".endasmfunc pseudo-op only available with -mccs flag."));
3157}
3158
3159static void
3160s_ccs_def (int name)
3161{
3162  if (codecomposer_syntax)
3163    s_globl (name);
3164  else
3165    as_bad (_(".def pseudo-op only available with -mccs flag."));
3166}
3167
3168/* Directives: Literal pools.  */
3169
3170static literal_pool *
3171find_literal_pool (void)
3172{
3173  literal_pool * pool;
3174
3175  for (pool = list_of_pools; pool != NULL; pool = pool->next)
3176    {
3177      if (pool->section == now_seg
3178	  && pool->sub_section == now_subseg)
3179	break;
3180    }
3181
3182  return pool;
3183}
3184
3185static literal_pool *
3186find_or_make_literal_pool (void)
3187{
3188  /* Next literal pool ID number.  */
3189  static unsigned int latest_pool_num = 1;
3190  literal_pool *      pool;
3191
3192  pool = find_literal_pool ();
3193
3194  if (pool == NULL)
3195    {
3196      /* Create a new pool.  */
3197      pool = XNEW (literal_pool);
3198      if (! pool)
3199	return NULL;
3200
3201      pool->next_free_entry = 0;
3202      pool->section	    = now_seg;
3203      pool->sub_section	    = now_subseg;
3204      pool->next	    = list_of_pools;
3205      pool->symbol	    = NULL;
3206      pool->alignment	    = 2;
3207
3208      /* Add it to the list.  */
3209      list_of_pools = pool;
3210    }
3211
3212  /* New pools, and emptied pools, will have a NULL symbol.  */
3213  if (pool->symbol == NULL)
3214    {
3215      pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
3216				    (valueT) 0, &zero_address_frag);
3217      pool->id = latest_pool_num ++;
3218    }
3219
3220  /* Done.  */
3221  return pool;
3222}
3223
3224/* Add the literal in the global 'inst'
3225   structure to the relevant literal pool.  */
3226
3227static int
3228add_to_lit_pool (unsigned int nbytes)
3229{
3230#define PADDING_SLOT 0x1
3231#define LIT_ENTRY_SIZE_MASK 0xFF
3232  literal_pool * pool;
3233  unsigned int entry, pool_size = 0;
3234  bfd_boolean padding_slot_p = FALSE;
3235  unsigned imm1 = 0;
3236  unsigned imm2 = 0;
3237
3238  if (nbytes == 8)
3239    {
3240      imm1 = inst.operands[1].imm;
3241      imm2 = (inst.operands[1].regisimm ? inst.operands[1].reg
3242	       : inst.reloc.exp.X_unsigned ? 0
3243	       : ((bfd_int64_t) inst.operands[1].imm) >> 32);
3244      if (target_big_endian)
3245	{
3246	  imm1 = imm2;
3247	  imm2 = inst.operands[1].imm;
3248	}
3249    }
3250
3251  pool = find_or_make_literal_pool ();
3252
3253  /* Check if this literal value is already in the pool.  */
3254  for (entry = 0; entry < pool->next_free_entry; entry ++)
3255    {
3256      if (nbytes == 4)
3257	{
3258	  if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3259	      && (inst.reloc.exp.X_op == O_constant)
3260	      && (pool->literals[entry].X_add_number
3261		  == inst.reloc.exp.X_add_number)
3262	      && (pool->literals[entry].X_md == nbytes)
3263	      && (pool->literals[entry].X_unsigned
3264		  == inst.reloc.exp.X_unsigned))
3265	    break;
3266
3267	  if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3268	      && (inst.reloc.exp.X_op == O_symbol)
3269	      && (pool->literals[entry].X_add_number
3270		  == inst.reloc.exp.X_add_number)
3271	      && (pool->literals[entry].X_add_symbol
3272		  == inst.reloc.exp.X_add_symbol)
3273	      && (pool->literals[entry].X_op_symbol
3274		  == inst.reloc.exp.X_op_symbol)
3275	      && (pool->literals[entry].X_md == nbytes))
3276	    break;
3277	}
3278      else if ((nbytes == 8)
3279	       && !(pool_size & 0x7)
3280	       && ((entry + 1) != pool->next_free_entry)
3281	       && (pool->literals[entry].X_op == O_constant)
3282	       && (pool->literals[entry].X_add_number == (offsetT) imm1)
3283	       && (pool->literals[entry].X_unsigned
3284		   == inst.reloc.exp.X_unsigned)
3285	       && (pool->literals[entry + 1].X_op == O_constant)
3286	       && (pool->literals[entry + 1].X_add_number == (offsetT) imm2)
3287	       && (pool->literals[entry + 1].X_unsigned
3288		   == inst.reloc.exp.X_unsigned))
3289	break;
3290
3291      padding_slot_p = ((pool->literals[entry].X_md >> 8) == PADDING_SLOT);
3292      if (padding_slot_p && (nbytes == 4))
3293	break;
3294
3295      pool_size += 4;
3296    }
3297
3298  /* Do we need to create a new entry?	*/
3299  if (entry == pool->next_free_entry)
3300    {
3301      if (entry >= MAX_LITERAL_POOL_SIZE)
3302	{
3303	  inst.error = _("literal pool overflow");
3304	  return FAIL;
3305	}
3306
3307      if (nbytes == 8)
3308	{
3309	  /* For 8-byte entries, we align to an 8-byte boundary,
3310	     and split it into two 4-byte entries, because on 32-bit
3311	     host, 8-byte constants are treated as big num, thus
3312	     saved in "generic_bignum" which will be overwritten
3313	     by later assignments.
3314
3315	     We also need to make sure there is enough space for
3316	     the split.
3317
3318	     We also check to make sure the literal operand is a
3319	     constant number.  */
3320	  if (!(inst.reloc.exp.X_op == O_constant
3321	        || inst.reloc.exp.X_op == O_big))
3322	    {
3323	      inst.error = _("invalid type for literal pool");
3324	      return FAIL;
3325	    }
3326	  else if (pool_size & 0x7)
3327	    {
3328	      if ((entry + 2) >= MAX_LITERAL_POOL_SIZE)
3329		{
3330		  inst.error = _("literal pool overflow");
3331		  return FAIL;
3332		}
3333
3334	      pool->literals[entry] = inst.reloc.exp;
3335	      pool->literals[entry].X_op = O_constant;
3336	      pool->literals[entry].X_add_number = 0;
3337	      pool->literals[entry++].X_md = (PADDING_SLOT << 8) | 4;
3338	      pool->next_free_entry += 1;
3339	      pool_size += 4;
3340	    }
3341	  else if ((entry + 1) >= MAX_LITERAL_POOL_SIZE)
3342	    {
3343	      inst.error = _("literal pool overflow");
3344	      return FAIL;
3345	    }
3346
3347	  pool->literals[entry] = inst.reloc.exp;
3348	  pool->literals[entry].X_op = O_constant;
3349	  pool->literals[entry].X_add_number = imm1;
3350	  pool->literals[entry].X_unsigned = inst.reloc.exp.X_unsigned;
3351	  pool->literals[entry++].X_md = 4;
3352	  pool->literals[entry] = inst.reloc.exp;
3353	  pool->literals[entry].X_op = O_constant;
3354	  pool->literals[entry].X_add_number = imm2;
3355	  pool->literals[entry].X_unsigned = inst.reloc.exp.X_unsigned;
3356	  pool->literals[entry].X_md = 4;
3357	  pool->alignment = 3;
3358	  pool->next_free_entry += 1;
3359	}
3360      else
3361	{
3362	  pool->literals[entry] = inst.reloc.exp;
3363	  pool->literals[entry].X_md = 4;
3364	}
3365
3366#ifdef OBJ_ELF
3367      /* PR ld/12974: Record the location of the first source line to reference
3368	 this entry in the literal pool.  If it turns out during linking that the
3369	 symbol does not exist we will be able to give an accurate line number for
3370	 the (first use of the) missing reference.  */
3371      if (debug_type == DEBUG_DWARF2)
3372	dwarf2_where (pool->locs + entry);
3373#endif
3374      pool->next_free_entry += 1;
3375    }
3376  else if (padding_slot_p)
3377    {
3378      pool->literals[entry] = inst.reloc.exp;
3379      pool->literals[entry].X_md = nbytes;
3380    }
3381
3382  inst.reloc.exp.X_op	      = O_symbol;
3383  inst.reloc.exp.X_add_number = pool_size;
3384  inst.reloc.exp.X_add_symbol = pool->symbol;
3385
3386  return SUCCESS;
3387}
3388
3389bfd_boolean
3390tc_start_label_without_colon (void)
3391{
3392  bfd_boolean ret = TRUE;
3393
3394  if (codecomposer_syntax && asmfunc_state == WAITING_ASMFUNC_NAME)
3395    {
3396      const char *label = input_line_pointer;
3397
3398      while (!is_end_of_line[(int) label[-1]])
3399	--label;
3400
3401      if (*label == '.')
3402	{
3403	  as_bad (_("Invalid label '%s'"), label);
3404	  ret = FALSE;
3405	}
3406
3407      asmfunc_debug (label);
3408
3409      asmfunc_state = WAITING_ENDASMFUNC;
3410    }
3411
3412  return ret;
3413}
3414
3415/* Can't use symbol_new here, so have to create a symbol and then at
3416   a later date assign it a value. That's what these functions do.  */
3417
3418static void
3419symbol_locate (symbolS *    symbolP,
3420	       const char * name,	/* It is copied, the caller can modify.	 */
3421	       segT	    segment,	/* Segment identifier (SEG_<something>).  */
3422	       valueT	    valu,	/* Symbol value.  */
3423	       fragS *	    frag)	/* Associated fragment.	 */
3424{
3425  size_t name_length;
3426  char * preserved_copy_of_name;
3427
3428  name_length = strlen (name) + 1;   /* +1 for \0.  */
3429  obstack_grow (&notes, name, name_length);
3430  preserved_copy_of_name = (char *) obstack_finish (&notes);
3431
3432#ifdef tc_canonicalize_symbol_name
3433  preserved_copy_of_name =
3434    tc_canonicalize_symbol_name (preserved_copy_of_name);
3435#endif
3436
3437  S_SET_NAME (symbolP, preserved_copy_of_name);
3438
3439  S_SET_SEGMENT (symbolP, segment);
3440  S_SET_VALUE (symbolP, valu);
3441  symbol_clear_list_pointers (symbolP);
3442
3443  symbol_set_frag (symbolP, frag);
3444
3445  /* Link to end of symbol chain.  */
3446  {
3447    extern int symbol_table_frozen;
3448
3449    if (symbol_table_frozen)
3450      abort ();
3451  }
3452
3453  symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
3454
3455  obj_symbol_new_hook (symbolP);
3456
3457#ifdef tc_symbol_new_hook
3458  tc_symbol_new_hook (symbolP);
3459#endif
3460
3461#ifdef DEBUG_SYMS
3462  verify_symbol_chain (symbol_rootP, symbol_lastP);
3463#endif /* DEBUG_SYMS  */
3464}
3465
3466static void
3467s_ltorg (int ignored ATTRIBUTE_UNUSED)
3468{
3469  unsigned int entry;
3470  literal_pool * pool;
3471  char sym_name[20];
3472
3473  pool = find_literal_pool ();
3474  if (pool == NULL
3475      || pool->symbol == NULL
3476      || pool->next_free_entry == 0)
3477    return;
3478
3479  /* Align pool as you have word accesses.
3480     Only make a frag if we have to.  */
3481  if (!need_pass_2)
3482    frag_align (pool->alignment, 0, 0);
3483
3484  record_alignment (now_seg, 2);
3485
3486#ifdef OBJ_ELF
3487  seg_info (now_seg)->tc_segment_info_data.mapstate = MAP_DATA;
3488  make_mapping_symbol (MAP_DATA, (valueT) frag_now_fix (), frag_now);
3489#endif
3490  sprintf (sym_name, "$$lit_\002%x", pool->id);
3491
3492  symbol_locate (pool->symbol, sym_name, now_seg,
3493		 (valueT) frag_now_fix (), frag_now);
3494  symbol_table_insert (pool->symbol);
3495
3496  ARM_SET_THUMB (pool->symbol, thumb_mode);
3497
3498#if defined OBJ_COFF || defined OBJ_ELF
3499  ARM_SET_INTERWORK (pool->symbol, support_interwork);
3500#endif
3501
3502  for (entry = 0; entry < pool->next_free_entry; entry ++)
3503    {
3504#ifdef OBJ_ELF
3505      if (debug_type == DEBUG_DWARF2)
3506	dwarf2_gen_line_info (frag_now_fix (), pool->locs + entry);
3507#endif
3508      /* First output the expression in the instruction to the pool.  */
3509      emit_expr (&(pool->literals[entry]),
3510		 pool->literals[entry].X_md & LIT_ENTRY_SIZE_MASK);
3511    }
3512
3513  /* Mark the pool as empty.  */
3514  pool->next_free_entry = 0;
3515  pool->symbol = NULL;
3516}
3517
3518#ifdef OBJ_ELF
3519/* Forward declarations for functions below, in the MD interface
3520   section.  */
3521static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
3522static valueT create_unwind_entry (int);
3523static void start_unwind_section (const segT, int);
3524static void add_unwind_opcode (valueT, int);
3525static void flush_pending_unwind (void);
3526
3527/* Directives: Data.  */
3528
3529static void
3530s_arm_elf_cons (int nbytes)
3531{
3532  expressionS exp;
3533
3534#ifdef md_flush_pending_output
3535  md_flush_pending_output ();
3536#endif
3537
3538  if (is_it_end_of_statement ())
3539    {
3540      demand_empty_rest_of_line ();
3541      return;
3542    }
3543
3544#ifdef md_cons_align
3545  md_cons_align (nbytes);
3546#endif
3547
3548  mapping_state (MAP_DATA);
3549  do
3550    {
3551      int reloc;
3552      char *base = input_line_pointer;
3553
3554      expression (& exp);
3555
3556      if (exp.X_op != O_symbol)
3557	emit_expr (&exp, (unsigned int) nbytes);
3558      else
3559	{
3560	  char *before_reloc = input_line_pointer;
3561	  reloc = parse_reloc (&input_line_pointer);
3562	  if (reloc == -1)
3563	    {
3564	      as_bad (_("unrecognized relocation suffix"));
3565	      ignore_rest_of_line ();
3566	      return;
3567	    }
3568	  else if (reloc == BFD_RELOC_UNUSED)
3569	    emit_expr (&exp, (unsigned int) nbytes);
3570	  else
3571	    {
3572	      reloc_howto_type *howto = (reloc_howto_type *)
3573		  bfd_reloc_type_lookup (stdoutput,
3574					 (bfd_reloc_code_real_type) reloc);
3575	      int size = bfd_get_reloc_size (howto);
3576
3577	      if (reloc == BFD_RELOC_ARM_PLT32)
3578		{
3579		  as_bad (_("(plt) is only valid on branch targets"));
3580		  reloc = BFD_RELOC_UNUSED;
3581		  size = 0;
3582		}
3583
3584	      if (size > nbytes)
3585		as_bad (ngettext ("%s relocations do not fit in %d byte",
3586				  "%s relocations do not fit in %d bytes",
3587				  nbytes),
3588			howto->name, nbytes);
3589	      else
3590		{
3591		  /* We've parsed an expression stopping at O_symbol.
3592		     But there may be more expression left now that we
3593		     have parsed the relocation marker.  Parse it again.
3594		     XXX Surely there is a cleaner way to do this.  */
3595		  char *p = input_line_pointer;
3596		  int offset;
3597		  char *save_buf = XNEWVEC (char, input_line_pointer - base);
3598
3599		  memcpy (save_buf, base, input_line_pointer - base);
3600		  memmove (base + (input_line_pointer - before_reloc),
3601			   base, before_reloc - base);
3602
3603		  input_line_pointer = base + (input_line_pointer-before_reloc);
3604		  expression (&exp);
3605		  memcpy (base, save_buf, p - base);
3606
3607		  offset = nbytes - size;
3608		  p = frag_more (nbytes);
3609		  memset (p, 0, nbytes);
3610		  fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
3611			       size, &exp, 0, (enum bfd_reloc_code_real) reloc);
3612		  free (save_buf);
3613		}
3614	    }
3615	}
3616    }
3617  while (*input_line_pointer++ == ',');
3618
3619  /* Put terminator back into stream.  */
3620  input_line_pointer --;
3621  demand_empty_rest_of_line ();
3622}
3623
3624/* Emit an expression containing a 32-bit thumb instruction.
3625   Implementation based on put_thumb32_insn.  */
3626
3627static void
3628emit_thumb32_expr (expressionS * exp)
3629{
3630  expressionS exp_high = *exp;
3631
3632  exp_high.X_add_number = (unsigned long)exp_high.X_add_number >> 16;
3633  emit_expr (& exp_high, (unsigned int) THUMB_SIZE);
3634  exp->X_add_number &= 0xffff;
3635  emit_expr (exp, (unsigned int) THUMB_SIZE);
3636}
3637
3638/*  Guess the instruction size based on the opcode.  */
3639
3640static int
3641thumb_insn_size (int opcode)
3642{
3643  if ((unsigned int) opcode < 0xe800u)
3644    return 2;
3645  else if ((unsigned int) opcode >= 0xe8000000u)
3646    return 4;
3647  else
3648    return 0;
3649}
3650
3651static bfd_boolean
3652emit_insn (expressionS *exp, int nbytes)
3653{
3654  int size = 0;
3655
3656  if (exp->X_op == O_constant)
3657    {
3658      size = nbytes;
3659
3660      if (size == 0)
3661	size = thumb_insn_size (exp->X_add_number);
3662
3663      if (size != 0)
3664	{
3665	  if (size == 2 && (unsigned int)exp->X_add_number > 0xffffu)
3666	    {
3667	      as_bad (_(".inst.n operand too big. "\
3668			"Use .inst.w instead"));
3669	      size = 0;
3670	    }
3671	  else
3672	    {
3673	      if (now_it.state == AUTOMATIC_IT_BLOCK)
3674		set_it_insn_type_nonvoid (OUTSIDE_IT_INSN, 0);
3675	      else
3676		set_it_insn_type_nonvoid (NEUTRAL_IT_INSN, 0);
3677
3678	      if (thumb_mode && (size > THUMB_SIZE) && !target_big_endian)
3679		emit_thumb32_expr (exp);
3680	      else
3681		emit_expr (exp, (unsigned int) size);
3682
3683	      it_fsm_post_encode ();
3684	    }
3685	}
3686      else
3687	as_bad (_("cannot determine Thumb instruction size. "	\
3688		  "Use .inst.n/.inst.w instead"));
3689    }
3690  else
3691    as_bad (_("constant expression required"));
3692
3693  return (size != 0);
3694}
3695
3696/* Like s_arm_elf_cons but do not use md_cons_align and
3697   set the mapping state to MAP_ARM/MAP_THUMB.  */
3698
3699static void
3700s_arm_elf_inst (int nbytes)
3701{
3702  if (is_it_end_of_statement ())
3703    {
3704      demand_empty_rest_of_line ();
3705      return;
3706    }
3707
3708  /* Calling mapping_state () here will not change ARM/THUMB,
3709     but will ensure not to be in DATA state.  */
3710
3711  if (thumb_mode)
3712    mapping_state (MAP_THUMB);
3713  else
3714    {
3715      if (nbytes != 0)
3716	{
3717	  as_bad (_("width suffixes are invalid in ARM mode"));
3718	  ignore_rest_of_line ();
3719	  return;
3720	}
3721
3722      nbytes = 4;
3723
3724      mapping_state (MAP_ARM);
3725    }
3726
3727  do
3728    {
3729      expressionS exp;
3730
3731      expression (& exp);
3732
3733      if (! emit_insn (& exp, nbytes))
3734	{
3735	  ignore_rest_of_line ();
3736	  return;
3737	}
3738    }
3739  while (*input_line_pointer++ == ',');
3740
3741  /* Put terminator back into stream.  */
3742  input_line_pointer --;
3743  demand_empty_rest_of_line ();
3744}
3745
3746/* Parse a .rel31 directive.  */
3747
3748static void
3749s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
3750{
3751  expressionS exp;
3752  char *p;
3753  valueT highbit;
3754
3755  highbit = 0;
3756  if (*input_line_pointer == '1')
3757    highbit = 0x80000000;
3758  else if (*input_line_pointer != '0')
3759    as_bad (_("expected 0 or 1"));
3760
3761  input_line_pointer++;
3762  if (*input_line_pointer != ',')
3763    as_bad (_("missing comma"));
3764  input_line_pointer++;
3765
3766#ifdef md_flush_pending_output
3767  md_flush_pending_output ();
3768#endif
3769
3770#ifdef md_cons_align
3771  md_cons_align (4);
3772#endif
3773
3774  mapping_state (MAP_DATA);
3775
3776  expression (&exp);
3777
3778  p = frag_more (4);
3779  md_number_to_chars (p, highbit, 4);
3780  fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3781	       BFD_RELOC_ARM_PREL31);
3782
3783  demand_empty_rest_of_line ();
3784}
3785
3786/* Directives: AEABI stack-unwind tables.  */
3787
3788/* Parse an unwind_fnstart directive.  Simply records the current location.  */
3789
3790static void
3791s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3792{
3793  demand_empty_rest_of_line ();
3794  if (unwind.proc_start)
3795    {
3796      as_bad (_("duplicate .fnstart directive"));
3797      return;
3798    }
3799
3800  /* Mark the start of the function.  */
3801  unwind.proc_start = expr_build_dot ();
3802
3803  /* Reset the rest of the unwind info.	 */
3804  unwind.opcode_count = 0;
3805  unwind.table_entry = NULL;
3806  unwind.personality_routine = NULL;
3807  unwind.personality_index = -1;
3808  unwind.frame_size = 0;
3809  unwind.fp_offset = 0;
3810  unwind.fp_reg = REG_SP;
3811  unwind.fp_used = 0;
3812  unwind.sp_restored = 0;
3813}
3814
3815
3816/* Parse a handlerdata directive.  Creates the exception handling table entry
3817   for the function.  */
3818
3819static void
3820s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3821{
3822  demand_empty_rest_of_line ();
3823  if (!unwind.proc_start)
3824    as_bad (MISSING_FNSTART);
3825
3826  if (unwind.table_entry)
3827    as_bad (_("duplicate .handlerdata directive"));
3828
3829  create_unwind_entry (1);
3830}
3831
3832/* Parse an unwind_fnend directive.  Generates the index table entry.  */
3833
3834static void
3835s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3836{
3837  long where;
3838  char *ptr;
3839  valueT val;
3840  unsigned int marked_pr_dependency;
3841
3842  demand_empty_rest_of_line ();
3843
3844  if (!unwind.proc_start)
3845    {
3846      as_bad (_(".fnend directive without .fnstart"));
3847      return;
3848    }
3849
3850  /* Add eh table entry.  */
3851  if (unwind.table_entry == NULL)
3852    val = create_unwind_entry (0);
3853  else
3854    val = 0;
3855
3856  /* Add index table entry.  This is two words.	 */
3857  start_unwind_section (unwind.saved_seg, 1);
3858  frag_align (2, 0, 0);
3859  record_alignment (now_seg, 2);
3860
3861  ptr = frag_more (8);
3862  memset (ptr, 0, 8);
3863  where = frag_now_fix () - 8;
3864
3865  /* Self relative offset of the function start.  */
3866  fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3867	   BFD_RELOC_ARM_PREL31);
3868
3869  /* Indicate dependency on EHABI-defined personality routines to the
3870     linker, if it hasn't been done already.  */
3871  marked_pr_dependency
3872    = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
3873  if (unwind.personality_index >= 0 && unwind.personality_index < 3
3874      && !(marked_pr_dependency & (1 << unwind.personality_index)))
3875    {
3876      static const char *const name[] =
3877	{
3878	  "__aeabi_unwind_cpp_pr0",
3879	  "__aeabi_unwind_cpp_pr1",
3880	  "__aeabi_unwind_cpp_pr2"
3881	};
3882      symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3883      fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
3884      seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
3885	|= 1 << unwind.personality_index;
3886    }
3887
3888  if (val)
3889    /* Inline exception table entry.  */
3890    md_number_to_chars (ptr + 4, val, 4);
3891  else
3892    /* Self relative offset of the table entry.	 */
3893    fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3894	     BFD_RELOC_ARM_PREL31);
3895
3896  /* Restore the original section.  */
3897  subseg_set (unwind.saved_seg, unwind.saved_subseg);
3898
3899  unwind.proc_start = NULL;
3900}
3901
3902
3903/* Parse an unwind_cantunwind directive.  */
3904
3905static void
3906s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3907{
3908  demand_empty_rest_of_line ();
3909  if (!unwind.proc_start)
3910    as_bad (MISSING_FNSTART);
3911
3912  if (unwind.personality_routine || unwind.personality_index != -1)
3913    as_bad (_("personality routine specified for cantunwind frame"));
3914
3915  unwind.personality_index = -2;
3916}
3917
3918
3919/* Parse a personalityindex directive.	*/
3920
3921static void
3922s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3923{
3924  expressionS exp;
3925
3926  if (!unwind.proc_start)
3927    as_bad (MISSING_FNSTART);
3928
3929  if (unwind.personality_routine || unwind.personality_index != -1)
3930    as_bad (_("duplicate .personalityindex directive"));
3931
3932  expression (&exp);
3933
3934  if (exp.X_op != O_constant
3935      || exp.X_add_number < 0 || exp.X_add_number > 15)
3936    {
3937      as_bad (_("bad personality routine number"));
3938      ignore_rest_of_line ();
3939      return;
3940    }
3941
3942  unwind.personality_index = exp.X_add_number;
3943
3944  demand_empty_rest_of_line ();
3945}
3946
3947
3948/* Parse a personality directive.  */
3949
3950static void
3951s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3952{
3953  char *name, *p, c;
3954
3955  if (!unwind.proc_start)
3956    as_bad (MISSING_FNSTART);
3957
3958  if (unwind.personality_routine || unwind.personality_index != -1)
3959    as_bad (_("duplicate .personality directive"));
3960
3961  c = get_symbol_name (& name);
3962  p = input_line_pointer;
3963  if (c == '"')
3964    ++ input_line_pointer;
3965  unwind.personality_routine = symbol_find_or_make (name);
3966  *p = c;
3967  demand_empty_rest_of_line ();
3968}
3969
3970
3971/* Parse a directive saving core registers.  */
3972
3973static void
3974s_arm_unwind_save_core (void)
3975{
3976  valueT op;
3977  long range;
3978  int n;
3979
3980  range = parse_reg_list (&input_line_pointer);
3981  if (range == FAIL)
3982    {
3983      as_bad (_("expected register list"));
3984      ignore_rest_of_line ();
3985      return;
3986    }
3987
3988  demand_empty_rest_of_line ();
3989
3990  /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3991     into .unwind_save {..., sp...}.  We aren't bothered about the value of
3992     ip because it is clobbered by calls.  */
3993  if (unwind.sp_restored && unwind.fp_reg == 12
3994      && (range & 0x3000) == 0x1000)
3995    {
3996      unwind.opcode_count--;
3997      unwind.sp_restored = 0;
3998      range = (range | 0x2000) & ~0x1000;
3999      unwind.pending_offset = 0;
4000    }
4001
4002  /* Pop r4-r15.  */
4003  if (range & 0xfff0)
4004    {
4005      /* See if we can use the short opcodes.  These pop a block of up to 8
4006	 registers starting with r4, plus maybe r14.  */
4007      for (n = 0; n < 8; n++)
4008	{
4009	  /* Break at the first non-saved register.	 */
4010	  if ((range & (1 << (n + 4))) == 0)
4011	    break;
4012	}
4013      /* See if there are any other bits set.  */
4014      if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
4015	{
4016	  /* Use the long form.  */
4017	  op = 0x8000 | ((range >> 4) & 0xfff);
4018	  add_unwind_opcode (op, 2);
4019	}
4020      else
4021	{
4022	  /* Use the short form.  */
4023	  if (range & 0x4000)
4024	    op = 0xa8; /* Pop r14.	*/
4025	  else
4026	    op = 0xa0; /* Do not pop r14.  */
4027	  op |= (n - 1);
4028	  add_unwind_opcode (op, 1);
4029	}
4030    }
4031
4032  /* Pop r0-r3.	 */
4033  if (range & 0xf)
4034    {
4035      op = 0xb100 | (range & 0xf);
4036      add_unwind_opcode (op, 2);
4037    }
4038
4039  /* Record the number of bytes pushed.	 */
4040  for (n = 0; n < 16; n++)
4041    {
4042      if (range & (1 << n))
4043	unwind.frame_size += 4;
4044    }
4045}
4046
4047
4048/* Parse a directive saving FPA registers.  */
4049
4050static void
4051s_arm_unwind_save_fpa (int reg)
4052{
4053  expressionS exp;
4054  int num_regs;
4055  valueT op;
4056
4057  /* Get Number of registers to transfer.  */
4058  if (skip_past_comma (&input_line_pointer) != FAIL)
4059    expression (&exp);
4060  else
4061    exp.X_op = O_illegal;
4062
4063  if (exp.X_op != O_constant)
4064    {
4065      as_bad (_("expected , <constant>"));
4066      ignore_rest_of_line ();
4067      return;
4068    }
4069
4070  num_regs = exp.X_add_number;
4071
4072  if (num_regs < 1 || num_regs > 4)
4073    {
4074      as_bad (_("number of registers must be in the range [1:4]"));
4075      ignore_rest_of_line ();
4076      return;
4077    }
4078
4079  demand_empty_rest_of_line ();
4080
4081  if (reg == 4)
4082    {
4083      /* Short form.  */
4084      op = 0xb4 | (num_regs - 1);
4085      add_unwind_opcode (op, 1);
4086    }
4087  else
4088    {
4089      /* Long form.  */
4090      op = 0xc800 | (reg << 4) | (num_regs - 1);
4091      add_unwind_opcode (op, 2);
4092    }
4093  unwind.frame_size += num_regs * 12;
4094}
4095
4096
4097/* Parse a directive saving VFP registers for ARMv6 and above.  */
4098
4099static void
4100s_arm_unwind_save_vfp_armv6 (void)
4101{
4102  int count;
4103  unsigned int start;
4104  valueT op;
4105  int num_vfpv3_regs = 0;
4106  int num_regs_below_16;
4107
4108  count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
4109  if (count == FAIL)
4110    {
4111      as_bad (_("expected register list"));
4112      ignore_rest_of_line ();
4113      return;
4114    }
4115
4116  demand_empty_rest_of_line ();
4117
4118  /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
4119     than FSTMX/FLDMX-style ones).  */
4120
4121  /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31.  */
4122  if (start >= 16)
4123    num_vfpv3_regs = count;
4124  else if (start + count > 16)
4125    num_vfpv3_regs = start + count - 16;
4126
4127  if (num_vfpv3_regs > 0)
4128    {
4129      int start_offset = start > 16 ? start - 16 : 0;
4130      op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
4131      add_unwind_opcode (op, 2);
4132    }
4133
4134  /* Generate opcode for registers numbered in the range 0 .. 15.  */
4135  num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
4136  gas_assert (num_regs_below_16 + num_vfpv3_regs == count);
4137  if (num_regs_below_16 > 0)
4138    {
4139      op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
4140      add_unwind_opcode (op, 2);
4141    }
4142
4143  unwind.frame_size += count * 8;
4144}
4145
4146
4147/* Parse a directive saving VFP registers for pre-ARMv6.  */
4148
4149static void
4150s_arm_unwind_save_vfp (void)
4151{
4152  int count;
4153  unsigned int reg;
4154  valueT op;
4155
4156  count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
4157  if (count == FAIL)
4158    {
4159      as_bad (_("expected register list"));
4160      ignore_rest_of_line ();
4161      return;
4162    }
4163
4164  demand_empty_rest_of_line ();
4165
4166  if (reg == 8)
4167    {
4168      /* Short form.  */
4169      op = 0xb8 | (count - 1);
4170      add_unwind_opcode (op, 1);
4171    }
4172  else
4173    {
4174      /* Long form.  */
4175      op = 0xb300 | (reg << 4) | (count - 1);
4176      add_unwind_opcode (op, 2);
4177    }
4178  unwind.frame_size += count * 8 + 4;
4179}
4180
4181
4182/* Parse a directive saving iWMMXt data registers.  */
4183
4184static void
4185s_arm_unwind_save_mmxwr (void)
4186{
4187  int reg;
4188  int hi_reg;
4189  int i;
4190  unsigned mask = 0;
4191  valueT op;
4192
4193  if (*input_line_pointer == '{')
4194    input_line_pointer++;
4195
4196  do
4197    {
4198      reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
4199
4200      if (reg == FAIL)
4201	{
4202	  as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
4203	  goto error;
4204	}
4205
4206      if (mask >> reg)
4207	as_tsktsk (_("register list not in ascending order"));
4208      mask |= 1 << reg;
4209
4210      if (*input_line_pointer == '-')
4211	{
4212	  input_line_pointer++;
4213	  hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
4214	  if (hi_reg == FAIL)
4215	    {
4216	      as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
4217	      goto error;
4218	    }
4219	  else if (reg >= hi_reg)
4220	    {
4221	      as_bad (_("bad register range"));
4222	      goto error;
4223	    }
4224	  for (; reg < hi_reg; reg++)
4225	    mask |= 1 << reg;
4226	}
4227    }
4228  while (skip_past_comma (&input_line_pointer) != FAIL);
4229
4230  skip_past_char (&input_line_pointer, '}');
4231
4232  demand_empty_rest_of_line ();
4233
4234  /* Generate any deferred opcodes because we're going to be looking at
4235     the list.	*/
4236  flush_pending_unwind ();
4237
4238  for (i = 0; i < 16; i++)
4239    {
4240      if (mask & (1 << i))
4241	unwind.frame_size += 8;
4242    }
4243
4244  /* Attempt to combine with a previous opcode.	 We do this because gcc
4245     likes to output separate unwind directives for a single block of
4246     registers.	 */
4247  if (unwind.opcode_count > 0)
4248    {
4249      i = unwind.opcodes[unwind.opcode_count - 1];
4250      if ((i & 0xf8) == 0xc0)
4251	{
4252	  i &= 7;
4253	  /* Only merge if the blocks are contiguous.  */
4254	  if (i < 6)
4255	    {
4256	      if ((mask & 0xfe00) == (1 << 9))
4257		{
4258		  mask |= ((1 << (i + 11)) - 1) & 0xfc00;
4259		  unwind.opcode_count--;
4260		}
4261	    }
4262	  else if (i == 6 && unwind.opcode_count >= 2)
4263	    {
4264	      i = unwind.opcodes[unwind.opcode_count - 2];
4265	      reg = i >> 4;
4266	      i &= 0xf;
4267
4268	      op = 0xffff << (reg - 1);
4269	      if (reg > 0
4270		  && ((mask & op) == (1u << (reg - 1))))
4271		{
4272		  op = (1 << (reg + i + 1)) - 1;
4273		  op &= ~((1 << reg) - 1);
4274		  mask |= op;
4275		  unwind.opcode_count -= 2;
4276		}
4277	    }
4278	}
4279    }
4280
4281  hi_reg = 15;
4282  /* We want to generate opcodes in the order the registers have been
4283     saved, ie. descending order.  */
4284  for (reg = 15; reg >= -1; reg--)
4285    {
4286      /* Save registers in blocks.  */
4287      if (reg < 0
4288	  || !(mask & (1 << reg)))
4289	{
4290	  /* We found an unsaved reg.  Generate opcodes to save the
4291	     preceding block.	*/
4292	  if (reg != hi_reg)
4293	    {
4294	      if (reg == 9)
4295		{
4296		  /* Short form.  */
4297		  op = 0xc0 | (hi_reg - 10);
4298		  add_unwind_opcode (op, 1);
4299		}
4300	      else
4301		{
4302		  /* Long form.	 */
4303		  op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
4304		  add_unwind_opcode (op, 2);
4305		}
4306	    }
4307	  hi_reg = reg - 1;
4308	}
4309    }
4310
4311  return;
4312error:
4313  ignore_rest_of_line ();
4314}
4315
4316static void
4317s_arm_unwind_save_mmxwcg (void)
4318{
4319  int reg;
4320  int hi_reg;
4321  unsigned mask = 0;
4322  valueT op;
4323
4324  if (*input_line_pointer == '{')
4325    input_line_pointer++;
4326
4327  skip_whitespace (input_line_pointer);
4328
4329  do
4330    {
4331      reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
4332
4333      if (reg == FAIL)
4334	{
4335	  as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
4336	  goto error;
4337	}
4338
4339      reg -= 8;
4340      if (mask >> reg)
4341	as_tsktsk (_("register list not in ascending order"));
4342      mask |= 1 << reg;
4343
4344      if (*input_line_pointer == '-')
4345	{
4346	  input_line_pointer++;
4347	  hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
4348	  if (hi_reg == FAIL)
4349	    {
4350	      as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
4351	      goto error;
4352	    }
4353	  else if (reg >= hi_reg)
4354	    {
4355	      as_bad (_("bad register range"));
4356	      goto error;
4357	    }
4358	  for (; reg < hi_reg; reg++)
4359	    mask |= 1 << reg;
4360	}
4361    }
4362  while (skip_past_comma (&input_line_pointer) != FAIL);
4363
4364  skip_past_char (&input_line_pointer, '}');
4365
4366  demand_empty_rest_of_line ();
4367
4368  /* Generate any deferred opcodes because we're going to be looking at
4369     the list.	*/
4370  flush_pending_unwind ();
4371
4372  for (reg = 0; reg < 16; reg++)
4373    {
4374      if (mask & (1 << reg))
4375	unwind.frame_size += 4;
4376    }
4377  op = 0xc700 | mask;
4378  add_unwind_opcode (op, 2);
4379  return;
4380error:
4381  ignore_rest_of_line ();
4382}
4383
4384
4385/* Parse an unwind_save directive.
4386   If the argument is non-zero, this is a .vsave directive.  */
4387
4388static void
4389s_arm_unwind_save (int arch_v6)
4390{
4391  char *peek;
4392  struct reg_entry *reg;
4393  bfd_boolean had_brace = FALSE;
4394
4395  if (!unwind.proc_start)
4396    as_bad (MISSING_FNSTART);
4397
4398  /* Figure out what sort of save we have.  */
4399  peek = input_line_pointer;
4400
4401  if (*peek == '{')
4402    {
4403      had_brace = TRUE;
4404      peek++;
4405    }
4406
4407  reg = arm_reg_parse_multi (&peek);
4408
4409  if (!reg)
4410    {
4411      as_bad (_("register expected"));
4412      ignore_rest_of_line ();
4413      return;
4414    }
4415
4416  switch (reg->type)
4417    {
4418    case REG_TYPE_FN:
4419      if (had_brace)
4420	{
4421	  as_bad (_("FPA .unwind_save does not take a register list"));
4422	  ignore_rest_of_line ();
4423	  return;
4424	}
4425      input_line_pointer = peek;
4426      s_arm_unwind_save_fpa (reg->number);
4427      return;
4428
4429    case REG_TYPE_RN:
4430      s_arm_unwind_save_core ();
4431      return;
4432
4433    case REG_TYPE_VFD:
4434      if (arch_v6)
4435	s_arm_unwind_save_vfp_armv6 ();
4436      else
4437	s_arm_unwind_save_vfp ();
4438      return;
4439
4440    case REG_TYPE_MMXWR:
4441      s_arm_unwind_save_mmxwr ();
4442      return;
4443
4444    case REG_TYPE_MMXWCG:
4445      s_arm_unwind_save_mmxwcg ();
4446      return;
4447
4448    default:
4449      as_bad (_(".unwind_save does not support this kind of register"));
4450      ignore_rest_of_line ();
4451    }
4452}
4453
4454
4455/* Parse an unwind_movsp directive.  */
4456
4457static void
4458s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
4459{
4460  int reg;
4461  valueT op;
4462  int offset;
4463
4464  if (!unwind.proc_start)
4465    as_bad (MISSING_FNSTART);
4466
4467  reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4468  if (reg == FAIL)
4469    {
4470      as_bad ("%s", _(reg_expected_msgs[REG_TYPE_RN]));
4471      ignore_rest_of_line ();
4472      return;
4473    }
4474
4475  /* Optional constant.	 */
4476  if (skip_past_comma (&input_line_pointer) != FAIL)
4477    {
4478      if (immediate_for_directive (&offset) == FAIL)
4479	return;
4480    }
4481  else
4482    offset = 0;
4483
4484  demand_empty_rest_of_line ();
4485
4486  if (reg == REG_SP || reg == REG_PC)
4487    {
4488      as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
4489      return;
4490    }
4491
4492  if (unwind.fp_reg != REG_SP)
4493    as_bad (_("unexpected .unwind_movsp directive"));
4494
4495  /* Generate opcode to restore the value.  */
4496  op = 0x90 | reg;
4497  add_unwind_opcode (op, 1);
4498
4499  /* Record the information for later.	*/
4500  unwind.fp_reg = reg;
4501  unwind.fp_offset = unwind.frame_size - offset;
4502  unwind.sp_restored = 1;
4503}
4504
4505/* Parse an unwind_pad directive.  */
4506
4507static void
4508s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
4509{
4510  int offset;
4511
4512  if (!unwind.proc_start)
4513    as_bad (MISSING_FNSTART);
4514
4515  if (immediate_for_directive (&offset) == FAIL)
4516    return;
4517
4518  if (offset & 3)
4519    {
4520      as_bad (_("stack increment must be multiple of 4"));
4521      ignore_rest_of_line ();
4522      return;
4523    }
4524
4525  /* Don't generate any opcodes, just record the details for later.  */
4526  unwind.frame_size += offset;
4527  unwind.pending_offset += offset;
4528
4529  demand_empty_rest_of_line ();
4530}
4531
4532/* Parse an unwind_setfp directive.  */
4533
4534static void
4535s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
4536{
4537  int sp_reg;
4538  int fp_reg;
4539  int offset;
4540
4541  if (!unwind.proc_start)
4542    as_bad (MISSING_FNSTART);
4543
4544  fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4545  if (skip_past_comma (&input_line_pointer) == FAIL)
4546    sp_reg = FAIL;
4547  else
4548    sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
4549
4550  if (fp_reg == FAIL || sp_reg == FAIL)
4551    {
4552      as_bad (_("expected <reg>, <reg>"));
4553      ignore_rest_of_line ();
4554      return;
4555    }
4556
4557  /* Optional constant.	 */
4558  if (skip_past_comma (&input_line_pointer) != FAIL)
4559    {
4560      if (immediate_for_directive (&offset) == FAIL)
4561	return;
4562    }
4563  else
4564    offset = 0;
4565
4566  demand_empty_rest_of_line ();
4567
4568  if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
4569    {
4570      as_bad (_("register must be either sp or set by a previous"
4571		"unwind_movsp directive"));
4572      return;
4573    }
4574
4575  /* Don't generate any opcodes, just record the information for later.	 */
4576  unwind.fp_reg = fp_reg;
4577  unwind.fp_used = 1;
4578  if (sp_reg == REG_SP)
4579    unwind.fp_offset = unwind.frame_size - offset;
4580  else
4581    unwind.fp_offset -= offset;
4582}
4583
4584/* Parse an unwind_raw directive.  */
4585
4586static void
4587s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
4588{
4589  expressionS exp;
4590  /* This is an arbitrary limit.	 */
4591  unsigned char op[16];
4592  int count;
4593
4594  if (!unwind.proc_start)
4595    as_bad (MISSING_FNSTART);
4596
4597  expression (&exp);
4598  if (exp.X_op == O_constant
4599      && skip_past_comma (&input_line_pointer) != FAIL)
4600    {
4601      unwind.frame_size += exp.X_add_number;
4602      expression (&exp);
4603    }
4604  else
4605    exp.X_op = O_illegal;
4606
4607  if (exp.X_op != O_constant)
4608    {
4609      as_bad (_("expected <offset>, <opcode>"));
4610      ignore_rest_of_line ();
4611      return;
4612    }
4613
4614  count = 0;
4615
4616  /* Parse the opcode.	*/
4617  for (;;)
4618    {
4619      if (count >= 16)
4620	{
4621	  as_bad (_("unwind opcode too long"));
4622	  ignore_rest_of_line ();
4623	}
4624      if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
4625	{
4626	  as_bad (_("invalid unwind opcode"));
4627	  ignore_rest_of_line ();
4628	  return;
4629	}
4630      op[count++] = exp.X_add_number;
4631
4632      /* Parse the next byte.  */
4633      if (skip_past_comma (&input_line_pointer) == FAIL)
4634	break;
4635
4636      expression (&exp);
4637    }
4638
4639  /* Add the opcode bytes in reverse order.  */
4640  while (count--)
4641    add_unwind_opcode (op[count], 1);
4642
4643  demand_empty_rest_of_line ();
4644}
4645
4646
4647/* Parse a .eabi_attribute directive.  */
4648
4649static void
4650s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
4651{
4652  int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
4653
4654  if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4655    attributes_set_explicitly[tag] = 1;
4656}
4657
4658/* Emit a tls fix for the symbol.  */
4659
4660static void
4661s_arm_tls_descseq (int ignored ATTRIBUTE_UNUSED)
4662{
4663  char *p;
4664  expressionS exp;
4665#ifdef md_flush_pending_output
4666  md_flush_pending_output ();
4667#endif
4668
4669#ifdef md_cons_align
4670  md_cons_align (4);
4671#endif
4672
4673  /* Since we're just labelling the code, there's no need to define a
4674     mapping symbol.  */
4675  expression (&exp);
4676  p = obstack_next_free (&frchain_now->frch_obstack);
4677  fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
4678	       thumb_mode ? BFD_RELOC_ARM_THM_TLS_DESCSEQ
4679	       : BFD_RELOC_ARM_TLS_DESCSEQ);
4680}
4681#endif /* OBJ_ELF */
4682
4683static void s_arm_arch (int);
4684static void s_arm_object_arch (int);
4685static void s_arm_cpu (int);
4686static void s_arm_fpu (int);
4687static void s_arm_arch_extension (int);
4688
4689#ifdef TE_PE
4690
4691static void
4692pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
4693{
4694  expressionS exp;
4695
4696  do
4697    {
4698      expression (&exp);
4699      if (exp.X_op == O_symbol)
4700	exp.X_op = O_secrel;
4701
4702      emit_expr (&exp, 4);
4703    }
4704  while (*input_line_pointer++ == ',');
4705
4706  input_line_pointer--;
4707  demand_empty_rest_of_line ();
4708}
4709#endif /* TE_PE */
4710
4711/* This table describes all the machine specific pseudo-ops the assembler
4712   has to support.  The fields are:
4713     pseudo-op name without dot
4714     function to call to execute this pseudo-op
4715     Integer arg to pass to the function.  */
4716
4717const pseudo_typeS md_pseudo_table[] =
4718{
4719  /* Never called because '.req' does not start a line.	 */
4720  { "req",	   s_req,	  0 },
4721  /* Following two are likewise never called.  */
4722  { "dn",	   s_dn,          0 },
4723  { "qn",          s_qn,          0 },
4724  { "unreq",	   s_unreq,	  0 },
4725  { "bss",	   s_bss,	  0 },
4726  { "align",	   s_align_ptwo,  2 },
4727  { "arm",	   s_arm,	  0 },
4728  { "thumb",	   s_thumb,	  0 },
4729  { "code",	   s_code,	  0 },
4730  { "force_thumb", s_force_thumb, 0 },
4731  { "thumb_func",  s_thumb_func,  0 },
4732  { "thumb_set",   s_thumb_set,	  0 },
4733  { "even",	   s_even,	  0 },
4734  { "ltorg",	   s_ltorg,	  0 },
4735  { "pool",	   s_ltorg,	  0 },
4736  { "syntax",	   s_syntax,	  0 },
4737  { "cpu",	   s_arm_cpu,	  0 },
4738  { "arch",	   s_arm_arch,	  0 },
4739  { "object_arch", s_arm_object_arch,	0 },
4740  { "fpu",	   s_arm_fpu,	  0 },
4741  { "arch_extension", s_arm_arch_extension, 0 },
4742#ifdef OBJ_ELF
4743  { "word",	        s_arm_elf_cons, 4 },
4744  { "long",	        s_arm_elf_cons, 4 },
4745  { "inst.n",           s_arm_elf_inst, 2 },
4746  { "inst.w",           s_arm_elf_inst, 4 },
4747  { "inst",             s_arm_elf_inst, 0 },
4748  { "rel31",	        s_arm_rel31,	  0 },
4749  { "fnstart",		s_arm_unwind_fnstart,	0 },
4750  { "fnend",		s_arm_unwind_fnend,	0 },
4751  { "cantunwind",	s_arm_unwind_cantunwind, 0 },
4752  { "personality",	s_arm_unwind_personality, 0 },
4753  { "personalityindex",	s_arm_unwind_personalityindex, 0 },
4754  { "handlerdata",	s_arm_unwind_handlerdata, 0 },
4755  { "save",		s_arm_unwind_save,	0 },
4756  { "vsave",		s_arm_unwind_save,	1 },
4757  { "movsp",		s_arm_unwind_movsp,	0 },
4758  { "pad",		s_arm_unwind_pad,	0 },
4759  { "setfp",		s_arm_unwind_setfp,	0 },
4760  { "unwind_raw",	s_arm_unwind_raw,	0 },
4761  { "eabi_attribute",	s_arm_eabi_attribute,	0 },
4762  { "tlsdescseq",	s_arm_tls_descseq,      0 },
4763#else
4764  { "word",	   cons, 4},
4765
4766  /* These are used for dwarf.  */
4767  {"2byte", cons, 2},
4768  {"4byte", cons, 4},
4769  {"8byte", cons, 8},
4770  /* These are used for dwarf2.  */
4771  { "file", dwarf2_directive_file, 0 },
4772  { "loc",  dwarf2_directive_loc,  0 },
4773  { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
4774#endif
4775  { "extend",	   float_cons, 'x' },
4776  { "ldouble",	   float_cons, 'x' },
4777  { "packed",	   float_cons, 'p' },
4778#ifdef TE_PE
4779  {"secrel32", pe_directive_secrel, 0},
4780#endif
4781
4782  /* These are for compatibility with CodeComposer Studio.  */
4783  {"ref",          s_ccs_ref,        0},
4784  {"def",          s_ccs_def,        0},
4785  {"asmfunc",      s_ccs_asmfunc,    0},
4786  {"endasmfunc",   s_ccs_endasmfunc, 0},
4787
4788  { 0, 0, 0 }
4789};
4790
4791/* Parser functions used exclusively in instruction operands.  */
4792
4793/* Generic immediate-value read function for use in insn parsing.
4794   STR points to the beginning of the immediate (the leading #);
4795   VAL receives the value; if the value is outside [MIN, MAX]
4796   issue an error.  PREFIX_OPT is true if the immediate prefix is
4797   optional.  */
4798
4799static int
4800parse_immediate (char **str, int *val, int min, int max,
4801		 bfd_boolean prefix_opt)
4802{
4803  expressionS exp;
4804
4805  my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
4806  if (exp.X_op != O_constant)
4807    {
4808      inst.error = _("constant expression required");
4809      return FAIL;
4810    }
4811
4812  if (exp.X_add_number < min || exp.X_add_number > max)
4813    {
4814      inst.error = _("immediate value out of range");
4815      return FAIL;
4816    }
4817
4818  *val = exp.X_add_number;
4819  return SUCCESS;
4820}
4821
4822/* Less-generic immediate-value read function with the possibility of loading a
4823   big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
4824   instructions. Puts the result directly in inst.operands[i].  */
4825
4826static int
4827parse_big_immediate (char **str, int i, expressionS *in_exp,
4828		     bfd_boolean allow_symbol_p)
4829{
4830  expressionS exp;
4831  expressionS *exp_p = in_exp ? in_exp : &exp;
4832  char *ptr = *str;
4833
4834  my_get_expression (exp_p, &ptr, GE_OPT_PREFIX_BIG);
4835
4836  if (exp_p->X_op == O_constant)
4837    {
4838      inst.operands[i].imm = exp_p->X_add_number & 0xffffffff;
4839      /* If we're on a 64-bit host, then a 64-bit number can be returned using
4840	 O_constant.  We have to be careful not to break compilation for
4841	 32-bit X_add_number, though.  */
4842      if ((exp_p->X_add_number & ~(offsetT)(0xffffffffU)) != 0)
4843	{
4844	  /* X >> 32 is illegal if sizeof (exp_p->X_add_number) == 4.  */
4845	  inst.operands[i].reg = (((exp_p->X_add_number >> 16) >> 16)
4846				  & 0xffffffff);
4847	  inst.operands[i].regisimm = 1;
4848	}
4849    }
4850  else if (exp_p->X_op == O_big
4851	   && LITTLENUM_NUMBER_OF_BITS * exp_p->X_add_number > 32)
4852    {
4853      unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
4854
4855      /* Bignums have their least significant bits in
4856	 generic_bignum[0]. Make sure we put 32 bits in imm and
4857	 32 bits in reg,  in a (hopefully) portable way.  */
4858      gas_assert (parts != 0);
4859
4860      /* Make sure that the number is not too big.
4861	 PR 11972: Bignums can now be sign-extended to the
4862	 size of a .octa so check that the out of range bits
4863	 are all zero or all one.  */
4864      if (LITTLENUM_NUMBER_OF_BITS * exp_p->X_add_number > 64)
4865	{
4866	  LITTLENUM_TYPE m = -1;
4867
4868	  if (generic_bignum[parts * 2] != 0
4869	      && generic_bignum[parts * 2] != m)
4870	    return FAIL;
4871
4872	  for (j = parts * 2 + 1; j < (unsigned) exp_p->X_add_number; j++)
4873	    if (generic_bignum[j] != generic_bignum[j-1])
4874	      return FAIL;
4875	}
4876
4877      inst.operands[i].imm = 0;
4878      for (j = 0; j < parts; j++, idx++)
4879	inst.operands[i].imm |= generic_bignum[idx]
4880				<< (LITTLENUM_NUMBER_OF_BITS * j);
4881      inst.operands[i].reg = 0;
4882      for (j = 0; j < parts; j++, idx++)
4883	inst.operands[i].reg |= generic_bignum[idx]
4884				<< (LITTLENUM_NUMBER_OF_BITS * j);
4885      inst.operands[i].regisimm = 1;
4886    }
4887  else if (!(exp_p->X_op == O_symbol && allow_symbol_p))
4888    return FAIL;
4889
4890  *str = ptr;
4891
4892  return SUCCESS;
4893}
4894
4895/* Returns the pseudo-register number of an FPA immediate constant,
4896   or FAIL if there isn't a valid constant here.  */
4897
4898static int
4899parse_fpa_immediate (char ** str)
4900{
4901  LITTLENUM_TYPE words[MAX_LITTLENUMS];
4902  char *	 save_in;
4903  expressionS	 exp;
4904  int		 i;
4905  int		 j;
4906
4907  /* First try and match exact strings, this is to guarantee
4908     that some formats will work even for cross assembly.  */
4909
4910  for (i = 0; fp_const[i]; i++)
4911    {
4912      if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
4913	{
4914	  char *start = *str;
4915
4916	  *str += strlen (fp_const[i]);
4917	  if (is_end_of_line[(unsigned char) **str])
4918	    return i + 8;
4919	  *str = start;
4920	}
4921    }
4922
4923  /* Just because we didn't get a match doesn't mean that the constant
4924     isn't valid, just that it is in a format that we don't
4925     automatically recognize.  Try parsing it with the standard
4926     expression routines.  */
4927
4928  memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
4929
4930  /* Look for a raw floating point number.  */
4931  if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4932      && is_end_of_line[(unsigned char) *save_in])
4933    {
4934      for (i = 0; i < NUM_FLOAT_VALS; i++)
4935	{
4936	  for (j = 0; j < MAX_LITTLENUMS; j++)
4937	    {
4938	      if (words[j] != fp_values[i][j])
4939		break;
4940	    }
4941
4942	  if (j == MAX_LITTLENUMS)
4943	    {
4944	      *str = save_in;
4945	      return i + 8;
4946	    }
4947	}
4948    }
4949
4950  /* Try and parse a more complex expression, this will probably fail
4951     unless the code uses a floating point prefix (eg "0f").  */
4952  save_in = input_line_pointer;
4953  input_line_pointer = *str;
4954  if (expression (&exp) == absolute_section
4955      && exp.X_op == O_big
4956      && exp.X_add_number < 0)
4957    {
4958      /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4959	 Ditto for 15.	*/
4960#define X_PRECISION 5
4961#define E_PRECISION 15L
4962      if (gen_to_words (words, X_PRECISION, E_PRECISION) == 0)
4963	{
4964	  for (i = 0; i < NUM_FLOAT_VALS; i++)
4965	    {
4966	      for (j = 0; j < MAX_LITTLENUMS; j++)
4967		{
4968		  if (words[j] != fp_values[i][j])
4969		    break;
4970		}
4971
4972	      if (j == MAX_LITTLENUMS)
4973		{
4974		  *str = input_line_pointer;
4975		  input_line_pointer = save_in;
4976		  return i + 8;
4977		}
4978	    }
4979	}
4980    }
4981
4982  *str = input_line_pointer;
4983  input_line_pointer = save_in;
4984  inst.error = _("invalid FPA immediate expression");
4985  return FAIL;
4986}
4987
4988/* Returns 1 if a number has "quarter-precision" float format
4989   0baBbbbbbc defgh000 00000000 00000000.  */
4990
4991static int
4992is_quarter_float (unsigned imm)
4993{
4994  int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4995  return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4996}
4997
4998
4999/* Detect the presence of a floating point or integer zero constant,
5000   i.e. #0.0 or #0.  */
5001
5002static bfd_boolean
5003parse_ifimm_zero (char **in)
5004{
5005  int error_code;
5006
5007  if (!is_immediate_prefix (**in))
5008    {
5009      /* In unified syntax, all prefixes are optional.  */
5010      if (!unified_syntax)
5011	return FALSE;
5012    }
5013  else
5014    ++*in;
5015
5016  /* Accept #0x0 as a synonym for #0.  */
5017  if (strncmp (*in, "0x", 2) == 0)
5018    {
5019      int val;
5020      if (parse_immediate (in, &val, 0, 0, TRUE) == FAIL)
5021        return FALSE;
5022      return TRUE;
5023    }
5024
5025  error_code = atof_generic (in, ".", EXP_CHARS,
5026                             &generic_floating_point_number);
5027
5028  if (!error_code
5029      && generic_floating_point_number.sign == '+'
5030      && (generic_floating_point_number.low
5031          > generic_floating_point_number.leader))
5032    return TRUE;
5033
5034  return FALSE;
5035}
5036
5037/* Parse an 8-bit "quarter-precision" floating point number of the form:
5038   0baBbbbbbc defgh000 00000000 00000000.
5039   The zero and minus-zero cases need special handling, since they can't be
5040   encoded in the "quarter-precision" float format, but can nonetheless be
5041   loaded as integer constants.  */
5042
5043static unsigned
5044parse_qfloat_immediate (char **ccp, int *immed)
5045{
5046  char *str = *ccp;
5047  char *fpnum;
5048  LITTLENUM_TYPE words[MAX_LITTLENUMS];
5049  int found_fpchar = 0;
5050
5051  skip_past_char (&str, '#');
5052
5053  /* We must not accidentally parse an integer as a floating-point number. Make
5054     sure that the value we parse is not an integer by checking for special
5055     characters '.' or 'e'.
5056     FIXME: This is a horrible hack, but doing better is tricky because type
5057     information isn't in a very usable state at parse time.  */
5058  fpnum = str;
5059  skip_whitespace (fpnum);
5060
5061  if (strncmp (fpnum, "0x", 2) == 0)
5062    return FAIL;
5063  else
5064    {
5065      for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
5066	if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
5067	  {
5068	    found_fpchar = 1;
5069	    break;
5070	  }
5071
5072      if (!found_fpchar)
5073	return FAIL;
5074    }
5075
5076  if ((str = atof_ieee (str, 's', words)) != NULL)
5077    {
5078      unsigned fpword = 0;
5079      int i;
5080
5081      /* Our FP word must be 32 bits (single-precision FP).  */
5082      for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
5083	{
5084	  fpword <<= LITTLENUM_NUMBER_OF_BITS;
5085	  fpword |= words[i];
5086	}
5087
5088      if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
5089	*immed = fpword;
5090      else
5091	return FAIL;
5092
5093      *ccp = str;
5094
5095      return SUCCESS;
5096    }
5097
5098  return FAIL;
5099}
5100
5101/* Shift operands.  */
5102enum shift_kind
5103{
5104  SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
5105};
5106
5107struct asm_shift_name
5108{
5109  const char	  *name;
5110  enum shift_kind  kind;
5111};
5112
5113/* Third argument to parse_shift.  */
5114enum parse_shift_mode
5115{
5116  NO_SHIFT_RESTRICT,		/* Any kind of shift is accepted.  */
5117  SHIFT_IMMEDIATE,		/* Shift operand must be an immediate.	*/
5118  SHIFT_LSL_OR_ASR_IMMEDIATE,	/* Shift must be LSL or ASR immediate.	*/
5119  SHIFT_ASR_IMMEDIATE,		/* Shift must be ASR immediate.	 */
5120  SHIFT_LSL_IMMEDIATE,		/* Shift must be LSL immediate.	 */
5121};
5122
5123/* Parse a <shift> specifier on an ARM data processing instruction.
5124   This has three forms:
5125
5126     (LSL|LSR|ASL|ASR|ROR) Rs
5127     (LSL|LSR|ASL|ASR|ROR) #imm
5128     RRX
5129
5130   Note that ASL is assimilated to LSL in the instruction encoding, and
5131   RRX to ROR #0 (which cannot be written as such).  */
5132
5133static int
5134parse_shift (char **str, int i, enum parse_shift_mode mode)
5135{
5136  const struct asm_shift_name *shift_name;
5137  enum shift_kind shift;
5138  char *s = *str;
5139  char *p = s;
5140  int reg;
5141
5142  for (p = *str; ISALPHA (*p); p++)
5143    ;
5144
5145  if (p == *str)
5146    {
5147      inst.error = _("shift expression expected");
5148      return FAIL;
5149    }
5150
5151  shift_name = (const struct asm_shift_name *) hash_find_n (arm_shift_hsh, *str,
5152							    p - *str);
5153
5154  if (shift_name == NULL)
5155    {
5156      inst.error = _("shift expression expected");
5157      return FAIL;
5158    }
5159
5160  shift = shift_name->kind;
5161
5162  switch (mode)
5163    {
5164    case NO_SHIFT_RESTRICT:
5165    case SHIFT_IMMEDIATE:   break;
5166
5167    case SHIFT_LSL_OR_ASR_IMMEDIATE:
5168      if (shift != SHIFT_LSL && shift != SHIFT_ASR)
5169	{
5170	  inst.error = _("'LSL' or 'ASR' required");
5171	  return FAIL;
5172	}
5173      break;
5174
5175    case SHIFT_LSL_IMMEDIATE:
5176      if (shift != SHIFT_LSL)
5177	{
5178	  inst.error = _("'LSL' required");
5179	  return FAIL;
5180	}
5181      break;
5182
5183    case SHIFT_ASR_IMMEDIATE:
5184      if (shift != SHIFT_ASR)
5185	{
5186	  inst.error = _("'ASR' required");
5187	  return FAIL;
5188	}
5189      break;
5190
5191    default: abort ();
5192    }
5193
5194  if (shift != SHIFT_RRX)
5195    {
5196      /* Whitespace can appear here if the next thing is a bare digit.	*/
5197      skip_whitespace (p);
5198
5199      if (mode == NO_SHIFT_RESTRICT
5200	  && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5201	{
5202	  inst.operands[i].imm = reg;
5203	  inst.operands[i].immisreg = 1;
5204	}
5205      else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5206	return FAIL;
5207    }
5208  inst.operands[i].shift_kind = shift;
5209  inst.operands[i].shifted = 1;
5210  *str = p;
5211  return SUCCESS;
5212}
5213
5214/* Parse a <shifter_operand> for an ARM data processing instruction:
5215
5216      #<immediate>
5217      #<immediate>, <rotate>
5218      <Rm>
5219      <Rm>, <shift>
5220
5221   where <shift> is defined by parse_shift above, and <rotate> is a
5222   multiple of 2 between 0 and 30.  Validation of immediate operands
5223   is deferred to md_apply_fix.  */
5224
5225static int
5226parse_shifter_operand (char **str, int i)
5227{
5228  int value;
5229  expressionS exp;
5230
5231  if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
5232    {
5233      inst.operands[i].reg = value;
5234      inst.operands[i].isreg = 1;
5235
5236      /* parse_shift will override this if appropriate */
5237      inst.reloc.exp.X_op = O_constant;
5238      inst.reloc.exp.X_add_number = 0;
5239
5240      if (skip_past_comma (str) == FAIL)
5241	return SUCCESS;
5242
5243      /* Shift operation on register.  */
5244      return parse_shift (str, i, NO_SHIFT_RESTRICT);
5245    }
5246
5247  if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
5248    return FAIL;
5249
5250  if (skip_past_comma (str) == SUCCESS)
5251    {
5252      /* #x, y -- ie explicit rotation by Y.  */
5253      if (my_get_expression (&exp, str, GE_NO_PREFIX))
5254	return FAIL;
5255
5256      if (exp.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
5257	{
5258	  inst.error = _("constant expression expected");
5259	  return FAIL;
5260	}
5261
5262      value = exp.X_add_number;
5263      if (value < 0 || value > 30 || value % 2 != 0)
5264	{
5265	  inst.error = _("invalid rotation");
5266	  return FAIL;
5267	}
5268      if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
5269	{
5270	  inst.error = _("invalid constant");
5271	  return FAIL;
5272	}
5273
5274      /* Encode as specified.  */
5275      inst.operands[i].imm = inst.reloc.exp.X_add_number | value << 7;
5276      return SUCCESS;
5277    }
5278
5279  inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
5280  inst.reloc.pc_rel = 0;
5281  return SUCCESS;
5282}
5283
5284/* Group relocation information.  Each entry in the table contains the
5285   textual name of the relocation as may appear in assembler source
5286   and must end with a colon.
5287   Along with this textual name are the relocation codes to be used if
5288   the corresponding instruction is an ALU instruction (ADD or SUB only),
5289   an LDR, an LDRS, or an LDC.  */
5290
5291struct group_reloc_table_entry
5292{
5293  const char *name;
5294  int alu_code;
5295  int ldr_code;
5296  int ldrs_code;
5297  int ldc_code;
5298};
5299
5300typedef enum
5301{
5302  /* Varieties of non-ALU group relocation.  */
5303
5304  GROUP_LDR,
5305  GROUP_LDRS,
5306  GROUP_LDC
5307} group_reloc_type;
5308
5309static struct group_reloc_table_entry group_reloc_table[] =
5310  { /* Program counter relative: */
5311    { "pc_g0_nc",
5312      BFD_RELOC_ARM_ALU_PC_G0_NC,	/* ALU */
5313      0,				/* LDR */
5314      0,				/* LDRS */
5315      0 },				/* LDC */
5316    { "pc_g0",
5317      BFD_RELOC_ARM_ALU_PC_G0,		/* ALU */
5318      BFD_RELOC_ARM_LDR_PC_G0,		/* LDR */
5319      BFD_RELOC_ARM_LDRS_PC_G0,		/* LDRS */
5320      BFD_RELOC_ARM_LDC_PC_G0 },	/* LDC */
5321    { "pc_g1_nc",
5322      BFD_RELOC_ARM_ALU_PC_G1_NC,	/* ALU */
5323      0,				/* LDR */
5324      0,				/* LDRS */
5325      0 },				/* LDC */
5326    { "pc_g1",
5327      BFD_RELOC_ARM_ALU_PC_G1,		/* ALU */
5328      BFD_RELOC_ARM_LDR_PC_G1, 		/* LDR */
5329      BFD_RELOC_ARM_LDRS_PC_G1,		/* LDRS */
5330      BFD_RELOC_ARM_LDC_PC_G1 },	/* LDC */
5331    { "pc_g2",
5332      BFD_RELOC_ARM_ALU_PC_G2,		/* ALU */
5333      BFD_RELOC_ARM_LDR_PC_G2,		/* LDR */
5334      BFD_RELOC_ARM_LDRS_PC_G2,		/* LDRS */
5335      BFD_RELOC_ARM_LDC_PC_G2 },	/* LDC */
5336    /* Section base relative */
5337    { "sb_g0_nc",
5338      BFD_RELOC_ARM_ALU_SB_G0_NC,	/* ALU */
5339      0,				/* LDR */
5340      0,				/* LDRS */
5341      0 },				/* LDC */
5342    { "sb_g0",
5343      BFD_RELOC_ARM_ALU_SB_G0,		/* ALU */
5344      BFD_RELOC_ARM_LDR_SB_G0,		/* LDR */
5345      BFD_RELOC_ARM_LDRS_SB_G0,		/* LDRS */
5346      BFD_RELOC_ARM_LDC_SB_G0 },	/* LDC */
5347    { "sb_g1_nc",
5348      BFD_RELOC_ARM_ALU_SB_G1_NC,	/* ALU */
5349      0,				/* LDR */
5350      0,				/* LDRS */
5351      0 },				/* LDC */
5352    { "sb_g1",
5353      BFD_RELOC_ARM_ALU_SB_G1,		/* ALU */
5354      BFD_RELOC_ARM_LDR_SB_G1, 		/* LDR */
5355      BFD_RELOC_ARM_LDRS_SB_G1,		/* LDRS */
5356      BFD_RELOC_ARM_LDC_SB_G1 },	/* LDC */
5357    { "sb_g2",
5358      BFD_RELOC_ARM_ALU_SB_G2,		/* ALU */
5359      BFD_RELOC_ARM_LDR_SB_G2,		/* LDR */
5360      BFD_RELOC_ARM_LDRS_SB_G2,		/* LDRS */
5361      BFD_RELOC_ARM_LDC_SB_G2 },	/* LDC */
5362    /* Absolute thumb alu relocations.  */
5363    { "lower0_7",
5364      BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC,/* ALU.  */
5365      0,				/* LDR.  */
5366      0,				/* LDRS.  */
5367      0 },				/* LDC.  */
5368    { "lower8_15",
5369      BFD_RELOC_ARM_THUMB_ALU_ABS_G1_NC,/* ALU.  */
5370      0,				/* LDR.  */
5371      0,				/* LDRS.  */
5372      0 },				/* LDC.  */
5373    { "upper0_7",
5374      BFD_RELOC_ARM_THUMB_ALU_ABS_G2_NC,/* ALU.  */
5375      0,				/* LDR.  */
5376      0,				/* LDRS.  */
5377      0 },				/* LDC.  */
5378    { "upper8_15",
5379      BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC,/* ALU.  */
5380      0,				/* LDR.  */
5381      0,				/* LDRS.  */
5382      0 } };				/* LDC.  */
5383
5384/* Given the address of a pointer pointing to the textual name of a group
5385   relocation as may appear in assembler source, attempt to find its details
5386   in group_reloc_table.  The pointer will be updated to the character after
5387   the trailing colon.  On failure, FAIL will be returned; SUCCESS
5388   otherwise.  On success, *entry will be updated to point at the relevant
5389   group_reloc_table entry. */
5390
5391static int
5392find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
5393{
5394  unsigned int i;
5395  for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
5396    {
5397      int length = strlen (group_reloc_table[i].name);
5398
5399      if (strncasecmp (group_reloc_table[i].name, *str, length) == 0
5400	  && (*str)[length] == ':')
5401	{
5402	  *out = &group_reloc_table[i];
5403	  *str += (length + 1);
5404	  return SUCCESS;
5405	}
5406    }
5407
5408  return FAIL;
5409}
5410
5411/* Parse a <shifter_operand> for an ARM data processing instruction
5412   (as for parse_shifter_operand) where group relocations are allowed:
5413
5414      #<immediate>
5415      #<immediate>, <rotate>
5416      #:<group_reloc>:<expression>
5417      <Rm>
5418      <Rm>, <shift>
5419
5420   where <group_reloc> is one of the strings defined in group_reloc_table.
5421   The hashes are optional.
5422
5423   Everything else is as for parse_shifter_operand.  */
5424
5425static parse_operand_result
5426parse_shifter_operand_group_reloc (char **str, int i)
5427{
5428  /* Determine if we have the sequence of characters #: or just :
5429     coming next.  If we do, then we check for a group relocation.
5430     If we don't, punt the whole lot to parse_shifter_operand.  */
5431
5432  if (((*str)[0] == '#' && (*str)[1] == ':')
5433      || (*str)[0] == ':')
5434    {
5435      struct group_reloc_table_entry *entry;
5436
5437      if ((*str)[0] == '#')
5438	(*str) += 2;
5439      else
5440	(*str)++;
5441
5442      /* Try to parse a group relocation.  Anything else is an error.  */
5443      if (find_group_reloc_table_entry (str, &entry) == FAIL)
5444	{
5445	  inst.error = _("unknown group relocation");
5446	  return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5447	}
5448
5449      /* We now have the group relocation table entry corresponding to
5450	 the name in the assembler source.  Next, we parse the expression.  */
5451      if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
5452	return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5453
5454      /* Record the relocation type (always the ALU variant here).  */
5455      inst.reloc.type = (bfd_reloc_code_real_type) entry->alu_code;
5456      gas_assert (inst.reloc.type != 0);
5457
5458      return PARSE_OPERAND_SUCCESS;
5459    }
5460  else
5461    return parse_shifter_operand (str, i) == SUCCESS
5462	   ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
5463
5464  /* Never reached.  */
5465}
5466
5467/* Parse a Neon alignment expression.  Information is written to
5468   inst.operands[i].  We assume the initial ':' has been skipped.
5469
5470   align	.imm = align << 8, .immisalign=1, .preind=0  */
5471static parse_operand_result
5472parse_neon_alignment (char **str, int i)
5473{
5474  char *p = *str;
5475  expressionS exp;
5476
5477  my_get_expression (&exp, &p, GE_NO_PREFIX);
5478
5479  if (exp.X_op != O_constant)
5480    {
5481      inst.error = _("alignment must be constant");
5482      return PARSE_OPERAND_FAIL;
5483    }
5484
5485  inst.operands[i].imm = exp.X_add_number << 8;
5486  inst.operands[i].immisalign = 1;
5487  /* Alignments are not pre-indexes.  */
5488  inst.operands[i].preind = 0;
5489
5490  *str = p;
5491  return PARSE_OPERAND_SUCCESS;
5492}
5493
5494/* Parse all forms of an ARM address expression.  Information is written
5495   to inst.operands[i] and/or inst.reloc.
5496
5497   Preindexed addressing (.preind=1):
5498
5499   [Rn, #offset]       .reg=Rn .reloc.exp=offset
5500   [Rn, +/-Rm]	       .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5501   [Rn, +/-Rm, shift]  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5502		       .shift_kind=shift .reloc.exp=shift_imm
5503
5504   These three may have a trailing ! which causes .writeback to be set also.
5505
5506   Postindexed addressing (.postind=1, .writeback=1):
5507
5508   [Rn], #offset       .reg=Rn .reloc.exp=offset
5509   [Rn], +/-Rm	       .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5510   [Rn], +/-Rm, shift  .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5511		       .shift_kind=shift .reloc.exp=shift_imm
5512
5513   Unindexed addressing (.preind=0, .postind=0):
5514
5515   [Rn], {option}      .reg=Rn .imm=option .immisreg=0
5516
5517   Other:
5518
5519   [Rn]{!}	       shorthand for [Rn,#0]{!}
5520   =immediate	       .isreg=0 .reloc.exp=immediate
5521   label	       .reg=PC .reloc.pc_rel=1 .reloc.exp=label
5522
5523  It is the caller's responsibility to check for addressing modes not
5524  supported by the instruction, and to set inst.reloc.type.  */
5525
5526static parse_operand_result
5527parse_address_main (char **str, int i, int group_relocations,
5528		    group_reloc_type group_type)
5529{
5530  char *p = *str;
5531  int reg;
5532
5533  if (skip_past_char (&p, '[') == FAIL)
5534    {
5535      if (skip_past_char (&p, '=') == FAIL)
5536	{
5537	  /* Bare address - translate to PC-relative offset.  */
5538	  inst.reloc.pc_rel = 1;
5539	  inst.operands[i].reg = REG_PC;
5540	  inst.operands[i].isreg = 1;
5541	  inst.operands[i].preind = 1;
5542
5543	  if (my_get_expression (&inst.reloc.exp, &p, GE_OPT_PREFIX_BIG))
5544	    return PARSE_OPERAND_FAIL;
5545	}
5546      else if (parse_big_immediate (&p, i, &inst.reloc.exp,
5547				    /*allow_symbol_p=*/TRUE))
5548	return PARSE_OPERAND_FAIL;
5549
5550      *str = p;
5551      return PARSE_OPERAND_SUCCESS;
5552    }
5553
5554  /* PR gas/14887: Allow for whitespace after the opening bracket.  */
5555  skip_whitespace (p);
5556
5557  if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
5558    {
5559      inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5560      return PARSE_OPERAND_FAIL;
5561    }
5562  inst.operands[i].reg = reg;
5563  inst.operands[i].isreg = 1;
5564
5565  if (skip_past_comma (&p) == SUCCESS)
5566    {
5567      inst.operands[i].preind = 1;
5568
5569      if (*p == '+') p++;
5570      else if (*p == '-') p++, inst.operands[i].negative = 1;
5571
5572      if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5573	{
5574	  inst.operands[i].imm = reg;
5575	  inst.operands[i].immisreg = 1;
5576
5577	  if (skip_past_comma (&p) == SUCCESS)
5578	    if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5579	      return PARSE_OPERAND_FAIL;
5580	}
5581      else if (skip_past_char (&p, ':') == SUCCESS)
5582	{
5583	  /* FIXME: '@' should be used here, but it's filtered out by generic
5584	     code before we get to see it here. This may be subject to
5585	     change.  */
5586	  parse_operand_result result = parse_neon_alignment (&p, i);
5587
5588	  if (result != PARSE_OPERAND_SUCCESS)
5589	    return result;
5590	}
5591      else
5592	{
5593	  if (inst.operands[i].negative)
5594	    {
5595	      inst.operands[i].negative = 0;
5596	      p--;
5597	    }
5598
5599	  if (group_relocations
5600	      && ((*p == '#' && *(p + 1) == ':') || *p == ':'))
5601	    {
5602	      struct group_reloc_table_entry *entry;
5603
5604	      /* Skip over the #: or : sequence.  */
5605	      if (*p == '#')
5606		p += 2;
5607	      else
5608		p++;
5609
5610	      /* Try to parse a group relocation.  Anything else is an
5611		 error.  */
5612	      if (find_group_reloc_table_entry (&p, &entry) == FAIL)
5613		{
5614		  inst.error = _("unknown group relocation");
5615		  return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5616		}
5617
5618	      /* We now have the group relocation table entry corresponding to
5619		 the name in the assembler source.  Next, we parse the
5620		 expression.  */
5621	      if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5622		return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5623
5624	      /* Record the relocation type.  */
5625	      switch (group_type)
5626		{
5627		  case GROUP_LDR:
5628		    inst.reloc.type = (bfd_reloc_code_real_type) entry->ldr_code;
5629		    break;
5630
5631		  case GROUP_LDRS:
5632		    inst.reloc.type = (bfd_reloc_code_real_type) entry->ldrs_code;
5633		    break;
5634
5635		  case GROUP_LDC:
5636		    inst.reloc.type = (bfd_reloc_code_real_type) entry->ldc_code;
5637		    break;
5638
5639		  default:
5640		    gas_assert (0);
5641		}
5642
5643	      if (inst.reloc.type == 0)
5644		{
5645		  inst.error = _("this group relocation is not allowed on this instruction");
5646		  return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5647		}
5648	    }
5649	  else
5650	    {
5651	      char *q = p;
5652
5653	      if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5654		return PARSE_OPERAND_FAIL;
5655	      /* If the offset is 0, find out if it's a +0 or -0.  */
5656	      if (inst.reloc.exp.X_op == O_constant
5657		  && inst.reloc.exp.X_add_number == 0)
5658		{
5659		  skip_whitespace (q);
5660		  if (*q == '#')
5661		    {
5662		      q++;
5663		      skip_whitespace (q);
5664		    }
5665		  if (*q == '-')
5666		    inst.operands[i].negative = 1;
5667		}
5668	    }
5669	}
5670    }
5671  else if (skip_past_char (&p, ':') == SUCCESS)
5672    {
5673      /* FIXME: '@' should be used here, but it's filtered out by generic code
5674	 before we get to see it here. This may be subject to change.  */
5675      parse_operand_result result = parse_neon_alignment (&p, i);
5676
5677      if (result != PARSE_OPERAND_SUCCESS)
5678	return result;
5679    }
5680
5681  if (skip_past_char (&p, ']') == FAIL)
5682    {
5683      inst.error = _("']' expected");
5684      return PARSE_OPERAND_FAIL;
5685    }
5686
5687  if (skip_past_char (&p, '!') == SUCCESS)
5688    inst.operands[i].writeback = 1;
5689
5690  else if (skip_past_comma (&p) == SUCCESS)
5691    {
5692      if (skip_past_char (&p, '{') == SUCCESS)
5693	{
5694	  /* [Rn], {expr} - unindexed, with option */
5695	  if (parse_immediate (&p, &inst.operands[i].imm,
5696			       0, 255, TRUE) == FAIL)
5697	    return PARSE_OPERAND_FAIL;
5698
5699	  if (skip_past_char (&p, '}') == FAIL)
5700	    {
5701	      inst.error = _("'}' expected at end of 'option' field");
5702	      return PARSE_OPERAND_FAIL;
5703	    }
5704	  if (inst.operands[i].preind)
5705	    {
5706	      inst.error = _("cannot combine index with option");
5707	      return PARSE_OPERAND_FAIL;
5708	    }
5709	  *str = p;
5710	  return PARSE_OPERAND_SUCCESS;
5711	}
5712      else
5713	{
5714	  inst.operands[i].postind = 1;
5715	  inst.operands[i].writeback = 1;
5716
5717	  if (inst.operands[i].preind)
5718	    {
5719	      inst.error = _("cannot combine pre- and post-indexing");
5720	      return PARSE_OPERAND_FAIL;
5721	    }
5722
5723	  if (*p == '+') p++;
5724	  else if (*p == '-') p++, inst.operands[i].negative = 1;
5725
5726	  if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
5727	    {
5728	      /* We might be using the immediate for alignment already. If we
5729		 are, OR the register number into the low-order bits.  */
5730	      if (inst.operands[i].immisalign)
5731		inst.operands[i].imm |= reg;
5732	      else
5733		inst.operands[i].imm = reg;
5734	      inst.operands[i].immisreg = 1;
5735
5736	      if (skip_past_comma (&p) == SUCCESS)
5737		if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
5738		  return PARSE_OPERAND_FAIL;
5739	    }
5740	  else
5741	    {
5742	      char *q = p;
5743
5744	      if (inst.operands[i].negative)
5745		{
5746		  inst.operands[i].negative = 0;
5747		  p--;
5748		}
5749	      if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5750		return PARSE_OPERAND_FAIL;
5751	      /* If the offset is 0, find out if it's a +0 or -0.  */
5752	      if (inst.reloc.exp.X_op == O_constant
5753		  && inst.reloc.exp.X_add_number == 0)
5754		{
5755		  skip_whitespace (q);
5756		  if (*q == '#')
5757		    {
5758		      q++;
5759		      skip_whitespace (q);
5760		    }
5761		  if (*q == '-')
5762		    inst.operands[i].negative = 1;
5763		}
5764	    }
5765	}
5766    }
5767
5768  /* If at this point neither .preind nor .postind is set, we have a
5769     bare [Rn]{!}, which is shorthand for [Rn,#0]{!}.  */
5770  if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
5771    {
5772      inst.operands[i].preind = 1;
5773      inst.reloc.exp.X_op = O_constant;
5774      inst.reloc.exp.X_add_number = 0;
5775    }
5776  *str = p;
5777  return PARSE_OPERAND_SUCCESS;
5778}
5779
5780static int
5781parse_address (char **str, int i)
5782{
5783  return parse_address_main (str, i, 0, GROUP_LDR) == PARSE_OPERAND_SUCCESS
5784	 ? SUCCESS : FAIL;
5785}
5786
5787static parse_operand_result
5788parse_address_group_reloc (char **str, int i, group_reloc_type type)
5789{
5790  return parse_address_main (str, i, 1, type);
5791}
5792
5793/* Parse an operand for a MOVW or MOVT instruction.  */
5794static int
5795parse_half (char **str)
5796{
5797  char * p;
5798
5799  p = *str;
5800  skip_past_char (&p, '#');
5801  if (strncasecmp (p, ":lower16:", 9) == 0)
5802    inst.reloc.type = BFD_RELOC_ARM_MOVW;
5803  else if (strncasecmp (p, ":upper16:", 9) == 0)
5804    inst.reloc.type = BFD_RELOC_ARM_MOVT;
5805
5806  if (inst.reloc.type != BFD_RELOC_UNUSED)
5807    {
5808      p += 9;
5809      skip_whitespace (p);
5810    }
5811
5812  if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5813    return FAIL;
5814
5815  if (inst.reloc.type == BFD_RELOC_UNUSED)
5816    {
5817      if (inst.reloc.exp.X_op != O_constant)
5818	{
5819	  inst.error = _("constant expression expected");
5820	  return FAIL;
5821	}
5822      if (inst.reloc.exp.X_add_number < 0
5823	  || inst.reloc.exp.X_add_number > 0xffff)
5824	{
5825	  inst.error = _("immediate value out of range");
5826	  return FAIL;
5827	}
5828    }
5829  *str = p;
5830  return SUCCESS;
5831}
5832
5833/* Miscellaneous. */
5834
5835/* Parse a PSR flag operand.  The value returned is FAIL on syntax error,
5836   or a bitmask suitable to be or-ed into the ARM msr instruction.  */
5837static int
5838parse_psr (char **str, bfd_boolean lhs)
5839{
5840  char *p;
5841  unsigned long psr_field;
5842  const struct asm_psr *psr;
5843  char *start;
5844  bfd_boolean is_apsr = FALSE;
5845  bfd_boolean m_profile = ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m);
5846
5847  /* PR gas/12698:  If the user has specified -march=all then m_profile will
5848     be TRUE, but we want to ignore it in this case as we are building for any
5849     CPU type, including non-m variants.  */
5850  if (ARM_FEATURE_CORE_EQUAL (selected_cpu, arm_arch_any))
5851    m_profile = FALSE;
5852
5853  /* CPSR's and SPSR's can now be lowercase.  This is just a convenience
5854     feature for ease of use and backwards compatibility.  */
5855  p = *str;
5856  if (strncasecmp (p, "SPSR", 4) == 0)
5857    {
5858      if (m_profile)
5859	goto unsupported_psr;
5860
5861      psr_field = SPSR_BIT;
5862    }
5863  else if (strncasecmp (p, "CPSR", 4) == 0)
5864    {
5865      if (m_profile)
5866	goto unsupported_psr;
5867
5868      psr_field = 0;
5869    }
5870  else if (strncasecmp (p, "APSR", 4) == 0)
5871    {
5872      /* APSR[_<bits>] can be used as a synonym for CPSR[_<flags>] on ARMv7-A
5873	 and ARMv7-R architecture CPUs.  */
5874      is_apsr = TRUE;
5875      psr_field = 0;
5876    }
5877  else if (m_profile)
5878    {
5879      start = p;
5880      do
5881	p++;
5882      while (ISALNUM (*p) || *p == '_');
5883
5884      if (strncasecmp (start, "iapsr", 5) == 0
5885	  || strncasecmp (start, "eapsr", 5) == 0
5886	  || strncasecmp (start, "xpsr", 4) == 0
5887	  || strncasecmp (start, "psr", 3) == 0)
5888	p = start + strcspn (start, "rR") + 1;
5889
5890      psr = (const struct asm_psr *) hash_find_n (arm_v7m_psr_hsh, start,
5891						  p - start);
5892
5893      if (!psr)
5894	return FAIL;
5895
5896      /* If APSR is being written, a bitfield may be specified.  Note that
5897	 APSR itself is handled above.  */
5898      if (psr->field <= 3)
5899	{
5900	  psr_field = psr->field;
5901	  is_apsr = TRUE;
5902	  goto check_suffix;
5903	}
5904
5905      *str = p;
5906      /* M-profile MSR instructions have the mask field set to "10", except
5907	 *PSR variants which modify APSR, which may use a different mask (and
5908	 have been handled already).  Do that by setting the PSR_f field
5909	 here.  */
5910      return psr->field | (lhs ? PSR_f : 0);
5911    }
5912  else
5913    goto unsupported_psr;
5914
5915  p += 4;
5916check_suffix:
5917  if (*p == '_')
5918    {
5919      /* A suffix follows.  */
5920      p++;
5921      start = p;
5922
5923      do
5924	p++;
5925      while (ISALNUM (*p) || *p == '_');
5926
5927      if (is_apsr)
5928	{
5929	  /* APSR uses a notation for bits, rather than fields.  */
5930	  unsigned int nzcvq_bits = 0;
5931	  unsigned int g_bit = 0;
5932	  char *bit;
5933
5934	  for (bit = start; bit != p; bit++)
5935	    {
5936	      switch (TOLOWER (*bit))
5937		{
5938		case 'n':
5939		  nzcvq_bits |= (nzcvq_bits & 0x01) ? 0x20 : 0x01;
5940		  break;
5941
5942		case 'z':
5943		  nzcvq_bits |= (nzcvq_bits & 0x02) ? 0x20 : 0x02;
5944		  break;
5945
5946		case 'c':
5947		  nzcvq_bits |= (nzcvq_bits & 0x04) ? 0x20 : 0x04;
5948		  break;
5949
5950		case 'v':
5951		  nzcvq_bits |= (nzcvq_bits & 0x08) ? 0x20 : 0x08;
5952		  break;
5953
5954		case 'q':
5955		  nzcvq_bits |= (nzcvq_bits & 0x10) ? 0x20 : 0x10;
5956		  break;
5957
5958		case 'g':
5959		  g_bit |= (g_bit & 0x1) ? 0x2 : 0x1;
5960		  break;
5961
5962		default:
5963		  inst.error = _("unexpected bit specified after APSR");
5964		  return FAIL;
5965		}
5966	    }
5967
5968	  if (nzcvq_bits == 0x1f)
5969	    psr_field |= PSR_f;
5970
5971	  if (g_bit == 0x1)
5972	    {
5973	      if (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp))
5974		{
5975		  inst.error = _("selected processor does not "
5976				 "support DSP extension");
5977		  return FAIL;
5978		}
5979
5980	      psr_field |= PSR_s;
5981	    }
5982
5983	  if ((nzcvq_bits & 0x20) != 0
5984	      || (nzcvq_bits != 0x1f && nzcvq_bits != 0)
5985	      || (g_bit & 0x2) != 0)
5986	    {
5987	      inst.error = _("bad bitmask specified after APSR");
5988	      return FAIL;
5989	    }
5990	}
5991      else
5992	{
5993	  psr = (const struct asm_psr *) hash_find_n (arm_psr_hsh, start,
5994						      p - start);
5995	  if (!psr)
5996	    goto error;
5997
5998	  psr_field |= psr->field;
5999	}
6000    }
6001  else
6002    {
6003      if (ISALNUM (*p))
6004	goto error;    /* Garbage after "[CS]PSR".  */
6005
6006      /* Unadorned APSR is equivalent to APSR_nzcvq/CPSR_f (for writes).  This
6007	 is deprecated, but allow it anyway.  */
6008      if (is_apsr && lhs)
6009	{
6010	  psr_field |= PSR_f;
6011	  as_tsktsk (_("writing to APSR without specifying a bitmask is "
6012		       "deprecated"));
6013	}
6014      else if (!m_profile)
6015	/* These bits are never right for M-profile devices: don't set them
6016	   (only code paths which read/write APSR reach here).  */
6017	psr_field |= (PSR_c | PSR_f);
6018    }
6019  *str = p;
6020  return psr_field;
6021
6022 unsupported_psr:
6023  inst.error = _("selected processor does not support requested special "
6024		 "purpose register");
6025  return FAIL;
6026
6027 error:
6028  inst.error = _("flag for {c}psr instruction expected");
6029  return FAIL;
6030}
6031
6032/* Parse the flags argument to CPSI[ED].  Returns FAIL on error, or a
6033   value suitable for splatting into the AIF field of the instruction.	*/
6034
6035static int
6036parse_cps_flags (char **str)
6037{
6038  int val = 0;
6039  int saw_a_flag = 0;
6040  char *s = *str;
6041
6042  for (;;)
6043    switch (*s++)
6044      {
6045      case '\0': case ',':
6046	goto done;
6047
6048      case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
6049      case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
6050      case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
6051
6052      default:
6053	inst.error = _("unrecognized CPS flag");
6054	return FAIL;
6055      }
6056
6057 done:
6058  if (saw_a_flag == 0)
6059    {
6060      inst.error = _("missing CPS flags");
6061      return FAIL;
6062    }
6063
6064  *str = s - 1;
6065  return val;
6066}
6067
6068/* Parse an endian specifier ("BE" or "LE", case insensitive);
6069   returns 0 for big-endian, 1 for little-endian, FAIL for an error.  */
6070
6071static int
6072parse_endian_specifier (char **str)
6073{
6074  int little_endian;
6075  char *s = *str;
6076
6077  if (strncasecmp (s, "BE", 2))
6078    little_endian = 0;
6079  else if (strncasecmp (s, "LE", 2))
6080    little_endian = 1;
6081  else
6082    {
6083      inst.error = _("valid endian specifiers are be or le");
6084      return FAIL;
6085    }
6086
6087  if (ISALNUM (s[2]) || s[2] == '_')
6088    {
6089      inst.error = _("valid endian specifiers are be or le");
6090      return FAIL;
6091    }
6092
6093  *str = s + 2;
6094  return little_endian;
6095}
6096
6097/* Parse a rotation specifier: ROR #0, #8, #16, #24.  *val receives a
6098   value suitable for poking into the rotate field of an sxt or sxta
6099   instruction, or FAIL on error.  */
6100
6101static int
6102parse_ror (char **str)
6103{
6104  int rot;
6105  char *s = *str;
6106
6107  if (strncasecmp (s, "ROR", 3) == 0)
6108    s += 3;
6109  else
6110    {
6111      inst.error = _("missing rotation field after comma");
6112      return FAIL;
6113    }
6114
6115  if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
6116    return FAIL;
6117
6118  switch (rot)
6119    {
6120    case  0: *str = s; return 0x0;
6121    case  8: *str = s; return 0x1;
6122    case 16: *str = s; return 0x2;
6123    case 24: *str = s; return 0x3;
6124
6125    default:
6126      inst.error = _("rotation can only be 0, 8, 16, or 24");
6127      return FAIL;
6128    }
6129}
6130
6131/* Parse a conditional code (from conds[] below).  The value returned is in the
6132   range 0 .. 14, or FAIL.  */
6133static int
6134parse_cond (char **str)
6135{
6136  char *q;
6137  const struct asm_cond *c;
6138  int n;
6139  /* Condition codes are always 2 characters, so matching up to
6140     3 characters is sufficient.  */
6141  char cond[3];
6142
6143  q = *str;
6144  n = 0;
6145  while (ISALPHA (*q) && n < 3)
6146    {
6147      cond[n] = TOLOWER (*q);
6148      q++;
6149      n++;
6150    }
6151
6152  c = (const struct asm_cond *) hash_find_n (arm_cond_hsh, cond, n);
6153  if (!c)
6154    {
6155      inst.error = _("condition required");
6156      return FAIL;
6157    }
6158
6159  *str = q;
6160  return c->value;
6161}
6162
6163/* Record a use of the given feature.  */
6164static void
6165record_feature_use (const arm_feature_set *feature)
6166{
6167  if (thumb_mode)
6168    ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, *feature);
6169  else
6170    ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, *feature);
6171}
6172
6173/* If the given feature is currently allowed, mark it as used and return TRUE.
6174   Return FALSE otherwise.  */
6175static bfd_boolean
6176mark_feature_used (const arm_feature_set *feature)
6177{
6178  /* Ensure the option is currently allowed.  */
6179  if (!ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
6180    return FALSE;
6181
6182  /* Add the appropriate architecture feature for the barrier option used.  */
6183  record_feature_use (feature);
6184
6185  return TRUE;
6186}
6187
6188/* Parse an option for a barrier instruction.  Returns the encoding for the
6189   option, or FAIL.  */
6190static int
6191parse_barrier (char **str)
6192{
6193  char *p, *q;
6194  const struct asm_barrier_opt *o;
6195
6196  p = q = *str;
6197  while (ISALPHA (*q))
6198    q++;
6199
6200  o = (const struct asm_barrier_opt *) hash_find_n (arm_barrier_opt_hsh, p,
6201						    q - p);
6202  if (!o)
6203    return FAIL;
6204
6205  if (!mark_feature_used (&o->arch))
6206    return FAIL;
6207
6208  *str = q;
6209  return o->value;
6210}
6211
6212/* Parse the operands of a table branch instruction.  Similar to a memory
6213   operand.  */
6214static int
6215parse_tb (char **str)
6216{
6217  char * p = *str;
6218  int reg;
6219
6220  if (skip_past_char (&p, '[') == FAIL)
6221    {
6222      inst.error = _("'[' expected");
6223      return FAIL;
6224    }
6225
6226  if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
6227    {
6228      inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
6229      return FAIL;
6230    }
6231  inst.operands[0].reg = reg;
6232
6233  if (skip_past_comma (&p) == FAIL)
6234    {
6235      inst.error = _("',' expected");
6236      return FAIL;
6237    }
6238
6239  if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
6240    {
6241      inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
6242      return FAIL;
6243    }
6244  inst.operands[0].imm = reg;
6245
6246  if (skip_past_comma (&p) == SUCCESS)
6247    {
6248      if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
6249	return FAIL;
6250      if (inst.reloc.exp.X_add_number != 1)
6251	{
6252	  inst.error = _("invalid shift");
6253	  return FAIL;
6254	}
6255      inst.operands[0].shifted = 1;
6256    }
6257
6258  if (skip_past_char (&p, ']') == FAIL)
6259    {
6260      inst.error = _("']' expected");
6261      return FAIL;
6262    }
6263  *str = p;
6264  return SUCCESS;
6265}
6266
6267/* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
6268   information on the types the operands can take and how they are encoded.
6269   Up to four operands may be read; this function handles setting the
6270   ".present" field for each read operand itself.
6271   Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
6272   else returns FAIL.  */
6273
6274static int
6275parse_neon_mov (char **str, int *which_operand)
6276{
6277  int i = *which_operand, val;
6278  enum arm_reg_type rtype;
6279  char *ptr = *str;
6280  struct neon_type_el optype;
6281
6282  if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
6283    {
6284      /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>.  */
6285      inst.operands[i].reg = val;
6286      inst.operands[i].isscalar = 1;
6287      inst.operands[i].vectype = optype;
6288      inst.operands[i++].present = 1;
6289
6290      if (skip_past_comma (&ptr) == FAIL)
6291	goto wanted_comma;
6292
6293      if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6294	goto wanted_arm;
6295
6296      inst.operands[i].reg = val;
6297      inst.operands[i].isreg = 1;
6298      inst.operands[i].present = 1;
6299    }
6300  else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
6301	   != FAIL)
6302    {
6303      /* Cases 0, 1, 2, 3, 5 (D only).  */
6304      if (skip_past_comma (&ptr) == FAIL)
6305	goto wanted_comma;
6306
6307      inst.operands[i].reg = val;
6308      inst.operands[i].isreg = 1;
6309      inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
6310      inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6311      inst.operands[i].isvec = 1;
6312      inst.operands[i].vectype = optype;
6313      inst.operands[i++].present = 1;
6314
6315      if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6316	{
6317	  /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
6318	     Case 13: VMOV <Sd>, <Rm>  */
6319	  inst.operands[i].reg = val;
6320	  inst.operands[i].isreg = 1;
6321	  inst.operands[i].present = 1;
6322
6323	  if (rtype == REG_TYPE_NQ)
6324	    {
6325	      first_error (_("can't use Neon quad register here"));
6326	      return FAIL;
6327	    }
6328	  else if (rtype != REG_TYPE_VFS)
6329	    {
6330	      i++;
6331	      if (skip_past_comma (&ptr) == FAIL)
6332		goto wanted_comma;
6333	      if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6334		goto wanted_arm;
6335	      inst.operands[i].reg = val;
6336	      inst.operands[i].isreg = 1;
6337	      inst.operands[i].present = 1;
6338	    }
6339	}
6340      else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
6341					   &optype)) != FAIL)
6342	{
6343	  /* Case 0: VMOV<c><q> <Qd>, <Qm>
6344	     Case 1: VMOV<c><q> <Dd>, <Dm>
6345	     Case 8: VMOV.F32 <Sd>, <Sm>
6346	     Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm>  */
6347
6348	  inst.operands[i].reg = val;
6349	  inst.operands[i].isreg = 1;
6350	  inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
6351	  inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6352	  inst.operands[i].isvec = 1;
6353	  inst.operands[i].vectype = optype;
6354	  inst.operands[i].present = 1;
6355
6356	  if (skip_past_comma (&ptr) == SUCCESS)
6357	    {
6358	      /* Case 15.  */
6359	      i++;
6360
6361	      if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6362		goto wanted_arm;
6363
6364	      inst.operands[i].reg = val;
6365	      inst.operands[i].isreg = 1;
6366	      inst.operands[i++].present = 1;
6367
6368	      if (skip_past_comma (&ptr) == FAIL)
6369		goto wanted_comma;
6370
6371	      if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
6372		goto wanted_arm;
6373
6374	      inst.operands[i].reg = val;
6375	      inst.operands[i].isreg = 1;
6376	      inst.operands[i].present = 1;
6377	    }
6378	}
6379      else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
6380	  /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
6381	     Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
6382	     Case 10: VMOV.F32 <Sd>, #<imm>
6383	     Case 11: VMOV.F64 <Dd>, #<imm>  */
6384	inst.operands[i].immisfloat = 1;
6385      else if (parse_big_immediate (&ptr, i, NULL, /*allow_symbol_p=*/FALSE)
6386	       == SUCCESS)
6387	  /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
6388	     Case 3: VMOV<c><q>.<dt> <Dd>, #<imm>  */
6389	;
6390      else
6391	{
6392	  first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
6393	  return FAIL;
6394	}
6395    }
6396  else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6397    {
6398      /* Cases 6, 7.  */
6399      inst.operands[i].reg = val;
6400      inst.operands[i].isreg = 1;
6401      inst.operands[i++].present = 1;
6402
6403      if (skip_past_comma (&ptr) == FAIL)
6404	goto wanted_comma;
6405
6406      if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
6407	{
6408	  /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]>  */
6409	  inst.operands[i].reg = val;
6410	  inst.operands[i].isscalar = 1;
6411	  inst.operands[i].present = 1;
6412	  inst.operands[i].vectype = optype;
6413	}
6414      else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
6415	{
6416	  /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm>  */
6417	  inst.operands[i].reg = val;
6418	  inst.operands[i].isreg = 1;
6419	  inst.operands[i++].present = 1;
6420
6421	  if (skip_past_comma (&ptr) == FAIL)
6422	    goto wanted_comma;
6423
6424	  if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
6425	      == FAIL)
6426	    {
6427	      first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
6428	      return FAIL;
6429	    }
6430
6431	  inst.operands[i].reg = val;
6432	  inst.operands[i].isreg = 1;
6433	  inst.operands[i].isvec = 1;
6434	  inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
6435	  inst.operands[i].vectype = optype;
6436	  inst.operands[i].present = 1;
6437
6438	  if (rtype == REG_TYPE_VFS)
6439	    {
6440	      /* Case 14.  */
6441	      i++;
6442	      if (skip_past_comma (&ptr) == FAIL)
6443		goto wanted_comma;
6444	      if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
6445					      &optype)) == FAIL)
6446		{
6447		  first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
6448		  return FAIL;
6449		}
6450	      inst.operands[i].reg = val;
6451	      inst.operands[i].isreg = 1;
6452	      inst.operands[i].isvec = 1;
6453	      inst.operands[i].issingle = 1;
6454	      inst.operands[i].vectype = optype;
6455	      inst.operands[i].present = 1;
6456	    }
6457	}
6458      else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
6459	       != FAIL)
6460	{
6461	  /* Case 13.  */
6462	  inst.operands[i].reg = val;
6463	  inst.operands[i].isreg = 1;
6464	  inst.operands[i].isvec = 1;
6465	  inst.operands[i].issingle = 1;
6466	  inst.operands[i].vectype = optype;
6467	  inst.operands[i].present = 1;
6468	}
6469    }
6470  else
6471    {
6472      first_error (_("parse error"));
6473      return FAIL;
6474    }
6475
6476  /* Successfully parsed the operands. Update args.  */
6477  *which_operand = i;
6478  *str = ptr;
6479  return SUCCESS;
6480
6481 wanted_comma:
6482  first_error (_("expected comma"));
6483  return FAIL;
6484
6485 wanted_arm:
6486  first_error (_(reg_expected_msgs[REG_TYPE_RN]));
6487  return FAIL;
6488}
6489
6490/* Use this macro when the operand constraints are different
6491   for ARM and THUMB (e.g. ldrd).  */
6492#define MIX_ARM_THUMB_OPERANDS(arm_operand, thumb_operand) \
6493	((arm_operand) | ((thumb_operand) << 16))
6494
6495/* Matcher codes for parse_operands.  */
6496enum operand_parse_code
6497{
6498  OP_stop,	/* end of line */
6499
6500  OP_RR,	/* ARM register */
6501  OP_RRnpc,	/* ARM register, not r15 */
6502  OP_RRnpcsp,	/* ARM register, neither r15 nor r13 (a.k.a. 'BadReg') */
6503  OP_RRnpcb,	/* ARM register, not r15, in square brackets */
6504  OP_RRnpctw,	/* ARM register, not r15 in Thumb-state or with writeback,
6505		   optional trailing ! */
6506  OP_RRw,	/* ARM register, not r15, optional trailing ! */
6507  OP_RCP,	/* Coprocessor number */
6508  OP_RCN,	/* Coprocessor register */
6509  OP_RF,	/* FPA register */
6510  OP_RVS,	/* VFP single precision register */
6511  OP_RVD,	/* VFP double precision register (0..15) */
6512  OP_RND,       /* Neon double precision register (0..31) */
6513  OP_RNQ,	/* Neon quad precision register */
6514  OP_RVSD,	/* VFP single or double precision register */
6515  OP_RNSD,      /* Neon single or double precision register */
6516  OP_RNDQ,      /* Neon double or quad precision register */
6517  OP_RNSDQ,	/* Neon single, double or quad precision register */
6518  OP_RNSC,      /* Neon scalar D[X] */
6519  OP_RVC,	/* VFP control register */
6520  OP_RMF,	/* Maverick F register */
6521  OP_RMD,	/* Maverick D register */
6522  OP_RMFX,	/* Maverick FX register */
6523  OP_RMDX,	/* Maverick DX register */
6524  OP_RMAX,	/* Maverick AX register */
6525  OP_RMDS,	/* Maverick DSPSC register */
6526  OP_RIWR,	/* iWMMXt wR register */
6527  OP_RIWC,	/* iWMMXt wC register */
6528  OP_RIWG,	/* iWMMXt wCG register */
6529  OP_RXA,	/* XScale accumulator register */
6530
6531  OP_REGLST,	/* ARM register list */
6532  OP_VRSLST,	/* VFP single-precision register list */
6533  OP_VRDLST,	/* VFP double-precision register list */
6534  OP_VRSDLST,   /* VFP single or double-precision register list (& quad) */
6535  OP_NRDLST,    /* Neon double-precision register list (d0-d31, qN aliases) */
6536  OP_NSTRLST,   /* Neon element/structure list */
6537
6538  OP_RNDQ_I0,   /* Neon D or Q reg, or immediate zero.  */
6539  OP_RVSD_I0,	/* VFP S or D reg, or immediate zero.  */
6540  OP_RSVD_FI0, /* VFP S or D reg, or floating point immediate zero.  */
6541  OP_RR_RNSC,   /* ARM reg or Neon scalar.  */
6542  OP_RNSD_RNSC, /* Neon S or D reg, or Neon scalar.  */
6543  OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar.  */
6544  OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar.  */
6545  OP_RND_RNSC,  /* Neon D reg, or Neon scalar.  */
6546  OP_VMOV,      /* Neon VMOV operands.  */
6547  OP_RNDQ_Ibig,	/* Neon D or Q reg, or big immediate for logic and VMVN.  */
6548  OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift.  */
6549  OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2.  */
6550
6551  OP_I0,        /* immediate zero */
6552  OP_I7,	/* immediate value 0 .. 7 */
6553  OP_I15,	/*		   0 .. 15 */
6554  OP_I16,	/*		   1 .. 16 */
6555  OP_I16z,      /*                 0 .. 16 */
6556  OP_I31,	/*		   0 .. 31 */
6557  OP_I31w,	/*		   0 .. 31, optional trailing ! */
6558  OP_I32,	/*		   1 .. 32 */
6559  OP_I32z,	/*		   0 .. 32 */
6560  OP_I63,	/*		   0 .. 63 */
6561  OP_I63s,	/*		 -64 .. 63 */
6562  OP_I64,	/*		   1 .. 64 */
6563  OP_I64z,	/*		   0 .. 64 */
6564  OP_I255,	/*		   0 .. 255 */
6565
6566  OP_I4b,	/* immediate, prefix optional, 1 .. 4 */
6567  OP_I7b,	/*			       0 .. 7 */
6568  OP_I15b,	/*			       0 .. 15 */
6569  OP_I31b,	/*			       0 .. 31 */
6570
6571  OP_SH,	/* shifter operand */
6572  OP_SHG,	/* shifter operand with possible group relocation */
6573  OP_ADDR,	/* Memory address expression (any mode) */
6574  OP_ADDRGLDR,	/* Mem addr expr (any mode) with possible LDR group reloc */
6575  OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
6576  OP_ADDRGLDC,  /* Mem addr expr (any mode) with possible LDC group reloc */
6577  OP_EXP,	/* arbitrary expression */
6578  OP_EXPi,	/* same, with optional immediate prefix */
6579  OP_EXPr,	/* same, with optional relocation suffix */
6580  OP_HALF,	/* 0 .. 65535 or low/high reloc.  */
6581  OP_IROT1,	/* VCADD rotate immediate: 90, 270.  */
6582  OP_IROT2,	/* VCMLA rotate immediate: 0, 90, 180, 270.  */
6583
6584  OP_CPSF,	/* CPS flags */
6585  OP_ENDI,	/* Endianness specifier */
6586  OP_wPSR,	/* CPSR/SPSR/APSR mask for msr (writing).  */
6587  OP_rPSR,	/* CPSR/SPSR/APSR mask for msr (reading).  */
6588  OP_COND,	/* conditional code */
6589  OP_TB,	/* Table branch.  */
6590
6591  OP_APSR_RR,   /* ARM register or "APSR_nzcv".  */
6592
6593  OP_RRnpc_I0,	/* ARM register or literal 0 */
6594  OP_RR_EXr,	/* ARM register or expression with opt. reloc stuff. */
6595  OP_RR_EXi,	/* ARM register or expression with imm prefix */
6596  OP_RF_IF,	/* FPA register or immediate */
6597  OP_RIWR_RIWC, /* iWMMXt R or C reg */
6598  OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
6599
6600  /* Optional operands.	 */
6601  OP_oI7b,	 /* immediate, prefix optional, 0 .. 7 */
6602  OP_oI31b,	 /*				0 .. 31 */
6603  OP_oI32b,      /*                             1 .. 32 */
6604  OP_oI32z,      /*                             0 .. 32 */
6605  OP_oIffffb,	 /*				0 .. 65535 */
6606  OP_oI255c,	 /*	  curly-brace enclosed, 0 .. 255 */
6607
6608  OP_oRR,	 /* ARM register */
6609  OP_oRRnpc,	 /* ARM register, not the PC */
6610  OP_oRRnpcsp,	 /* ARM register, neither the PC nor the SP (a.k.a. BadReg) */
6611  OP_oRRw,	 /* ARM register, not r15, optional trailing ! */
6612  OP_oRND,       /* Optional Neon double precision register */
6613  OP_oRNQ,       /* Optional Neon quad precision register */
6614  OP_oRNDQ,      /* Optional Neon double or quad precision register */
6615  OP_oRNSDQ,	 /* Optional single, double or quad precision vector register */
6616  OP_oSHll,	 /* LSL immediate */
6617  OP_oSHar,	 /* ASR immediate */
6618  OP_oSHllar,	 /* LSL or ASR immediate */
6619  OP_oROR,	 /* ROR 0/8/16/24 */
6620  OP_oBARRIER_I15, /* Option argument for a barrier instruction.  */
6621
6622  /* Some pre-defined mixed (ARM/THUMB) operands.  */
6623  OP_RR_npcsp		= MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
6624  OP_RRnpc_npcsp	= MIX_ARM_THUMB_OPERANDS (OP_RRnpc, OP_RRnpcsp),
6625  OP_oRRnpc_npcsp	= MIX_ARM_THUMB_OPERANDS (OP_oRRnpc, OP_oRRnpcsp),
6626
6627  OP_FIRST_OPTIONAL = OP_oI7b
6628};
6629
6630/* Generic instruction operand parser.	This does no encoding and no
6631   semantic validation; it merely squirrels values away in the inst
6632   structure.  Returns SUCCESS or FAIL depending on whether the
6633   specified grammar matched.  */
6634static int
6635parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
6636{
6637  unsigned const int *upat = pattern;
6638  char *backtrack_pos = 0;
6639  const char *backtrack_error = 0;
6640  int i, val = 0, backtrack_index = 0;
6641  enum arm_reg_type rtype;
6642  parse_operand_result result;
6643  unsigned int op_parse_code;
6644
6645#define po_char_or_fail(chr)			\
6646  do						\
6647    {						\
6648      if (skip_past_char (&str, chr) == FAIL)	\
6649	goto bad_args;				\
6650    }						\
6651  while (0)
6652
6653#define po_reg_or_fail(regtype)					\
6654  do								\
6655    {								\
6656      val = arm_typed_reg_parse (& str, regtype, & rtype,	\
6657				 & inst.operands[i].vectype);	\
6658      if (val == FAIL)						\
6659	{							\
6660	  first_error (_(reg_expected_msgs[regtype]));		\
6661	  goto failure;						\
6662	}							\
6663      inst.operands[i].reg = val;				\
6664      inst.operands[i].isreg = 1;				\
6665      inst.operands[i].isquad = (rtype == REG_TYPE_NQ);		\
6666      inst.operands[i].issingle = (rtype == REG_TYPE_VFS);	\
6667      inst.operands[i].isvec = (rtype == REG_TYPE_VFS		\
6668			     || rtype == REG_TYPE_VFD		\
6669			     || rtype == REG_TYPE_NQ);		\
6670    }								\
6671  while (0)
6672
6673#define po_reg_or_goto(regtype, label)				\
6674  do								\
6675    {								\
6676      val = arm_typed_reg_parse (& str, regtype, & rtype,	\
6677				 & inst.operands[i].vectype);	\
6678      if (val == FAIL)						\
6679	goto label;						\
6680								\
6681      inst.operands[i].reg = val;				\
6682      inst.operands[i].isreg = 1;				\
6683      inst.operands[i].isquad = (rtype == REG_TYPE_NQ);		\
6684      inst.operands[i].issingle = (rtype == REG_TYPE_VFS);	\
6685      inst.operands[i].isvec = (rtype == REG_TYPE_VFS		\
6686			     || rtype == REG_TYPE_VFD		\
6687			     || rtype == REG_TYPE_NQ);		\
6688    }								\
6689  while (0)
6690
6691#define po_imm_or_fail(min, max, popt)				\
6692  do								\
6693    {								\
6694      if (parse_immediate (&str, &val, min, max, popt) == FAIL)	\
6695	goto failure;						\
6696      inst.operands[i].imm = val;				\
6697    }								\
6698  while (0)
6699
6700#define po_scalar_or_goto(elsz, label)					\
6701  do									\
6702    {									\
6703      val = parse_scalar (& str, elsz, & inst.operands[i].vectype);	\
6704      if (val == FAIL)							\
6705	goto label;							\
6706      inst.operands[i].reg = val;					\
6707      inst.operands[i].isscalar = 1;					\
6708    }									\
6709  while (0)
6710
6711#define po_misc_or_fail(expr)			\
6712  do						\
6713    {						\
6714      if (expr)					\
6715	goto failure;				\
6716    }						\
6717  while (0)
6718
6719#define po_misc_or_fail_no_backtrack(expr)		\
6720  do							\
6721    {							\
6722      result = expr;					\
6723      if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK)	\
6724	backtrack_pos = 0;				\
6725      if (result != PARSE_OPERAND_SUCCESS)		\
6726	goto failure;					\
6727    }							\
6728  while (0)
6729
6730#define po_barrier_or_imm(str)				   \
6731  do							   \
6732    {						 	   \
6733      val = parse_barrier (&str);			   \
6734      if (val == FAIL && ! ISALPHA (*str))		   \
6735	goto immediate;					   \
6736      if (val == FAIL					   \
6737	  /* ISB can only take SY as an option.  */	   \
6738	  || ((inst.instruction & 0xf0) == 0x60		   \
6739	       && val != 0xf))				   \
6740	{						   \
6741	   inst.error = _("invalid barrier type");	   \
6742	   backtrack_pos = 0;				   \
6743	   goto failure;				   \
6744	}						   \
6745    }							   \
6746  while (0)
6747
6748  skip_whitespace (str);
6749
6750  for (i = 0; upat[i] != OP_stop; i++)
6751    {
6752      op_parse_code = upat[i];
6753      if (op_parse_code >= 1<<16)
6754	op_parse_code = thumb ? (op_parse_code >> 16)
6755				: (op_parse_code & ((1<<16)-1));
6756
6757      if (op_parse_code >= OP_FIRST_OPTIONAL)
6758	{
6759	  /* Remember where we are in case we need to backtrack.  */
6760	  gas_assert (!backtrack_pos);
6761	  backtrack_pos = str;
6762	  backtrack_error = inst.error;
6763	  backtrack_index = i;
6764	}
6765
6766      if (i > 0 && (i > 1 || inst.operands[0].present))
6767	po_char_or_fail (',');
6768
6769      switch (op_parse_code)
6770	{
6771	  /* Registers */
6772	case OP_oRRnpc:
6773	case OP_oRRnpcsp:
6774	case OP_RRnpc:
6775	case OP_RRnpcsp:
6776	case OP_oRR:
6777	case OP_RR:    po_reg_or_fail (REG_TYPE_RN);	  break;
6778	case OP_RCP:   po_reg_or_fail (REG_TYPE_CP);	  break;
6779	case OP_RCN:   po_reg_or_fail (REG_TYPE_CN);	  break;
6780	case OP_RF:    po_reg_or_fail (REG_TYPE_FN);	  break;
6781	case OP_RVS:   po_reg_or_fail (REG_TYPE_VFS);	  break;
6782	case OP_RVD:   po_reg_or_fail (REG_TYPE_VFD);	  break;
6783	case OP_oRND:
6784	case OP_RND:   po_reg_or_fail (REG_TYPE_VFD);	  break;
6785	case OP_RVC:
6786	  po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
6787	  break;
6788	  /* Also accept generic coprocessor regs for unknown registers.  */
6789	  coproc_reg:
6790	  po_reg_or_fail (REG_TYPE_CN);
6791	  break;
6792	case OP_RMF:   po_reg_or_fail (REG_TYPE_MVF);	  break;
6793	case OP_RMD:   po_reg_or_fail (REG_TYPE_MVD);	  break;
6794	case OP_RMFX:  po_reg_or_fail (REG_TYPE_MVFX);	  break;
6795	case OP_RMDX:  po_reg_or_fail (REG_TYPE_MVDX);	  break;
6796	case OP_RMAX:  po_reg_or_fail (REG_TYPE_MVAX);	  break;
6797	case OP_RMDS:  po_reg_or_fail (REG_TYPE_DSPSC);	  break;
6798	case OP_RIWR:  po_reg_or_fail (REG_TYPE_MMXWR);	  break;
6799	case OP_RIWC:  po_reg_or_fail (REG_TYPE_MMXWC);	  break;
6800	case OP_RIWG:  po_reg_or_fail (REG_TYPE_MMXWCG);  break;
6801	case OP_RXA:   po_reg_or_fail (REG_TYPE_XSCALE);  break;
6802	case OP_oRNQ:
6803	case OP_RNQ:   po_reg_or_fail (REG_TYPE_NQ);      break;
6804	case OP_RNSD:  po_reg_or_fail (REG_TYPE_NSD);     break;
6805	case OP_oRNDQ:
6806	case OP_RNDQ:  po_reg_or_fail (REG_TYPE_NDQ);     break;
6807	case OP_RVSD:  po_reg_or_fail (REG_TYPE_VFSD);    break;
6808	case OP_oRNSDQ:
6809	case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ);    break;
6810
6811	/* Neon scalar. Using an element size of 8 means that some invalid
6812	   scalars are accepted here, so deal with those in later code.  */
6813	case OP_RNSC:  po_scalar_or_goto (8, failure);    break;
6814
6815	case OP_RNDQ_I0:
6816	  {
6817	    po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
6818	    break;
6819	    try_imm0:
6820	    po_imm_or_fail (0, 0, TRUE);
6821	  }
6822	  break;
6823
6824	case OP_RVSD_I0:
6825	  po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
6826	  break;
6827
6828	case OP_RSVD_FI0:
6829	  {
6830	    po_reg_or_goto (REG_TYPE_VFSD, try_ifimm0);
6831	    break;
6832	    try_ifimm0:
6833	    if (parse_ifimm_zero (&str))
6834	      inst.operands[i].imm = 0;
6835	    else
6836	    {
6837	      inst.error
6838	        = _("only floating point zero is allowed as immediate value");
6839	      goto failure;
6840	    }
6841	  }
6842	  break;
6843
6844	case OP_RR_RNSC:
6845	  {
6846	    po_scalar_or_goto (8, try_rr);
6847	    break;
6848	    try_rr:
6849	    po_reg_or_fail (REG_TYPE_RN);
6850	  }
6851	  break;
6852
6853	case OP_RNSDQ_RNSC:
6854	  {
6855	    po_scalar_or_goto (8, try_nsdq);
6856	    break;
6857	    try_nsdq:
6858	    po_reg_or_fail (REG_TYPE_NSDQ);
6859	  }
6860	  break;
6861
6862	case OP_RNSD_RNSC:
6863	  {
6864	    po_scalar_or_goto (8, try_s_scalar);
6865	    break;
6866	    try_s_scalar:
6867	    po_scalar_or_goto (4, try_nsd);
6868	    break;
6869	    try_nsd:
6870	    po_reg_or_fail (REG_TYPE_NSD);
6871	  }
6872	  break;
6873
6874	case OP_RNDQ_RNSC:
6875	  {
6876	    po_scalar_or_goto (8, try_ndq);
6877	    break;
6878	    try_ndq:
6879	    po_reg_or_fail (REG_TYPE_NDQ);
6880	  }
6881	  break;
6882
6883	case OP_RND_RNSC:
6884	  {
6885	    po_scalar_or_goto (8, try_vfd);
6886	    break;
6887	    try_vfd:
6888	    po_reg_or_fail (REG_TYPE_VFD);
6889	  }
6890	  break;
6891
6892	case OP_VMOV:
6893	  /* WARNING: parse_neon_mov can move the operand counter, i. If we're
6894	     not careful then bad things might happen.  */
6895	  po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
6896	  break;
6897
6898	case OP_RNDQ_Ibig:
6899	  {
6900	    po_reg_or_goto (REG_TYPE_NDQ, try_immbig);
6901	    break;
6902	    try_immbig:
6903	    /* There's a possibility of getting a 64-bit immediate here, so
6904	       we need special handling.  */
6905	    if (parse_big_immediate (&str, i, NULL, /*allow_symbol_p=*/FALSE)
6906		== FAIL)
6907	      {
6908		inst.error = _("immediate value is out of range");
6909		goto failure;
6910	      }
6911	  }
6912	  break;
6913
6914	case OP_RNDQ_I63b:
6915	  {
6916	    po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
6917	    break;
6918	    try_shimm:
6919	    po_imm_or_fail (0, 63, TRUE);
6920	  }
6921	  break;
6922
6923	case OP_RRnpcb:
6924	  po_char_or_fail ('[');
6925	  po_reg_or_fail  (REG_TYPE_RN);
6926	  po_char_or_fail (']');
6927	  break;
6928
6929	case OP_RRnpctw:
6930	case OP_RRw:
6931	case OP_oRRw:
6932	  po_reg_or_fail (REG_TYPE_RN);
6933	  if (skip_past_char (&str, '!') == SUCCESS)
6934	    inst.operands[i].writeback = 1;
6935	  break;
6936
6937	  /* Immediates */
6938	case OP_I7:	 po_imm_or_fail (  0,	   7, FALSE);	break;
6939	case OP_I15:	 po_imm_or_fail (  0,	  15, FALSE);	break;
6940	case OP_I16:	 po_imm_or_fail (  1,	  16, FALSE);	break;
6941	case OP_I16z:	 po_imm_or_fail (  0,     16, FALSE);   break;
6942	case OP_I31:	 po_imm_or_fail (  0,	  31, FALSE);	break;
6943	case OP_I32:	 po_imm_or_fail (  1,	  32, FALSE);	break;
6944	case OP_I32z:	 po_imm_or_fail (  0,     32, FALSE);   break;
6945	case OP_I63s:	 po_imm_or_fail (-64,	  63, FALSE);	break;
6946	case OP_I63:	 po_imm_or_fail (  0,     63, FALSE);   break;
6947	case OP_I64:	 po_imm_or_fail (  1,     64, FALSE);   break;
6948	case OP_I64z:	 po_imm_or_fail (  0,     64, FALSE);   break;
6949	case OP_I255:	 po_imm_or_fail (  0,	 255, FALSE);	break;
6950
6951	case OP_I4b:	 po_imm_or_fail (  1,	   4, TRUE);	break;
6952	case OP_oI7b:
6953	case OP_I7b:	 po_imm_or_fail (  0,	   7, TRUE);	break;
6954	case OP_I15b:	 po_imm_or_fail (  0,	  15, TRUE);	break;
6955	case OP_oI31b:
6956	case OP_I31b:	 po_imm_or_fail (  0,	  31, TRUE);	break;
6957	case OP_oI32b:   po_imm_or_fail (  1,     32, TRUE);    break;
6958	case OP_oI32z:   po_imm_or_fail (  0,     32, TRUE);    break;
6959	case OP_oIffffb: po_imm_or_fail (  0, 0xffff, TRUE);	break;
6960
6961	  /* Immediate variants */
6962	case OP_oI255c:
6963	  po_char_or_fail ('{');
6964	  po_imm_or_fail (0, 255, TRUE);
6965	  po_char_or_fail ('}');
6966	  break;
6967
6968	case OP_I31w:
6969	  /* The expression parser chokes on a trailing !, so we have
6970	     to find it first and zap it.  */
6971	  {
6972	    char *s = str;
6973	    while (*s && *s != ',')
6974	      s++;
6975	    if (s[-1] == '!')
6976	      {
6977		s[-1] = '\0';
6978		inst.operands[i].writeback = 1;
6979	      }
6980	    po_imm_or_fail (0, 31, TRUE);
6981	    if (str == s - 1)
6982	      str = s;
6983	  }
6984	  break;
6985
6986	  /* Expressions */
6987	case OP_EXPi:	EXPi:
6988	  po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6989					      GE_OPT_PREFIX));
6990	  break;
6991
6992	case OP_EXP:
6993	  po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6994					      GE_NO_PREFIX));
6995	  break;
6996
6997	case OP_EXPr:	EXPr:
6998	  po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6999					      GE_NO_PREFIX));
7000	  if (inst.reloc.exp.X_op == O_symbol)
7001	    {
7002	      val = parse_reloc (&str);
7003	      if (val == -1)
7004		{
7005		  inst.error = _("unrecognized relocation suffix");
7006		  goto failure;
7007		}
7008	      else if (val != BFD_RELOC_UNUSED)
7009		{
7010		  inst.operands[i].imm = val;
7011		  inst.operands[i].hasreloc = 1;
7012		}
7013	    }
7014	  break;
7015
7016	  /* Operand for MOVW or MOVT.  */
7017	case OP_HALF:
7018	  po_misc_or_fail (parse_half (&str));
7019	  break;
7020
7021	  /* Register or expression.  */
7022	case OP_RR_EXr:	  po_reg_or_goto (REG_TYPE_RN, EXPr); break;
7023	case OP_RR_EXi:	  po_reg_or_goto (REG_TYPE_RN, EXPi); break;
7024
7025	  /* Register or immediate.  */
7026	case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0);   break;
7027	I0:		  po_imm_or_fail (0, 0, FALSE);	      break;
7028
7029	case OP_RF_IF:    po_reg_or_goto (REG_TYPE_FN, IF);   break;
7030	IF:
7031	  if (!is_immediate_prefix (*str))
7032	    goto bad_args;
7033	  str++;
7034	  val = parse_fpa_immediate (&str);
7035	  if (val == FAIL)
7036	    goto failure;
7037	  /* FPA immediates are encoded as registers 8-15.
7038	     parse_fpa_immediate has already applied the offset.  */
7039	  inst.operands[i].reg = val;
7040	  inst.operands[i].isreg = 1;
7041	  break;
7042
7043	case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
7044	I32z:		  po_imm_or_fail (0, 32, FALSE);	  break;
7045
7046	  /* Two kinds of register.  */
7047	case OP_RIWR_RIWC:
7048	  {
7049	    struct reg_entry *rege = arm_reg_parse_multi (&str);
7050	    if (!rege
7051		|| (rege->type != REG_TYPE_MMXWR
7052		    && rege->type != REG_TYPE_MMXWC
7053		    && rege->type != REG_TYPE_MMXWCG))
7054	      {
7055		inst.error = _("iWMMXt data or control register expected");
7056		goto failure;
7057	      }
7058	    inst.operands[i].reg = rege->number;
7059	    inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
7060	  }
7061	  break;
7062
7063	case OP_RIWC_RIWG:
7064	  {
7065	    struct reg_entry *rege = arm_reg_parse_multi (&str);
7066	    if (!rege
7067		|| (rege->type != REG_TYPE_MMXWC
7068		    && rege->type != REG_TYPE_MMXWCG))
7069	      {
7070		inst.error = _("iWMMXt control register expected");
7071		goto failure;
7072	      }
7073	    inst.operands[i].reg = rege->number;
7074	    inst.operands[i].isreg = 1;
7075	  }
7076	  break;
7077
7078	  /* Misc */
7079	case OP_CPSF:	 val = parse_cps_flags (&str);		break;
7080	case OP_ENDI:	 val = parse_endian_specifier (&str);	break;
7081	case OP_oROR:	 val = parse_ror (&str);		break;
7082	case OP_COND:	 val = parse_cond (&str);		break;
7083	case OP_oBARRIER_I15:
7084	  po_barrier_or_imm (str); break;
7085	  immediate:
7086	  if (parse_immediate (&str, &val, 0, 15, TRUE) == FAIL)
7087	    goto failure;
7088	  break;
7089
7090	case OP_wPSR:
7091	case OP_rPSR:
7092	  po_reg_or_goto (REG_TYPE_RNB, try_psr);
7093	  if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_virt))
7094	    {
7095	      inst.error = _("Banked registers are not available with this "
7096			     "architecture.");
7097	      goto failure;
7098	    }
7099	  break;
7100	  try_psr:
7101	  val = parse_psr (&str, op_parse_code == OP_wPSR);
7102	  break;
7103
7104	case OP_APSR_RR:
7105	  po_reg_or_goto (REG_TYPE_RN, try_apsr);
7106	  break;
7107	  try_apsr:
7108	  /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
7109	     instruction).  */
7110	  if (strncasecmp (str, "APSR_", 5) == 0)
7111	    {
7112	      unsigned found = 0;
7113	      str += 5;
7114	      while (found < 15)
7115		switch (*str++)
7116		  {
7117		  case 'c': found = (found & 1) ? 16 : found | 1; break;
7118		  case 'n': found = (found & 2) ? 16 : found | 2; break;
7119		  case 'z': found = (found & 4) ? 16 : found | 4; break;
7120		  case 'v': found = (found & 8) ? 16 : found | 8; break;
7121		  default: found = 16;
7122		  }
7123	      if (found != 15)
7124		goto failure;
7125	      inst.operands[i].isvec = 1;
7126	      /* APSR_nzcv is encoded in instructions as if it were the REG_PC.  */
7127	      inst.operands[i].reg = REG_PC;
7128	    }
7129	  else
7130	    goto failure;
7131	  break;
7132
7133	case OP_TB:
7134	  po_misc_or_fail (parse_tb (&str));
7135	  break;
7136
7137	  /* Register lists.  */
7138	case OP_REGLST:
7139	  val = parse_reg_list (&str);
7140	  if (*str == '^')
7141	    {
7142	      inst.operands[i].writeback = 1;
7143	      str++;
7144	    }
7145	  break;
7146
7147	case OP_VRSLST:
7148	  val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
7149	  break;
7150
7151	case OP_VRDLST:
7152	  val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
7153	  break;
7154
7155	case OP_VRSDLST:
7156	  /* Allow Q registers too.  */
7157	  val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
7158				    REGLIST_NEON_D);
7159	  if (val == FAIL)
7160	    {
7161	      inst.error = NULL;
7162	      val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
7163					REGLIST_VFP_S);
7164	      inst.operands[i].issingle = 1;
7165	    }
7166	  break;
7167
7168	case OP_NRDLST:
7169	  val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
7170				    REGLIST_NEON_D);
7171	  break;
7172
7173	case OP_NSTRLST:
7174	  val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
7175					   &inst.operands[i].vectype);
7176	  break;
7177
7178	  /* Addressing modes */
7179	case OP_ADDR:
7180	  po_misc_or_fail (parse_address (&str, i));
7181	  break;
7182
7183	case OP_ADDRGLDR:
7184	  po_misc_or_fail_no_backtrack (
7185	    parse_address_group_reloc (&str, i, GROUP_LDR));
7186	  break;
7187
7188	case OP_ADDRGLDRS:
7189	  po_misc_or_fail_no_backtrack (
7190	    parse_address_group_reloc (&str, i, GROUP_LDRS));
7191	  break;
7192
7193	case OP_ADDRGLDC:
7194	  po_misc_or_fail_no_backtrack (
7195	    parse_address_group_reloc (&str, i, GROUP_LDC));
7196	  break;
7197
7198	case OP_SH:
7199	  po_misc_or_fail (parse_shifter_operand (&str, i));
7200	  break;
7201
7202	case OP_SHG:
7203	  po_misc_or_fail_no_backtrack (
7204	    parse_shifter_operand_group_reloc (&str, i));
7205	  break;
7206
7207	case OP_oSHll:
7208	  po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
7209	  break;
7210
7211	case OP_oSHar:
7212	  po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
7213	  break;
7214
7215	case OP_oSHllar:
7216	  po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
7217	  break;
7218
7219	default:
7220	  as_fatal (_("unhandled operand code %d"), op_parse_code);
7221	}
7222
7223      /* Various value-based sanity checks and shared operations.  We
7224	 do not signal immediate failures for the register constraints;
7225	 this allows a syntax error to take precedence.	 */
7226      switch (op_parse_code)
7227	{
7228	case OP_oRRnpc:
7229	case OP_RRnpc:
7230	case OP_RRnpcb:
7231	case OP_RRw:
7232	case OP_oRRw:
7233	case OP_RRnpc_I0:
7234	  if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
7235	    inst.error = BAD_PC;
7236	  break;
7237
7238	case OP_oRRnpcsp:
7239	case OP_RRnpcsp:
7240	  if (inst.operands[i].isreg)
7241	    {
7242	      if (inst.operands[i].reg == REG_PC)
7243		inst.error = BAD_PC;
7244	      else if (inst.operands[i].reg == REG_SP
7245		       /* The restriction on Rd/Rt/Rt2 on Thumb mode has been
7246			  relaxed since ARMv8-A.  */
7247		       && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
7248		{
7249		  gas_assert (thumb);
7250		  inst.error = BAD_SP;
7251		}
7252	    }
7253	  break;
7254
7255	case OP_RRnpctw:
7256	  if (inst.operands[i].isreg
7257	      && inst.operands[i].reg == REG_PC
7258	      && (inst.operands[i].writeback || thumb))
7259	    inst.error = BAD_PC;
7260	  break;
7261
7262	case OP_CPSF:
7263	case OP_ENDI:
7264	case OP_oROR:
7265	case OP_wPSR:
7266	case OP_rPSR:
7267	case OP_COND:
7268	case OP_oBARRIER_I15:
7269	case OP_REGLST:
7270	case OP_VRSLST:
7271	case OP_VRDLST:
7272	case OP_VRSDLST:
7273	case OP_NRDLST:
7274	case OP_NSTRLST:
7275	  if (val == FAIL)
7276	    goto failure;
7277	  inst.operands[i].imm = val;
7278	  break;
7279
7280	default:
7281	  break;
7282	}
7283
7284      /* If we get here, this operand was successfully parsed.	*/
7285      inst.operands[i].present = 1;
7286      continue;
7287
7288    bad_args:
7289      inst.error = BAD_ARGS;
7290
7291    failure:
7292      if (!backtrack_pos)
7293	{
7294	  /* The parse routine should already have set inst.error, but set a
7295	     default here just in case.  */
7296	  if (!inst.error)
7297	    inst.error = _("syntax error");
7298	  return FAIL;
7299	}
7300
7301      /* Do not backtrack over a trailing optional argument that
7302	 absorbed some text.  We will only fail again, with the
7303	 'garbage following instruction' error message, which is
7304	 probably less helpful than the current one.  */
7305      if (backtrack_index == i && backtrack_pos != str
7306	  && upat[i+1] == OP_stop)
7307	{
7308	  if (!inst.error)
7309	    inst.error = _("syntax error");
7310	  return FAIL;
7311	}
7312
7313      /* Try again, skipping the optional argument at backtrack_pos.  */
7314      str = backtrack_pos;
7315      inst.error = backtrack_error;
7316      inst.operands[backtrack_index].present = 0;
7317      i = backtrack_index;
7318      backtrack_pos = 0;
7319    }
7320
7321  /* Check that we have parsed all the arguments.  */
7322  if (*str != '\0' && !inst.error)
7323    inst.error = _("garbage following instruction");
7324
7325  return inst.error ? FAIL : SUCCESS;
7326}
7327
7328#undef po_char_or_fail
7329#undef po_reg_or_fail
7330#undef po_reg_or_goto
7331#undef po_imm_or_fail
7332#undef po_scalar_or_fail
7333#undef po_barrier_or_imm
7334
7335/* Shorthand macro for instruction encoding functions issuing errors.  */
7336#define constraint(expr, err)			\
7337  do						\
7338    {						\
7339      if (expr)					\
7340	{					\
7341	  inst.error = err;			\
7342	  return;				\
7343	}					\
7344    }						\
7345  while (0)
7346
7347/* Reject "bad registers" for Thumb-2 instructions.  Many Thumb-2
7348   instructions are unpredictable if these registers are used.  This
7349   is the BadReg predicate in ARM's Thumb-2 documentation.
7350
7351   Before ARMv8-A, REG_PC and REG_SP were not allowed in quite a few
7352   places, while the restriction on REG_SP was relaxed since ARMv8-A.  */
7353#define reject_bad_reg(reg)					\
7354  do								\
7355   if (reg == REG_PC)						\
7356     {								\
7357       inst.error = BAD_PC;					\
7358       return;							\
7359     }								\
7360   else if (reg == REG_SP					\
7361	    && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))	\
7362     {								\
7363       inst.error = BAD_SP;					\
7364       return;							\
7365     }								\
7366  while (0)
7367
7368/* If REG is R13 (the stack pointer), warn that its use is
7369   deprecated.  */
7370#define warn_deprecated_sp(reg)			\
7371  do						\
7372    if (warn_on_deprecated && reg == REG_SP)	\
7373       as_tsktsk (_("use of r13 is deprecated"));	\
7374  while (0)
7375
7376/* Functions for operand encoding.  ARM, then Thumb.  */
7377
7378#define rotate_left(v, n) (v << (n & 31) | v >> ((32 - n) & 31))
7379
7380/* If the current inst is scalar ARMv8.2 fp16 instruction, do special encoding.
7381
7382   The only binary encoding difference is the Coprocessor number.  Coprocessor
7383   9 is used for half-precision calculations or conversions.  The format of the
7384   instruction is the same as the equivalent Coprocessor 10 instruction that
7385   exists for Single-Precision operation.  */
7386
7387static void
7388do_scalar_fp16_v82_encode (void)
7389{
7390  if (inst.cond != COND_ALWAYS)
7391    as_warn (_("ARMv8.2 scalar fp16 instruction cannot be conditional,"
7392	       " the behaviour is UNPREDICTABLE"));
7393  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16),
7394	      _(BAD_FP16));
7395
7396  inst.instruction = (inst.instruction & 0xfffff0ff) | 0x900;
7397  mark_feature_used (&arm_ext_fp16);
7398}
7399
7400/* If VAL can be encoded in the immediate field of an ARM instruction,
7401   return the encoded form.  Otherwise, return FAIL.  */
7402
7403static unsigned int
7404encode_arm_immediate (unsigned int val)
7405{
7406  unsigned int a, i;
7407
7408  if (val <= 0xff)
7409    return val;
7410
7411  for (i = 2; i < 32; i += 2)
7412    if ((a = rotate_left (val, i)) <= 0xff)
7413      return a | (i << 7); /* 12-bit pack: [shift-cnt,const].  */
7414
7415  return FAIL;
7416}
7417
7418/* If VAL can be encoded in the immediate field of a Thumb32 instruction,
7419   return the encoded form.  Otherwise, return FAIL.  */
7420static unsigned int
7421encode_thumb32_immediate (unsigned int val)
7422{
7423  unsigned int a, i;
7424
7425  if (val <= 0xff)
7426    return val;
7427
7428  for (i = 1; i <= 24; i++)
7429    {
7430      a = val >> i;
7431      if ((val & ~(0xff << i)) == 0)
7432	return ((val >> i) & 0x7f) | ((32 - i) << 7);
7433    }
7434
7435  a = val & 0xff;
7436  if (val == ((a << 16) | a))
7437    return 0x100 | a;
7438  if (val == ((a << 24) | (a << 16) | (a << 8) | a))
7439    return 0x300 | a;
7440
7441  a = val & 0xff00;
7442  if (val == ((a << 16) | a))
7443    return 0x200 | (a >> 8);
7444
7445  return FAIL;
7446}
7447/* Encode a VFP SP or DP register number into inst.instruction.  */
7448
7449static void
7450encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
7451{
7452  if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
7453      && reg > 15)
7454    {
7455      if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
7456	{
7457	  if (thumb_mode)
7458	    ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
7459				    fpu_vfp_ext_d32);
7460	  else
7461	    ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
7462				    fpu_vfp_ext_d32);
7463	}
7464      else
7465	{
7466	  first_error (_("D register out of range for selected VFP version"));
7467	  return;
7468	}
7469    }
7470
7471  switch (pos)
7472    {
7473    case VFP_REG_Sd:
7474      inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
7475      break;
7476
7477    case VFP_REG_Sn:
7478      inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
7479      break;
7480
7481    case VFP_REG_Sm:
7482      inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
7483      break;
7484
7485    case VFP_REG_Dd:
7486      inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
7487      break;
7488
7489    case VFP_REG_Dn:
7490      inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
7491      break;
7492
7493    case VFP_REG_Dm:
7494      inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
7495      break;
7496
7497    default:
7498      abort ();
7499    }
7500}
7501
7502/* Encode a <shift> in an ARM-format instruction.  The immediate,
7503   if any, is handled by md_apply_fix.	 */
7504static void
7505encode_arm_shift (int i)
7506{
7507  /* register-shifted register.  */
7508  if (inst.operands[i].immisreg)
7509    {
7510      int op_index;
7511      for (op_index = 0; op_index <= i; ++op_index)
7512	{
7513	  /* Check the operand only when it's presented.  In pre-UAL syntax,
7514	     if the destination register is the same as the first operand, two
7515	     register form of the instruction can be used.  */
7516	  if (inst.operands[op_index].present && inst.operands[op_index].isreg
7517	      && inst.operands[op_index].reg == REG_PC)
7518	    as_warn (UNPRED_REG ("r15"));
7519	}
7520
7521      if (inst.operands[i].imm == REG_PC)
7522	as_warn (UNPRED_REG ("r15"));
7523    }
7524
7525  if (inst.operands[i].shift_kind == SHIFT_RRX)
7526    inst.instruction |= SHIFT_ROR << 5;
7527  else
7528    {
7529      inst.instruction |= inst.operands[i].shift_kind << 5;
7530      if (inst.operands[i].immisreg)
7531	{
7532	  inst.instruction |= SHIFT_BY_REG;
7533	  inst.instruction |= inst.operands[i].imm << 8;
7534	}
7535      else
7536	inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7537    }
7538}
7539
7540static void
7541encode_arm_shifter_operand (int i)
7542{
7543  if (inst.operands[i].isreg)
7544    {
7545      inst.instruction |= inst.operands[i].reg;
7546      encode_arm_shift (i);
7547    }
7548  else
7549    {
7550      inst.instruction |= INST_IMMEDIATE;
7551      if (inst.reloc.type != BFD_RELOC_ARM_IMMEDIATE)
7552	inst.instruction |= inst.operands[i].imm;
7553    }
7554}
7555
7556/* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3.  */
7557static void
7558encode_arm_addr_mode_common (int i, bfd_boolean is_t)
7559{
7560  /* PR 14260:
7561     Generate an error if the operand is not a register.  */
7562  constraint (!inst.operands[i].isreg,
7563	      _("Instruction does not support =N addresses"));
7564
7565  inst.instruction |= inst.operands[i].reg << 16;
7566
7567  if (inst.operands[i].preind)
7568    {
7569      if (is_t)
7570	{
7571	  inst.error = _("instruction does not accept preindexed addressing");
7572	  return;
7573	}
7574      inst.instruction |= PRE_INDEX;
7575      if (inst.operands[i].writeback)
7576	inst.instruction |= WRITE_BACK;
7577
7578    }
7579  else if (inst.operands[i].postind)
7580    {
7581      gas_assert (inst.operands[i].writeback);
7582      if (is_t)
7583	inst.instruction |= WRITE_BACK;
7584    }
7585  else /* unindexed - only for coprocessor */
7586    {
7587      inst.error = _("instruction does not accept unindexed addressing");
7588      return;
7589    }
7590
7591  if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
7592      && (((inst.instruction & 0x000f0000) >> 16)
7593	  == ((inst.instruction & 0x0000f000) >> 12)))
7594    as_warn ((inst.instruction & LOAD_BIT)
7595	     ? _("destination register same as write-back base")
7596	     : _("source register same as write-back base"));
7597}
7598
7599/* inst.operands[i] was set up by parse_address.  Encode it into an
7600   ARM-format mode 2 load or store instruction.	 If is_t is true,
7601   reject forms that cannot be used with a T instruction (i.e. not
7602   post-indexed).  */
7603static void
7604encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
7605{
7606  const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
7607
7608  encode_arm_addr_mode_common (i, is_t);
7609
7610  if (inst.operands[i].immisreg)
7611    {
7612      constraint ((inst.operands[i].imm == REG_PC
7613		   || (is_pc && inst.operands[i].writeback)),
7614		  BAD_PC_ADDRESSING);
7615      inst.instruction |= INST_IMMEDIATE;  /* yes, this is backwards */
7616      inst.instruction |= inst.operands[i].imm;
7617      if (!inst.operands[i].negative)
7618	inst.instruction |= INDEX_UP;
7619      if (inst.operands[i].shifted)
7620	{
7621	  if (inst.operands[i].shift_kind == SHIFT_RRX)
7622	    inst.instruction |= SHIFT_ROR << 5;
7623	  else
7624	    {
7625	      inst.instruction |= inst.operands[i].shift_kind << 5;
7626	      inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7627	    }
7628	}
7629    }
7630  else /* immediate offset in inst.reloc */
7631    {
7632      if (is_pc && !inst.reloc.pc_rel)
7633	{
7634	  const bfd_boolean is_load = ((inst.instruction & LOAD_BIT) != 0);
7635
7636	  /* If is_t is TRUE, it's called from do_ldstt.  ldrt/strt
7637	     cannot use PC in addressing.
7638	     PC cannot be used in writeback addressing, either.  */
7639	  constraint ((is_t || inst.operands[i].writeback),
7640		      BAD_PC_ADDRESSING);
7641
7642	  /* Use of PC in str is deprecated for ARMv7.  */
7643	  if (warn_on_deprecated
7644	      && !is_load
7645	      && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
7646	    as_tsktsk (_("use of PC in this instruction is deprecated"));
7647	}
7648
7649      if (inst.reloc.type == BFD_RELOC_UNUSED)
7650	{
7651	  /* Prefer + for zero encoded value.  */
7652	  if (!inst.operands[i].negative)
7653	    inst.instruction |= INDEX_UP;
7654	  inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
7655	}
7656    }
7657}
7658
7659/* inst.operands[i] was set up by parse_address.  Encode it into an
7660   ARM-format mode 3 load or store instruction.	 Reject forms that
7661   cannot be used with such instructions.  If is_t is true, reject
7662   forms that cannot be used with a T instruction (i.e. not
7663   post-indexed).  */
7664static void
7665encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
7666{
7667  if (inst.operands[i].immisreg && inst.operands[i].shifted)
7668    {
7669      inst.error = _("instruction does not accept scaled register index");
7670      return;
7671    }
7672
7673  encode_arm_addr_mode_common (i, is_t);
7674
7675  if (inst.operands[i].immisreg)
7676    {
7677      constraint ((inst.operands[i].imm == REG_PC
7678		   || (is_t && inst.operands[i].reg == REG_PC)),
7679		  BAD_PC_ADDRESSING);
7680      constraint (inst.operands[i].reg == REG_PC && inst.operands[i].writeback,
7681		  BAD_PC_WRITEBACK);
7682      inst.instruction |= inst.operands[i].imm;
7683      if (!inst.operands[i].negative)
7684	inst.instruction |= INDEX_UP;
7685    }
7686  else /* immediate offset in inst.reloc */
7687    {
7688      constraint ((inst.operands[i].reg == REG_PC && !inst.reloc.pc_rel
7689		   && inst.operands[i].writeback),
7690		  BAD_PC_WRITEBACK);
7691      inst.instruction |= HWOFFSET_IMM;
7692      if (inst.reloc.type == BFD_RELOC_UNUSED)
7693	{
7694	  /* Prefer + for zero encoded value.  */
7695	  if (!inst.operands[i].negative)
7696	    inst.instruction |= INDEX_UP;
7697
7698	  inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
7699	}
7700    }
7701}
7702
7703/* Write immediate bits [7:0] to the following locations:
7704
7705  |28/24|23     19|18 16|15                    4|3     0|
7706  |  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|
7707
7708  This function is used by VMOV/VMVN/VORR/VBIC.  */
7709
7710static void
7711neon_write_immbits (unsigned immbits)
7712{
7713  inst.instruction |= immbits & 0xf;
7714  inst.instruction |= ((immbits >> 4) & 0x7) << 16;
7715  inst.instruction |= ((immbits >> 7) & 0x1) << (thumb_mode ? 28 : 24);
7716}
7717
7718/* Invert low-order SIZE bits of XHI:XLO.  */
7719
7720static void
7721neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
7722{
7723  unsigned immlo = xlo ? *xlo : 0;
7724  unsigned immhi = xhi ? *xhi : 0;
7725
7726  switch (size)
7727    {
7728    case 8:
7729      immlo = (~immlo) & 0xff;
7730      break;
7731
7732    case 16:
7733      immlo = (~immlo) & 0xffff;
7734      break;
7735
7736    case 64:
7737      immhi = (~immhi) & 0xffffffff;
7738      /* fall through.  */
7739
7740    case 32:
7741      immlo = (~immlo) & 0xffffffff;
7742      break;
7743
7744    default:
7745      abort ();
7746    }
7747
7748  if (xlo)
7749    *xlo = immlo;
7750
7751  if (xhi)
7752    *xhi = immhi;
7753}
7754
7755/* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
7756   A, B, C, D.  */
7757
7758static int
7759neon_bits_same_in_bytes (unsigned imm)
7760{
7761  return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
7762	 && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
7763	 && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
7764	 && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
7765}
7766
7767/* For immediate of above form, return 0bABCD.  */
7768
7769static unsigned
7770neon_squash_bits (unsigned imm)
7771{
7772  return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
7773	 | ((imm & 0x01000000) >> 21);
7774}
7775
7776/* Compress quarter-float representation to 0b...000 abcdefgh.  */
7777
7778static unsigned
7779neon_qfloat_bits (unsigned imm)
7780{
7781  return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
7782}
7783
7784/* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
7785   the instruction. *OP is passed as the initial value of the op field, and
7786   may be set to a different value depending on the constant (i.e.
7787   "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
7788   MVN).  If the immediate looks like a repeated pattern then also
7789   try smaller element sizes.  */
7790
7791static int
7792neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
7793			 unsigned *immbits, int *op, int size,
7794			 enum neon_el_type type)
7795{
7796  /* Only permit float immediates (including 0.0/-0.0) if the operand type is
7797     float.  */
7798  if (type == NT_float && !float_p)
7799    return FAIL;
7800
7801  if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
7802    {
7803      if (size != 32 || *op == 1)
7804	return FAIL;
7805      *immbits = neon_qfloat_bits (immlo);
7806      return 0xf;
7807    }
7808
7809  if (size == 64)
7810    {
7811      if (neon_bits_same_in_bytes (immhi)
7812	  && neon_bits_same_in_bytes (immlo))
7813	{
7814	  if (*op == 1)
7815	    return FAIL;
7816	  *immbits = (neon_squash_bits (immhi) << 4)
7817		     | neon_squash_bits (immlo);
7818	  *op = 1;
7819	  return 0xe;
7820	}
7821
7822      if (immhi != immlo)
7823	return FAIL;
7824    }
7825
7826  if (size >= 32)
7827    {
7828      if (immlo == (immlo & 0x000000ff))
7829	{
7830	  *immbits = immlo;
7831	  return 0x0;
7832	}
7833      else if (immlo == (immlo & 0x0000ff00))
7834	{
7835	  *immbits = immlo >> 8;
7836	  return 0x2;
7837	}
7838      else if (immlo == (immlo & 0x00ff0000))
7839	{
7840	  *immbits = immlo >> 16;
7841	  return 0x4;
7842	}
7843      else if (immlo == (immlo & 0xff000000))
7844	{
7845	  *immbits = immlo >> 24;
7846	  return 0x6;
7847	}
7848      else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
7849	{
7850	  *immbits = (immlo >> 8) & 0xff;
7851	  return 0xc;
7852	}
7853      else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
7854	{
7855	  *immbits = (immlo >> 16) & 0xff;
7856	  return 0xd;
7857	}
7858
7859      if ((immlo & 0xffff) != (immlo >> 16))
7860	return FAIL;
7861      immlo &= 0xffff;
7862    }
7863
7864  if (size >= 16)
7865    {
7866      if (immlo == (immlo & 0x000000ff))
7867	{
7868	  *immbits = immlo;
7869	  return 0x8;
7870	}
7871      else if (immlo == (immlo & 0x0000ff00))
7872	{
7873	  *immbits = immlo >> 8;
7874	  return 0xa;
7875	}
7876
7877      if ((immlo & 0xff) != (immlo >> 8))
7878	return FAIL;
7879      immlo &= 0xff;
7880    }
7881
7882  if (immlo == (immlo & 0x000000ff))
7883    {
7884      /* Don't allow MVN with 8-bit immediate.  */
7885      if (*op == 1)
7886	return FAIL;
7887      *immbits = immlo;
7888      return 0xe;
7889    }
7890
7891  return FAIL;
7892}
7893
7894#if defined BFD_HOST_64_BIT
7895/* Returns TRUE if double precision value V may be cast
7896   to single precision without loss of accuracy.  */
7897
7898static bfd_boolean
7899is_double_a_single (bfd_int64_t v)
7900{
7901  int exp = (int)((v >> 52) & 0x7FF);
7902  bfd_int64_t mantissa = (v & (bfd_int64_t)0xFFFFFFFFFFFFFULL);
7903
7904  return (exp == 0 || exp == 0x7FF
7905	  || (exp >= 1023 - 126 && exp <= 1023 + 127))
7906    && (mantissa & 0x1FFFFFFFl) == 0;
7907}
7908
7909/* Returns a double precision value casted to single precision
7910   (ignoring the least significant bits in exponent and mantissa).  */
7911
7912static int
7913double_to_single (bfd_int64_t v)
7914{
7915  int sign = (int) ((v >> 63) & 1l);
7916  int exp = (int) ((v >> 52) & 0x7FF);
7917  bfd_int64_t mantissa = (v & (bfd_int64_t)0xFFFFFFFFFFFFFULL);
7918
7919  if (exp == 0x7FF)
7920    exp = 0xFF;
7921  else
7922    {
7923      exp = exp - 1023 + 127;
7924      if (exp >= 0xFF)
7925	{
7926	  /* Infinity.  */
7927	  exp = 0x7F;
7928	  mantissa = 0;
7929	}
7930      else if (exp < 0)
7931	{
7932	  /* No denormalized numbers.  */
7933	  exp = 0;
7934	  mantissa = 0;
7935	}
7936    }
7937  mantissa >>= 29;
7938  return (sign << 31) | (exp << 23) | mantissa;
7939}
7940#endif /* BFD_HOST_64_BIT */
7941
7942enum lit_type
7943{
7944  CONST_THUMB,
7945  CONST_ARM,
7946  CONST_VEC
7947};
7948
7949static void do_vfp_nsyn_opcode (const char *);
7950
7951/* inst.reloc.exp describes an "=expr" load pseudo-operation.
7952   Determine whether it can be performed with a move instruction; if
7953   it can, convert inst.instruction to that move instruction and
7954   return TRUE; if it can't, convert inst.instruction to a literal-pool
7955   load and return FALSE.  If this is not a valid thing to do in the
7956   current context, set inst.error and return TRUE.
7957
7958   inst.operands[i] describes the destination register.	 */
7959
7960static bfd_boolean
7961move_or_literal_pool (int i, enum lit_type t, bfd_boolean mode_3)
7962{
7963  unsigned long tbit;
7964  bfd_boolean thumb_p = (t == CONST_THUMB);
7965  bfd_boolean arm_p   = (t == CONST_ARM);
7966
7967  if (thumb_p)
7968    tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
7969  else
7970    tbit = LOAD_BIT;
7971
7972  if ((inst.instruction & tbit) == 0)
7973    {
7974      inst.error = _("invalid pseudo operation");
7975      return TRUE;
7976    }
7977
7978  if (inst.reloc.exp.X_op != O_constant
7979      && inst.reloc.exp.X_op != O_symbol
7980      && inst.reloc.exp.X_op != O_big)
7981    {
7982      inst.error = _("constant expression expected");
7983      return TRUE;
7984    }
7985
7986  if (inst.reloc.exp.X_op == O_constant
7987      || inst.reloc.exp.X_op == O_big)
7988    {
7989#if defined BFD_HOST_64_BIT
7990      bfd_int64_t v;
7991#else
7992      offsetT v;
7993#endif
7994      if (inst.reloc.exp.X_op == O_big)
7995	{
7996	  LITTLENUM_TYPE w[X_PRECISION];
7997	  LITTLENUM_TYPE * l;
7998
7999	  if (inst.reloc.exp.X_add_number == -1)
8000	    {
8001	      gen_to_words (w, X_PRECISION, E_PRECISION);
8002	      l = w;
8003	      /* FIXME: Should we check words w[2..5] ?  */
8004	    }
8005	  else
8006	    l = generic_bignum;
8007
8008#if defined BFD_HOST_64_BIT
8009	  v =
8010	    ((((((((bfd_int64_t) l[3] & LITTLENUM_MASK)
8011		  << LITTLENUM_NUMBER_OF_BITS)
8012		 | ((bfd_int64_t) l[2] & LITTLENUM_MASK))
8013		<< LITTLENUM_NUMBER_OF_BITS)
8014	       | ((bfd_int64_t) l[1] & LITTLENUM_MASK))
8015	      << LITTLENUM_NUMBER_OF_BITS)
8016	     | ((bfd_int64_t) l[0] & LITTLENUM_MASK));
8017#else
8018	  v = ((l[1] & LITTLENUM_MASK) << LITTLENUM_NUMBER_OF_BITS)
8019	    |  (l[0] & LITTLENUM_MASK);
8020#endif
8021	}
8022      else
8023	v = inst.reloc.exp.X_add_number;
8024
8025      if (!inst.operands[i].issingle)
8026	{
8027	  if (thumb_p)
8028	    {
8029	      /* LDR should not use lead in a flag-setting instruction being
8030		 chosen so we do not check whether movs can be used.  */
8031
8032	      if ((ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2)
8033		  || ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2_v8m))
8034		  && inst.operands[i].reg != 13
8035		  && inst.operands[i].reg != 15)
8036		{
8037		  /* Check if on thumb2 it can be done with a mov.w, mvn or
8038		     movw instruction.  */
8039		  unsigned int newimm;
8040		  bfd_boolean isNegated;
8041
8042		  newimm = encode_thumb32_immediate (v);
8043		  if (newimm != (unsigned int) FAIL)
8044		    isNegated = FALSE;
8045		  else
8046		    {
8047		      newimm = encode_thumb32_immediate (~v);
8048		      if (newimm != (unsigned int) FAIL)
8049			isNegated = TRUE;
8050		    }
8051
8052		  /* The number can be loaded with a mov.w or mvn
8053		     instruction.  */
8054		  if (newimm != (unsigned int) FAIL
8055		      && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2))
8056		    {
8057		      inst.instruction = (0xf04f0000  /*  MOV.W.  */
8058					  | (inst.operands[i].reg << 8));
8059		      /* Change to MOVN.  */
8060		      inst.instruction |= (isNegated ? 0x200000 : 0);
8061		      inst.instruction |= (newimm & 0x800) << 15;
8062		      inst.instruction |= (newimm & 0x700) << 4;
8063		      inst.instruction |= (newimm & 0x0ff);
8064		      return TRUE;
8065		    }
8066		  /* The number can be loaded with a movw instruction.  */
8067		  else if ((v & ~0xFFFF) == 0
8068			   && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2_v8m))
8069		    {
8070		      int imm = v & 0xFFFF;
8071
8072		      inst.instruction = 0xf2400000;  /* MOVW.  */
8073		      inst.instruction |= (inst.operands[i].reg << 8);
8074		      inst.instruction |= (imm & 0xf000) << 4;
8075		      inst.instruction |= (imm & 0x0800) << 15;
8076		      inst.instruction |= (imm & 0x0700) << 4;
8077		      inst.instruction |= (imm & 0x00ff);
8078		      return TRUE;
8079		    }
8080		}
8081	    }
8082	  else if (arm_p)
8083	    {
8084	      int value = encode_arm_immediate (v);
8085
8086	      if (value != FAIL)
8087		{
8088		  /* This can be done with a mov instruction.  */
8089		  inst.instruction &= LITERAL_MASK;
8090		  inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
8091		  inst.instruction |= value & 0xfff;
8092		  return TRUE;
8093		}
8094
8095	      value = encode_arm_immediate (~ v);
8096	      if (value != FAIL)
8097		{
8098		  /* This can be done with a mvn instruction.  */
8099		  inst.instruction &= LITERAL_MASK;
8100		  inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
8101		  inst.instruction |= value & 0xfff;
8102		  return TRUE;
8103		}
8104	    }
8105	  else if (t == CONST_VEC && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1))
8106	    {
8107	      int op = 0;
8108	      unsigned immbits = 0;
8109	      unsigned immlo = inst.operands[1].imm;
8110	      unsigned immhi = inst.operands[1].regisimm
8111		? inst.operands[1].reg
8112		: inst.reloc.exp.X_unsigned
8113		? 0
8114		: ((bfd_int64_t)((int) immlo)) >> 32;
8115	      int cmode = neon_cmode_for_move_imm (immlo, immhi, FALSE, &immbits,
8116						   &op, 64, NT_invtype);
8117
8118	      if (cmode == FAIL)
8119		{
8120		  neon_invert_size (&immlo, &immhi, 64);
8121		  op = !op;
8122		  cmode = neon_cmode_for_move_imm (immlo, immhi, FALSE, &immbits,
8123						   &op, 64, NT_invtype);
8124		}
8125
8126	      if (cmode != FAIL)
8127		{
8128		  inst.instruction = (inst.instruction & VLDR_VMOV_SAME)
8129		    | (1 << 23)
8130		    | (cmode << 8)
8131		    | (op << 5)
8132		    | (1 << 4);
8133
8134		  /* Fill other bits in vmov encoding for both thumb and arm.  */
8135		  if (thumb_mode)
8136		    inst.instruction |= (0x7U << 29) | (0xF << 24);
8137		  else
8138		    inst.instruction |= (0xFU << 28) | (0x1 << 25);
8139		  neon_write_immbits (immbits);
8140		  return TRUE;
8141		}
8142	    }
8143	}
8144
8145      if (t == CONST_VEC)
8146	{
8147	  /* Check if vldr Rx, =constant could be optimized to vmov Rx, #constant.  */
8148	  if (inst.operands[i].issingle
8149	      && is_quarter_float (inst.operands[1].imm)
8150	      && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v3xd))
8151	    {
8152	      inst.operands[1].imm =
8153		neon_qfloat_bits (v);
8154	      do_vfp_nsyn_opcode ("fconsts");
8155	      return TRUE;
8156	    }
8157
8158	  /* If our host does not support a 64-bit type then we cannot perform
8159	     the following optimization.  This mean that there will be a
8160	     discrepancy between the output produced by an assembler built for
8161	     a 32-bit-only host and the output produced from a 64-bit host, but
8162	     this cannot be helped.  */
8163#if defined BFD_HOST_64_BIT
8164	  else if (!inst.operands[1].issingle
8165		   && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v3))
8166	    {
8167	      if (is_double_a_single (v)
8168		  && is_quarter_float (double_to_single (v)))
8169		{
8170		  inst.operands[1].imm =
8171		    neon_qfloat_bits (double_to_single (v));
8172		  do_vfp_nsyn_opcode ("fconstd");
8173		  return TRUE;
8174		}
8175	    }
8176#endif
8177	}
8178    }
8179
8180  if (add_to_lit_pool ((!inst.operands[i].isvec
8181			|| inst.operands[i].issingle) ? 4 : 8) == FAIL)
8182    return TRUE;
8183
8184  inst.operands[1].reg = REG_PC;
8185  inst.operands[1].isreg = 1;
8186  inst.operands[1].preind = 1;
8187  inst.reloc.pc_rel = 1;
8188  inst.reloc.type = (thumb_p
8189		     ? BFD_RELOC_ARM_THUMB_OFFSET
8190		     : (mode_3
8191			? BFD_RELOC_ARM_HWLITERAL
8192			: BFD_RELOC_ARM_LITERAL));
8193  return FALSE;
8194}
8195
8196/* inst.operands[i] was set up by parse_address.  Encode it into an
8197   ARM-format instruction.  Reject all forms which cannot be encoded
8198   into a coprocessor load/store instruction.  If wb_ok is false,
8199   reject use of writeback; if unind_ok is false, reject use of
8200   unindexed addressing.  If reloc_override is not 0, use it instead
8201   of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
8202   (in which case it is preserved).  */
8203
8204static int
8205encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
8206{
8207  if (!inst.operands[i].isreg)
8208    {
8209      /* PR 18256 */
8210      if (! inst.operands[0].isvec)
8211	{
8212	  inst.error = _("invalid co-processor operand");
8213	  return FAIL;
8214	}
8215      if (move_or_literal_pool (0, CONST_VEC, /*mode_3=*/FALSE))
8216	return SUCCESS;
8217    }
8218
8219  inst.instruction |= inst.operands[i].reg << 16;
8220
8221  gas_assert (!(inst.operands[i].preind && inst.operands[i].postind));
8222
8223  if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
8224    {
8225      gas_assert (!inst.operands[i].writeback);
8226      if (!unind_ok)
8227	{
8228	  inst.error = _("instruction does not support unindexed addressing");
8229	  return FAIL;
8230	}
8231      inst.instruction |= inst.operands[i].imm;
8232      inst.instruction |= INDEX_UP;
8233      return SUCCESS;
8234    }
8235
8236  if (inst.operands[i].preind)
8237    inst.instruction |= PRE_INDEX;
8238
8239  if (inst.operands[i].writeback)
8240    {
8241      if (inst.operands[i].reg == REG_PC)
8242	{
8243	  inst.error = _("pc may not be used with write-back");
8244	  return FAIL;
8245	}
8246      if (!wb_ok)
8247	{
8248	  inst.error = _("instruction does not support writeback");
8249	  return FAIL;
8250	}
8251      inst.instruction |= WRITE_BACK;
8252    }
8253
8254  if (reloc_override)
8255    inst.reloc.type = (bfd_reloc_code_real_type) reloc_override;
8256  else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
8257	    || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
8258	   && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
8259    {
8260      if (thumb_mode)
8261	inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
8262      else
8263	inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
8264    }
8265
8266  /* Prefer + for zero encoded value.  */
8267  if (!inst.operands[i].negative)
8268    inst.instruction |= INDEX_UP;
8269
8270  return SUCCESS;
8271}
8272
8273/* Functions for instruction encoding, sorted by sub-architecture.
8274   First some generics; their names are taken from the conventional
8275   bit positions for register arguments in ARM format instructions.  */
8276
8277static void
8278do_noargs (void)
8279{
8280}
8281
8282static void
8283do_rd (void)
8284{
8285  inst.instruction |= inst.operands[0].reg << 12;
8286}
8287
8288static void
8289do_rn (void)
8290{
8291  inst.instruction |= inst.operands[0].reg << 16;
8292}
8293
8294static void
8295do_rd_rm (void)
8296{
8297  inst.instruction |= inst.operands[0].reg << 12;
8298  inst.instruction |= inst.operands[1].reg;
8299}
8300
8301static void
8302do_rm_rn (void)
8303{
8304  inst.instruction |= inst.operands[0].reg;
8305  inst.instruction |= inst.operands[1].reg << 16;
8306}
8307
8308static void
8309do_rd_rn (void)
8310{
8311  inst.instruction |= inst.operands[0].reg << 12;
8312  inst.instruction |= inst.operands[1].reg << 16;
8313}
8314
8315static void
8316do_rn_rd (void)
8317{
8318  inst.instruction |= inst.operands[0].reg << 16;
8319  inst.instruction |= inst.operands[1].reg << 12;
8320}
8321
8322static void
8323do_tt (void)
8324{
8325  inst.instruction |= inst.operands[0].reg << 8;
8326  inst.instruction |= inst.operands[1].reg << 16;
8327}
8328
8329static bfd_boolean
8330check_obsolete (const arm_feature_set *feature, const char *msg)
8331{
8332  if (ARM_CPU_IS_ANY (cpu_variant))
8333    {
8334      as_tsktsk ("%s", msg);
8335      return TRUE;
8336    }
8337  else if (ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
8338    {
8339      as_bad ("%s", msg);
8340      return TRUE;
8341    }
8342
8343  return FALSE;
8344}
8345
8346static void
8347do_rd_rm_rn (void)
8348{
8349  unsigned Rn = inst.operands[2].reg;
8350  /* Enforce restrictions on SWP instruction.  */
8351  if ((inst.instruction & 0x0fbfffff) == 0x01000090)
8352    {
8353      constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
8354		  _("Rn must not overlap other operands"));
8355
8356      /* SWP{b} is obsolete for ARMv8-A, and deprecated for ARMv6* and ARMv7.
8357       */
8358      if (!check_obsolete (&arm_ext_v8,
8359			   _("swp{b} use is obsoleted for ARMv8 and later"))
8360	  && warn_on_deprecated
8361	  && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6))
8362	as_tsktsk (_("swp{b} use is deprecated for ARMv6 and ARMv7"));
8363    }
8364
8365  inst.instruction |= inst.operands[0].reg << 12;
8366  inst.instruction |= inst.operands[1].reg;
8367  inst.instruction |= Rn << 16;
8368}
8369
8370static void
8371do_rd_rn_rm (void)
8372{
8373  inst.instruction |= inst.operands[0].reg << 12;
8374  inst.instruction |= inst.operands[1].reg << 16;
8375  inst.instruction |= inst.operands[2].reg;
8376}
8377
8378static void
8379do_rm_rd_rn (void)
8380{
8381  constraint ((inst.operands[2].reg == REG_PC), BAD_PC);
8382  constraint (((inst.reloc.exp.X_op != O_constant
8383		&& inst.reloc.exp.X_op != O_illegal)
8384	       || inst.reloc.exp.X_add_number != 0),
8385	      BAD_ADDR_MODE);
8386  inst.instruction |= inst.operands[0].reg;
8387  inst.instruction |= inst.operands[1].reg << 12;
8388  inst.instruction |= inst.operands[2].reg << 16;
8389}
8390
8391static void
8392do_imm0 (void)
8393{
8394  inst.instruction |= inst.operands[0].imm;
8395}
8396
8397static void
8398do_rd_cpaddr (void)
8399{
8400  inst.instruction |= inst.operands[0].reg << 12;
8401  encode_arm_cp_address (1, TRUE, TRUE, 0);
8402}
8403
8404/* ARM instructions, in alphabetical order by function name (except
8405   that wrapper functions appear immediately after the function they
8406   wrap).  */
8407
8408/* This is a pseudo-op of the form "adr rd, label" to be converted
8409   into a relative address of the form "add rd, pc, #label-.-8".  */
8410
8411static void
8412do_adr (void)
8413{
8414  inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
8415
8416  /* Frag hacking will turn this into a sub instruction if the offset turns
8417     out to be negative.  */
8418  inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
8419  inst.reloc.pc_rel = 1;
8420  inst.reloc.exp.X_add_number -= 8;
8421
8422  if (support_interwork
8423      && inst.reloc.exp.X_op == O_symbol
8424      && inst.reloc.exp.X_add_symbol != NULL
8425      && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
8426      && THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
8427    inst.reloc.exp.X_add_number |= 1;
8428}
8429
8430/* This is a pseudo-op of the form "adrl rd, label" to be converted
8431   into a relative address of the form:
8432   add rd, pc, #low(label-.-8)"
8433   add rd, rd, #high(label-.-8)"  */
8434
8435static void
8436do_adrl (void)
8437{
8438  inst.instruction |= (inst.operands[0].reg << 12);  /* Rd */
8439
8440  /* Frag hacking will turn this into a sub instruction if the offset turns
8441     out to be negative.  */
8442  inst.reloc.type	       = BFD_RELOC_ARM_ADRL_IMMEDIATE;
8443  inst.reloc.pc_rel	       = 1;
8444  inst.size		       = INSN_SIZE * 2;
8445  inst.reloc.exp.X_add_number -= 8;
8446
8447  if (support_interwork
8448      && inst.reloc.exp.X_op == O_symbol
8449      && inst.reloc.exp.X_add_symbol != NULL
8450      && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
8451      && THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
8452    inst.reloc.exp.X_add_number |= 1;
8453}
8454
8455static void
8456do_arit (void)
8457{
8458  constraint (inst.reloc.type >= BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC
8459	      && inst.reloc.type <= BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC ,
8460	      THUMB1_RELOC_ONLY);
8461  if (!inst.operands[1].present)
8462    inst.operands[1].reg = inst.operands[0].reg;
8463  inst.instruction |= inst.operands[0].reg << 12;
8464  inst.instruction |= inst.operands[1].reg << 16;
8465  encode_arm_shifter_operand (2);
8466}
8467
8468static void
8469do_barrier (void)
8470{
8471  if (inst.operands[0].present)
8472    inst.instruction |= inst.operands[0].imm;
8473  else
8474    inst.instruction |= 0xf;
8475}
8476
8477static void
8478do_bfc (void)
8479{
8480  unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
8481  constraint (msb > 32, _("bit-field extends past end of register"));
8482  /* The instruction encoding stores the LSB and MSB,
8483     not the LSB and width.  */
8484  inst.instruction |= inst.operands[0].reg << 12;
8485  inst.instruction |= inst.operands[1].imm << 7;
8486  inst.instruction |= (msb - 1) << 16;
8487}
8488
8489static void
8490do_bfi (void)
8491{
8492  unsigned int msb;
8493
8494  /* #0 in second position is alternative syntax for bfc, which is
8495     the same instruction but with REG_PC in the Rm field.  */
8496  if (!inst.operands[1].isreg)
8497    inst.operands[1].reg = REG_PC;
8498
8499  msb = inst.operands[2].imm + inst.operands[3].imm;
8500  constraint (msb > 32, _("bit-field extends past end of register"));
8501  /* The instruction encoding stores the LSB and MSB,
8502     not the LSB and width.  */
8503  inst.instruction |= inst.operands[0].reg << 12;
8504  inst.instruction |= inst.operands[1].reg;
8505  inst.instruction |= inst.operands[2].imm << 7;
8506  inst.instruction |= (msb - 1) << 16;
8507}
8508
8509static void
8510do_bfx (void)
8511{
8512  constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
8513	      _("bit-field extends past end of register"));
8514  inst.instruction |= inst.operands[0].reg << 12;
8515  inst.instruction |= inst.operands[1].reg;
8516  inst.instruction |= inst.operands[2].imm << 7;
8517  inst.instruction |= (inst.operands[3].imm - 1) << 16;
8518}
8519
8520/* ARM V5 breakpoint instruction (argument parse)
8521     BKPT <16 bit unsigned immediate>
8522     Instruction is not conditional.
8523	The bit pattern given in insns[] has the COND_ALWAYS condition,
8524	and it is an error if the caller tried to override that.  */
8525
8526static void
8527do_bkpt (void)
8528{
8529  /* Top 12 of 16 bits to bits 19:8.  */
8530  inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
8531
8532  /* Bottom 4 of 16 bits to bits 3:0.  */
8533  inst.instruction |= inst.operands[0].imm & 0xf;
8534}
8535
8536static void
8537encode_branch (int default_reloc)
8538{
8539  if (inst.operands[0].hasreloc)
8540    {
8541      constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32
8542		  && inst.operands[0].imm != BFD_RELOC_ARM_TLS_CALL,
8543		  _("the only valid suffixes here are '(plt)' and '(tlscall)'"));
8544      inst.reloc.type = inst.operands[0].imm == BFD_RELOC_ARM_PLT32
8545	? BFD_RELOC_ARM_PLT32
8546	: thumb_mode ? BFD_RELOC_ARM_THM_TLS_CALL : BFD_RELOC_ARM_TLS_CALL;
8547    }
8548  else
8549    inst.reloc.type = (bfd_reloc_code_real_type) default_reloc;
8550  inst.reloc.pc_rel = 1;
8551}
8552
8553static void
8554do_branch (void)
8555{
8556#ifdef OBJ_ELF
8557  if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
8558    encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
8559  else
8560#endif
8561    encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
8562}
8563
8564static void
8565do_bl (void)
8566{
8567#ifdef OBJ_ELF
8568  if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
8569    {
8570      if (inst.cond == COND_ALWAYS)
8571	encode_branch (BFD_RELOC_ARM_PCREL_CALL);
8572      else
8573	encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
8574    }
8575  else
8576#endif
8577    encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
8578}
8579
8580/* ARM V5 branch-link-exchange instruction (argument parse)
8581     BLX <target_addr>		ie BLX(1)
8582     BLX{<condition>} <Rm>	ie BLX(2)
8583   Unfortunately, there are two different opcodes for this mnemonic.
8584   So, the insns[].value is not used, and the code here zaps values
8585	into inst.instruction.
8586   Also, the <target_addr> can be 25 bits, hence has its own reloc.  */
8587
8588static void
8589do_blx (void)
8590{
8591  if (inst.operands[0].isreg)
8592    {
8593      /* Arg is a register; the opcode provided by insns[] is correct.
8594	 It is not illegal to do "blx pc", just useless.  */
8595      if (inst.operands[0].reg == REG_PC)
8596	as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
8597
8598      inst.instruction |= inst.operands[0].reg;
8599    }
8600  else
8601    {
8602      /* Arg is an address; this instruction cannot be executed
8603	 conditionally, and the opcode must be adjusted.
8604	 We retain the BFD_RELOC_ARM_PCREL_BLX till the very end
8605	 where we generate out a BFD_RELOC_ARM_PCREL_CALL instead.  */
8606      constraint (inst.cond != COND_ALWAYS, BAD_COND);
8607      inst.instruction = 0xfa000000;
8608      encode_branch (BFD_RELOC_ARM_PCREL_BLX);
8609    }
8610}
8611
8612static void
8613do_bx (void)
8614{
8615  bfd_boolean want_reloc;
8616
8617  if (inst.operands[0].reg == REG_PC)
8618    as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
8619
8620  inst.instruction |= inst.operands[0].reg;
8621  /* Output R_ARM_V4BX relocations if is an EABI object that looks like
8622     it is for ARMv4t or earlier.  */
8623  want_reloc = !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5);
8624  if (!ARM_FEATURE_ZERO (selected_object_arch)
8625      && !ARM_CPU_HAS_FEATURE (selected_object_arch, arm_ext_v5))
8626      want_reloc = TRUE;
8627
8628#ifdef OBJ_ELF
8629  if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
8630#endif
8631    want_reloc = FALSE;
8632
8633  if (want_reloc)
8634    inst.reloc.type = BFD_RELOC_ARM_V4BX;
8635}
8636
8637
8638/* ARM v5TEJ.  Jump to Jazelle code.  */
8639
8640static void
8641do_bxj (void)
8642{
8643  if (inst.operands[0].reg == REG_PC)
8644    as_tsktsk (_("use of r15 in bxj is not really useful"));
8645
8646  inst.instruction |= inst.operands[0].reg;
8647}
8648
8649/* Co-processor data operation:
8650      CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
8651      CDP2	<coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}	 */
8652static void
8653do_cdp (void)
8654{
8655  inst.instruction |= inst.operands[0].reg << 8;
8656  inst.instruction |= inst.operands[1].imm << 20;
8657  inst.instruction |= inst.operands[2].reg << 12;
8658  inst.instruction |= inst.operands[3].reg << 16;
8659  inst.instruction |= inst.operands[4].reg;
8660  inst.instruction |= inst.operands[5].imm << 5;
8661}
8662
8663static void
8664do_cmp (void)
8665{
8666  inst.instruction |= inst.operands[0].reg << 16;
8667  encode_arm_shifter_operand (1);
8668}
8669
8670/* Transfer between coprocessor and ARM registers.
8671   MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
8672   MRC2
8673   MCR{cond}
8674   MCR2
8675
8676   No special properties.  */
8677
8678struct deprecated_coproc_regs_s
8679{
8680  unsigned cp;
8681  int opc1;
8682  unsigned crn;
8683  unsigned crm;
8684  int opc2;
8685  arm_feature_set deprecated;
8686  arm_feature_set obsoleted;
8687  const char *dep_msg;
8688  const char *obs_msg;
8689};
8690
8691#define DEPR_ACCESS_V8 \
8692  N_("This coprocessor register access is deprecated in ARMv8")
8693
8694/* Table of all deprecated coprocessor registers.  */
8695static struct deprecated_coproc_regs_s deprecated_coproc_regs[] =
8696{
8697    {15, 0, 7, 10, 5,					/* CP15DMB.  */
8698     ARM_FEATURE_CORE_LOW (ARM_EXT_V8), ARM_ARCH_NONE,
8699     DEPR_ACCESS_V8, NULL},
8700    {15, 0, 7, 10, 4,					/* CP15DSB.  */
8701     ARM_FEATURE_CORE_LOW (ARM_EXT_V8), ARM_ARCH_NONE,
8702     DEPR_ACCESS_V8, NULL},
8703    {15, 0, 7,  5, 4,					/* CP15ISB.  */
8704     ARM_FEATURE_CORE_LOW (ARM_EXT_V8), ARM_ARCH_NONE,
8705     DEPR_ACCESS_V8, NULL},
8706    {14, 6, 1,  0, 0,					/* TEEHBR.  */
8707     ARM_FEATURE_CORE_LOW (ARM_EXT_V8), ARM_ARCH_NONE,
8708     DEPR_ACCESS_V8, NULL},
8709    {14, 6, 0,  0, 0,					/* TEECR.  */
8710     ARM_FEATURE_CORE_LOW (ARM_EXT_V8), ARM_ARCH_NONE,
8711     DEPR_ACCESS_V8, NULL},
8712};
8713
8714#undef DEPR_ACCESS_V8
8715
8716static const size_t deprecated_coproc_reg_count =
8717  sizeof (deprecated_coproc_regs) / sizeof (deprecated_coproc_regs[0]);
8718
8719static void
8720do_co_reg (void)
8721{
8722  unsigned Rd;
8723  size_t i;
8724
8725  Rd = inst.operands[2].reg;
8726  if (thumb_mode)
8727    {
8728      if (inst.instruction == 0xee000010
8729	  || inst.instruction == 0xfe000010)
8730	/* MCR, MCR2  */
8731	reject_bad_reg (Rd);
8732      else if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
8733	/* MRC, MRC2  */
8734	constraint (Rd == REG_SP, BAD_SP);
8735    }
8736  else
8737    {
8738      /* MCR */
8739      if (inst.instruction == 0xe000010)
8740	constraint (Rd == REG_PC, BAD_PC);
8741    }
8742
8743    for (i = 0; i < deprecated_coproc_reg_count; ++i)
8744      {
8745	const struct deprecated_coproc_regs_s *r =
8746	  deprecated_coproc_regs + i;
8747
8748	if (inst.operands[0].reg == r->cp
8749	    && inst.operands[1].imm == r->opc1
8750	    && inst.operands[3].reg == r->crn
8751	    && inst.operands[4].reg == r->crm
8752	    && inst.operands[5].imm == r->opc2)
8753	  {
8754	    if (! ARM_CPU_IS_ANY (cpu_variant)
8755		&& warn_on_deprecated
8756		&& ARM_CPU_HAS_FEATURE (cpu_variant, r->deprecated))
8757	      as_tsktsk ("%s", r->dep_msg);
8758	  }
8759      }
8760
8761  inst.instruction |= inst.operands[0].reg << 8;
8762  inst.instruction |= inst.operands[1].imm << 21;
8763  inst.instruction |= Rd << 12;
8764  inst.instruction |= inst.operands[3].reg << 16;
8765  inst.instruction |= inst.operands[4].reg;
8766  inst.instruction |= inst.operands[5].imm << 5;
8767}
8768
8769/* Transfer between coprocessor register and pair of ARM registers.
8770   MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
8771   MCRR2
8772   MRRC{cond}
8773   MRRC2
8774
8775   Two XScale instructions are special cases of these:
8776
8777     MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
8778     MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
8779
8780   Result unpredictable if Rd or Rn is R15.  */
8781
8782static void
8783do_co_reg2c (void)
8784{
8785  unsigned Rd, Rn;
8786
8787  Rd = inst.operands[2].reg;
8788  Rn = inst.operands[3].reg;
8789
8790  if (thumb_mode)
8791    {
8792      reject_bad_reg (Rd);
8793      reject_bad_reg (Rn);
8794    }
8795  else
8796    {
8797      constraint (Rd == REG_PC, BAD_PC);
8798      constraint (Rn == REG_PC, BAD_PC);
8799    }
8800
8801  /* Only check the MRRC{2} variants.  */
8802  if ((inst.instruction & 0x0FF00000) == 0x0C500000)
8803    {
8804       /* If Rd == Rn, error that the operation is
8805	  unpredictable (example MRRC p3,#1,r1,r1,c4).  */
8806       constraint (Rd == Rn, BAD_OVERLAP);
8807    }
8808
8809  inst.instruction |= inst.operands[0].reg << 8;
8810  inst.instruction |= inst.operands[1].imm << 4;
8811  inst.instruction |= Rd << 12;
8812  inst.instruction |= Rn << 16;
8813  inst.instruction |= inst.operands[4].reg;
8814}
8815
8816static void
8817do_cpsi (void)
8818{
8819  inst.instruction |= inst.operands[0].imm << 6;
8820  if (inst.operands[1].present)
8821    {
8822      inst.instruction |= CPSI_MMOD;
8823      inst.instruction |= inst.operands[1].imm;
8824    }
8825}
8826
8827static void
8828do_dbg (void)
8829{
8830  inst.instruction |= inst.operands[0].imm;
8831}
8832
8833static void
8834do_div (void)
8835{
8836  unsigned Rd, Rn, Rm;
8837
8838  Rd = inst.operands[0].reg;
8839  Rn = (inst.operands[1].present
8840	? inst.operands[1].reg : Rd);
8841  Rm = inst.operands[2].reg;
8842
8843  constraint ((Rd == REG_PC), BAD_PC);
8844  constraint ((Rn == REG_PC), BAD_PC);
8845  constraint ((Rm == REG_PC), BAD_PC);
8846
8847  inst.instruction |= Rd << 16;
8848  inst.instruction |= Rn << 0;
8849  inst.instruction |= Rm << 8;
8850}
8851
8852static void
8853do_it (void)
8854{
8855  /* There is no IT instruction in ARM mode.  We
8856     process it to do the validation as if in
8857     thumb mode, just in case the code gets
8858     assembled for thumb using the unified syntax.  */
8859
8860  inst.size = 0;
8861  if (unified_syntax)
8862    {
8863      set_it_insn_type (IT_INSN);
8864      now_it.mask = (inst.instruction & 0xf) | 0x10;
8865      now_it.cc = inst.operands[0].imm;
8866    }
8867}
8868
8869/* If there is only one register in the register list,
8870   then return its register number.  Otherwise return -1.  */
8871static int
8872only_one_reg_in_list (int range)
8873{
8874  int i = ffs (range) - 1;
8875  return (i > 15 || range != (1 << i)) ? -1 : i;
8876}
8877
8878static void
8879encode_ldmstm(int from_push_pop_mnem)
8880{
8881  int base_reg = inst.operands[0].reg;
8882  int range = inst.operands[1].imm;
8883  int one_reg;
8884
8885  inst.instruction |= base_reg << 16;
8886  inst.instruction |= range;
8887
8888  if (inst.operands[1].writeback)
8889    inst.instruction |= LDM_TYPE_2_OR_3;
8890
8891  if (inst.operands[0].writeback)
8892    {
8893      inst.instruction |= WRITE_BACK;
8894      /* Check for unpredictable uses of writeback.  */
8895      if (inst.instruction & LOAD_BIT)
8896	{
8897	  /* Not allowed in LDM type 2.	 */
8898	  if ((inst.instruction & LDM_TYPE_2_OR_3)
8899	      && ((range & (1 << REG_PC)) == 0))
8900	    as_warn (_("writeback of base register is UNPREDICTABLE"));
8901	  /* Only allowed if base reg not in list for other types.  */
8902	  else if (range & (1 << base_reg))
8903	    as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
8904	}
8905      else /* STM.  */
8906	{
8907	  /* Not allowed for type 2.  */
8908	  if (inst.instruction & LDM_TYPE_2_OR_3)
8909	    as_warn (_("writeback of base register is UNPREDICTABLE"));
8910	  /* Only allowed if base reg not in list, or first in list.  */
8911	  else if ((range & (1 << base_reg))
8912		   && (range & ((1 << base_reg) - 1)))
8913	    as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
8914	}
8915    }
8916
8917  /* If PUSH/POP has only one register, then use the A2 encoding.  */
8918  one_reg = only_one_reg_in_list (range);
8919  if (from_push_pop_mnem && one_reg >= 0)
8920    {
8921      int is_push = (inst.instruction & A_PUSH_POP_OP_MASK) == A1_OPCODE_PUSH;
8922
8923      if (is_push && one_reg == 13 /* SP */)
8924	/* PR 22483: The A2 encoding cannot be used when
8925	   pushing the stack pointer as this is UNPREDICTABLE.  */
8926	return;
8927
8928      inst.instruction &= A_COND_MASK;
8929      inst.instruction |= is_push ? A2_OPCODE_PUSH : A2_OPCODE_POP;
8930      inst.instruction |= one_reg << 12;
8931    }
8932}
8933
8934static void
8935do_ldmstm (void)
8936{
8937  encode_ldmstm (/*from_push_pop_mnem=*/FALSE);
8938}
8939
8940/* ARMv5TE load-consecutive (argument parse)
8941   Mode is like LDRH.
8942
8943     LDRccD R, mode
8944     STRccD R, mode.  */
8945
8946static void
8947do_ldrd (void)
8948{
8949  constraint (inst.operands[0].reg % 2 != 0,
8950	      _("first transfer register must be even"));
8951  constraint (inst.operands[1].present
8952	      && inst.operands[1].reg != inst.operands[0].reg + 1,
8953	      _("can only transfer two consecutive registers"));
8954  constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
8955  constraint (!inst.operands[2].isreg, _("'[' expected"));
8956
8957  if (!inst.operands[1].present)
8958    inst.operands[1].reg = inst.operands[0].reg + 1;
8959
8960  /* encode_arm_addr_mode_3 will diagnose overlap between the base
8961     register and the first register written; we have to diagnose
8962     overlap between the base and the second register written here.  */
8963
8964  if (inst.operands[2].reg == inst.operands[1].reg
8965      && (inst.operands[2].writeback || inst.operands[2].postind))
8966    as_warn (_("base register written back, and overlaps "
8967	       "second transfer register"));
8968
8969  if (!(inst.instruction & V4_STR_BIT))
8970    {
8971      /* For an index-register load, the index register must not overlap the
8972	destination (even if not write-back).  */
8973      if (inst.operands[2].immisreg
8974	      && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
8975	      || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
8976	as_warn (_("index register overlaps transfer register"));
8977    }
8978  inst.instruction |= inst.operands[0].reg << 12;
8979  encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
8980}
8981
8982static void
8983do_ldrex (void)
8984{
8985  constraint (!inst.operands[1].isreg || !inst.operands[1].preind
8986	      || inst.operands[1].postind || inst.operands[1].writeback
8987	      || inst.operands[1].immisreg || inst.operands[1].shifted
8988	      || inst.operands[1].negative
8989	      /* This can arise if the programmer has written
8990		   strex rN, rM, foo
8991		 or if they have mistakenly used a register name as the last
8992		 operand,  eg:
8993		   strex rN, rM, rX
8994		 It is very difficult to distinguish between these two cases
8995		 because "rX" might actually be a label. ie the register
8996		 name has been occluded by a symbol of the same name. So we
8997		 just generate a general 'bad addressing mode' type error
8998		 message and leave it up to the programmer to discover the
8999		 true cause and fix their mistake.  */
9000	      || (inst.operands[1].reg == REG_PC),
9001	      BAD_ADDR_MODE);
9002
9003  constraint (inst.reloc.exp.X_op != O_constant
9004	      || inst.reloc.exp.X_add_number != 0,
9005	      _("offset must be zero in ARM encoding"));
9006
9007  constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
9008
9009  inst.instruction |= inst.operands[0].reg << 12;
9010  inst.instruction |= inst.operands[1].reg << 16;
9011  inst.reloc.type = BFD_RELOC_UNUSED;
9012}
9013
9014static void
9015do_ldrexd (void)
9016{
9017  constraint (inst.operands[0].reg % 2 != 0,
9018	      _("even register required"));
9019  constraint (inst.operands[1].present
9020	      && inst.operands[1].reg != inst.operands[0].reg + 1,
9021	      _("can only load two consecutive registers"));
9022  /* If op 1 were present and equal to PC, this function wouldn't
9023     have been called in the first place.  */
9024  constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
9025
9026  inst.instruction |= inst.operands[0].reg << 12;
9027  inst.instruction |= inst.operands[2].reg << 16;
9028}
9029
9030/* In both ARM and thumb state 'ldr pc, #imm'  with an immediate
9031   which is not a multiple of four is UNPREDICTABLE.  */
9032static void
9033check_ldr_r15_aligned (void)
9034{
9035  constraint (!(inst.operands[1].immisreg)
9036	      && (inst.operands[0].reg == REG_PC
9037	      && inst.operands[1].reg == REG_PC
9038	      && (inst.reloc.exp.X_add_number & 0x3)),
9039	      _("ldr to register 15 must be 4-byte aligned"));
9040}
9041
9042static void
9043do_ldst (void)
9044{
9045  inst.instruction |= inst.operands[0].reg << 12;
9046  if (!inst.operands[1].isreg)
9047    if (move_or_literal_pool (0, CONST_ARM, /*mode_3=*/FALSE))
9048      return;
9049  encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
9050  check_ldr_r15_aligned ();
9051}
9052
9053static void
9054do_ldstt (void)
9055{
9056  /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
9057     reject [Rn,...].  */
9058  if (inst.operands[1].preind)
9059    {
9060      constraint (inst.reloc.exp.X_op != O_constant
9061		  || inst.reloc.exp.X_add_number != 0,
9062		  _("this instruction requires a post-indexed address"));
9063
9064      inst.operands[1].preind = 0;
9065      inst.operands[1].postind = 1;
9066      inst.operands[1].writeback = 1;
9067    }
9068  inst.instruction |= inst.operands[0].reg << 12;
9069  encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
9070}
9071
9072/* Halfword and signed-byte load/store operations.  */
9073
9074static void
9075do_ldstv4 (void)
9076{
9077  constraint (inst.operands[0].reg == REG_PC, BAD_PC);
9078  inst.instruction |= inst.operands[0].reg << 12;
9079  if (!inst.operands[1].isreg)
9080    if (move_or_literal_pool (0, CONST_ARM, /*mode_3=*/TRUE))
9081      return;
9082  encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
9083}
9084
9085static void
9086do_ldsttv4 (void)
9087{
9088  /* ldrt/strt always use post-indexed addressing.  Turn [Rn] into [Rn]! and
9089     reject [Rn,...].  */
9090  if (inst.operands[1].preind)
9091    {
9092      constraint (inst.reloc.exp.X_op != O_constant
9093		  || inst.reloc.exp.X_add_number != 0,
9094		  _("this instruction requires a post-indexed address"));
9095
9096      inst.operands[1].preind = 0;
9097      inst.operands[1].postind = 1;
9098      inst.operands[1].writeback = 1;
9099    }
9100  inst.instruction |= inst.operands[0].reg << 12;
9101  encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
9102}
9103
9104/* Co-processor register load/store.
9105   Format: <LDC|STC>{cond}[L] CP#,CRd,<address>	 */
9106static void
9107do_lstc (void)
9108{
9109  inst.instruction |= inst.operands[0].reg << 8;
9110  inst.instruction |= inst.operands[1].reg << 12;
9111  encode_arm_cp_address (2, TRUE, TRUE, 0);
9112}
9113
9114static void
9115do_mlas (void)
9116{
9117  /* This restriction does not apply to mls (nor to mla in v6 or later).  */
9118  if (inst.operands[0].reg == inst.operands[1].reg
9119      && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
9120      && !(inst.instruction & 0x00400000))
9121    as_tsktsk (_("Rd and Rm should be different in mla"));
9122
9123  inst.instruction |= inst.operands[0].reg << 16;
9124  inst.instruction |= inst.operands[1].reg;
9125  inst.instruction |= inst.operands[2].reg << 8;
9126  inst.instruction |= inst.operands[3].reg << 12;
9127}
9128
9129static void
9130do_mov (void)
9131{
9132  constraint (inst.reloc.type >= BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC
9133	      && inst.reloc.type <= BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC ,
9134	      THUMB1_RELOC_ONLY);
9135  inst.instruction |= inst.operands[0].reg << 12;
9136  encode_arm_shifter_operand (1);
9137}
9138
9139/* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>.	 */
9140static void
9141do_mov16 (void)
9142{
9143  bfd_vma imm;
9144  bfd_boolean top;
9145
9146  top = (inst.instruction & 0x00400000) != 0;
9147  constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
9148	      _(":lower16: not allowed in this instruction"));
9149  constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
9150	      _(":upper16: not allowed in this instruction"));
9151  inst.instruction |= inst.operands[0].reg << 12;
9152  if (inst.reloc.type == BFD_RELOC_UNUSED)
9153    {
9154      imm = inst.reloc.exp.X_add_number;
9155      /* The value is in two pieces: 0:11, 16:19.  */
9156      inst.instruction |= (imm & 0x00000fff);
9157      inst.instruction |= (imm & 0x0000f000) << 4;
9158    }
9159}
9160
9161static int
9162do_vfp_nsyn_mrs (void)
9163{
9164  if (inst.operands[0].isvec)
9165    {
9166      if (inst.operands[1].reg != 1)
9167	first_error (_("operand 1 must be FPSCR"));
9168      memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
9169      memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
9170      do_vfp_nsyn_opcode ("fmstat");
9171    }
9172  else if (inst.operands[1].isvec)
9173    do_vfp_nsyn_opcode ("fmrx");
9174  else
9175    return FAIL;
9176
9177  return SUCCESS;
9178}
9179
9180static int
9181do_vfp_nsyn_msr (void)
9182{
9183  if (inst.operands[0].isvec)
9184    do_vfp_nsyn_opcode ("fmxr");
9185  else
9186    return FAIL;
9187
9188  return SUCCESS;
9189}
9190
9191static void
9192do_vmrs (void)
9193{
9194  unsigned Rt = inst.operands[0].reg;
9195
9196  if (thumb_mode && Rt == REG_SP)
9197    {
9198      inst.error = BAD_SP;
9199      return;
9200    }
9201
9202  /* MVFR2 is only valid at ARMv8-A.  */
9203  if (inst.operands[1].reg == 5)
9204    constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
9205		_(BAD_FPU));
9206
9207  /* APSR_ sets isvec. All other refs to PC are illegal.  */
9208  if (!inst.operands[0].isvec && Rt == REG_PC)
9209    {
9210      inst.error = BAD_PC;
9211      return;
9212    }
9213
9214  /* If we get through parsing the register name, we just insert the number
9215     generated into the instruction without further validation.  */
9216  inst.instruction |= (inst.operands[1].reg << 16);
9217  inst.instruction |= (Rt << 12);
9218}
9219
9220static void
9221do_vmsr (void)
9222{
9223  unsigned Rt = inst.operands[1].reg;
9224
9225  if (thumb_mode)
9226    reject_bad_reg (Rt);
9227  else if (Rt == REG_PC)
9228    {
9229      inst.error = BAD_PC;
9230      return;
9231    }
9232
9233  /* MVFR2 is only valid for ARMv8-A.  */
9234  if (inst.operands[0].reg == 5)
9235    constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
9236		_(BAD_FPU));
9237
9238  /* If we get through parsing the register name, we just insert the number
9239     generated into the instruction without further validation.  */
9240  inst.instruction |= (inst.operands[0].reg << 16);
9241  inst.instruction |= (Rt << 12);
9242}
9243
9244static void
9245do_mrs (void)
9246{
9247  unsigned br;
9248
9249  if (do_vfp_nsyn_mrs () == SUCCESS)
9250    return;
9251
9252  constraint (inst.operands[0].reg == REG_PC, BAD_PC);
9253  inst.instruction |= inst.operands[0].reg << 12;
9254
9255  if (inst.operands[1].isreg)
9256    {
9257      br = inst.operands[1].reg;
9258      if (((br & 0x200) == 0) && ((br & 0xf0000) != 0xf0000))
9259	as_bad (_("bad register for mrs"));
9260    }
9261  else
9262    {
9263      /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all.  */
9264      constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
9265		  != (PSR_c|PSR_f),
9266		  _("'APSR', 'CPSR' or 'SPSR' expected"));
9267      br = (15<<16) | (inst.operands[1].imm & SPSR_BIT);
9268    }
9269
9270  inst.instruction |= br;
9271}
9272
9273/* Two possible forms:
9274      "{C|S}PSR_<field>, Rm",
9275      "{C|S}PSR_f, #expression".  */
9276
9277static void
9278do_msr (void)
9279{
9280  if (do_vfp_nsyn_msr () == SUCCESS)
9281    return;
9282
9283  inst.instruction |= inst.operands[0].imm;
9284  if (inst.operands[1].isreg)
9285    inst.instruction |= inst.operands[1].reg;
9286  else
9287    {
9288      inst.instruction |= INST_IMMEDIATE;
9289      inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
9290      inst.reloc.pc_rel = 0;
9291    }
9292}
9293
9294static void
9295do_mul (void)
9296{
9297  constraint (inst.operands[2].reg == REG_PC, BAD_PC);
9298
9299  if (!inst.operands[2].present)
9300    inst.operands[2].reg = inst.operands[0].reg;
9301  inst.instruction |= inst.operands[0].reg << 16;
9302  inst.instruction |= inst.operands[1].reg;
9303  inst.instruction |= inst.operands[2].reg << 8;
9304
9305  if (inst.operands[0].reg == inst.operands[1].reg
9306      && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
9307    as_tsktsk (_("Rd and Rm should be different in mul"));
9308}
9309
9310/* Long Multiply Parser
9311   UMULL RdLo, RdHi, Rm, Rs
9312   SMULL RdLo, RdHi, Rm, Rs
9313   UMLAL RdLo, RdHi, Rm, Rs
9314   SMLAL RdLo, RdHi, Rm, Rs.  */
9315
9316static void
9317do_mull (void)
9318{
9319  inst.instruction |= inst.operands[0].reg << 12;
9320  inst.instruction |= inst.operands[1].reg << 16;
9321  inst.instruction |= inst.operands[2].reg;
9322  inst.instruction |= inst.operands[3].reg << 8;
9323
9324  /* rdhi and rdlo must be different.  */
9325  if (inst.operands[0].reg == inst.operands[1].reg)
9326    as_tsktsk (_("rdhi and rdlo must be different"));
9327
9328  /* rdhi, rdlo and rm must all be different before armv6.  */
9329  if ((inst.operands[0].reg == inst.operands[2].reg
9330      || inst.operands[1].reg == inst.operands[2].reg)
9331      && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
9332    as_tsktsk (_("rdhi, rdlo and rm must all be different"));
9333}
9334
9335static void
9336do_nop (void)
9337{
9338  if (inst.operands[0].present
9339      || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k))
9340    {
9341      /* Architectural NOP hints are CPSR sets with no bits selected.  */
9342      inst.instruction &= 0xf0000000;
9343      inst.instruction |= 0x0320f000;
9344      if (inst.operands[0].present)
9345	inst.instruction |= inst.operands[0].imm;
9346    }
9347}
9348
9349/* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
9350   PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
9351   Condition defaults to COND_ALWAYS.
9352   Error if Rd, Rn or Rm are R15.  */
9353
9354static void
9355do_pkhbt (void)
9356{
9357  inst.instruction |= inst.operands[0].reg << 12;
9358  inst.instruction |= inst.operands[1].reg << 16;
9359  inst.instruction |= inst.operands[2].reg;
9360  if (inst.operands[3].present)
9361    encode_arm_shift (3);
9362}
9363
9364/* ARM V6 PKHTB (Argument Parse).  */
9365
9366static void
9367do_pkhtb (void)
9368{
9369  if (!inst.operands[3].present)
9370    {
9371      /* If the shift specifier is omitted, turn the instruction
9372	 into pkhbt rd, rm, rn. */
9373      inst.instruction &= 0xfff00010;
9374      inst.instruction |= inst.operands[0].reg << 12;
9375      inst.instruction |= inst.operands[1].reg;
9376      inst.instruction |= inst.operands[2].reg << 16;
9377    }
9378  else
9379    {
9380      inst.instruction |= inst.operands[0].reg << 12;
9381      inst.instruction |= inst.operands[1].reg << 16;
9382      inst.instruction |= inst.operands[2].reg;
9383      encode_arm_shift (3);
9384    }
9385}
9386
9387/* ARMv5TE: Preload-Cache
9388   MP Extensions: Preload for write
9389
9390    PLD(W) <addr_mode>
9391
9392  Syntactically, like LDR with B=1, W=0, L=1.  */
9393
9394static void
9395do_pld (void)
9396{
9397  constraint (!inst.operands[0].isreg,
9398	      _("'[' expected after PLD mnemonic"));
9399  constraint (inst.operands[0].postind,
9400	      _("post-indexed expression used in preload instruction"));
9401  constraint (inst.operands[0].writeback,
9402	      _("writeback used in preload instruction"));
9403  constraint (!inst.operands[0].preind,
9404	      _("unindexed addressing used in preload instruction"));
9405  encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
9406}
9407
9408/* ARMv7: PLI <addr_mode>  */
9409static void
9410do_pli (void)
9411{
9412  constraint (!inst.operands[0].isreg,
9413	      _("'[' expected after PLI mnemonic"));
9414  constraint (inst.operands[0].postind,
9415	      _("post-indexed expression used in preload instruction"));
9416  constraint (inst.operands[0].writeback,
9417	      _("writeback used in preload instruction"));
9418  constraint (!inst.operands[0].preind,
9419	      _("unindexed addressing used in preload instruction"));
9420  encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
9421  inst.instruction &= ~PRE_INDEX;
9422}
9423
9424static void
9425do_push_pop (void)
9426{
9427  constraint (inst.operands[0].writeback,
9428	      _("push/pop do not support {reglist}^"));
9429  inst.operands[1] = inst.operands[0];
9430  memset (&inst.operands[0], 0, sizeof inst.operands[0]);
9431  inst.operands[0].isreg = 1;
9432  inst.operands[0].writeback = 1;
9433  inst.operands[0].reg = REG_SP;
9434  encode_ldmstm (/*from_push_pop_mnem=*/TRUE);
9435}
9436
9437/* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
9438   word at the specified address and the following word
9439   respectively.
9440   Unconditionally executed.
9441   Error if Rn is R15.	*/
9442
9443static void
9444do_rfe (void)
9445{
9446  inst.instruction |= inst.operands[0].reg << 16;
9447  if (inst.operands[0].writeback)
9448    inst.instruction |= WRITE_BACK;
9449}
9450
9451/* ARM V6 ssat (argument parse).  */
9452
9453static void
9454do_ssat (void)
9455{
9456  inst.instruction |= inst.operands[0].reg << 12;
9457  inst.instruction |= (inst.operands[1].imm - 1) << 16;
9458  inst.instruction |= inst.operands[2].reg;
9459
9460  if (inst.operands[3].present)
9461    encode_arm_shift (3);
9462}
9463
9464/* ARM V6 usat (argument parse).  */
9465
9466static void
9467do_usat (void)
9468{
9469  inst.instruction |= inst.operands[0].reg << 12;
9470  inst.instruction |= inst.operands[1].imm << 16;
9471  inst.instruction |= inst.operands[2].reg;
9472
9473  if (inst.operands[3].present)
9474    encode_arm_shift (3);
9475}
9476
9477/* ARM V6 ssat16 (argument parse).  */
9478
9479static void
9480do_ssat16 (void)
9481{
9482  inst.instruction |= inst.operands[0].reg << 12;
9483  inst.instruction |= ((inst.operands[1].imm - 1) << 16);
9484  inst.instruction |= inst.operands[2].reg;
9485}
9486
9487static void
9488do_usat16 (void)
9489{
9490  inst.instruction |= inst.operands[0].reg << 12;
9491  inst.instruction |= inst.operands[1].imm << 16;
9492  inst.instruction |= inst.operands[2].reg;
9493}
9494
9495/* ARM V6 SETEND (argument parse).  Sets the E bit in the CPSR while
9496   preserving the other bits.
9497
9498   setend <endian_specifier>, where <endian_specifier> is either
9499   BE or LE.  */
9500
9501static void
9502do_setend (void)
9503{
9504  if (warn_on_deprecated
9505      && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
9506      as_tsktsk (_("setend use is deprecated for ARMv8"));
9507
9508  if (inst.operands[0].imm)
9509    inst.instruction |= 0x200;
9510}
9511
9512static void
9513do_shift (void)
9514{
9515  unsigned int Rm = (inst.operands[1].present
9516		     ? inst.operands[1].reg
9517		     : inst.operands[0].reg);
9518
9519  inst.instruction |= inst.operands[0].reg << 12;
9520  inst.instruction |= Rm;
9521  if (inst.operands[2].isreg)  /* Rd, {Rm,} Rs */
9522    {
9523      inst.instruction |= inst.operands[2].reg << 8;
9524      inst.instruction |= SHIFT_BY_REG;
9525      /* PR 12854: Error on extraneous shifts.  */
9526      constraint (inst.operands[2].shifted,
9527		  _("extraneous shift as part of operand to shift insn"));
9528    }
9529  else
9530    inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
9531}
9532
9533static void
9534do_smc (void)
9535{
9536  inst.reloc.type = BFD_RELOC_ARM_SMC;
9537  inst.reloc.pc_rel = 0;
9538}
9539
9540static void
9541do_hvc (void)
9542{
9543  inst.reloc.type = BFD_RELOC_ARM_HVC;
9544  inst.reloc.pc_rel = 0;
9545}
9546
9547static void
9548do_swi (void)
9549{
9550  inst.reloc.type = BFD_RELOC_ARM_SWI;
9551  inst.reloc.pc_rel = 0;
9552}
9553
9554static void
9555do_setpan (void)
9556{
9557  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_pan),
9558	      _("selected processor does not support SETPAN instruction"));
9559
9560  inst.instruction |= ((inst.operands[0].imm & 1) << 9);
9561}
9562
9563static void
9564do_t_setpan (void)
9565{
9566  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_pan),
9567	      _("selected processor does not support SETPAN instruction"));
9568
9569  inst.instruction |= (inst.operands[0].imm << 3);
9570}
9571
9572/* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
9573   SMLAxy{cond} Rd,Rm,Rs,Rn
9574   SMLAWy{cond} Rd,Rm,Rs,Rn
9575   Error if any register is R15.  */
9576
9577static void
9578do_smla (void)
9579{
9580  inst.instruction |= inst.operands[0].reg << 16;
9581  inst.instruction |= inst.operands[1].reg;
9582  inst.instruction |= inst.operands[2].reg << 8;
9583  inst.instruction |= inst.operands[3].reg << 12;
9584}
9585
9586/* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
9587   SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
9588   Error if any register is R15.
9589   Warning if Rdlo == Rdhi.  */
9590
9591static void
9592do_smlal (void)
9593{
9594  inst.instruction |= inst.operands[0].reg << 12;
9595  inst.instruction |= inst.operands[1].reg << 16;
9596  inst.instruction |= inst.operands[2].reg;
9597  inst.instruction |= inst.operands[3].reg << 8;
9598
9599  if (inst.operands[0].reg == inst.operands[1].reg)
9600    as_tsktsk (_("rdhi and rdlo must be different"));
9601}
9602
9603/* ARM V5E (El Segundo) signed-multiply (argument parse)
9604   SMULxy{cond} Rd,Rm,Rs
9605   Error if any register is R15.  */
9606
9607static void
9608do_smul (void)
9609{
9610  inst.instruction |= inst.operands[0].reg << 16;
9611  inst.instruction |= inst.operands[1].reg;
9612  inst.instruction |= inst.operands[2].reg << 8;
9613}
9614
9615/* ARM V6 srs (argument parse).  The variable fields in the encoding are
9616   the same for both ARM and Thumb-2.  */
9617
9618static void
9619do_srs (void)
9620{
9621  int reg;
9622
9623  if (inst.operands[0].present)
9624    {
9625      reg = inst.operands[0].reg;
9626      constraint (reg != REG_SP, _("SRS base register must be r13"));
9627    }
9628  else
9629    reg = REG_SP;
9630
9631  inst.instruction |= reg << 16;
9632  inst.instruction |= inst.operands[1].imm;
9633  if (inst.operands[0].writeback || inst.operands[1].writeback)
9634    inst.instruction |= WRITE_BACK;
9635}
9636
9637/* ARM V6 strex (argument parse).  */
9638
9639static void
9640do_strex (void)
9641{
9642  constraint (!inst.operands[2].isreg || !inst.operands[2].preind
9643	      || inst.operands[2].postind || inst.operands[2].writeback
9644	      || inst.operands[2].immisreg || inst.operands[2].shifted
9645	      || inst.operands[2].negative
9646	      /* See comment in do_ldrex().  */
9647	      || (inst.operands[2].reg == REG_PC),
9648	      BAD_ADDR_MODE);
9649
9650  constraint (inst.operands[0].reg == inst.operands[1].reg
9651	      || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
9652
9653  constraint (inst.reloc.exp.X_op != O_constant
9654	      || inst.reloc.exp.X_add_number != 0,
9655	      _("offset must be zero in ARM encoding"));
9656
9657  inst.instruction |= inst.operands[0].reg << 12;
9658  inst.instruction |= inst.operands[1].reg;
9659  inst.instruction |= inst.operands[2].reg << 16;
9660  inst.reloc.type = BFD_RELOC_UNUSED;
9661}
9662
9663static void
9664do_t_strexbh (void)
9665{
9666  constraint (!inst.operands[2].isreg || !inst.operands[2].preind
9667	      || inst.operands[2].postind || inst.operands[2].writeback
9668	      || inst.operands[2].immisreg || inst.operands[2].shifted
9669	      || inst.operands[2].negative,
9670	      BAD_ADDR_MODE);
9671
9672  constraint (inst.operands[0].reg == inst.operands[1].reg
9673	      || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
9674
9675  do_rm_rd_rn ();
9676}
9677
9678static void
9679do_strexd (void)
9680{
9681  constraint (inst.operands[1].reg % 2 != 0,
9682	      _("even register required"));
9683  constraint (inst.operands[2].present
9684	      && inst.operands[2].reg != inst.operands[1].reg + 1,
9685	      _("can only store two consecutive registers"));
9686  /* If op 2 were present and equal to PC, this function wouldn't
9687     have been called in the first place.  */
9688  constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
9689
9690  constraint (inst.operands[0].reg == inst.operands[1].reg
9691	      || inst.operands[0].reg == inst.operands[1].reg + 1
9692	      || inst.operands[0].reg == inst.operands[3].reg,
9693	      BAD_OVERLAP);
9694
9695  inst.instruction |= inst.operands[0].reg << 12;
9696  inst.instruction |= inst.operands[1].reg;
9697  inst.instruction |= inst.operands[3].reg << 16;
9698}
9699
9700/* ARM V8 STRL.  */
9701static void
9702do_stlex (void)
9703{
9704  constraint (inst.operands[0].reg == inst.operands[1].reg
9705	      || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
9706
9707  do_rd_rm_rn ();
9708}
9709
9710static void
9711do_t_stlex (void)
9712{
9713  constraint (inst.operands[0].reg == inst.operands[1].reg
9714	      || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
9715
9716  do_rm_rd_rn ();
9717}
9718
9719/* ARM V6 SXTAH extracts a 16-bit value from a register, sign
9720   extends it to 32-bits, and adds the result to a value in another
9721   register.  You can specify a rotation by 0, 8, 16, or 24 bits
9722   before extracting the 16-bit value.
9723   SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
9724   Condition defaults to COND_ALWAYS.
9725   Error if any register uses R15.  */
9726
9727static void
9728do_sxtah (void)
9729{
9730  inst.instruction |= inst.operands[0].reg << 12;
9731  inst.instruction |= inst.operands[1].reg << 16;
9732  inst.instruction |= inst.operands[2].reg;
9733  inst.instruction |= inst.operands[3].imm << 10;
9734}
9735
9736/* ARM V6 SXTH.
9737
9738   SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
9739   Condition defaults to COND_ALWAYS.
9740   Error if any register uses R15.  */
9741
9742static void
9743do_sxth (void)
9744{
9745  inst.instruction |= inst.operands[0].reg << 12;
9746  inst.instruction |= inst.operands[1].reg;
9747  inst.instruction |= inst.operands[2].imm << 10;
9748}
9749
9750/* VFP instructions.  In a logical order: SP variant first, monad
9751   before dyad, arithmetic then move then load/store.  */
9752
9753static void
9754do_vfp_sp_monadic (void)
9755{
9756  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9757  encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
9758}
9759
9760static void
9761do_vfp_sp_dyadic (void)
9762{
9763  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9764  encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
9765  encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
9766}
9767
9768static void
9769do_vfp_sp_compare_z (void)
9770{
9771  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9772}
9773
9774static void
9775do_vfp_dp_sp_cvt (void)
9776{
9777  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9778  encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
9779}
9780
9781static void
9782do_vfp_sp_dp_cvt (void)
9783{
9784  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9785  encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
9786}
9787
9788static void
9789do_vfp_reg_from_sp (void)
9790{
9791  inst.instruction |= inst.operands[0].reg << 12;
9792  encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
9793}
9794
9795static void
9796do_vfp_reg2_from_sp2 (void)
9797{
9798  constraint (inst.operands[2].imm != 2,
9799	      _("only two consecutive VFP SP registers allowed here"));
9800  inst.instruction |= inst.operands[0].reg << 12;
9801  inst.instruction |= inst.operands[1].reg << 16;
9802  encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
9803}
9804
9805static void
9806do_vfp_sp_from_reg (void)
9807{
9808  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
9809  inst.instruction |= inst.operands[1].reg << 12;
9810}
9811
9812static void
9813do_vfp_sp2_from_reg2 (void)
9814{
9815  constraint (inst.operands[0].imm != 2,
9816	      _("only two consecutive VFP SP registers allowed here"));
9817  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
9818  inst.instruction |= inst.operands[1].reg << 12;
9819  inst.instruction |= inst.operands[2].reg << 16;
9820}
9821
9822static void
9823do_vfp_sp_ldst (void)
9824{
9825  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9826  encode_arm_cp_address (1, FALSE, TRUE, 0);
9827}
9828
9829static void
9830do_vfp_dp_ldst (void)
9831{
9832  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9833  encode_arm_cp_address (1, FALSE, TRUE, 0);
9834}
9835
9836
9837static void
9838vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
9839{
9840  if (inst.operands[0].writeback)
9841    inst.instruction |= WRITE_BACK;
9842  else
9843    constraint (ldstm_type != VFP_LDSTMIA,
9844		_("this addressing mode requires base-register writeback"));
9845  inst.instruction |= inst.operands[0].reg << 16;
9846  encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
9847  inst.instruction |= inst.operands[1].imm;
9848}
9849
9850static void
9851vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
9852{
9853  int count;
9854
9855  if (inst.operands[0].writeback)
9856    inst.instruction |= WRITE_BACK;
9857  else
9858    constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
9859		_("this addressing mode requires base-register writeback"));
9860
9861  inst.instruction |= inst.operands[0].reg << 16;
9862  encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
9863
9864  count = inst.operands[1].imm << 1;
9865  if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
9866    count += 1;
9867
9868  inst.instruction |= count;
9869}
9870
9871static void
9872do_vfp_sp_ldstmia (void)
9873{
9874  vfp_sp_ldstm (VFP_LDSTMIA);
9875}
9876
9877static void
9878do_vfp_sp_ldstmdb (void)
9879{
9880  vfp_sp_ldstm (VFP_LDSTMDB);
9881}
9882
9883static void
9884do_vfp_dp_ldstmia (void)
9885{
9886  vfp_dp_ldstm (VFP_LDSTMIA);
9887}
9888
9889static void
9890do_vfp_dp_ldstmdb (void)
9891{
9892  vfp_dp_ldstm (VFP_LDSTMDB);
9893}
9894
9895static void
9896do_vfp_xp_ldstmia (void)
9897{
9898  vfp_dp_ldstm (VFP_LDSTMIAX);
9899}
9900
9901static void
9902do_vfp_xp_ldstmdb (void)
9903{
9904  vfp_dp_ldstm (VFP_LDSTMDBX);
9905}
9906
9907static void
9908do_vfp_dp_rd_rm (void)
9909{
9910  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9911  encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
9912}
9913
9914static void
9915do_vfp_dp_rn_rd (void)
9916{
9917  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
9918  encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
9919}
9920
9921static void
9922do_vfp_dp_rd_rn (void)
9923{
9924  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9925  encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
9926}
9927
9928static void
9929do_vfp_dp_rd_rn_rm (void)
9930{
9931  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9932  encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
9933  encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
9934}
9935
9936static void
9937do_vfp_dp_rd (void)
9938{
9939  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9940}
9941
9942static void
9943do_vfp_dp_rm_rd_rn (void)
9944{
9945  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
9946  encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
9947  encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
9948}
9949
9950/* VFPv3 instructions.  */
9951static void
9952do_vfp_sp_const (void)
9953{
9954  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9955  inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
9956  inst.instruction |= (inst.operands[1].imm & 0x0f);
9957}
9958
9959static void
9960do_vfp_dp_const (void)
9961{
9962  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9963  inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
9964  inst.instruction |= (inst.operands[1].imm & 0x0f);
9965}
9966
9967static void
9968vfp_conv (int srcsize)
9969{
9970  int immbits = srcsize - inst.operands[1].imm;
9971
9972  if (srcsize == 16 && !(immbits >= 0 && immbits <= srcsize))
9973    {
9974      /* If srcsize is 16, inst.operands[1].imm must be in the range 0-16.
9975	 i.e. immbits must be in range 0 - 16.  */
9976      inst.error = _("immediate value out of range, expected range [0, 16]");
9977      return;
9978    }
9979  else if (srcsize == 32 && !(immbits >= 0 && immbits < srcsize))
9980    {
9981      /* If srcsize is 32, inst.operands[1].imm must be in the range 1-32.
9982	 i.e. immbits must be in range 0 - 31.  */
9983      inst.error = _("immediate value out of range, expected range [1, 32]");
9984      return;
9985    }
9986
9987  inst.instruction |= (immbits & 1) << 5;
9988  inst.instruction |= (immbits >> 1);
9989}
9990
9991static void
9992do_vfp_sp_conv_16 (void)
9993{
9994  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
9995  vfp_conv (16);
9996}
9997
9998static void
9999do_vfp_dp_conv_16 (void)
10000{
10001  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
10002  vfp_conv (16);
10003}
10004
10005static void
10006do_vfp_sp_conv_32 (void)
10007{
10008  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
10009  vfp_conv (32);
10010}
10011
10012static void
10013do_vfp_dp_conv_32 (void)
10014{
10015  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
10016  vfp_conv (32);
10017}
10018
10019/* FPA instructions.  Also in a logical order.	*/
10020
10021static void
10022do_fpa_cmp (void)
10023{
10024  inst.instruction |= inst.operands[0].reg << 16;
10025  inst.instruction |= inst.operands[1].reg;
10026}
10027
10028static void
10029do_fpa_ldmstm (void)
10030{
10031  inst.instruction |= inst.operands[0].reg << 12;
10032  switch (inst.operands[1].imm)
10033    {
10034    case 1: inst.instruction |= CP_T_X;		 break;
10035    case 2: inst.instruction |= CP_T_Y;		 break;
10036    case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
10037    case 4:					 break;
10038    default: abort ();
10039    }
10040
10041  if (inst.instruction & (PRE_INDEX | INDEX_UP))
10042    {
10043      /* The instruction specified "ea" or "fd", so we can only accept
10044	 [Rn]{!}.  The instruction does not really support stacking or
10045	 unstacking, so we have to emulate these by setting appropriate
10046	 bits and offsets.  */
10047      constraint (inst.reloc.exp.X_op != O_constant
10048		  || inst.reloc.exp.X_add_number != 0,
10049		  _("this instruction does not support indexing"));
10050
10051      if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
10052	inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
10053
10054      if (!(inst.instruction & INDEX_UP))
10055	inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
10056
10057      if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
10058	{
10059	  inst.operands[2].preind = 0;
10060	  inst.operands[2].postind = 1;
10061	}
10062    }
10063
10064  encode_arm_cp_address (2, TRUE, TRUE, 0);
10065}
10066
10067/* iWMMXt instructions: strictly in alphabetical order.	 */
10068
10069static void
10070do_iwmmxt_tandorc (void)
10071{
10072  constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
10073}
10074
10075static void
10076do_iwmmxt_textrc (void)
10077{
10078  inst.instruction |= inst.operands[0].reg << 12;
10079  inst.instruction |= inst.operands[1].imm;
10080}
10081
10082static void
10083do_iwmmxt_textrm (void)
10084{
10085  inst.instruction |= inst.operands[0].reg << 12;
10086  inst.instruction |= inst.operands[1].reg << 16;
10087  inst.instruction |= inst.operands[2].imm;
10088}
10089
10090static void
10091do_iwmmxt_tinsr (void)
10092{
10093  inst.instruction |= inst.operands[0].reg << 16;
10094  inst.instruction |= inst.operands[1].reg << 12;
10095  inst.instruction |= inst.operands[2].imm;
10096}
10097
10098static void
10099do_iwmmxt_tmia (void)
10100{
10101  inst.instruction |= inst.operands[0].reg << 5;
10102  inst.instruction |= inst.operands[1].reg;
10103  inst.instruction |= inst.operands[2].reg << 12;
10104}
10105
10106static void
10107do_iwmmxt_waligni (void)
10108{
10109  inst.instruction |= inst.operands[0].reg << 12;
10110  inst.instruction |= inst.operands[1].reg << 16;
10111  inst.instruction |= inst.operands[2].reg;
10112  inst.instruction |= inst.operands[3].imm << 20;
10113}
10114
10115static void
10116do_iwmmxt_wmerge (void)
10117{
10118  inst.instruction |= inst.operands[0].reg << 12;
10119  inst.instruction |= inst.operands[1].reg << 16;
10120  inst.instruction |= inst.operands[2].reg;
10121  inst.instruction |= inst.operands[3].imm << 21;
10122}
10123
10124static void
10125do_iwmmxt_wmov (void)
10126{
10127  /* WMOV rD, rN is an alias for WOR rD, rN, rN.  */
10128  inst.instruction |= inst.operands[0].reg << 12;
10129  inst.instruction |= inst.operands[1].reg << 16;
10130  inst.instruction |= inst.operands[1].reg;
10131}
10132
10133static void
10134do_iwmmxt_wldstbh (void)
10135{
10136  int reloc;
10137  inst.instruction |= inst.operands[0].reg << 12;
10138  if (thumb_mode)
10139    reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
10140  else
10141    reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
10142  encode_arm_cp_address (1, TRUE, FALSE, reloc);
10143}
10144
10145static void
10146do_iwmmxt_wldstw (void)
10147{
10148  /* RIWR_RIWC clears .isreg for a control register.  */
10149  if (!inst.operands[0].isreg)
10150    {
10151      constraint (inst.cond != COND_ALWAYS, BAD_COND);
10152      inst.instruction |= 0xf0000000;
10153    }
10154
10155  inst.instruction |= inst.operands[0].reg << 12;
10156  encode_arm_cp_address (1, TRUE, TRUE, 0);
10157}
10158
10159static void
10160do_iwmmxt_wldstd (void)
10161{
10162  inst.instruction |= inst.operands[0].reg << 12;
10163  if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
10164      && inst.operands[1].immisreg)
10165    {
10166      inst.instruction &= ~0x1a000ff;
10167      inst.instruction |= (0xfU << 28);
10168      if (inst.operands[1].preind)
10169	inst.instruction |= PRE_INDEX;
10170      if (!inst.operands[1].negative)
10171	inst.instruction |= INDEX_UP;
10172      if (inst.operands[1].writeback)
10173	inst.instruction |= WRITE_BACK;
10174      inst.instruction |= inst.operands[1].reg << 16;
10175      inst.instruction |= inst.reloc.exp.X_add_number << 4;
10176      inst.instruction |= inst.operands[1].imm;
10177    }
10178  else
10179    encode_arm_cp_address (1, TRUE, FALSE, 0);
10180}
10181
10182static void
10183do_iwmmxt_wshufh (void)
10184{
10185  inst.instruction |= inst.operands[0].reg << 12;
10186  inst.instruction |= inst.operands[1].reg << 16;
10187  inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
10188  inst.instruction |= (inst.operands[2].imm & 0x0f);
10189}
10190
10191static void
10192do_iwmmxt_wzero (void)
10193{
10194  /* WZERO reg is an alias for WANDN reg, reg, reg.  */
10195  inst.instruction |= inst.operands[0].reg;
10196  inst.instruction |= inst.operands[0].reg << 12;
10197  inst.instruction |= inst.operands[0].reg << 16;
10198}
10199
10200static void
10201do_iwmmxt_wrwrwr_or_imm5 (void)
10202{
10203  if (inst.operands[2].isreg)
10204    do_rd_rn_rm ();
10205  else {
10206    constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
10207		_("immediate operand requires iWMMXt2"));
10208    do_rd_rn ();
10209    if (inst.operands[2].imm == 0)
10210      {
10211	switch ((inst.instruction >> 20) & 0xf)
10212	  {
10213	  case 4:
10214	  case 5:
10215	  case 6:
10216	  case 7:
10217	    /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16.  */
10218	    inst.operands[2].imm = 16;
10219	    inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
10220	    break;
10221	  case 8:
10222	  case 9:
10223	  case 10:
10224	  case 11:
10225	    /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32.  */
10226	    inst.operands[2].imm = 32;
10227	    inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
10228	    break;
10229	  case 12:
10230	  case 13:
10231	  case 14:
10232	  case 15:
10233	    {
10234	      /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn.  */
10235	      unsigned long wrn;
10236	      wrn = (inst.instruction >> 16) & 0xf;
10237	      inst.instruction &= 0xff0fff0f;
10238	      inst.instruction |= wrn;
10239	      /* Bail out here; the instruction is now assembled.  */
10240	      return;
10241	    }
10242	  }
10243      }
10244    /* Map 32 -> 0, etc.  */
10245    inst.operands[2].imm &= 0x1f;
10246    inst.instruction |= (0xfU << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
10247  }
10248}
10249
10250/* Cirrus Maverick instructions.  Simple 2-, 3-, and 4-register
10251   operations first, then control, shift, and load/store.  */
10252
10253/* Insns like "foo X,Y,Z".  */
10254
10255static void
10256do_mav_triple (void)
10257{
10258  inst.instruction |= inst.operands[0].reg << 16;
10259  inst.instruction |= inst.operands[1].reg;
10260  inst.instruction |= inst.operands[2].reg << 12;
10261}
10262
10263/* Insns like "foo W,X,Y,Z".
10264    where W=MVAX[0:3] and X,Y,Z=MVFX[0:15].  */
10265
10266static void
10267do_mav_quad (void)
10268{
10269  inst.instruction |= inst.operands[0].reg << 5;
10270  inst.instruction |= inst.operands[1].reg << 12;
10271  inst.instruction |= inst.operands[2].reg << 16;
10272  inst.instruction |= inst.operands[3].reg;
10273}
10274
10275/* cfmvsc32<cond> DSPSC,MVDX[15:0].  */
10276static void
10277do_mav_dspsc (void)
10278{
10279  inst.instruction |= inst.operands[1].reg << 12;
10280}
10281
10282/* Maverick shift immediate instructions.
10283   cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
10284   cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0].  */
10285
10286static void
10287do_mav_shift (void)
10288{
10289  int imm = inst.operands[2].imm;
10290
10291  inst.instruction |= inst.operands[0].reg << 12;
10292  inst.instruction |= inst.operands[1].reg << 16;
10293
10294  /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
10295     Bits 5-7 of the insn should have bits 4-6 of the immediate.
10296     Bit 4 should be 0.	 */
10297  imm = (imm & 0xf) | ((imm & 0x70) << 1);
10298
10299  inst.instruction |= imm;
10300}
10301
10302/* XScale instructions.	 Also sorted arithmetic before move.  */
10303
10304/* Xscale multiply-accumulate (argument parse)
10305     MIAcc   acc0,Rm,Rs
10306     MIAPHcc acc0,Rm,Rs
10307     MIAxycc acc0,Rm,Rs.  */
10308
10309static void
10310do_xsc_mia (void)
10311{
10312  inst.instruction |= inst.operands[1].reg;
10313  inst.instruction |= inst.operands[2].reg << 12;
10314}
10315
10316/* Xscale move-accumulator-register (argument parse)
10317
10318     MARcc   acc0,RdLo,RdHi.  */
10319
10320static void
10321do_xsc_mar (void)
10322{
10323  inst.instruction |= inst.operands[1].reg << 12;
10324  inst.instruction |= inst.operands[2].reg << 16;
10325}
10326
10327/* Xscale move-register-accumulator (argument parse)
10328
10329     MRAcc   RdLo,RdHi,acc0.  */
10330
10331static void
10332do_xsc_mra (void)
10333{
10334  constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
10335  inst.instruction |= inst.operands[0].reg << 12;
10336  inst.instruction |= inst.operands[1].reg << 16;
10337}
10338
10339/* Encoding functions relevant only to Thumb.  */
10340
10341/* inst.operands[i] is a shifted-register operand; encode
10342   it into inst.instruction in the format used by Thumb32.  */
10343
10344static void
10345encode_thumb32_shifted_operand (int i)
10346{
10347  unsigned int value = inst.reloc.exp.X_add_number;
10348  unsigned int shift = inst.operands[i].shift_kind;
10349
10350  constraint (inst.operands[i].immisreg,
10351	      _("shift by register not allowed in thumb mode"));
10352  inst.instruction |= inst.operands[i].reg;
10353  if (shift == SHIFT_RRX)
10354    inst.instruction |= SHIFT_ROR << 4;
10355  else
10356    {
10357      constraint (inst.reloc.exp.X_op != O_constant,
10358		  _("expression too complex"));
10359
10360      constraint (value > 32
10361		  || (value == 32 && (shift == SHIFT_LSL
10362				      || shift == SHIFT_ROR)),
10363		  _("shift expression is too large"));
10364
10365      if (value == 0)
10366	shift = SHIFT_LSL;
10367      else if (value == 32)
10368	value = 0;
10369
10370      inst.instruction |= shift << 4;
10371      inst.instruction |= (value & 0x1c) << 10;
10372      inst.instruction |= (value & 0x03) << 6;
10373    }
10374}
10375
10376
10377/* inst.operands[i] was set up by parse_address.  Encode it into a
10378   Thumb32 format load or store instruction.  Reject forms that cannot
10379   be used with such instructions.  If is_t is true, reject forms that
10380   cannot be used with a T instruction; if is_d is true, reject forms
10381   that cannot be used with a D instruction.  If it is a store insn,
10382   reject PC in Rn.  */
10383
10384static void
10385encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
10386{
10387  const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
10388
10389  constraint (!inst.operands[i].isreg,
10390	      _("Instruction does not support =N addresses"));
10391
10392  inst.instruction |= inst.operands[i].reg << 16;
10393  if (inst.operands[i].immisreg)
10394    {
10395      constraint (is_pc, BAD_PC_ADDRESSING);
10396      constraint (is_t || is_d, _("cannot use register index with this instruction"));
10397      constraint (inst.operands[i].negative,
10398		  _("Thumb does not support negative register indexing"));
10399      constraint (inst.operands[i].postind,
10400		  _("Thumb does not support register post-indexing"));
10401      constraint (inst.operands[i].writeback,
10402		  _("Thumb does not support register indexing with writeback"));
10403      constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
10404		  _("Thumb supports only LSL in shifted register indexing"));
10405
10406      inst.instruction |= inst.operands[i].imm;
10407      if (inst.operands[i].shifted)
10408	{
10409	  constraint (inst.reloc.exp.X_op != O_constant,
10410		      _("expression too complex"));
10411	  constraint (inst.reloc.exp.X_add_number < 0
10412		      || inst.reloc.exp.X_add_number > 3,
10413		      _("shift out of range"));
10414	  inst.instruction |= inst.reloc.exp.X_add_number << 4;
10415	}
10416      inst.reloc.type = BFD_RELOC_UNUSED;
10417    }
10418  else if (inst.operands[i].preind)
10419    {
10420      constraint (is_pc && inst.operands[i].writeback, BAD_PC_WRITEBACK);
10421      constraint (is_t && inst.operands[i].writeback,
10422		  _("cannot use writeback with this instruction"));
10423      constraint (is_pc && ((inst.instruction & THUMB2_LOAD_BIT) == 0),
10424		  BAD_PC_ADDRESSING);
10425
10426      if (is_d)
10427	{
10428	  inst.instruction |= 0x01000000;
10429	  if (inst.operands[i].writeback)
10430	    inst.instruction |= 0x00200000;
10431	}
10432      else
10433	{
10434	  inst.instruction |= 0x00000c00;
10435	  if (inst.operands[i].writeback)
10436	    inst.instruction |= 0x00000100;
10437	}
10438      inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
10439    }
10440  else if (inst.operands[i].postind)
10441    {
10442      gas_assert (inst.operands[i].writeback);
10443      constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
10444      constraint (is_t, _("cannot use post-indexing with this instruction"));
10445
10446      if (is_d)
10447	inst.instruction |= 0x00200000;
10448      else
10449	inst.instruction |= 0x00000900;
10450      inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
10451    }
10452  else /* unindexed - only for coprocessor */
10453    inst.error = _("instruction does not accept unindexed addressing");
10454}
10455
10456/* Table of Thumb instructions which exist in both 16- and 32-bit
10457   encodings (the latter only in post-V6T2 cores).  The index is the
10458   value used in the insns table below.  When there is more than one
10459   possible 16-bit encoding for the instruction, this table always
10460   holds variant (1).
10461   Also contains several pseudo-instructions used during relaxation.  */
10462#define T16_32_TAB				\
10463  X(_adc,   4140, eb400000),			\
10464  X(_adcs,  4140, eb500000),			\
10465  X(_add,   1c00, eb000000),			\
10466  X(_adds,  1c00, eb100000),			\
10467  X(_addi,  0000, f1000000),			\
10468  X(_addis, 0000, f1100000),			\
10469  X(_add_pc,000f, f20f0000),			\
10470  X(_add_sp,000d, f10d0000),			\
10471  X(_adr,   000f, f20f0000),			\
10472  X(_and,   4000, ea000000),			\
10473  X(_ands,  4000, ea100000),			\
10474  X(_asr,   1000, fa40f000),			\
10475  X(_asrs,  1000, fa50f000),			\
10476  X(_b,     e000, f000b000),			\
10477  X(_bcond, d000, f0008000),			\
10478  X(_bic,   4380, ea200000),			\
10479  X(_bics,  4380, ea300000),			\
10480  X(_cmn,   42c0, eb100f00),			\
10481  X(_cmp,   2800, ebb00f00),			\
10482  X(_cpsie, b660, f3af8400),			\
10483  X(_cpsid, b670, f3af8600),			\
10484  X(_cpy,   4600, ea4f0000),			\
10485  X(_dec_sp,80dd, f1ad0d00),			\
10486  X(_eor,   4040, ea800000),			\
10487  X(_eors,  4040, ea900000),			\
10488  X(_inc_sp,00dd, f10d0d00),			\
10489  X(_ldmia, c800, e8900000),			\
10490  X(_ldr,   6800, f8500000),			\
10491  X(_ldrb,  7800, f8100000),			\
10492  X(_ldrh,  8800, f8300000),			\
10493  X(_ldrsb, 5600, f9100000),			\
10494  X(_ldrsh, 5e00, f9300000),			\
10495  X(_ldr_pc,4800, f85f0000),			\
10496  X(_ldr_pc2,4800, f85f0000),			\
10497  X(_ldr_sp,9800, f85d0000),			\
10498  X(_lsl,   0000, fa00f000),			\
10499  X(_lsls,  0000, fa10f000),			\
10500  X(_lsr,   0800, fa20f000),			\
10501  X(_lsrs,  0800, fa30f000),			\
10502  X(_mov,   2000, ea4f0000),			\
10503  X(_movs,  2000, ea5f0000),			\
10504  X(_mul,   4340, fb00f000),                     \
10505  X(_muls,  4340, ffffffff), /* no 32b muls */	\
10506  X(_mvn,   43c0, ea6f0000),			\
10507  X(_mvns,  43c0, ea7f0000),			\
10508  X(_neg,   4240, f1c00000), /* rsb #0 */	\
10509  X(_negs,  4240, f1d00000), /* rsbs #0 */	\
10510  X(_orr,   4300, ea400000),			\
10511  X(_orrs,  4300, ea500000),			\
10512  X(_pop,   bc00, e8bd0000), /* ldmia sp!,... */	\
10513  X(_push,  b400, e92d0000), /* stmdb sp!,... */	\
10514  X(_rev,   ba00, fa90f080),			\
10515  X(_rev16, ba40, fa90f090),			\
10516  X(_revsh, bac0, fa90f0b0),			\
10517  X(_ror,   41c0, fa60f000),			\
10518  X(_rors,  41c0, fa70f000),			\
10519  X(_sbc,   4180, eb600000),			\
10520  X(_sbcs,  4180, eb700000),			\
10521  X(_stmia, c000, e8800000),			\
10522  X(_str,   6000, f8400000),			\
10523  X(_strb,  7000, f8000000),			\
10524  X(_strh,  8000, f8200000),			\
10525  X(_str_sp,9000, f84d0000),			\
10526  X(_sub,   1e00, eba00000),			\
10527  X(_subs,  1e00, ebb00000),			\
10528  X(_subi,  8000, f1a00000),			\
10529  X(_subis, 8000, f1b00000),			\
10530  X(_sxtb,  b240, fa4ff080),			\
10531  X(_sxth,  b200, fa0ff080),			\
10532  X(_tst,   4200, ea100f00),			\
10533  X(_uxtb,  b2c0, fa5ff080),			\
10534  X(_uxth,  b280, fa1ff080),			\
10535  X(_nop,   bf00, f3af8000),			\
10536  X(_yield, bf10, f3af8001),			\
10537  X(_wfe,   bf20, f3af8002),			\
10538  X(_wfi,   bf30, f3af8003),			\
10539  X(_sev,   bf40, f3af8004),                    \
10540  X(_sevl,  bf50, f3af8005),			\
10541  X(_udf,   de00, f7f0a000)
10542
10543/* To catch errors in encoding functions, the codes are all offset by
10544   0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
10545   as 16-bit instructions.  */
10546#define X(a,b,c) T_MNEM##a
10547enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
10548#undef X
10549
10550#define X(a,b,c) 0x##b
10551static const unsigned short thumb_op16[] = { T16_32_TAB };
10552#define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
10553#undef X
10554
10555#define X(a,b,c) 0x##c
10556static const unsigned int thumb_op32[] = { T16_32_TAB };
10557#define THUMB_OP32(n)        (thumb_op32[(n) - (T16_32_OFFSET + 1)])
10558#define THUMB_SETS_FLAGS(n)  (THUMB_OP32 (n) & 0x00100000)
10559#undef X
10560#undef T16_32_TAB
10561
10562/* Thumb instruction encoders, in alphabetical order.  */
10563
10564/* ADDW or SUBW.  */
10565
10566static void
10567do_t_add_sub_w (void)
10568{
10569  int Rd, Rn;
10570
10571  Rd = inst.operands[0].reg;
10572  Rn = inst.operands[1].reg;
10573
10574  /* If Rn is REG_PC, this is ADR; if Rn is REG_SP, then this
10575     is the SP-{plus,minus}-immediate form of the instruction.  */
10576  if (Rn == REG_SP)
10577    constraint (Rd == REG_PC, BAD_PC);
10578  else
10579    reject_bad_reg (Rd);
10580
10581  inst.instruction |= (Rn << 16) | (Rd << 8);
10582  inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
10583}
10584
10585/* Parse an add or subtract instruction.  We get here with inst.instruction
10586   equaling any of THUMB_OPCODE_add, adds, sub, or subs.  */
10587
10588static void
10589do_t_add_sub (void)
10590{
10591  int Rd, Rs, Rn;
10592
10593  Rd = inst.operands[0].reg;
10594  Rs = (inst.operands[1].present
10595	? inst.operands[1].reg    /* Rd, Rs, foo */
10596	: inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
10597
10598  if (Rd == REG_PC)
10599    set_it_insn_type_last ();
10600
10601  if (unified_syntax)
10602    {
10603      bfd_boolean flags;
10604      bfd_boolean narrow;
10605      int opcode;
10606
10607      flags = (inst.instruction == T_MNEM_adds
10608	       || inst.instruction == T_MNEM_subs);
10609      if (flags)
10610	narrow = !in_it_block ();
10611      else
10612	narrow = in_it_block ();
10613      if (!inst.operands[2].isreg)
10614	{
10615	  int add;
10616
10617	  if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
10618	    constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
10619
10620	  add = (inst.instruction == T_MNEM_add
10621		 || inst.instruction == T_MNEM_adds);
10622	  opcode = 0;
10623	  if (inst.size_req != 4)
10624	    {
10625	      /* Attempt to use a narrow opcode, with relaxation if
10626		 appropriate.  */
10627	      if (Rd == REG_SP && Rs == REG_SP && !flags)
10628		opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
10629	      else if (Rd <= 7 && Rs == REG_SP && add && !flags)
10630		opcode = T_MNEM_add_sp;
10631	      else if (Rd <= 7 && Rs == REG_PC && add && !flags)
10632		opcode = T_MNEM_add_pc;
10633	      else if (Rd <= 7 && Rs <= 7 && narrow)
10634		{
10635		  if (flags)
10636		    opcode = add ? T_MNEM_addis : T_MNEM_subis;
10637		  else
10638		    opcode = add ? T_MNEM_addi : T_MNEM_subi;
10639		}
10640	      if (opcode)
10641		{
10642		  inst.instruction = THUMB_OP16(opcode);
10643		  inst.instruction |= (Rd << 4) | Rs;
10644		  if (inst.reloc.type < BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC
10645		      || inst.reloc.type > BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC)
10646		  {
10647		    if (inst.size_req == 2)
10648		      inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
10649		    else
10650		      inst.relax = opcode;
10651		  }
10652		}
10653	      else
10654		constraint (inst.size_req == 2, BAD_HIREG);
10655	    }
10656	  if (inst.size_req == 4
10657	      || (inst.size_req != 2 && !opcode))
10658	    {
10659	      constraint (inst.reloc.type >= BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC
10660			  && inst.reloc.type <= BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC ,
10661			  THUMB1_RELOC_ONLY);
10662	      if (Rd == REG_PC)
10663		{
10664		  constraint (add, BAD_PC);
10665		  constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
10666			     _("only SUBS PC, LR, #const allowed"));
10667		  constraint (inst.reloc.exp.X_op != O_constant,
10668			      _("expression too complex"));
10669		  constraint (inst.reloc.exp.X_add_number < 0
10670			      || inst.reloc.exp.X_add_number > 0xff,
10671			     _("immediate value out of range"));
10672		  inst.instruction = T2_SUBS_PC_LR
10673				     | inst.reloc.exp.X_add_number;
10674		  inst.reloc.type = BFD_RELOC_UNUSED;
10675		  return;
10676		}
10677	      else if (Rs == REG_PC)
10678		{
10679		  /* Always use addw/subw.  */
10680		  inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
10681		  inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
10682		}
10683	      else
10684		{
10685		  inst.instruction = THUMB_OP32 (inst.instruction);
10686		  inst.instruction = (inst.instruction & 0xe1ffffff)
10687				     | 0x10000000;
10688		  if (flags)
10689		    inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10690		  else
10691		    inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
10692		}
10693	      inst.instruction |= Rd << 8;
10694	      inst.instruction |= Rs << 16;
10695	    }
10696	}
10697      else
10698	{
10699	  unsigned int value = inst.reloc.exp.X_add_number;
10700	  unsigned int shift = inst.operands[2].shift_kind;
10701
10702	  Rn = inst.operands[2].reg;
10703	  /* See if we can do this with a 16-bit instruction.  */
10704	  if (!inst.operands[2].shifted && inst.size_req != 4)
10705	    {
10706	      if (Rd > 7 || Rs > 7 || Rn > 7)
10707		narrow = FALSE;
10708
10709	      if (narrow)
10710		{
10711		  inst.instruction = ((inst.instruction == T_MNEM_adds
10712				       || inst.instruction == T_MNEM_add)
10713				      ? T_OPCODE_ADD_R3
10714				      : T_OPCODE_SUB_R3);
10715		  inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
10716		  return;
10717		}
10718
10719	      if (inst.instruction == T_MNEM_add && (Rd == Rs || Rd == Rn))
10720		{
10721		  /* Thumb-1 cores (except v6-M) require at least one high
10722		     register in a narrow non flag setting add.  */
10723		  if (Rd > 7 || Rn > 7
10724		      || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)
10725		      || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_msr))
10726		    {
10727		      if (Rd == Rn)
10728			{
10729			  Rn = Rs;
10730			  Rs = Rd;
10731			}
10732		      inst.instruction = T_OPCODE_ADD_HI;
10733		      inst.instruction |= (Rd & 8) << 4;
10734		      inst.instruction |= (Rd & 7);
10735		      inst.instruction |= Rn << 3;
10736		      return;
10737		    }
10738		}
10739	    }
10740
10741	  constraint (Rd == REG_PC, BAD_PC);
10742	  if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
10743	    constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
10744	  constraint (Rs == REG_PC, BAD_PC);
10745	  reject_bad_reg (Rn);
10746
10747	  /* If we get here, it can't be done in 16 bits.  */
10748	  constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
10749		      _("shift must be constant"));
10750	  inst.instruction = THUMB_OP32 (inst.instruction);
10751	  inst.instruction |= Rd << 8;
10752	  inst.instruction |= Rs << 16;
10753	  constraint (Rd == REG_SP && Rs == REG_SP && value > 3,
10754		      _("shift value over 3 not allowed in thumb mode"));
10755	  constraint (Rd == REG_SP && Rs == REG_SP && shift != SHIFT_LSL,
10756		      _("only LSL shift allowed in thumb mode"));
10757	  encode_thumb32_shifted_operand (2);
10758	}
10759    }
10760  else
10761    {
10762      constraint (inst.instruction == T_MNEM_adds
10763		  || inst.instruction == T_MNEM_subs,
10764		  BAD_THUMB32);
10765
10766      if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
10767	{
10768	  constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
10769		      || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
10770		      BAD_HIREG);
10771
10772	  inst.instruction = (inst.instruction == T_MNEM_add
10773			      ? 0x0000 : 0x8000);
10774	  inst.instruction |= (Rd << 4) | Rs;
10775	  inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
10776	  return;
10777	}
10778
10779      Rn = inst.operands[2].reg;
10780      constraint (inst.operands[2].shifted, _("unshifted register required"));
10781
10782      /* We now have Rd, Rs, and Rn set to registers.  */
10783      if (Rd > 7 || Rs > 7 || Rn > 7)
10784	{
10785	  /* Can't do this for SUB.	 */
10786	  constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
10787	  inst.instruction = T_OPCODE_ADD_HI;
10788	  inst.instruction |= (Rd & 8) << 4;
10789	  inst.instruction |= (Rd & 7);
10790	  if (Rs == Rd)
10791	    inst.instruction |= Rn << 3;
10792	  else if (Rn == Rd)
10793	    inst.instruction |= Rs << 3;
10794	  else
10795	    constraint (1, _("dest must overlap one source register"));
10796	}
10797      else
10798	{
10799	  inst.instruction = (inst.instruction == T_MNEM_add
10800			      ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
10801	  inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
10802	}
10803    }
10804}
10805
10806static void
10807do_t_adr (void)
10808{
10809  unsigned Rd;
10810
10811  Rd = inst.operands[0].reg;
10812  reject_bad_reg (Rd);
10813
10814  if (unified_syntax && inst.size_req == 0 && Rd <= 7)
10815    {
10816      /* Defer to section relaxation.  */
10817      inst.relax = inst.instruction;
10818      inst.instruction = THUMB_OP16 (inst.instruction);
10819      inst.instruction |= Rd << 4;
10820    }
10821  else if (unified_syntax && inst.size_req != 2)
10822    {
10823      /* Generate a 32-bit opcode.  */
10824      inst.instruction = THUMB_OP32 (inst.instruction);
10825      inst.instruction |= Rd << 8;
10826      inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
10827      inst.reloc.pc_rel = 1;
10828    }
10829  else
10830    {
10831      /* Generate a 16-bit opcode.  */
10832      inst.instruction = THUMB_OP16 (inst.instruction);
10833      inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
10834      inst.reloc.exp.X_add_number -= 4; /* PC relative adjust.  */
10835      inst.reloc.pc_rel = 1;
10836      inst.instruction |= Rd << 4;
10837    }
10838
10839  if (inst.reloc.exp.X_op == O_symbol
10840      && inst.reloc.exp.X_add_symbol != NULL
10841      && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
10842      && THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
10843    inst.reloc.exp.X_add_number += 1;
10844}
10845
10846/* Arithmetic instructions for which there is just one 16-bit
10847   instruction encoding, and it allows only two low registers.
10848   For maximal compatibility with ARM syntax, we allow three register
10849   operands even when Thumb-32 instructions are not available, as long
10850   as the first two are identical.  For instance, both "sbc r0,r1" and
10851   "sbc r0,r0,r1" are allowed.  */
10852static void
10853do_t_arit3 (void)
10854{
10855  int Rd, Rs, Rn;
10856
10857  Rd = inst.operands[0].reg;
10858  Rs = (inst.operands[1].present
10859	? inst.operands[1].reg    /* Rd, Rs, foo */
10860	: inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
10861  Rn = inst.operands[2].reg;
10862
10863  reject_bad_reg (Rd);
10864  reject_bad_reg (Rs);
10865  if (inst.operands[2].isreg)
10866    reject_bad_reg (Rn);
10867
10868  if (unified_syntax)
10869    {
10870      if (!inst.operands[2].isreg)
10871	{
10872	  /* For an immediate, we always generate a 32-bit opcode;
10873	     section relaxation will shrink it later if possible.  */
10874	  inst.instruction = THUMB_OP32 (inst.instruction);
10875	  inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10876	  inst.instruction |= Rd << 8;
10877	  inst.instruction |= Rs << 16;
10878	  inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10879	}
10880      else
10881	{
10882	  bfd_boolean narrow;
10883
10884	  /* See if we can do this with a 16-bit instruction.  */
10885	  if (THUMB_SETS_FLAGS (inst.instruction))
10886	    narrow = !in_it_block ();
10887	  else
10888	    narrow = in_it_block ();
10889
10890	  if (Rd > 7 || Rn > 7 || Rs > 7)
10891	    narrow = FALSE;
10892	  if (inst.operands[2].shifted)
10893	    narrow = FALSE;
10894	  if (inst.size_req == 4)
10895	    narrow = FALSE;
10896
10897	  if (narrow
10898	      && Rd == Rs)
10899	    {
10900	      inst.instruction = THUMB_OP16 (inst.instruction);
10901	      inst.instruction |= Rd;
10902	      inst.instruction |= Rn << 3;
10903	      return;
10904	    }
10905
10906	  /* If we get here, it can't be done in 16 bits.  */
10907	  constraint (inst.operands[2].shifted
10908		      && inst.operands[2].immisreg,
10909		      _("shift must be constant"));
10910	  inst.instruction = THUMB_OP32 (inst.instruction);
10911	  inst.instruction |= Rd << 8;
10912	  inst.instruction |= Rs << 16;
10913	  encode_thumb32_shifted_operand (2);
10914	}
10915    }
10916  else
10917    {
10918      /* On its face this is a lie - the instruction does set the
10919	 flags.  However, the only supported mnemonic in this mode
10920	 says it doesn't.  */
10921      constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
10922
10923      constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
10924		  _("unshifted register required"));
10925      constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
10926      constraint (Rd != Rs,
10927		  _("dest and source1 must be the same register"));
10928
10929      inst.instruction = THUMB_OP16 (inst.instruction);
10930      inst.instruction |= Rd;
10931      inst.instruction |= Rn << 3;
10932    }
10933}
10934
10935/* Similarly, but for instructions where the arithmetic operation is
10936   commutative, so we can allow either of them to be different from
10937   the destination operand in a 16-bit instruction.  For instance, all
10938   three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
10939   accepted.  */
10940static void
10941do_t_arit3c (void)
10942{
10943  int Rd, Rs, Rn;
10944
10945  Rd = inst.operands[0].reg;
10946  Rs = (inst.operands[1].present
10947	? inst.operands[1].reg    /* Rd, Rs, foo */
10948	: inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
10949  Rn = inst.operands[2].reg;
10950
10951  reject_bad_reg (Rd);
10952  reject_bad_reg (Rs);
10953  if (inst.operands[2].isreg)
10954    reject_bad_reg (Rn);
10955
10956  if (unified_syntax)
10957    {
10958      if (!inst.operands[2].isreg)
10959	{
10960	  /* For an immediate, we always generate a 32-bit opcode;
10961	     section relaxation will shrink it later if possible.  */
10962	  inst.instruction = THUMB_OP32 (inst.instruction);
10963	  inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
10964	  inst.instruction |= Rd << 8;
10965	  inst.instruction |= Rs << 16;
10966	  inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10967	}
10968      else
10969	{
10970	  bfd_boolean narrow;
10971
10972	  /* See if we can do this with a 16-bit instruction.  */
10973	  if (THUMB_SETS_FLAGS (inst.instruction))
10974	    narrow = !in_it_block ();
10975	  else
10976	    narrow = in_it_block ();
10977
10978	  if (Rd > 7 || Rn > 7 || Rs > 7)
10979	    narrow = FALSE;
10980	  if (inst.operands[2].shifted)
10981	    narrow = FALSE;
10982	  if (inst.size_req == 4)
10983	    narrow = FALSE;
10984
10985	  if (narrow)
10986	    {
10987	      if (Rd == Rs)
10988		{
10989		  inst.instruction = THUMB_OP16 (inst.instruction);
10990		  inst.instruction |= Rd;
10991		  inst.instruction |= Rn << 3;
10992		  return;
10993		}
10994	      if (Rd == Rn)
10995		{
10996		  inst.instruction = THUMB_OP16 (inst.instruction);
10997		  inst.instruction |= Rd;
10998		  inst.instruction |= Rs << 3;
10999		  return;
11000		}
11001	    }
11002
11003	  /* If we get here, it can't be done in 16 bits.  */
11004	  constraint (inst.operands[2].shifted
11005		      && inst.operands[2].immisreg,
11006		      _("shift must be constant"));
11007	  inst.instruction = THUMB_OP32 (inst.instruction);
11008	  inst.instruction |= Rd << 8;
11009	  inst.instruction |= Rs << 16;
11010	  encode_thumb32_shifted_operand (2);
11011	}
11012    }
11013  else
11014    {
11015      /* On its face this is a lie - the instruction does set the
11016	 flags.  However, the only supported mnemonic in this mode
11017	 says it doesn't.  */
11018      constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11019
11020      constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
11021		  _("unshifted register required"));
11022      constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
11023
11024      inst.instruction = THUMB_OP16 (inst.instruction);
11025      inst.instruction |= Rd;
11026
11027      if (Rd == Rs)
11028	inst.instruction |= Rn << 3;
11029      else if (Rd == Rn)
11030	inst.instruction |= Rs << 3;
11031      else
11032	constraint (1, _("dest must overlap one source register"));
11033    }
11034}
11035
11036static void
11037do_t_bfc (void)
11038{
11039  unsigned Rd;
11040  unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
11041  constraint (msb > 32, _("bit-field extends past end of register"));
11042  /* The instruction encoding stores the LSB and MSB,
11043     not the LSB and width.  */
11044  Rd = inst.operands[0].reg;
11045  reject_bad_reg (Rd);
11046  inst.instruction |= Rd << 8;
11047  inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
11048  inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
11049  inst.instruction |= msb - 1;
11050}
11051
11052static void
11053do_t_bfi (void)
11054{
11055  int Rd, Rn;
11056  unsigned int msb;
11057
11058  Rd = inst.operands[0].reg;
11059  reject_bad_reg (Rd);
11060
11061  /* #0 in second position is alternative syntax for bfc, which is
11062     the same instruction but with REG_PC in the Rm field.  */
11063  if (!inst.operands[1].isreg)
11064    Rn = REG_PC;
11065  else
11066    {
11067      Rn = inst.operands[1].reg;
11068      reject_bad_reg (Rn);
11069    }
11070
11071  msb = inst.operands[2].imm + inst.operands[3].imm;
11072  constraint (msb > 32, _("bit-field extends past end of register"));
11073  /* The instruction encoding stores the LSB and MSB,
11074     not the LSB and width.  */
11075  inst.instruction |= Rd << 8;
11076  inst.instruction |= Rn << 16;
11077  inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
11078  inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
11079  inst.instruction |= msb - 1;
11080}
11081
11082static void
11083do_t_bfx (void)
11084{
11085  unsigned Rd, Rn;
11086
11087  Rd = inst.operands[0].reg;
11088  Rn = inst.operands[1].reg;
11089
11090  reject_bad_reg (Rd);
11091  reject_bad_reg (Rn);
11092
11093  constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
11094	      _("bit-field extends past end of register"));
11095  inst.instruction |= Rd << 8;
11096  inst.instruction |= Rn << 16;
11097  inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
11098  inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
11099  inst.instruction |= inst.operands[3].imm - 1;
11100}
11101
11102/* ARM V5 Thumb BLX (argument parse)
11103	BLX <target_addr>	which is BLX(1)
11104	BLX <Rm>		which is BLX(2)
11105   Unfortunately, there are two different opcodes for this mnemonic.
11106   So, the insns[].value is not used, and the code here zaps values
11107	into inst.instruction.
11108
11109   ??? How to take advantage of the additional two bits of displacement
11110   available in Thumb32 mode?  Need new relocation?  */
11111
11112static void
11113do_t_blx (void)
11114{
11115  set_it_insn_type_last ();
11116
11117  if (inst.operands[0].isreg)
11118    {
11119      constraint (inst.operands[0].reg == REG_PC, BAD_PC);
11120      /* We have a register, so this is BLX(2).  */
11121      inst.instruction |= inst.operands[0].reg << 3;
11122    }
11123  else
11124    {
11125      /* No register.  This must be BLX(1).  */
11126      inst.instruction = 0xf000e800;
11127      encode_branch (BFD_RELOC_THUMB_PCREL_BLX);
11128    }
11129}
11130
11131static void
11132do_t_branch (void)
11133{
11134  int opcode;
11135  int cond;
11136  bfd_reloc_code_real_type reloc;
11137
11138  cond = inst.cond;
11139  set_it_insn_type (IF_INSIDE_IT_LAST_INSN);
11140
11141  if (in_it_block ())
11142    {
11143      /* Conditional branches inside IT blocks are encoded as unconditional
11144	 branches.  */
11145      cond = COND_ALWAYS;
11146    }
11147  else
11148    cond = inst.cond;
11149
11150  if (cond != COND_ALWAYS)
11151    opcode = T_MNEM_bcond;
11152  else
11153    opcode = inst.instruction;
11154
11155  if (unified_syntax
11156      && (inst.size_req == 4
11157	  || (inst.size_req != 2
11158	      && (inst.operands[0].hasreloc
11159		  || inst.reloc.exp.X_op == O_constant))))
11160    {
11161      inst.instruction = THUMB_OP32(opcode);
11162      if (cond == COND_ALWAYS)
11163	reloc = BFD_RELOC_THUMB_PCREL_BRANCH25;
11164      else
11165	{
11166	  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2),
11167		      _("selected architecture does not support "
11168			"wide conditional branch instruction"));
11169
11170	  gas_assert (cond != 0xF);
11171	  inst.instruction |= cond << 22;
11172	  reloc = BFD_RELOC_THUMB_PCREL_BRANCH20;
11173	}
11174    }
11175  else
11176    {
11177      inst.instruction = THUMB_OP16(opcode);
11178      if (cond == COND_ALWAYS)
11179	reloc = BFD_RELOC_THUMB_PCREL_BRANCH12;
11180      else
11181	{
11182	  inst.instruction |= cond << 8;
11183	  reloc = BFD_RELOC_THUMB_PCREL_BRANCH9;
11184	}
11185      /* Allow section relaxation.  */
11186      if (unified_syntax && inst.size_req != 2)
11187	inst.relax = opcode;
11188    }
11189  inst.reloc.type = reloc;
11190  inst.reloc.pc_rel = 1;
11191}
11192
11193/* Actually do the work for Thumb state bkpt and hlt.  The only difference
11194   between the two is the maximum immediate allowed - which is passed in
11195   RANGE.  */
11196static void
11197do_t_bkpt_hlt1 (int range)
11198{
11199  constraint (inst.cond != COND_ALWAYS,
11200	      _("instruction is always unconditional"));
11201  if (inst.operands[0].present)
11202    {
11203      constraint (inst.operands[0].imm > range,
11204		  _("immediate value out of range"));
11205      inst.instruction |= inst.operands[0].imm;
11206    }
11207
11208  set_it_insn_type (NEUTRAL_IT_INSN);
11209}
11210
11211static void
11212do_t_hlt (void)
11213{
11214  do_t_bkpt_hlt1 (63);
11215}
11216
11217static void
11218do_t_bkpt (void)
11219{
11220  do_t_bkpt_hlt1 (255);
11221}
11222
11223static void
11224do_t_branch23 (void)
11225{
11226  set_it_insn_type_last ();
11227  encode_branch (BFD_RELOC_THUMB_PCREL_BRANCH23);
11228
11229  /* md_apply_fix blows up with 'bl foo(PLT)' where foo is defined in
11230     this file.  We used to simply ignore the PLT reloc type here --
11231     the branch encoding is now needed to deal with TLSCALL relocs.
11232     So if we see a PLT reloc now, put it back to how it used to be to
11233     keep the preexisting behaviour.  */
11234  if (inst.reloc.type == BFD_RELOC_ARM_PLT32)
11235    inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
11236
11237#if defined(OBJ_COFF)
11238  /* If the destination of the branch is a defined symbol which does not have
11239     the THUMB_FUNC attribute, then we must be calling a function which has
11240     the (interfacearm) attribute.  We look for the Thumb entry point to that
11241     function and change the branch to refer to that function instead.	*/
11242  if (	 inst.reloc.exp.X_op == O_symbol
11243      && inst.reloc.exp.X_add_symbol != NULL
11244      && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
11245      && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
11246    inst.reloc.exp.X_add_symbol =
11247      find_real_start (inst.reloc.exp.X_add_symbol);
11248#endif
11249}
11250
11251static void
11252do_t_bx (void)
11253{
11254  set_it_insn_type_last ();
11255  inst.instruction |= inst.operands[0].reg << 3;
11256  /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC.	 The reloc
11257     should cause the alignment to be checked once it is known.	 This is
11258     because BX PC only works if the instruction is word aligned.  */
11259}
11260
11261static void
11262do_t_bxj (void)
11263{
11264  int Rm;
11265
11266  set_it_insn_type_last ();
11267  Rm = inst.operands[0].reg;
11268  reject_bad_reg (Rm);
11269  inst.instruction |= Rm << 16;
11270}
11271
11272static void
11273do_t_clz (void)
11274{
11275  unsigned Rd;
11276  unsigned Rm;
11277
11278  Rd = inst.operands[0].reg;
11279  Rm = inst.operands[1].reg;
11280
11281  reject_bad_reg (Rd);
11282  reject_bad_reg (Rm);
11283
11284  inst.instruction |= Rd << 8;
11285  inst.instruction |= Rm << 16;
11286  inst.instruction |= Rm;
11287}
11288
11289static void
11290do_t_csdb (void)
11291{
11292  set_it_insn_type (OUTSIDE_IT_INSN);
11293}
11294
11295static void
11296do_t_cps (void)
11297{
11298  set_it_insn_type (OUTSIDE_IT_INSN);
11299  inst.instruction |= inst.operands[0].imm;
11300}
11301
11302static void
11303do_t_cpsi (void)
11304{
11305  set_it_insn_type (OUTSIDE_IT_INSN);
11306  if (unified_syntax
11307      && (inst.operands[1].present || inst.size_req == 4)
11308      && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
11309    {
11310      unsigned int imod = (inst.instruction & 0x0030) >> 4;
11311      inst.instruction = 0xf3af8000;
11312      inst.instruction |= imod << 9;
11313      inst.instruction |= inst.operands[0].imm << 5;
11314      if (inst.operands[1].present)
11315	inst.instruction |= 0x100 | inst.operands[1].imm;
11316    }
11317  else
11318    {
11319      constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
11320		  && (inst.operands[0].imm & 4),
11321		  _("selected processor does not support 'A' form "
11322		    "of this instruction"));
11323      constraint (inst.operands[1].present || inst.size_req == 4,
11324		  _("Thumb does not support the 2-argument "
11325		    "form of this instruction"));
11326      inst.instruction |= inst.operands[0].imm;
11327    }
11328}
11329
11330/* THUMB CPY instruction (argument parse).  */
11331
11332static void
11333do_t_cpy (void)
11334{
11335  if (inst.size_req == 4)
11336    {
11337      inst.instruction = THUMB_OP32 (T_MNEM_mov);
11338      inst.instruction |= inst.operands[0].reg << 8;
11339      inst.instruction |= inst.operands[1].reg;
11340    }
11341  else
11342    {
11343      inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
11344      inst.instruction |= (inst.operands[0].reg & 0x7);
11345      inst.instruction |= inst.operands[1].reg << 3;
11346    }
11347}
11348
11349static void
11350do_t_cbz (void)
11351{
11352  set_it_insn_type (OUTSIDE_IT_INSN);
11353  constraint (inst.operands[0].reg > 7, BAD_HIREG);
11354  inst.instruction |= inst.operands[0].reg;
11355  inst.reloc.pc_rel = 1;
11356  inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
11357}
11358
11359static void
11360do_t_dbg (void)
11361{
11362  inst.instruction |= inst.operands[0].imm;
11363}
11364
11365static void
11366do_t_div (void)
11367{
11368  unsigned Rd, Rn, Rm;
11369
11370  Rd = inst.operands[0].reg;
11371  Rn = (inst.operands[1].present
11372	? inst.operands[1].reg : Rd);
11373  Rm = inst.operands[2].reg;
11374
11375  reject_bad_reg (Rd);
11376  reject_bad_reg (Rn);
11377  reject_bad_reg (Rm);
11378
11379  inst.instruction |= Rd << 8;
11380  inst.instruction |= Rn << 16;
11381  inst.instruction |= Rm;
11382}
11383
11384static void
11385do_t_hint (void)
11386{
11387  if (unified_syntax && inst.size_req == 4)
11388    inst.instruction = THUMB_OP32 (inst.instruction);
11389  else
11390    inst.instruction = THUMB_OP16 (inst.instruction);
11391}
11392
11393static void
11394do_t_it (void)
11395{
11396  unsigned int cond = inst.operands[0].imm;
11397
11398  set_it_insn_type (IT_INSN);
11399  now_it.mask = (inst.instruction & 0xf) | 0x10;
11400  now_it.cc = cond;
11401  now_it.warn_deprecated = FALSE;
11402
11403  /* If the condition is a negative condition, invert the mask.  */
11404  if ((cond & 0x1) == 0x0)
11405    {
11406      unsigned int mask = inst.instruction & 0x000f;
11407
11408      if ((mask & 0x7) == 0)
11409	{
11410	  /* No conversion needed.  */
11411	  now_it.block_length = 1;
11412	}
11413      else if ((mask & 0x3) == 0)
11414	{
11415	  mask ^= 0x8;
11416	  now_it.block_length = 2;
11417	}
11418      else if ((mask & 0x1) == 0)
11419	{
11420	  mask ^= 0xC;
11421	  now_it.block_length = 3;
11422	}
11423      else
11424	{
11425	  mask ^= 0xE;
11426	  now_it.block_length = 4;
11427	}
11428
11429      inst.instruction &= 0xfff0;
11430      inst.instruction |= mask;
11431    }
11432
11433  inst.instruction |= cond << 4;
11434}
11435
11436/* Helper function used for both push/pop and ldm/stm.  */
11437static void
11438encode_thumb2_ldmstm (int base, unsigned mask, bfd_boolean writeback)
11439{
11440  bfd_boolean load;
11441
11442  load = (inst.instruction & (1 << 20)) != 0;
11443
11444  if (mask & (1 << 13))
11445    inst.error =  _("SP not allowed in register list");
11446
11447  if ((mask & (1 << base)) != 0
11448      && writeback)
11449    inst.error = _("having the base register in the register list when "
11450		   "using write back is UNPREDICTABLE");
11451
11452  if (load)
11453    {
11454      if (mask & (1 << 15))
11455	{
11456	  if (mask & (1 << 14))
11457	    inst.error = _("LR and PC should not both be in register list");
11458	  else
11459	    set_it_insn_type_last ();
11460	}
11461    }
11462  else
11463    {
11464      if (mask & (1 << 15))
11465	inst.error = _("PC not allowed in register list");
11466    }
11467
11468  if ((mask & (mask - 1)) == 0)
11469    {
11470      /* Single register transfers implemented as str/ldr.  */
11471      if (writeback)
11472	{
11473	  if (inst.instruction & (1 << 23))
11474	    inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
11475	  else
11476	    inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
11477	}
11478      else
11479	{
11480	  if (inst.instruction & (1 << 23))
11481	    inst.instruction = 0x00800000; /* ia -> [base] */
11482	  else
11483	    inst.instruction = 0x00000c04; /* db -> [base, #-4] */
11484	}
11485
11486      inst.instruction |= 0xf8400000;
11487      if (load)
11488	inst.instruction |= 0x00100000;
11489
11490      mask = ffs (mask) - 1;
11491      mask <<= 12;
11492    }
11493  else if (writeback)
11494    inst.instruction |= WRITE_BACK;
11495
11496  inst.instruction |= mask;
11497  inst.instruction |= base << 16;
11498}
11499
11500static void
11501do_t_ldmstm (void)
11502{
11503  /* This really doesn't seem worth it.  */
11504  constraint (inst.reloc.type != BFD_RELOC_UNUSED,
11505	      _("expression too complex"));
11506  constraint (inst.operands[1].writeback,
11507	      _("Thumb load/store multiple does not support {reglist}^"));
11508
11509  if (unified_syntax)
11510    {
11511      bfd_boolean narrow;
11512      unsigned mask;
11513
11514      narrow = FALSE;
11515      /* See if we can use a 16-bit instruction.  */
11516      if (inst.instruction < 0xffff /* not ldmdb/stmdb */
11517	  && inst.size_req != 4
11518	  && !(inst.operands[1].imm & ~0xff))
11519	{
11520	  mask = 1 << inst.operands[0].reg;
11521
11522	  if (inst.operands[0].reg <= 7)
11523	    {
11524	      if (inst.instruction == T_MNEM_stmia
11525		  ? inst.operands[0].writeback
11526		  : (inst.operands[0].writeback
11527		     == !(inst.operands[1].imm & mask)))
11528		{
11529		  if (inst.instruction == T_MNEM_stmia
11530		      && (inst.operands[1].imm & mask)
11531		      && (inst.operands[1].imm & (mask - 1)))
11532		    as_warn (_("value stored for r%d is UNKNOWN"),
11533			     inst.operands[0].reg);
11534
11535		  inst.instruction = THUMB_OP16 (inst.instruction);
11536		  inst.instruction |= inst.operands[0].reg << 8;
11537		  inst.instruction |= inst.operands[1].imm;
11538		  narrow = TRUE;
11539		}
11540	      else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
11541		{
11542		  /* This means 1 register in reg list one of 3 situations:
11543		     1. Instruction is stmia, but without writeback.
11544		     2. lmdia without writeback, but with Rn not in
11545			reglist.
11546		     3. ldmia with writeback, but with Rn in reglist.
11547		     Case 3 is UNPREDICTABLE behaviour, so we handle
11548		     case 1 and 2 which can be converted into a 16-bit
11549		     str or ldr. The SP cases are handled below.  */
11550		  unsigned long opcode;
11551		  /* First, record an error for Case 3.  */
11552		  if (inst.operands[1].imm & mask
11553		      && inst.operands[0].writeback)
11554		    inst.error =
11555			_("having the base register in the register list when "
11556			  "using write back is UNPREDICTABLE");
11557
11558		  opcode = (inst.instruction == T_MNEM_stmia ? T_MNEM_str
11559							     : T_MNEM_ldr);
11560		  inst.instruction = THUMB_OP16 (opcode);
11561		  inst.instruction |= inst.operands[0].reg << 3;
11562		  inst.instruction |= (ffs (inst.operands[1].imm)-1);
11563		  narrow = TRUE;
11564		}
11565	    }
11566	  else if (inst.operands[0] .reg == REG_SP)
11567	    {
11568	      if (inst.operands[0].writeback)
11569		{
11570		  inst.instruction =
11571			THUMB_OP16 (inst.instruction == T_MNEM_stmia
11572				    ? T_MNEM_push : T_MNEM_pop);
11573		  inst.instruction |= inst.operands[1].imm;
11574		  narrow = TRUE;
11575		}
11576	      else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
11577		{
11578		  inst.instruction =
11579			THUMB_OP16 (inst.instruction == T_MNEM_stmia
11580				    ? T_MNEM_str_sp : T_MNEM_ldr_sp);
11581		  inst.instruction |= ((ffs (inst.operands[1].imm)-1) << 8);
11582		  narrow = TRUE;
11583		}
11584	    }
11585	}
11586
11587      if (!narrow)
11588	{
11589	  if (inst.instruction < 0xffff)
11590	    inst.instruction = THUMB_OP32 (inst.instruction);
11591
11592	  encode_thumb2_ldmstm (inst.operands[0].reg, inst.operands[1].imm,
11593				inst.operands[0].writeback);
11594	}
11595    }
11596  else
11597    {
11598      constraint (inst.operands[0].reg > 7
11599		  || (inst.operands[1].imm & ~0xff), BAD_HIREG);
11600      constraint (inst.instruction != T_MNEM_ldmia
11601		  && inst.instruction != T_MNEM_stmia,
11602		  _("Thumb-2 instruction only valid in unified syntax"));
11603      if (inst.instruction == T_MNEM_stmia)
11604	{
11605	  if (!inst.operands[0].writeback)
11606	    as_warn (_("this instruction will write back the base register"));
11607	  if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
11608	      && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
11609	    as_warn (_("value stored for r%d is UNKNOWN"),
11610		     inst.operands[0].reg);
11611	}
11612      else
11613	{
11614	  if (!inst.operands[0].writeback
11615	      && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
11616	    as_warn (_("this instruction will write back the base register"));
11617	  else if (inst.operands[0].writeback
11618		   && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
11619	    as_warn (_("this instruction will not write back the base register"));
11620	}
11621
11622      inst.instruction = THUMB_OP16 (inst.instruction);
11623      inst.instruction |= inst.operands[0].reg << 8;
11624      inst.instruction |= inst.operands[1].imm;
11625    }
11626}
11627
11628static void
11629do_t_ldrex (void)
11630{
11631  constraint (!inst.operands[1].isreg || !inst.operands[1].preind
11632	      || inst.operands[1].postind || inst.operands[1].writeback
11633	      || inst.operands[1].immisreg || inst.operands[1].shifted
11634	      || inst.operands[1].negative,
11635	      BAD_ADDR_MODE);
11636
11637  constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
11638
11639  inst.instruction |= inst.operands[0].reg << 12;
11640  inst.instruction |= inst.operands[1].reg << 16;
11641  inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
11642}
11643
11644static void
11645do_t_ldrexd (void)
11646{
11647  if (!inst.operands[1].present)
11648    {
11649      constraint (inst.operands[0].reg == REG_LR,
11650		  _("r14 not allowed as first register "
11651		    "when second register is omitted"));
11652      inst.operands[1].reg = inst.operands[0].reg + 1;
11653    }
11654  constraint (inst.operands[0].reg == inst.operands[1].reg,
11655	      BAD_OVERLAP);
11656
11657  inst.instruction |= inst.operands[0].reg << 12;
11658  inst.instruction |= inst.operands[1].reg << 8;
11659  inst.instruction |= inst.operands[2].reg << 16;
11660}
11661
11662static void
11663do_t_ldst (void)
11664{
11665  unsigned long opcode;
11666  int Rn;
11667
11668  if (inst.operands[0].isreg
11669      && !inst.operands[0].preind
11670      && inst.operands[0].reg == REG_PC)
11671    set_it_insn_type_last ();
11672
11673  opcode = inst.instruction;
11674  if (unified_syntax)
11675    {
11676      if (!inst.operands[1].isreg)
11677	{
11678	  if (opcode <= 0xffff)
11679	    inst.instruction = THUMB_OP32 (opcode);
11680	  if (move_or_literal_pool (0, CONST_THUMB, /*mode_3=*/FALSE))
11681	    return;
11682	}
11683      if (inst.operands[1].isreg
11684	  && !inst.operands[1].writeback
11685	  && !inst.operands[1].shifted && !inst.operands[1].postind
11686	  && !inst.operands[1].negative && inst.operands[0].reg <= 7
11687	  && opcode <= 0xffff
11688	  && inst.size_req != 4)
11689	{
11690	  /* Insn may have a 16-bit form.  */
11691	  Rn = inst.operands[1].reg;
11692	  if (inst.operands[1].immisreg)
11693	    {
11694	      inst.instruction = THUMB_OP16 (opcode);
11695	      /* [Rn, Rik] */
11696	      if (Rn <= 7 && inst.operands[1].imm <= 7)
11697		goto op16;
11698	      else if (opcode != T_MNEM_ldr && opcode != T_MNEM_str)
11699		reject_bad_reg (inst.operands[1].imm);
11700	    }
11701	  else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
11702		    && opcode != T_MNEM_ldrsb)
11703		   || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
11704		   || (Rn == REG_SP && opcode == T_MNEM_str))
11705	    {
11706	      /* [Rn, #const] */
11707	      if (Rn > 7)
11708		{
11709		  if (Rn == REG_PC)
11710		    {
11711		      if (inst.reloc.pc_rel)
11712			opcode = T_MNEM_ldr_pc2;
11713		      else
11714			opcode = T_MNEM_ldr_pc;
11715		    }
11716		  else
11717		    {
11718		      if (opcode == T_MNEM_ldr)
11719			opcode = T_MNEM_ldr_sp;
11720		      else
11721			opcode = T_MNEM_str_sp;
11722		    }
11723		  inst.instruction = inst.operands[0].reg << 8;
11724		}
11725	      else
11726		{
11727		  inst.instruction = inst.operands[0].reg;
11728		  inst.instruction |= inst.operands[1].reg << 3;
11729		}
11730	      inst.instruction |= THUMB_OP16 (opcode);
11731	      if (inst.size_req == 2)
11732		inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
11733	      else
11734		inst.relax = opcode;
11735	      return;
11736	    }
11737	}
11738      /* Definitely a 32-bit variant.  */
11739
11740      /* Warning for Erratum 752419.  */
11741      if (opcode == T_MNEM_ldr
11742	  && inst.operands[0].reg == REG_SP
11743	  && inst.operands[1].writeback == 1
11744	  && !inst.operands[1].immisreg)
11745	{
11746	  if (no_cpu_selected ()
11747	      || (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7)
11748		  && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a)
11749		  && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7r)))
11750	    as_warn (_("This instruction may be unpredictable "
11751		       "if executed on M-profile cores "
11752		       "with interrupts enabled."));
11753	}
11754
11755      /* Do some validations regarding addressing modes.  */
11756      if (inst.operands[1].immisreg)
11757	reject_bad_reg (inst.operands[1].imm);
11758
11759      constraint (inst.operands[1].writeback == 1
11760		  && inst.operands[0].reg == inst.operands[1].reg,
11761		  BAD_OVERLAP);
11762
11763      inst.instruction = THUMB_OP32 (opcode);
11764      inst.instruction |= inst.operands[0].reg << 12;
11765      encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
11766      check_ldr_r15_aligned ();
11767      return;
11768    }
11769
11770  constraint (inst.operands[0].reg > 7, BAD_HIREG);
11771
11772  if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
11773    {
11774      /* Only [Rn,Rm] is acceptable.  */
11775      constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
11776      constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
11777		  || inst.operands[1].postind || inst.operands[1].shifted
11778		  || inst.operands[1].negative,
11779		  _("Thumb does not support this addressing mode"));
11780      inst.instruction = THUMB_OP16 (inst.instruction);
11781      goto op16;
11782    }
11783
11784  inst.instruction = THUMB_OP16 (inst.instruction);
11785  if (!inst.operands[1].isreg)
11786    if (move_or_literal_pool (0, CONST_THUMB, /*mode_3=*/FALSE))
11787      return;
11788
11789  constraint (!inst.operands[1].preind
11790	      || inst.operands[1].shifted
11791	      || inst.operands[1].writeback,
11792	      _("Thumb does not support this addressing mode"));
11793  if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
11794    {
11795      constraint (inst.instruction & 0x0600,
11796		  _("byte or halfword not valid for base register"));
11797      constraint (inst.operands[1].reg == REG_PC
11798		  && !(inst.instruction & THUMB_LOAD_BIT),
11799		  _("r15 based store not allowed"));
11800      constraint (inst.operands[1].immisreg,
11801		  _("invalid base register for register offset"));
11802
11803      if (inst.operands[1].reg == REG_PC)
11804	inst.instruction = T_OPCODE_LDR_PC;
11805      else if (inst.instruction & THUMB_LOAD_BIT)
11806	inst.instruction = T_OPCODE_LDR_SP;
11807      else
11808	inst.instruction = T_OPCODE_STR_SP;
11809
11810      inst.instruction |= inst.operands[0].reg << 8;
11811      inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
11812      return;
11813    }
11814
11815  constraint (inst.operands[1].reg > 7, BAD_HIREG);
11816  if (!inst.operands[1].immisreg)
11817    {
11818      /* Immediate offset.  */
11819      inst.instruction |= inst.operands[0].reg;
11820      inst.instruction |= inst.operands[1].reg << 3;
11821      inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
11822      return;
11823    }
11824
11825  /* Register offset.  */
11826  constraint (inst.operands[1].imm > 7, BAD_HIREG);
11827  constraint (inst.operands[1].negative,
11828	      _("Thumb does not support this addressing mode"));
11829
11830 op16:
11831  switch (inst.instruction)
11832    {
11833    case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
11834    case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
11835    case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
11836    case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
11837    case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
11838    case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
11839    case 0x5600 /* ldrsb */:
11840    case 0x5e00 /* ldrsh */: break;
11841    default: abort ();
11842    }
11843
11844  inst.instruction |= inst.operands[0].reg;
11845  inst.instruction |= inst.operands[1].reg << 3;
11846  inst.instruction |= inst.operands[1].imm << 6;
11847}
11848
11849static void
11850do_t_ldstd (void)
11851{
11852  if (!inst.operands[1].present)
11853    {
11854      inst.operands[1].reg = inst.operands[0].reg + 1;
11855      constraint (inst.operands[0].reg == REG_LR,
11856		  _("r14 not allowed here"));
11857      constraint (inst.operands[0].reg == REG_R12,
11858		  _("r12 not allowed here"));
11859    }
11860
11861  if (inst.operands[2].writeback
11862      && (inst.operands[0].reg == inst.operands[2].reg
11863      || inst.operands[1].reg == inst.operands[2].reg))
11864    as_warn (_("base register written back, and overlaps "
11865	       "one of transfer registers"));
11866
11867  inst.instruction |= inst.operands[0].reg << 12;
11868  inst.instruction |= inst.operands[1].reg << 8;
11869  encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
11870}
11871
11872static void
11873do_t_ldstt (void)
11874{
11875  inst.instruction |= inst.operands[0].reg << 12;
11876  encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
11877}
11878
11879static void
11880do_t_mla (void)
11881{
11882  unsigned Rd, Rn, Rm, Ra;
11883
11884  Rd = inst.operands[0].reg;
11885  Rn = inst.operands[1].reg;
11886  Rm = inst.operands[2].reg;
11887  Ra = inst.operands[3].reg;
11888
11889  reject_bad_reg (Rd);
11890  reject_bad_reg (Rn);
11891  reject_bad_reg (Rm);
11892  reject_bad_reg (Ra);
11893
11894  inst.instruction |= Rd << 8;
11895  inst.instruction |= Rn << 16;
11896  inst.instruction |= Rm;
11897  inst.instruction |= Ra << 12;
11898}
11899
11900static void
11901do_t_mlal (void)
11902{
11903  unsigned RdLo, RdHi, Rn, Rm;
11904
11905  RdLo = inst.operands[0].reg;
11906  RdHi = inst.operands[1].reg;
11907  Rn = inst.operands[2].reg;
11908  Rm = inst.operands[3].reg;
11909
11910  reject_bad_reg (RdLo);
11911  reject_bad_reg (RdHi);
11912  reject_bad_reg (Rn);
11913  reject_bad_reg (Rm);
11914
11915  inst.instruction |= RdLo << 12;
11916  inst.instruction |= RdHi << 8;
11917  inst.instruction |= Rn << 16;
11918  inst.instruction |= Rm;
11919}
11920
11921static void
11922do_t_mov_cmp (void)
11923{
11924  unsigned Rn, Rm;
11925
11926  Rn = inst.operands[0].reg;
11927  Rm = inst.operands[1].reg;
11928
11929  if (Rn == REG_PC)
11930    set_it_insn_type_last ();
11931
11932  if (unified_syntax)
11933    {
11934      int r0off = (inst.instruction == T_MNEM_mov
11935		   || inst.instruction == T_MNEM_movs) ? 8 : 16;
11936      unsigned long opcode;
11937      bfd_boolean narrow;
11938      bfd_boolean low_regs;
11939
11940      low_regs = (Rn <= 7 && Rm <= 7);
11941      opcode = inst.instruction;
11942      if (in_it_block ())
11943	narrow = opcode != T_MNEM_movs;
11944      else
11945	narrow = opcode != T_MNEM_movs || low_regs;
11946      if (inst.size_req == 4
11947	  || inst.operands[1].shifted)
11948	narrow = FALSE;
11949
11950      /* MOVS PC, LR is encoded as SUBS PC, LR, #0.  */
11951      if (opcode == T_MNEM_movs && inst.operands[1].isreg
11952	  && !inst.operands[1].shifted
11953	  && Rn == REG_PC
11954	  && Rm == REG_LR)
11955	{
11956	  inst.instruction = T2_SUBS_PC_LR;
11957	  return;
11958	}
11959
11960      if (opcode == T_MNEM_cmp)
11961	{
11962	  constraint (Rn == REG_PC, BAD_PC);
11963	  if (narrow)
11964	    {
11965	      /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
11966		 but valid.  */
11967	      warn_deprecated_sp (Rm);
11968	      /* R15 was documented as a valid choice for Rm in ARMv6,
11969		 but as UNPREDICTABLE in ARMv7.  ARM's proprietary
11970		 tools reject R15, so we do too.  */
11971	      constraint (Rm == REG_PC, BAD_PC);
11972	    }
11973	  else
11974	    reject_bad_reg (Rm);
11975	}
11976      else if (opcode == T_MNEM_mov
11977	       || opcode == T_MNEM_movs)
11978	{
11979	  if (inst.operands[1].isreg)
11980	    {
11981	      if (opcode == T_MNEM_movs)
11982		{
11983		  reject_bad_reg (Rn);
11984		  reject_bad_reg (Rm);
11985		}
11986	      else if (narrow)
11987		{
11988		  /* This is mov.n.  */
11989		  if ((Rn == REG_SP || Rn == REG_PC)
11990		      && (Rm == REG_SP || Rm == REG_PC))
11991		    {
11992		      as_tsktsk (_("Use of r%u as a source register is "
11993				 "deprecated when r%u is the destination "
11994				 "register."), Rm, Rn);
11995		    }
11996		}
11997	      else
11998		{
11999		  /* This is mov.w.  */
12000		  constraint (Rn == REG_PC, BAD_PC);
12001		  constraint (Rm == REG_PC, BAD_PC);
12002		  if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
12003		    constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP);
12004		}
12005	    }
12006	  else
12007	    reject_bad_reg (Rn);
12008	}
12009
12010      if (!inst.operands[1].isreg)
12011	{
12012	  /* Immediate operand.  */
12013	  if (!in_it_block () && opcode == T_MNEM_mov)
12014	    narrow = 0;
12015	  if (low_regs && narrow)
12016	    {
12017	      inst.instruction = THUMB_OP16 (opcode);
12018	      inst.instruction |= Rn << 8;
12019	      if (inst.reloc.type < BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC
12020		  || inst.reloc.type > BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC)
12021		{
12022		  if (inst.size_req == 2)
12023		    inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
12024		  else
12025		    inst.relax = opcode;
12026		}
12027	    }
12028	  else
12029	    {
12030	      constraint (inst.reloc.type >= BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC
12031			  && inst.reloc.type <= BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC ,
12032			  THUMB1_RELOC_ONLY);
12033
12034	      inst.instruction = THUMB_OP32 (inst.instruction);
12035	      inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
12036	      inst.instruction |= Rn << r0off;
12037	      inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
12038	    }
12039	}
12040      else if (inst.operands[1].shifted && inst.operands[1].immisreg
12041	       && (inst.instruction == T_MNEM_mov
12042		   || inst.instruction == T_MNEM_movs))
12043	{
12044	  /* Register shifts are encoded as separate shift instructions.  */
12045	  bfd_boolean flags = (inst.instruction == T_MNEM_movs);
12046
12047	  if (in_it_block ())
12048	    narrow = !flags;
12049	  else
12050	    narrow = flags;
12051
12052	  if (inst.size_req == 4)
12053	    narrow = FALSE;
12054
12055	  if (!low_regs || inst.operands[1].imm > 7)
12056	    narrow = FALSE;
12057
12058	  if (Rn != Rm)
12059	    narrow = FALSE;
12060
12061	  switch (inst.operands[1].shift_kind)
12062	    {
12063	    case SHIFT_LSL:
12064	      opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
12065	      break;
12066	    case SHIFT_ASR:
12067	      opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
12068	      break;
12069	    case SHIFT_LSR:
12070	      opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
12071	      break;
12072	    case SHIFT_ROR:
12073	      opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
12074	      break;
12075	    default:
12076	      abort ();
12077	    }
12078
12079	  inst.instruction = opcode;
12080	  if (narrow)
12081	    {
12082	      inst.instruction |= Rn;
12083	      inst.instruction |= inst.operands[1].imm << 3;
12084	    }
12085	  else
12086	    {
12087	      if (flags)
12088		inst.instruction |= CONDS_BIT;
12089
12090	      inst.instruction |= Rn << 8;
12091	      inst.instruction |= Rm << 16;
12092	      inst.instruction |= inst.operands[1].imm;
12093	    }
12094	}
12095      else if (!narrow)
12096	{
12097	  /* Some mov with immediate shift have narrow variants.
12098	     Register shifts are handled above.  */
12099	  if (low_regs && inst.operands[1].shifted
12100	      && (inst.instruction == T_MNEM_mov
12101		  || inst.instruction == T_MNEM_movs))
12102	    {
12103	      if (in_it_block ())
12104		narrow = (inst.instruction == T_MNEM_mov);
12105	      else
12106		narrow = (inst.instruction == T_MNEM_movs);
12107	    }
12108
12109	  if (narrow)
12110	    {
12111	      switch (inst.operands[1].shift_kind)
12112		{
12113		case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
12114		case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
12115		case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
12116		default: narrow = FALSE; break;
12117		}
12118	    }
12119
12120	  if (narrow)
12121	    {
12122	      inst.instruction |= Rn;
12123	      inst.instruction |= Rm << 3;
12124	      inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
12125	    }
12126	  else
12127	    {
12128	      inst.instruction = THUMB_OP32 (inst.instruction);
12129	      inst.instruction |= Rn << r0off;
12130	      encode_thumb32_shifted_operand (1);
12131	    }
12132	}
12133      else
12134	switch (inst.instruction)
12135	  {
12136	  case T_MNEM_mov:
12137	    /* In v4t or v5t a move of two lowregs produces unpredictable
12138	       results. Don't allow this.  */
12139	    if (low_regs)
12140	      {
12141		constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6),
12142			    "MOV Rd, Rs with two low registers is not "
12143			    "permitted on this architecture");
12144		ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
12145					arm_ext_v6);
12146	      }
12147
12148	    inst.instruction = T_OPCODE_MOV_HR;
12149	    inst.instruction |= (Rn & 0x8) << 4;
12150	    inst.instruction |= (Rn & 0x7);
12151	    inst.instruction |= Rm << 3;
12152	    break;
12153
12154	  case T_MNEM_movs:
12155	    /* We know we have low registers at this point.
12156	       Generate LSLS Rd, Rs, #0.  */
12157	    inst.instruction = T_OPCODE_LSL_I;
12158	    inst.instruction |= Rn;
12159	    inst.instruction |= Rm << 3;
12160	    break;
12161
12162	  case T_MNEM_cmp:
12163	    if (low_regs)
12164	      {
12165		inst.instruction = T_OPCODE_CMP_LR;
12166		inst.instruction |= Rn;
12167		inst.instruction |= Rm << 3;
12168	      }
12169	    else
12170	      {
12171		inst.instruction = T_OPCODE_CMP_HR;
12172		inst.instruction |= (Rn & 0x8) << 4;
12173		inst.instruction |= (Rn & 0x7);
12174		inst.instruction |= Rm << 3;
12175	      }
12176	    break;
12177	  }
12178      return;
12179    }
12180
12181  inst.instruction = THUMB_OP16 (inst.instruction);
12182
12183  /* PR 10443: Do not silently ignore shifted operands.  */
12184  constraint (inst.operands[1].shifted,
12185	      _("shifts in CMP/MOV instructions are only supported in unified syntax"));
12186
12187  if (inst.operands[1].isreg)
12188    {
12189      if (Rn < 8 && Rm < 8)
12190	{
12191	  /* A move of two lowregs is encoded as ADD Rd, Rs, #0
12192	     since a MOV instruction produces unpredictable results.  */
12193	  if (inst.instruction == T_OPCODE_MOV_I8)
12194	    inst.instruction = T_OPCODE_ADD_I3;
12195	  else
12196	    inst.instruction = T_OPCODE_CMP_LR;
12197
12198	  inst.instruction |= Rn;
12199	  inst.instruction |= Rm << 3;
12200	}
12201      else
12202	{
12203	  if (inst.instruction == T_OPCODE_MOV_I8)
12204	    inst.instruction = T_OPCODE_MOV_HR;
12205	  else
12206	    inst.instruction = T_OPCODE_CMP_HR;
12207	  do_t_cpy ();
12208	}
12209    }
12210  else
12211    {
12212      constraint (Rn > 7,
12213		  _("only lo regs allowed with immediate"));
12214      inst.instruction |= Rn << 8;
12215      inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
12216    }
12217}
12218
12219static void
12220do_t_mov16 (void)
12221{
12222  unsigned Rd;
12223  bfd_vma imm;
12224  bfd_boolean top;
12225
12226  top = (inst.instruction & 0x00800000) != 0;
12227  if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
12228    {
12229      constraint (top, _(":lower16: not allowed in this instruction"));
12230      inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
12231    }
12232  else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
12233    {
12234      constraint (!top, _(":upper16: not allowed in this instruction"));
12235      inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
12236    }
12237
12238  Rd = inst.operands[0].reg;
12239  reject_bad_reg (Rd);
12240
12241  inst.instruction |= Rd << 8;
12242  if (inst.reloc.type == BFD_RELOC_UNUSED)
12243    {
12244      imm = inst.reloc.exp.X_add_number;
12245      inst.instruction |= (imm & 0xf000) << 4;
12246      inst.instruction |= (imm & 0x0800) << 15;
12247      inst.instruction |= (imm & 0x0700) << 4;
12248      inst.instruction |= (imm & 0x00ff);
12249    }
12250}
12251
12252static void
12253do_t_mvn_tst (void)
12254{
12255  unsigned Rn, Rm;
12256
12257  Rn = inst.operands[0].reg;
12258  Rm = inst.operands[1].reg;
12259
12260  if (inst.instruction == T_MNEM_cmp
12261      || inst.instruction == T_MNEM_cmn)
12262    constraint (Rn == REG_PC, BAD_PC);
12263  else
12264    reject_bad_reg (Rn);
12265  reject_bad_reg (Rm);
12266
12267  if (unified_syntax)
12268    {
12269      int r0off = (inst.instruction == T_MNEM_mvn
12270		   || inst.instruction == T_MNEM_mvns) ? 8 : 16;
12271      bfd_boolean narrow;
12272
12273      if (inst.size_req == 4
12274	  || inst.instruction > 0xffff
12275	  || inst.operands[1].shifted
12276	  || Rn > 7 || Rm > 7)
12277	narrow = FALSE;
12278      else if (inst.instruction == T_MNEM_cmn
12279	       || inst.instruction == T_MNEM_tst)
12280	narrow = TRUE;
12281      else if (THUMB_SETS_FLAGS (inst.instruction))
12282	narrow = !in_it_block ();
12283      else
12284	narrow = in_it_block ();
12285
12286      if (!inst.operands[1].isreg)
12287	{
12288	  /* For an immediate, we always generate a 32-bit opcode;
12289	     section relaxation will shrink it later if possible.  */
12290	  if (inst.instruction < 0xffff)
12291	    inst.instruction = THUMB_OP32 (inst.instruction);
12292	  inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
12293	  inst.instruction |= Rn << r0off;
12294	  inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
12295	}
12296      else
12297	{
12298	  /* See if we can do this with a 16-bit instruction.  */
12299	  if (narrow)
12300	    {
12301	      inst.instruction = THUMB_OP16 (inst.instruction);
12302	      inst.instruction |= Rn;
12303	      inst.instruction |= Rm << 3;
12304	    }
12305	  else
12306	    {
12307	      constraint (inst.operands[1].shifted
12308			  && inst.operands[1].immisreg,
12309			  _("shift must be constant"));
12310	      if (inst.instruction < 0xffff)
12311		inst.instruction = THUMB_OP32 (inst.instruction);
12312	      inst.instruction |= Rn << r0off;
12313	      encode_thumb32_shifted_operand (1);
12314	    }
12315	}
12316    }
12317  else
12318    {
12319      constraint (inst.instruction > 0xffff
12320		  || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
12321      constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
12322		  _("unshifted register required"));
12323      constraint (Rn > 7 || Rm > 7,
12324		  BAD_HIREG);
12325
12326      inst.instruction = THUMB_OP16 (inst.instruction);
12327      inst.instruction |= Rn;
12328      inst.instruction |= Rm << 3;
12329    }
12330}
12331
12332static void
12333do_t_mrs (void)
12334{
12335  unsigned Rd;
12336
12337  if (do_vfp_nsyn_mrs () == SUCCESS)
12338    return;
12339
12340  Rd = inst.operands[0].reg;
12341  reject_bad_reg (Rd);
12342  inst.instruction |= Rd << 8;
12343
12344  if (inst.operands[1].isreg)
12345    {
12346      unsigned br = inst.operands[1].reg;
12347      if (((br & 0x200) == 0) && ((br & 0xf000) != 0xf000))
12348	as_bad (_("bad register for mrs"));
12349
12350      inst.instruction |= br & (0xf << 16);
12351      inst.instruction |= (br & 0x300) >> 4;
12352      inst.instruction |= (br & SPSR_BIT) >> 2;
12353    }
12354  else
12355    {
12356      int flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
12357
12358      if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
12359	{
12360	  /* PR gas/12698:  The constraint is only applied for m_profile.
12361	     If the user has specified -march=all, we want to ignore it as
12362	     we are building for any CPU type, including non-m variants.  */
12363	  bfd_boolean m_profile =
12364	    !ARM_FEATURE_CORE_EQUAL (selected_cpu, arm_arch_any);
12365	  constraint ((flags != 0) && m_profile, _("selected processor does "
12366						   "not support requested special purpose register"));
12367	}
12368      else
12369	/* mrs only accepts APSR/CPSR/SPSR/CPSR_all/SPSR_all (for non-M profile
12370	   devices).  */
12371	constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
12372		    _("'APSR', 'CPSR' or 'SPSR' expected"));
12373
12374      inst.instruction |= (flags & SPSR_BIT) >> 2;
12375      inst.instruction |= inst.operands[1].imm & 0xff;
12376      inst.instruction |= 0xf0000;
12377    }
12378}
12379
12380static void
12381do_t_msr (void)
12382{
12383  int flags;
12384  unsigned Rn;
12385
12386  if (do_vfp_nsyn_msr () == SUCCESS)
12387    return;
12388
12389  constraint (!inst.operands[1].isreg,
12390	      _("Thumb encoding does not support an immediate here"));
12391
12392  if (inst.operands[0].isreg)
12393    flags = (int)(inst.operands[0].reg);
12394  else
12395    flags = inst.operands[0].imm;
12396
12397  if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
12398    {
12399      int bits = inst.operands[0].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
12400
12401      /* PR gas/12698:  The constraint is only applied for m_profile.
12402	 If the user has specified -march=all, we want to ignore it as
12403	 we are building for any CPU type, including non-m variants.  */
12404      bfd_boolean m_profile =
12405	!ARM_FEATURE_CORE_EQUAL (selected_cpu, arm_arch_any);
12406      constraint (((ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
12407	   && (bits & ~(PSR_s | PSR_f)) != 0)
12408	  || (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
12409	      && bits != PSR_f)) && m_profile,
12410	  _("selected processor does not support requested special "
12411	    "purpose register"));
12412    }
12413  else
12414     constraint ((flags & 0xff) != 0, _("selected processor does not support "
12415		 "requested special purpose register"));
12416
12417  Rn = inst.operands[1].reg;
12418  reject_bad_reg (Rn);
12419
12420  inst.instruction |= (flags & SPSR_BIT) >> 2;
12421  inst.instruction |= (flags & 0xf0000) >> 8;
12422  inst.instruction |= (flags & 0x300) >> 4;
12423  inst.instruction |= (flags & 0xff);
12424  inst.instruction |= Rn << 16;
12425}
12426
12427static void
12428do_t_mul (void)
12429{
12430  bfd_boolean narrow;
12431  unsigned Rd, Rn, Rm;
12432
12433  if (!inst.operands[2].present)
12434    inst.operands[2].reg = inst.operands[0].reg;
12435
12436  Rd = inst.operands[0].reg;
12437  Rn = inst.operands[1].reg;
12438  Rm = inst.operands[2].reg;
12439
12440  if (unified_syntax)
12441    {
12442      if (inst.size_req == 4
12443	  || (Rd != Rn
12444	      && Rd != Rm)
12445	  || Rn > 7
12446	  || Rm > 7)
12447	narrow = FALSE;
12448      else if (inst.instruction == T_MNEM_muls)
12449	narrow = !in_it_block ();
12450      else
12451	narrow = in_it_block ();
12452    }
12453  else
12454    {
12455      constraint (inst.instruction == T_MNEM_muls, BAD_THUMB32);
12456      constraint (Rn > 7 || Rm > 7,
12457		  BAD_HIREG);
12458      narrow = TRUE;
12459    }
12460
12461  if (narrow)
12462    {
12463      /* 16-bit MULS/Conditional MUL.  */
12464      inst.instruction = THUMB_OP16 (inst.instruction);
12465      inst.instruction |= Rd;
12466
12467      if (Rd == Rn)
12468	inst.instruction |= Rm << 3;
12469      else if (Rd == Rm)
12470	inst.instruction |= Rn << 3;
12471      else
12472	constraint (1, _("dest must overlap one source register"));
12473    }
12474  else
12475    {
12476      constraint (inst.instruction != T_MNEM_mul,
12477		  _("Thumb-2 MUL must not set flags"));
12478      /* 32-bit MUL.  */
12479      inst.instruction = THUMB_OP32 (inst.instruction);
12480      inst.instruction |= Rd << 8;
12481      inst.instruction |= Rn << 16;
12482      inst.instruction |= Rm << 0;
12483
12484      reject_bad_reg (Rd);
12485      reject_bad_reg (Rn);
12486      reject_bad_reg (Rm);
12487    }
12488}
12489
12490static void
12491do_t_mull (void)
12492{
12493  unsigned RdLo, RdHi, Rn, Rm;
12494
12495  RdLo = inst.operands[0].reg;
12496  RdHi = inst.operands[1].reg;
12497  Rn = inst.operands[2].reg;
12498  Rm = inst.operands[3].reg;
12499
12500  reject_bad_reg (RdLo);
12501  reject_bad_reg (RdHi);
12502  reject_bad_reg (Rn);
12503  reject_bad_reg (Rm);
12504
12505  inst.instruction |= RdLo << 12;
12506  inst.instruction |= RdHi << 8;
12507  inst.instruction |= Rn << 16;
12508  inst.instruction |= Rm;
12509
12510 if (RdLo == RdHi)
12511    as_tsktsk (_("rdhi and rdlo must be different"));
12512}
12513
12514static void
12515do_t_nop (void)
12516{
12517  set_it_insn_type (NEUTRAL_IT_INSN);
12518
12519  if (unified_syntax)
12520    {
12521      if (inst.size_req == 4 || inst.operands[0].imm > 15)
12522	{
12523	  inst.instruction = THUMB_OP32 (inst.instruction);
12524	  inst.instruction |= inst.operands[0].imm;
12525	}
12526      else
12527	{
12528	  /* PR9722: Check for Thumb2 availability before
12529	     generating a thumb2 nop instruction.  */
12530	  if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
12531	    {
12532	      inst.instruction = THUMB_OP16 (inst.instruction);
12533	      inst.instruction |= inst.operands[0].imm << 4;
12534	    }
12535	  else
12536	    inst.instruction = 0x46c0;
12537	}
12538    }
12539  else
12540    {
12541      constraint (inst.operands[0].present,
12542		  _("Thumb does not support NOP with hints"));
12543      inst.instruction = 0x46c0;
12544    }
12545}
12546
12547static void
12548do_t_neg (void)
12549{
12550  if (unified_syntax)
12551    {
12552      bfd_boolean narrow;
12553
12554      if (THUMB_SETS_FLAGS (inst.instruction))
12555	narrow = !in_it_block ();
12556      else
12557	narrow = in_it_block ();
12558      if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
12559	narrow = FALSE;
12560      if (inst.size_req == 4)
12561	narrow = FALSE;
12562
12563      if (!narrow)
12564	{
12565	  inst.instruction = THUMB_OP32 (inst.instruction);
12566	  inst.instruction |= inst.operands[0].reg << 8;
12567	  inst.instruction |= inst.operands[1].reg << 16;
12568	}
12569      else
12570	{
12571	  inst.instruction = THUMB_OP16 (inst.instruction);
12572	  inst.instruction |= inst.operands[0].reg;
12573	  inst.instruction |= inst.operands[1].reg << 3;
12574	}
12575    }
12576  else
12577    {
12578      constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
12579		  BAD_HIREG);
12580      constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
12581
12582      inst.instruction = THUMB_OP16 (inst.instruction);
12583      inst.instruction |= inst.operands[0].reg;
12584      inst.instruction |= inst.operands[1].reg << 3;
12585    }
12586}
12587
12588static void
12589do_t_orn (void)
12590{
12591  unsigned Rd, Rn;
12592
12593  Rd = inst.operands[0].reg;
12594  Rn = inst.operands[1].present ? inst.operands[1].reg : Rd;
12595
12596  reject_bad_reg (Rd);
12597  /* Rn == REG_SP is unpredictable; Rn == REG_PC is MVN.  */
12598  reject_bad_reg (Rn);
12599
12600  inst.instruction |= Rd << 8;
12601  inst.instruction |= Rn << 16;
12602
12603  if (!inst.operands[2].isreg)
12604    {
12605      inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
12606      inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
12607    }
12608  else
12609    {
12610      unsigned Rm;
12611
12612      Rm = inst.operands[2].reg;
12613      reject_bad_reg (Rm);
12614
12615      constraint (inst.operands[2].shifted
12616		  && inst.operands[2].immisreg,
12617		  _("shift must be constant"));
12618      encode_thumb32_shifted_operand (2);
12619    }
12620}
12621
12622static void
12623do_t_pkhbt (void)
12624{
12625  unsigned Rd, Rn, Rm;
12626
12627  Rd = inst.operands[0].reg;
12628  Rn = inst.operands[1].reg;
12629  Rm = inst.operands[2].reg;
12630
12631  reject_bad_reg (Rd);
12632  reject_bad_reg (Rn);
12633  reject_bad_reg (Rm);
12634
12635  inst.instruction |= Rd << 8;
12636  inst.instruction |= Rn << 16;
12637  inst.instruction |= Rm;
12638  if (inst.operands[3].present)
12639    {
12640      unsigned int val = inst.reloc.exp.X_add_number;
12641      constraint (inst.reloc.exp.X_op != O_constant,
12642		  _("expression too complex"));
12643      inst.instruction |= (val & 0x1c) << 10;
12644      inst.instruction |= (val & 0x03) << 6;
12645    }
12646}
12647
12648static void
12649do_t_pkhtb (void)
12650{
12651  if (!inst.operands[3].present)
12652    {
12653      unsigned Rtmp;
12654
12655      inst.instruction &= ~0x00000020;
12656
12657      /* PR 10168.  Swap the Rm and Rn registers.  */
12658      Rtmp = inst.operands[1].reg;
12659      inst.operands[1].reg = inst.operands[2].reg;
12660      inst.operands[2].reg = Rtmp;
12661    }
12662  do_t_pkhbt ();
12663}
12664
12665static void
12666do_t_pld (void)
12667{
12668  if (inst.operands[0].immisreg)
12669    reject_bad_reg (inst.operands[0].imm);
12670
12671  encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
12672}
12673
12674static void
12675do_t_push_pop (void)
12676{
12677  unsigned mask;
12678
12679  constraint (inst.operands[0].writeback,
12680	      _("push/pop do not support {reglist}^"));
12681  constraint (inst.reloc.type != BFD_RELOC_UNUSED,
12682	      _("expression too complex"));
12683
12684  mask = inst.operands[0].imm;
12685  if (inst.size_req != 4 && (mask & ~0xff) == 0)
12686    inst.instruction = THUMB_OP16 (inst.instruction) | mask;
12687  else if (inst.size_req != 4
12688	   && (mask & ~0xff) == (1U << (inst.instruction == T_MNEM_push
12689				       ? REG_LR : REG_PC)))
12690    {
12691      inst.instruction = THUMB_OP16 (inst.instruction);
12692      inst.instruction |= THUMB_PP_PC_LR;
12693      inst.instruction |= mask & 0xff;
12694    }
12695  else if (unified_syntax)
12696    {
12697      inst.instruction = THUMB_OP32 (inst.instruction);
12698      encode_thumb2_ldmstm (13, mask, TRUE);
12699    }
12700  else
12701    {
12702      inst.error = _("invalid register list to push/pop instruction");
12703      return;
12704    }
12705}
12706
12707static void
12708do_t_rbit (void)
12709{
12710  unsigned Rd, Rm;
12711
12712  Rd = inst.operands[0].reg;
12713  Rm = inst.operands[1].reg;
12714
12715  reject_bad_reg (Rd);
12716  reject_bad_reg (Rm);
12717
12718  inst.instruction |= Rd << 8;
12719  inst.instruction |= Rm << 16;
12720  inst.instruction |= Rm;
12721}
12722
12723static void
12724do_t_rev (void)
12725{
12726  unsigned Rd, Rm;
12727
12728  Rd = inst.operands[0].reg;
12729  Rm = inst.operands[1].reg;
12730
12731  reject_bad_reg (Rd);
12732  reject_bad_reg (Rm);
12733
12734  if (Rd <= 7 && Rm <= 7
12735      && inst.size_req != 4)
12736    {
12737      inst.instruction = THUMB_OP16 (inst.instruction);
12738      inst.instruction |= Rd;
12739      inst.instruction |= Rm << 3;
12740    }
12741  else if (unified_syntax)
12742    {
12743      inst.instruction = THUMB_OP32 (inst.instruction);
12744      inst.instruction |= Rd << 8;
12745      inst.instruction |= Rm << 16;
12746      inst.instruction |= Rm;
12747    }
12748  else
12749    inst.error = BAD_HIREG;
12750}
12751
12752static void
12753do_t_rrx (void)
12754{
12755  unsigned Rd, Rm;
12756
12757  Rd = inst.operands[0].reg;
12758  Rm = inst.operands[1].reg;
12759
12760  reject_bad_reg (Rd);
12761  reject_bad_reg (Rm);
12762
12763  inst.instruction |= Rd << 8;
12764  inst.instruction |= Rm;
12765}
12766
12767static void
12768do_t_rsb (void)
12769{
12770  unsigned Rd, Rs;
12771
12772  Rd = inst.operands[0].reg;
12773  Rs = (inst.operands[1].present
12774	? inst.operands[1].reg    /* Rd, Rs, foo */
12775	: inst.operands[0].reg);  /* Rd, foo -> Rd, Rd, foo */
12776
12777  reject_bad_reg (Rd);
12778  reject_bad_reg (Rs);
12779  if (inst.operands[2].isreg)
12780    reject_bad_reg (inst.operands[2].reg);
12781
12782  inst.instruction |= Rd << 8;
12783  inst.instruction |= Rs << 16;
12784  if (!inst.operands[2].isreg)
12785    {
12786      bfd_boolean narrow;
12787
12788      if ((inst.instruction & 0x00100000) != 0)
12789	narrow = !in_it_block ();
12790      else
12791	narrow = in_it_block ();
12792
12793      if (Rd > 7 || Rs > 7)
12794	narrow = FALSE;
12795
12796      if (inst.size_req == 4 || !unified_syntax)
12797	narrow = FALSE;
12798
12799      if (inst.reloc.exp.X_op != O_constant
12800	  || inst.reloc.exp.X_add_number != 0)
12801	narrow = FALSE;
12802
12803      /* Turn rsb #0 into 16-bit neg.  We should probably do this via
12804	 relaxation, but it doesn't seem worth the hassle.  */
12805      if (narrow)
12806	{
12807	  inst.reloc.type = BFD_RELOC_UNUSED;
12808	  inst.instruction = THUMB_OP16 (T_MNEM_negs);
12809	  inst.instruction |= Rs << 3;
12810	  inst.instruction |= Rd;
12811	}
12812      else
12813	{
12814	  inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
12815	  inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
12816	}
12817    }
12818  else
12819    encode_thumb32_shifted_operand (2);
12820}
12821
12822static void
12823do_t_setend (void)
12824{
12825  if (warn_on_deprecated
12826      && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
12827      as_tsktsk (_("setend use is deprecated for ARMv8"));
12828
12829  set_it_insn_type (OUTSIDE_IT_INSN);
12830  if (inst.operands[0].imm)
12831    inst.instruction |= 0x8;
12832}
12833
12834static void
12835do_t_shift (void)
12836{
12837  if (!inst.operands[1].present)
12838    inst.operands[1].reg = inst.operands[0].reg;
12839
12840  if (unified_syntax)
12841    {
12842      bfd_boolean narrow;
12843      int shift_kind;
12844
12845      switch (inst.instruction)
12846	{
12847	case T_MNEM_asr:
12848	case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
12849	case T_MNEM_lsl:
12850	case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
12851	case T_MNEM_lsr:
12852	case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
12853	case T_MNEM_ror:
12854	case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
12855	default: abort ();
12856	}
12857
12858      if (THUMB_SETS_FLAGS (inst.instruction))
12859	narrow = !in_it_block ();
12860      else
12861	narrow = in_it_block ();
12862      if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
12863	narrow = FALSE;
12864      if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
12865	narrow = FALSE;
12866      if (inst.operands[2].isreg
12867	  && (inst.operands[1].reg != inst.operands[0].reg
12868	      || inst.operands[2].reg > 7))
12869	narrow = FALSE;
12870      if (inst.size_req == 4)
12871	narrow = FALSE;
12872
12873      reject_bad_reg (inst.operands[0].reg);
12874      reject_bad_reg (inst.operands[1].reg);
12875
12876      if (!narrow)
12877	{
12878	  if (inst.operands[2].isreg)
12879	    {
12880	      reject_bad_reg (inst.operands[2].reg);
12881	      inst.instruction = THUMB_OP32 (inst.instruction);
12882	      inst.instruction |= inst.operands[0].reg << 8;
12883	      inst.instruction |= inst.operands[1].reg << 16;
12884	      inst.instruction |= inst.operands[2].reg;
12885
12886	      /* PR 12854: Error on extraneous shifts.  */
12887	      constraint (inst.operands[2].shifted,
12888			  _("extraneous shift as part of operand to shift insn"));
12889	    }
12890	  else
12891	    {
12892	      inst.operands[1].shifted = 1;
12893	      inst.operands[1].shift_kind = shift_kind;
12894	      inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
12895					     ? T_MNEM_movs : T_MNEM_mov);
12896	      inst.instruction |= inst.operands[0].reg << 8;
12897	      encode_thumb32_shifted_operand (1);
12898	      /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup.  */
12899	      inst.reloc.type = BFD_RELOC_UNUSED;
12900	    }
12901	}
12902      else
12903	{
12904	  if (inst.operands[2].isreg)
12905	    {
12906	      switch (shift_kind)
12907		{
12908		case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
12909		case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
12910		case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
12911		case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
12912		default: abort ();
12913		}
12914
12915	      inst.instruction |= inst.operands[0].reg;
12916	      inst.instruction |= inst.operands[2].reg << 3;
12917
12918	      /* PR 12854: Error on extraneous shifts.  */
12919	      constraint (inst.operands[2].shifted,
12920			  _("extraneous shift as part of operand to shift insn"));
12921	    }
12922	  else
12923	    {
12924	      switch (shift_kind)
12925		{
12926		case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
12927		case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
12928		case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
12929		default: abort ();
12930		}
12931	      inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
12932	      inst.instruction |= inst.operands[0].reg;
12933	      inst.instruction |= inst.operands[1].reg << 3;
12934	    }
12935	}
12936    }
12937  else
12938    {
12939      constraint (inst.operands[0].reg > 7
12940		  || inst.operands[1].reg > 7, BAD_HIREG);
12941      constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
12942
12943      if (inst.operands[2].isreg)  /* Rd, {Rs,} Rn */
12944	{
12945	  constraint (inst.operands[2].reg > 7, BAD_HIREG);
12946	  constraint (inst.operands[0].reg != inst.operands[1].reg,
12947		      _("source1 and dest must be same register"));
12948
12949	  switch (inst.instruction)
12950	    {
12951	    case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
12952	    case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
12953	    case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
12954	    case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
12955	    default: abort ();
12956	    }
12957
12958	  inst.instruction |= inst.operands[0].reg;
12959	  inst.instruction |= inst.operands[2].reg << 3;
12960
12961	  /* PR 12854: Error on extraneous shifts.  */
12962	  constraint (inst.operands[2].shifted,
12963		      _("extraneous shift as part of operand to shift insn"));
12964	}
12965      else
12966	{
12967	  switch (inst.instruction)
12968	    {
12969	    case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
12970	    case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
12971	    case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
12972	    case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
12973	    default: abort ();
12974	    }
12975	  inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
12976	  inst.instruction |= inst.operands[0].reg;
12977	  inst.instruction |= inst.operands[1].reg << 3;
12978	}
12979    }
12980}
12981
12982static void
12983do_t_simd (void)
12984{
12985  unsigned Rd, Rn, Rm;
12986
12987  Rd = inst.operands[0].reg;
12988  Rn = inst.operands[1].reg;
12989  Rm = inst.operands[2].reg;
12990
12991  reject_bad_reg (Rd);
12992  reject_bad_reg (Rn);
12993  reject_bad_reg (Rm);
12994
12995  inst.instruction |= Rd << 8;
12996  inst.instruction |= Rn << 16;
12997  inst.instruction |= Rm;
12998}
12999
13000static void
13001do_t_simd2 (void)
13002{
13003  unsigned Rd, Rn, Rm;
13004
13005  Rd = inst.operands[0].reg;
13006  Rm = inst.operands[1].reg;
13007  Rn = inst.operands[2].reg;
13008
13009  reject_bad_reg (Rd);
13010  reject_bad_reg (Rn);
13011  reject_bad_reg (Rm);
13012
13013  inst.instruction |= Rd << 8;
13014  inst.instruction |= Rn << 16;
13015  inst.instruction |= Rm;
13016}
13017
13018static void
13019do_t_smc (void)
13020{
13021  unsigned int value = inst.reloc.exp.X_add_number;
13022  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a),
13023	      _("SMC is not permitted on this architecture"));
13024  constraint (inst.reloc.exp.X_op != O_constant,
13025	      _("expression too complex"));
13026  inst.reloc.type = BFD_RELOC_UNUSED;
13027  inst.instruction |= (value & 0xf000) >> 12;
13028  inst.instruction |= (value & 0x0ff0);
13029  inst.instruction |= (value & 0x000f) << 16;
13030  /* PR gas/15623: SMC instructions must be last in an IT block.  */
13031  set_it_insn_type_last ();
13032}
13033
13034static void
13035do_t_hvc (void)
13036{
13037  unsigned int value = inst.reloc.exp.X_add_number;
13038
13039  inst.reloc.type = BFD_RELOC_UNUSED;
13040  inst.instruction |= (value & 0x0fff);
13041  inst.instruction |= (value & 0xf000) << 4;
13042}
13043
13044static void
13045do_t_ssat_usat (int bias)
13046{
13047  unsigned Rd, Rn;
13048
13049  Rd = inst.operands[0].reg;
13050  Rn = inst.operands[2].reg;
13051
13052  reject_bad_reg (Rd);
13053  reject_bad_reg (Rn);
13054
13055  inst.instruction |= Rd << 8;
13056  inst.instruction |= inst.operands[1].imm - bias;
13057  inst.instruction |= Rn << 16;
13058
13059  if (inst.operands[3].present)
13060    {
13061      offsetT shift_amount = inst.reloc.exp.X_add_number;
13062
13063      inst.reloc.type = BFD_RELOC_UNUSED;
13064
13065      constraint (inst.reloc.exp.X_op != O_constant,
13066		  _("expression too complex"));
13067
13068      if (shift_amount != 0)
13069	{
13070	  constraint (shift_amount > 31,
13071		      _("shift expression is too large"));
13072
13073	  if (inst.operands[3].shift_kind == SHIFT_ASR)
13074	    inst.instruction |= 0x00200000;  /* sh bit.  */
13075
13076	  inst.instruction |= (shift_amount & 0x1c) << 10;
13077	  inst.instruction |= (shift_amount & 0x03) << 6;
13078	}
13079    }
13080}
13081
13082static void
13083do_t_ssat (void)
13084{
13085  do_t_ssat_usat (1);
13086}
13087
13088static void
13089do_t_ssat16 (void)
13090{
13091  unsigned Rd, Rn;
13092
13093  Rd = inst.operands[0].reg;
13094  Rn = inst.operands[2].reg;
13095
13096  reject_bad_reg (Rd);
13097  reject_bad_reg (Rn);
13098
13099  inst.instruction |= Rd << 8;
13100  inst.instruction |= inst.operands[1].imm - 1;
13101  inst.instruction |= Rn << 16;
13102}
13103
13104static void
13105do_t_strex (void)
13106{
13107  constraint (!inst.operands[2].isreg || !inst.operands[2].preind
13108	      || inst.operands[2].postind || inst.operands[2].writeback
13109	      || inst.operands[2].immisreg || inst.operands[2].shifted
13110	      || inst.operands[2].negative,
13111	      BAD_ADDR_MODE);
13112
13113  constraint (inst.operands[2].reg == REG_PC, BAD_PC);
13114
13115  inst.instruction |= inst.operands[0].reg << 8;
13116  inst.instruction |= inst.operands[1].reg << 12;
13117  inst.instruction |= inst.operands[2].reg << 16;
13118  inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
13119}
13120
13121static void
13122do_t_strexd (void)
13123{
13124  if (!inst.operands[2].present)
13125    inst.operands[2].reg = inst.operands[1].reg + 1;
13126
13127  constraint (inst.operands[0].reg == inst.operands[1].reg
13128	      || inst.operands[0].reg == inst.operands[2].reg
13129	      || inst.operands[0].reg == inst.operands[3].reg,
13130	      BAD_OVERLAP);
13131
13132  inst.instruction |= inst.operands[0].reg;
13133  inst.instruction |= inst.operands[1].reg << 12;
13134  inst.instruction |= inst.operands[2].reg << 8;
13135  inst.instruction |= inst.operands[3].reg << 16;
13136}
13137
13138static void
13139do_t_sxtah (void)
13140{
13141  unsigned Rd, Rn, Rm;
13142
13143  Rd = inst.operands[0].reg;
13144  Rn = inst.operands[1].reg;
13145  Rm = inst.operands[2].reg;
13146
13147  reject_bad_reg (Rd);
13148  reject_bad_reg (Rn);
13149  reject_bad_reg (Rm);
13150
13151  inst.instruction |= Rd << 8;
13152  inst.instruction |= Rn << 16;
13153  inst.instruction |= Rm;
13154  inst.instruction |= inst.operands[3].imm << 4;
13155}
13156
13157static void
13158do_t_sxth (void)
13159{
13160  unsigned Rd, Rm;
13161
13162  Rd = inst.operands[0].reg;
13163  Rm = inst.operands[1].reg;
13164
13165  reject_bad_reg (Rd);
13166  reject_bad_reg (Rm);
13167
13168  if (inst.instruction <= 0xffff
13169      && inst.size_req != 4
13170      && Rd <= 7 && Rm <= 7
13171      && (!inst.operands[2].present || inst.operands[2].imm == 0))
13172    {
13173      inst.instruction = THUMB_OP16 (inst.instruction);
13174      inst.instruction |= Rd;
13175      inst.instruction |= Rm << 3;
13176    }
13177  else if (unified_syntax)
13178    {
13179      if (inst.instruction <= 0xffff)
13180	inst.instruction = THUMB_OP32 (inst.instruction);
13181      inst.instruction |= Rd << 8;
13182      inst.instruction |= Rm;
13183      inst.instruction |= inst.operands[2].imm << 4;
13184    }
13185  else
13186    {
13187      constraint (inst.operands[2].present && inst.operands[2].imm != 0,
13188		  _("Thumb encoding does not support rotation"));
13189      constraint (1, BAD_HIREG);
13190    }
13191}
13192
13193static void
13194do_t_swi (void)
13195{
13196  inst.reloc.type = BFD_RELOC_ARM_SWI;
13197}
13198
13199static void
13200do_t_tb (void)
13201{
13202  unsigned Rn, Rm;
13203  int half;
13204
13205  half = (inst.instruction & 0x10) != 0;
13206  set_it_insn_type_last ();
13207  constraint (inst.operands[0].immisreg,
13208	      _("instruction requires register index"));
13209
13210  Rn = inst.operands[0].reg;
13211  Rm = inst.operands[0].imm;
13212
13213  if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
13214    constraint (Rn == REG_SP, BAD_SP);
13215  reject_bad_reg (Rm);
13216
13217  constraint (!half && inst.operands[0].shifted,
13218	      _("instruction does not allow shifted index"));
13219  inst.instruction |= (Rn << 16) | Rm;
13220}
13221
13222static void
13223do_t_udf (void)
13224{
13225  if (!inst.operands[0].present)
13226    inst.operands[0].imm = 0;
13227
13228  if ((unsigned int) inst.operands[0].imm > 255 || inst.size_req == 4)
13229    {
13230      constraint (inst.size_req == 2,
13231                  _("immediate value out of range"));
13232      inst.instruction = THUMB_OP32 (inst.instruction);
13233      inst.instruction |= (inst.operands[0].imm & 0xf000u) << 4;
13234      inst.instruction |= (inst.operands[0].imm & 0x0fffu) << 0;
13235    }
13236  else
13237    {
13238      inst.instruction = THUMB_OP16 (inst.instruction);
13239      inst.instruction |= inst.operands[0].imm;
13240    }
13241
13242  set_it_insn_type (NEUTRAL_IT_INSN);
13243}
13244
13245
13246static void
13247do_t_usat (void)
13248{
13249  do_t_ssat_usat (0);
13250}
13251
13252static void
13253do_t_usat16 (void)
13254{
13255  unsigned Rd, Rn;
13256
13257  Rd = inst.operands[0].reg;
13258  Rn = inst.operands[2].reg;
13259
13260  reject_bad_reg (Rd);
13261  reject_bad_reg (Rn);
13262
13263  inst.instruction |= Rd << 8;
13264  inst.instruction |= inst.operands[1].imm;
13265  inst.instruction |= Rn << 16;
13266}
13267
13268/* Neon instruction encoder helpers.  */
13269
13270/* Encodings for the different types for various Neon opcodes.  */
13271
13272/* An "invalid" code for the following tables.  */
13273#define N_INV -1u
13274
13275struct neon_tab_entry
13276{
13277  unsigned integer;
13278  unsigned float_or_poly;
13279  unsigned scalar_or_imm;
13280};
13281
13282/* Map overloaded Neon opcodes to their respective encodings.  */
13283#define NEON_ENC_TAB					\
13284  X(vabd,	0x0000700, 0x1200d00, N_INV),		\
13285  X(vmax,	0x0000600, 0x0000f00, N_INV),		\
13286  X(vmin,	0x0000610, 0x0200f00, N_INV),		\
13287  X(vpadd,	0x0000b10, 0x1000d00, N_INV),		\
13288  X(vpmax,	0x0000a00, 0x1000f00, N_INV),		\
13289  X(vpmin,	0x0000a10, 0x1200f00, N_INV),		\
13290  X(vadd,	0x0000800, 0x0000d00, N_INV),		\
13291  X(vsub,	0x1000800, 0x0200d00, N_INV),		\
13292  X(vceq,	0x1000810, 0x0000e00, 0x1b10100),	\
13293  X(vcge,	0x0000310, 0x1000e00, 0x1b10080),	\
13294  X(vcgt,	0x0000300, 0x1200e00, 0x1b10000),	\
13295  /* Register variants of the following two instructions are encoded as
13296     vcge / vcgt with the operands reversed.  */  	\
13297  X(vclt,	0x0000300, 0x1200e00, 0x1b10200),	\
13298  X(vcle,	0x0000310, 0x1000e00, 0x1b10180),	\
13299  X(vfma,	N_INV, 0x0000c10, N_INV),		\
13300  X(vfms,	N_INV, 0x0200c10, N_INV),		\
13301  X(vmla,	0x0000900, 0x0000d10, 0x0800040),	\
13302  X(vmls,	0x1000900, 0x0200d10, 0x0800440),	\
13303  X(vmul,	0x0000910, 0x1000d10, 0x0800840),	\
13304  X(vmull,	0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float.  */ \
13305  X(vmlal,	0x0800800, N_INV,     0x0800240),	\
13306  X(vmlsl,	0x0800a00, N_INV,     0x0800640),	\
13307  X(vqdmlal,	0x0800900, N_INV,     0x0800340),	\
13308  X(vqdmlsl,	0x0800b00, N_INV,     0x0800740),	\
13309  X(vqdmull,	0x0800d00, N_INV,     0x0800b40),	\
13310  X(vqdmulh,    0x0000b00, N_INV,     0x0800c40),	\
13311  X(vqrdmulh,   0x1000b00, N_INV,     0x0800d40),	\
13312  X(vqrdmlah,   0x3000b10, N_INV,     0x0800e40),	\
13313  X(vqrdmlsh,   0x3000c10, N_INV,     0x0800f40),	\
13314  X(vshl,	0x0000400, N_INV,     0x0800510),	\
13315  X(vqshl,	0x0000410, N_INV,     0x0800710),	\
13316  X(vand,	0x0000110, N_INV,     0x0800030),	\
13317  X(vbic,	0x0100110, N_INV,     0x0800030),	\
13318  X(veor,	0x1000110, N_INV,     N_INV),		\
13319  X(vorn,	0x0300110, N_INV,     0x0800010),	\
13320  X(vorr,	0x0200110, N_INV,     0x0800010),	\
13321  X(vmvn,	0x1b00580, N_INV,     0x0800030),	\
13322  X(vshll,	0x1b20300, N_INV,     0x0800a10), /* max shift, immediate.  */ \
13323  X(vcvt,       0x1b30600, N_INV,     0x0800e10), /* integer, fixed-point.  */ \
13324  X(vdup,       0xe800b10, N_INV,     0x1b00c00), /* arm, scalar.  */ \
13325  X(vld1,       0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup.  */ \
13326  X(vst1,	0x0000000, 0x0800000, N_INV),		\
13327  X(vld2,	0x0200100, 0x0a00100, 0x0a00d00),	\
13328  X(vst2,	0x0000100, 0x0800100, N_INV),		\
13329  X(vld3,	0x0200200, 0x0a00200, 0x0a00e00),	\
13330  X(vst3,	0x0000200, 0x0800200, N_INV),		\
13331  X(vld4,	0x0200300, 0x0a00300, 0x0a00f00),	\
13332  X(vst4,	0x0000300, 0x0800300, N_INV),		\
13333  X(vmovn,	0x1b20200, N_INV,     N_INV),		\
13334  X(vtrn,	0x1b20080, N_INV,     N_INV),		\
13335  X(vqmovn,	0x1b20200, N_INV,     N_INV),		\
13336  X(vqmovun,	0x1b20240, N_INV,     N_INV),		\
13337  X(vnmul,      0xe200a40, 0xe200b40, N_INV),		\
13338  X(vnmla,      0xe100a40, 0xe100b40, N_INV),		\
13339  X(vnmls,      0xe100a00, 0xe100b00, N_INV),		\
13340  X(vfnma,      0xe900a40, 0xe900b40, N_INV),		\
13341  X(vfnms,      0xe900a00, 0xe900b00, N_INV),		\
13342  X(vcmp,	0xeb40a40, 0xeb40b40, N_INV),		\
13343  X(vcmpz,	0xeb50a40, 0xeb50b40, N_INV),		\
13344  X(vcmpe,	0xeb40ac0, 0xeb40bc0, N_INV),		\
13345  X(vcmpez,     0xeb50ac0, 0xeb50bc0, N_INV),		\
13346  X(vseleq,	0xe000a00, N_INV,     N_INV),		\
13347  X(vselvs,	0xe100a00, N_INV,     N_INV),		\
13348  X(vselge,	0xe200a00, N_INV,     N_INV),		\
13349  X(vselgt,	0xe300a00, N_INV,     N_INV),		\
13350  X(vmaxnm,	0xe800a00, 0x3000f10, N_INV),		\
13351  X(vminnm,	0xe800a40, 0x3200f10, N_INV),		\
13352  X(vcvta,	0xebc0a40, 0x3bb0000, N_INV),		\
13353  X(vrintr,	0xeb60a40, 0x3ba0400, N_INV),		\
13354  X(vrinta,	0xeb80a40, 0x3ba0400, N_INV),		\
13355  X(aes,	0x3b00300, N_INV,     N_INV),		\
13356  X(sha3op,	0x2000c00, N_INV,     N_INV),		\
13357  X(sha1h,	0x3b902c0, N_INV,     N_INV),           \
13358  X(sha2op,     0x3ba0380, N_INV,     N_INV)
13359
13360enum neon_opc
13361{
13362#define X(OPC,I,F,S) N_MNEM_##OPC
13363NEON_ENC_TAB
13364#undef X
13365};
13366
13367static const struct neon_tab_entry neon_enc_tab[] =
13368{
13369#define X(OPC,I,F,S) { (I), (F), (S) }
13370NEON_ENC_TAB
13371#undef X
13372};
13373
13374/* Do not use these macros; instead, use NEON_ENCODE defined below.  */
13375#define NEON_ENC_INTEGER_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
13376#define NEON_ENC_ARMREG_(X)  (neon_enc_tab[(X) & 0x0fffffff].integer)
13377#define NEON_ENC_POLY_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
13378#define NEON_ENC_FLOAT_(X)   (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
13379#define NEON_ENC_SCALAR_(X)  (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
13380#define NEON_ENC_IMMED_(X)   (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
13381#define NEON_ENC_INTERLV_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
13382#define NEON_ENC_LANE_(X)    (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
13383#define NEON_ENC_DUP_(X)     (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
13384#define NEON_ENC_SINGLE_(X) \
13385  ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
13386#define NEON_ENC_DOUBLE_(X) \
13387  ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
13388#define NEON_ENC_FPV8_(X) \
13389  ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf000000))
13390
13391#define NEON_ENCODE(type, inst)					\
13392  do								\
13393    {								\
13394      inst.instruction = NEON_ENC_##type##_ (inst.instruction);	\
13395      inst.is_neon = 1;						\
13396    }								\
13397  while (0)
13398
13399#define check_neon_suffixes						\
13400  do									\
13401    {									\
13402      if (!inst.error && inst.vectype.elems > 0 && !inst.is_neon)	\
13403	{								\
13404	  as_bad (_("invalid neon suffix for non neon instruction"));	\
13405	  return;							\
13406	}								\
13407    }									\
13408  while (0)
13409
13410/* Define shapes for instruction operands. The following mnemonic characters
13411   are used in this table:
13412
13413     F - VFP S<n> register
13414     D - Neon D<n> register
13415     Q - Neon Q<n> register
13416     I - Immediate
13417     S - Scalar
13418     R - ARM register
13419     L - D<n> register list
13420
13421   This table is used to generate various data:
13422     - enumerations of the form NS_DDR to be used as arguments to
13423       neon_select_shape.
13424     - a table classifying shapes into single, double, quad, mixed.
13425     - a table used to drive neon_select_shape.  */
13426
13427#define NEON_SHAPE_DEF			\
13428  X(3, (D, D, D), DOUBLE),		\
13429  X(3, (Q, Q, Q), QUAD),		\
13430  X(3, (D, D, I), DOUBLE),		\
13431  X(3, (Q, Q, I), QUAD),		\
13432  X(3, (D, D, S), DOUBLE),		\
13433  X(3, (Q, Q, S), QUAD),		\
13434  X(2, (D, D), DOUBLE),			\
13435  X(2, (Q, Q), QUAD),			\
13436  X(2, (D, S), DOUBLE),			\
13437  X(2, (Q, S), QUAD),			\
13438  X(2, (D, R), DOUBLE),			\
13439  X(2, (Q, R), QUAD),			\
13440  X(2, (D, I), DOUBLE),			\
13441  X(2, (Q, I), QUAD),			\
13442  X(3, (D, L, D), DOUBLE),		\
13443  X(2, (D, Q), MIXED),			\
13444  X(2, (Q, D), MIXED),			\
13445  X(3, (D, Q, I), MIXED),		\
13446  X(3, (Q, D, I), MIXED),		\
13447  X(3, (Q, D, D), MIXED),		\
13448  X(3, (D, Q, Q), MIXED),		\
13449  X(3, (Q, Q, D), MIXED),		\
13450  X(3, (Q, D, S), MIXED),		\
13451  X(3, (D, Q, S), MIXED),		\
13452  X(4, (D, D, D, I), DOUBLE),		\
13453  X(4, (Q, Q, Q, I), QUAD),		\
13454  X(4, (D, D, S, I), DOUBLE),		\
13455  X(4, (Q, Q, S, I), QUAD),		\
13456  X(2, (F, F), SINGLE),			\
13457  X(3, (F, F, F), SINGLE),		\
13458  X(2, (F, I), SINGLE),			\
13459  X(2, (F, D), MIXED),			\
13460  X(2, (D, F), MIXED),			\
13461  X(3, (F, F, I), MIXED),		\
13462  X(4, (R, R, F, F), SINGLE),		\
13463  X(4, (F, F, R, R), SINGLE),		\
13464  X(3, (D, R, R), DOUBLE),		\
13465  X(3, (R, R, D), DOUBLE),		\
13466  X(2, (S, R), SINGLE),			\
13467  X(2, (R, S), SINGLE),			\
13468  X(2, (F, R), SINGLE),			\
13469  X(2, (R, F), SINGLE),			\
13470/* Half float shape supported so far.  */\
13471  X (2, (H, D), MIXED),			\
13472  X (2, (D, H), MIXED),			\
13473  X (2, (H, F), MIXED),			\
13474  X (2, (F, H), MIXED),			\
13475  X (2, (H, H), HALF),			\
13476  X (2, (H, R), HALF),			\
13477  X (2, (R, H), HALF),			\
13478  X (2, (H, I), HALF),			\
13479  X (3, (H, H, H), HALF),		\
13480  X (3, (H, F, I), MIXED),		\
13481  X (3, (F, H, I), MIXED),		\
13482  X (3, (D, H, H), MIXED),		\
13483  X (3, (D, H, S), MIXED)
13484
13485#define S2(A,B)		NS_##A##B
13486#define S3(A,B,C)	NS_##A##B##C
13487#define S4(A,B,C,D)	NS_##A##B##C##D
13488
13489#define X(N, L, C) S##N L
13490
13491enum neon_shape
13492{
13493  NEON_SHAPE_DEF,
13494  NS_NULL
13495};
13496
13497#undef X
13498#undef S2
13499#undef S3
13500#undef S4
13501
13502enum neon_shape_class
13503{
13504  SC_HALF,
13505  SC_SINGLE,
13506  SC_DOUBLE,
13507  SC_QUAD,
13508  SC_MIXED
13509};
13510
13511#define X(N, L, C) SC_##C
13512
13513static enum neon_shape_class neon_shape_class[] =
13514{
13515  NEON_SHAPE_DEF
13516};
13517
13518#undef X
13519
13520enum neon_shape_el
13521{
13522  SE_H,
13523  SE_F,
13524  SE_D,
13525  SE_Q,
13526  SE_I,
13527  SE_S,
13528  SE_R,
13529  SE_L
13530};
13531
13532/* Register widths of above.  */
13533static unsigned neon_shape_el_size[] =
13534{
13535  16,
13536  32,
13537  64,
13538  128,
13539  0,
13540  32,
13541  32,
13542  0
13543};
13544
13545struct neon_shape_info
13546{
13547  unsigned els;
13548  enum neon_shape_el el[NEON_MAX_TYPE_ELS];
13549};
13550
13551#define S2(A,B)		{ SE_##A, SE_##B }
13552#define S3(A,B,C)	{ SE_##A, SE_##B, SE_##C }
13553#define S4(A,B,C,D)	{ SE_##A, SE_##B, SE_##C, SE_##D }
13554
13555#define X(N, L, C) { N, S##N L }
13556
13557static struct neon_shape_info neon_shape_tab[] =
13558{
13559  NEON_SHAPE_DEF
13560};
13561
13562#undef X
13563#undef S2
13564#undef S3
13565#undef S4
13566
13567/* Bit masks used in type checking given instructions.
13568  'N_EQK' means the type must be the same as (or based on in some way) the key
13569   type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
13570   set, various other bits can be set as well in order to modify the meaning of
13571   the type constraint.  */
13572
13573enum neon_type_mask
13574{
13575  N_S8   = 0x0000001,
13576  N_S16  = 0x0000002,
13577  N_S32  = 0x0000004,
13578  N_S64  = 0x0000008,
13579  N_U8   = 0x0000010,
13580  N_U16  = 0x0000020,
13581  N_U32  = 0x0000040,
13582  N_U64  = 0x0000080,
13583  N_I8   = 0x0000100,
13584  N_I16  = 0x0000200,
13585  N_I32  = 0x0000400,
13586  N_I64  = 0x0000800,
13587  N_8    = 0x0001000,
13588  N_16   = 0x0002000,
13589  N_32   = 0x0004000,
13590  N_64   = 0x0008000,
13591  N_P8   = 0x0010000,
13592  N_P16  = 0x0020000,
13593  N_F16  = 0x0040000,
13594  N_F32  = 0x0080000,
13595  N_F64  = 0x0100000,
13596  N_P64	 = 0x0200000,
13597  N_KEY  = 0x1000000, /* Key element (main type specifier).  */
13598  N_EQK  = 0x2000000, /* Given operand has the same type & size as the key.  */
13599  N_VFP  = 0x4000000, /* VFP mode: operand size must match register width.  */
13600  N_UNT  = 0x8000000, /* Must be explicitly untyped.  */
13601  N_DBL  = 0x0000001, /* If N_EQK, this operand is twice the size.  */
13602  N_HLF  = 0x0000002, /* If N_EQK, this operand is half the size.  */
13603  N_SGN  = 0x0000004, /* If N_EQK, this operand is forced to be signed.  */
13604  N_UNS  = 0x0000008, /* If N_EQK, this operand is forced to be unsigned.  */
13605  N_INT  = 0x0000010, /* If N_EQK, this operand is forced to be integer.  */
13606  N_FLT  = 0x0000020, /* If N_EQK, this operand is forced to be float.  */
13607  N_SIZ  = 0x0000040, /* If N_EQK, this operand is forced to be size-only.  */
13608  N_UTYP = 0,
13609  N_MAX_NONSPECIAL = N_P64
13610};
13611
13612#define N_ALLMODS  (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
13613
13614#define N_SU_ALL   (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
13615#define N_SU_32    (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
13616#define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
13617#define N_S_32     (N_S8 | N_S16 | N_S32)
13618#define N_F_16_32  (N_F16 | N_F32)
13619#define N_SUF_32   (N_SU_32 | N_F_16_32)
13620#define N_I_ALL    (N_I8 | N_I16 | N_I32 | N_I64)
13621#define N_IF_32    (N_I8 | N_I16 | N_I32 | N_F16 | N_F32)
13622#define N_F_ALL    (N_F16 | N_F32 | N_F64)
13623
13624/* Pass this as the first type argument to neon_check_type to ignore types
13625   altogether.  */
13626#define N_IGNORE_TYPE (N_KEY | N_EQK)
13627
13628/* Select a "shape" for the current instruction (describing register types or
13629   sizes) from a list of alternatives. Return NS_NULL if the current instruction
13630   doesn't fit. For non-polymorphic shapes, checking is usually done as a
13631   function of operand parsing, so this function doesn't need to be called.
13632   Shapes should be listed in order of decreasing length.  */
13633
13634static enum neon_shape
13635neon_select_shape (enum neon_shape shape, ...)
13636{
13637  va_list ap;
13638  enum neon_shape first_shape = shape;
13639
13640  /* Fix missing optional operands. FIXME: we don't know at this point how
13641     many arguments we should have, so this makes the assumption that we have
13642     > 1. This is true of all current Neon opcodes, I think, but may not be
13643     true in the future.  */
13644  if (!inst.operands[1].present)
13645    inst.operands[1] = inst.operands[0];
13646
13647  va_start (ap, shape);
13648
13649  for (; shape != NS_NULL; shape = (enum neon_shape) va_arg (ap, int))
13650    {
13651      unsigned j;
13652      int matches = 1;
13653
13654      for (j = 0; j < neon_shape_tab[shape].els; j++)
13655	{
13656	  if (!inst.operands[j].present)
13657	    {
13658	      matches = 0;
13659	      break;
13660	    }
13661
13662	  switch (neon_shape_tab[shape].el[j])
13663	    {
13664	      /* If a  .f16,  .16,  .u16,  .s16 type specifier is given over
13665		 a VFP single precision register operand, it's essentially
13666		 means only half of the register is used.
13667
13668		 If the type specifier is given after the mnemonics, the
13669		 information is stored in inst.vectype.  If the type specifier
13670		 is given after register operand, the information is stored
13671		 in inst.operands[].vectype.
13672
13673		 When there is only one type specifier, and all the register
13674		 operands are the same type of hardware register, the type
13675		 specifier applies to all register operands.
13676
13677		 If no type specifier is given, the shape is inferred from
13678		 operand information.
13679
13680		 for example:
13681		 vadd.f16 s0, s1, s2:		NS_HHH
13682		 vabs.f16 s0, s1:		NS_HH
13683		 vmov.f16 s0, r1:		NS_HR
13684		 vmov.f16 r0, s1:		NS_RH
13685		 vcvt.f16 r0, s1:		NS_RH
13686		 vcvt.f16.s32	s2, s2, #29:	NS_HFI
13687		 vcvt.f16.s32	s2, s2:		NS_HF
13688	      */
13689	    case SE_H:
13690	      if (!(inst.operands[j].isreg
13691		    && inst.operands[j].isvec
13692		    && inst.operands[j].issingle
13693		    && !inst.operands[j].isquad
13694		    && ((inst.vectype.elems == 1
13695			 && inst.vectype.el[0].size == 16)
13696			|| (inst.vectype.elems > 1
13697			    && inst.vectype.el[j].size == 16)
13698			|| (inst.vectype.elems == 0
13699			    && inst.operands[j].vectype.type != NT_invtype
13700			    && inst.operands[j].vectype.size == 16))))
13701		matches = 0;
13702	      break;
13703
13704	    case SE_F:
13705	      if (!(inst.operands[j].isreg
13706		    && inst.operands[j].isvec
13707		    && inst.operands[j].issingle
13708		    && !inst.operands[j].isquad
13709		    && ((inst.vectype.elems == 1 && inst.vectype.el[0].size == 32)
13710			|| (inst.vectype.elems > 1 && inst.vectype.el[j].size == 32)
13711			|| (inst.vectype.elems == 0
13712			    && (inst.operands[j].vectype.size == 32
13713				|| inst.operands[j].vectype.type == NT_invtype)))))
13714		matches = 0;
13715	      break;
13716
13717	    case SE_D:
13718	      if (!(inst.operands[j].isreg
13719		    && inst.operands[j].isvec
13720		    && !inst.operands[j].isquad
13721		    && !inst.operands[j].issingle))
13722		matches = 0;
13723	      break;
13724
13725	    case SE_R:
13726	      if (!(inst.operands[j].isreg
13727		    && !inst.operands[j].isvec))
13728		matches = 0;
13729	      break;
13730
13731	    case SE_Q:
13732	      if (!(inst.operands[j].isreg
13733		    && inst.operands[j].isvec
13734		    && inst.operands[j].isquad
13735		    && !inst.operands[j].issingle))
13736		matches = 0;
13737	      break;
13738
13739	    case SE_I:
13740	      if (!(!inst.operands[j].isreg
13741		    && !inst.operands[j].isscalar))
13742		matches = 0;
13743	      break;
13744
13745	    case SE_S:
13746	      if (!(!inst.operands[j].isreg
13747		    && inst.operands[j].isscalar))
13748		matches = 0;
13749	      break;
13750
13751	    case SE_L:
13752	      break;
13753	    }
13754	  if (!matches)
13755	    break;
13756	}
13757      if (matches && (j >= ARM_IT_MAX_OPERANDS || !inst.operands[j].present))
13758	/* We've matched all the entries in the shape table, and we don't
13759	   have any left over operands which have not been matched.  */
13760	break;
13761    }
13762
13763  va_end (ap);
13764
13765  if (shape == NS_NULL && first_shape != NS_NULL)
13766    first_error (_("invalid instruction shape"));
13767
13768  return shape;
13769}
13770
13771/* True if SHAPE is predominantly a quadword operation (most of the time, this
13772   means the Q bit should be set).  */
13773
13774static int
13775neon_quad (enum neon_shape shape)
13776{
13777  return neon_shape_class[shape] == SC_QUAD;
13778}
13779
13780static void
13781neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
13782		       unsigned *g_size)
13783{
13784  /* Allow modification to be made to types which are constrained to be
13785     based on the key element, based on bits set alongside N_EQK.  */
13786  if ((typebits & N_EQK) != 0)
13787    {
13788      if ((typebits & N_HLF) != 0)
13789	*g_size /= 2;
13790      else if ((typebits & N_DBL) != 0)
13791	*g_size *= 2;
13792      if ((typebits & N_SGN) != 0)
13793	*g_type = NT_signed;
13794      else if ((typebits & N_UNS) != 0)
13795	*g_type = NT_unsigned;
13796      else if ((typebits & N_INT) != 0)
13797	*g_type = NT_integer;
13798      else if ((typebits & N_FLT) != 0)
13799	*g_type = NT_float;
13800      else if ((typebits & N_SIZ) != 0)
13801	*g_type = NT_untyped;
13802    }
13803}
13804
13805/* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
13806   operand type, i.e. the single type specified in a Neon instruction when it
13807   is the only one given.  */
13808
13809static struct neon_type_el
13810neon_type_promote (struct neon_type_el *key, unsigned thisarg)
13811{
13812  struct neon_type_el dest = *key;
13813
13814  gas_assert ((thisarg & N_EQK) != 0);
13815
13816  neon_modify_type_size (thisarg, &dest.type, &dest.size);
13817
13818  return dest;
13819}
13820
13821/* Convert Neon type and size into compact bitmask representation.  */
13822
13823static enum neon_type_mask
13824type_chk_of_el_type (enum neon_el_type type, unsigned size)
13825{
13826  switch (type)
13827    {
13828    case NT_untyped:
13829      switch (size)
13830	{
13831	case 8:  return N_8;
13832	case 16: return N_16;
13833	case 32: return N_32;
13834	case 64: return N_64;
13835	default: ;
13836	}
13837      break;
13838
13839    case NT_integer:
13840      switch (size)
13841	{
13842	case 8:  return N_I8;
13843	case 16: return N_I16;
13844	case 32: return N_I32;
13845	case 64: return N_I64;
13846	default: ;
13847	}
13848      break;
13849
13850    case NT_float:
13851      switch (size)
13852	{
13853	case 16: return N_F16;
13854	case 32: return N_F32;
13855	case 64: return N_F64;
13856	default: ;
13857	}
13858      break;
13859
13860    case NT_poly:
13861      switch (size)
13862	{
13863	case 8:  return N_P8;
13864	case 16: return N_P16;
13865	case 64: return N_P64;
13866	default: ;
13867	}
13868      break;
13869
13870    case NT_signed:
13871      switch (size)
13872	{
13873	case 8:  return N_S8;
13874	case 16: return N_S16;
13875	case 32: return N_S32;
13876	case 64: return N_S64;
13877	default: ;
13878	}
13879      break;
13880
13881    case NT_unsigned:
13882      switch (size)
13883	{
13884	case 8:  return N_U8;
13885	case 16: return N_U16;
13886	case 32: return N_U32;
13887	case 64: return N_U64;
13888	default: ;
13889	}
13890      break;
13891
13892    default: ;
13893    }
13894
13895  return N_UTYP;
13896}
13897
13898/* Convert compact Neon bitmask type representation to a type and size. Only
13899   handles the case where a single bit is set in the mask.  */
13900
13901static int
13902el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
13903		     enum neon_type_mask mask)
13904{
13905  if ((mask & N_EQK) != 0)
13906    return FAIL;
13907
13908  if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
13909    *size = 8;
13910  else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_F16 | N_P16)) != 0)
13911    *size = 16;
13912  else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
13913    *size = 32;
13914  else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64 | N_P64)) != 0)
13915    *size = 64;
13916  else
13917    return FAIL;
13918
13919  if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
13920    *type = NT_signed;
13921  else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
13922    *type = NT_unsigned;
13923  else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
13924    *type = NT_integer;
13925  else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
13926    *type = NT_untyped;
13927  else if ((mask & (N_P8 | N_P16 | N_P64)) != 0)
13928    *type = NT_poly;
13929  else if ((mask & (N_F_ALL)) != 0)
13930    *type = NT_float;
13931  else
13932    return FAIL;
13933
13934  return SUCCESS;
13935}
13936
13937/* Modify a bitmask of allowed types. This is only needed for type
13938   relaxation.  */
13939
13940static unsigned
13941modify_types_allowed (unsigned allowed, unsigned mods)
13942{
13943  unsigned size;
13944  enum neon_el_type type;
13945  unsigned destmask;
13946  int i;
13947
13948  destmask = 0;
13949
13950  for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
13951    {
13952      if (el_type_of_type_chk (&type, &size,
13953			       (enum neon_type_mask) (allowed & i)) == SUCCESS)
13954	{
13955	  neon_modify_type_size (mods, &type, &size);
13956	  destmask |= type_chk_of_el_type (type, size);
13957	}
13958    }
13959
13960  return destmask;
13961}
13962
13963/* Check type and return type classification.
13964   The manual states (paraphrase): If one datatype is given, it indicates the
13965   type given in:
13966    - the second operand, if there is one
13967    - the operand, if there is no second operand
13968    - the result, if there are no operands.
13969   This isn't quite good enough though, so we use a concept of a "key" datatype
13970   which is set on a per-instruction basis, which is the one which matters when
13971   only one data type is written.
13972   Note: this function has side-effects (e.g. filling in missing operands). All
13973   Neon instructions should call it before performing bit encoding.  */
13974
13975static struct neon_type_el
13976neon_check_type (unsigned els, enum neon_shape ns, ...)
13977{
13978  va_list ap;
13979  unsigned i, pass, key_el = 0;
13980  unsigned types[NEON_MAX_TYPE_ELS];
13981  enum neon_el_type k_type = NT_invtype;
13982  unsigned k_size = -1u;
13983  struct neon_type_el badtype = {NT_invtype, -1};
13984  unsigned key_allowed = 0;
13985
13986  /* Optional registers in Neon instructions are always (not) in operand 1.
13987     Fill in the missing operand here, if it was omitted.  */
13988  if (els > 1 && !inst.operands[1].present)
13989    inst.operands[1] = inst.operands[0];
13990
13991  /* Suck up all the varargs.  */
13992  va_start (ap, ns);
13993  for (i = 0; i < els; i++)
13994    {
13995      unsigned thisarg = va_arg (ap, unsigned);
13996      if (thisarg == N_IGNORE_TYPE)
13997	{
13998	  va_end (ap);
13999	  return badtype;
14000	}
14001      types[i] = thisarg;
14002      if ((thisarg & N_KEY) != 0)
14003	key_el = i;
14004    }
14005  va_end (ap);
14006
14007  if (inst.vectype.elems > 0)
14008    for (i = 0; i < els; i++)
14009      if (inst.operands[i].vectype.type != NT_invtype)
14010	{
14011	  first_error (_("types specified in both the mnemonic and operands"));
14012	  return badtype;
14013	}
14014
14015  /* Duplicate inst.vectype elements here as necessary.
14016     FIXME: No idea if this is exactly the same as the ARM assembler,
14017     particularly when an insn takes one register and one non-register
14018     operand. */
14019  if (inst.vectype.elems == 1 && els > 1)
14020    {
14021      unsigned j;
14022      inst.vectype.elems = els;
14023      inst.vectype.el[key_el] = inst.vectype.el[0];
14024      for (j = 0; j < els; j++)
14025	if (j != key_el)
14026	  inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
14027						  types[j]);
14028    }
14029  else if (inst.vectype.elems == 0 && els > 0)
14030    {
14031      unsigned j;
14032      /* No types were given after the mnemonic, so look for types specified
14033	 after each operand. We allow some flexibility here; as long as the
14034	 "key" operand has a type, we can infer the others.  */
14035      for (j = 0; j < els; j++)
14036	if (inst.operands[j].vectype.type != NT_invtype)
14037	  inst.vectype.el[j] = inst.operands[j].vectype;
14038
14039      if (inst.operands[key_el].vectype.type != NT_invtype)
14040	{
14041	  for (j = 0; j < els; j++)
14042	    if (inst.operands[j].vectype.type == NT_invtype)
14043	      inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
14044						      types[j]);
14045	}
14046      else
14047	{
14048	  first_error (_("operand types can't be inferred"));
14049	  return badtype;
14050	}
14051    }
14052  else if (inst.vectype.elems != els)
14053    {
14054      first_error (_("type specifier has the wrong number of parts"));
14055      return badtype;
14056    }
14057
14058  for (pass = 0; pass < 2; pass++)
14059    {
14060      for (i = 0; i < els; i++)
14061	{
14062	  unsigned thisarg = types[i];
14063	  unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
14064	    ? modify_types_allowed (key_allowed, thisarg) : thisarg;
14065	  enum neon_el_type g_type = inst.vectype.el[i].type;
14066	  unsigned g_size = inst.vectype.el[i].size;
14067
14068	  /* Decay more-specific signed & unsigned types to sign-insensitive
14069	     integer types if sign-specific variants are unavailable.  */
14070	  if ((g_type == NT_signed || g_type == NT_unsigned)
14071	      && (types_allowed & N_SU_ALL) == 0)
14072	    g_type = NT_integer;
14073
14074	  /* If only untyped args are allowed, decay any more specific types to
14075	     them. Some instructions only care about signs for some element
14076	     sizes, so handle that properly.  */
14077	  if (((types_allowed & N_UNT) == 0)
14078	      && ((g_size == 8 && (types_allowed & N_8) != 0)
14079		  || (g_size == 16 && (types_allowed & N_16) != 0)
14080		  || (g_size == 32 && (types_allowed & N_32) != 0)
14081		  || (g_size == 64 && (types_allowed & N_64) != 0)))
14082	    g_type = NT_untyped;
14083
14084	  if (pass == 0)
14085	    {
14086	      if ((thisarg & N_KEY) != 0)
14087		{
14088		  k_type = g_type;
14089		  k_size = g_size;
14090		  key_allowed = thisarg & ~N_KEY;
14091
14092		  /* Check architecture constraint on FP16 extension.  */
14093		  if (k_size == 16
14094		      && k_type == NT_float
14095		      && ! ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16))
14096		    {
14097		      inst.error = _(BAD_FP16);
14098		      return badtype;
14099		    }
14100		}
14101	    }
14102	  else
14103	    {
14104	      if ((thisarg & N_VFP) != 0)
14105		{
14106		  enum neon_shape_el regshape;
14107		  unsigned regwidth, match;
14108
14109		  /* PR 11136: Catch the case where we are passed a shape of NS_NULL.  */
14110		  if (ns == NS_NULL)
14111		    {
14112		      first_error (_("invalid instruction shape"));
14113		      return badtype;
14114		    }
14115		  regshape = neon_shape_tab[ns].el[i];
14116		  regwidth = neon_shape_el_size[regshape];
14117
14118		  /* In VFP mode, operands must match register widths. If we
14119		     have a key operand, use its width, else use the width of
14120		     the current operand.  */
14121		  if (k_size != -1u)
14122		    match = k_size;
14123		  else
14124		    match = g_size;
14125
14126		  /* FP16 will use a single precision register.  */
14127		  if (regwidth == 32 && match == 16)
14128		    {
14129		      if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16))
14130			match = regwidth;
14131		      else
14132			{
14133			  inst.error = _(BAD_FP16);
14134			  return badtype;
14135			}
14136		    }
14137
14138		  if (regwidth != match)
14139		    {
14140		      first_error (_("operand size must match register width"));
14141		      return badtype;
14142		    }
14143		}
14144
14145	      if ((thisarg & N_EQK) == 0)
14146		{
14147		  unsigned given_type = type_chk_of_el_type (g_type, g_size);
14148
14149		  if ((given_type & types_allowed) == 0)
14150		    {
14151		      first_error (_("bad type in Neon instruction"));
14152		      return badtype;
14153		    }
14154		}
14155	      else
14156		{
14157		  enum neon_el_type mod_k_type = k_type;
14158		  unsigned mod_k_size = k_size;
14159		  neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
14160		  if (g_type != mod_k_type || g_size != mod_k_size)
14161		    {
14162		      first_error (_("inconsistent types in Neon instruction"));
14163		      return badtype;
14164		    }
14165		}
14166	    }
14167	}
14168    }
14169
14170  return inst.vectype.el[key_el];
14171}
14172
14173/* Neon-style VFP instruction forwarding.  */
14174
14175/* Thumb VFP instructions have 0xE in the condition field.  */
14176
14177static void
14178do_vfp_cond_or_thumb (void)
14179{
14180  inst.is_neon = 1;
14181
14182  if (thumb_mode)
14183    inst.instruction |= 0xe0000000;
14184  else
14185    inst.instruction |= inst.cond << 28;
14186}
14187
14188/* Look up and encode a simple mnemonic, for use as a helper function for the
14189   Neon-style VFP syntax.  This avoids duplication of bits of the insns table,
14190   etc.  It is assumed that operand parsing has already been done, and that the
14191   operands are in the form expected by the given opcode (this isn't necessarily
14192   the same as the form in which they were parsed, hence some massaging must
14193   take place before this function is called).
14194   Checks current arch version against that in the looked-up opcode.  */
14195
14196static void
14197do_vfp_nsyn_opcode (const char *opname)
14198{
14199  const struct asm_opcode *opcode;
14200
14201  opcode = (const struct asm_opcode *) hash_find (arm_ops_hsh, opname);
14202
14203  if (!opcode)
14204    abort ();
14205
14206  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
14207		thumb_mode ? *opcode->tvariant : *opcode->avariant),
14208	      _(BAD_FPU));
14209
14210  inst.is_neon = 1;
14211
14212  if (thumb_mode)
14213    {
14214      inst.instruction = opcode->tvalue;
14215      opcode->tencode ();
14216    }
14217  else
14218    {
14219      inst.instruction = (inst.cond << 28) | opcode->avalue;
14220      opcode->aencode ();
14221    }
14222}
14223
14224static void
14225do_vfp_nsyn_add_sub (enum neon_shape rs)
14226{
14227  int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
14228
14229  if (rs == NS_FFF || rs == NS_HHH)
14230    {
14231      if (is_add)
14232	do_vfp_nsyn_opcode ("fadds");
14233      else
14234	do_vfp_nsyn_opcode ("fsubs");
14235
14236      /* ARMv8.2 fp16 instruction.  */
14237      if (rs == NS_HHH)
14238	do_scalar_fp16_v82_encode ();
14239    }
14240  else
14241    {
14242      if (is_add)
14243	do_vfp_nsyn_opcode ("faddd");
14244      else
14245	do_vfp_nsyn_opcode ("fsubd");
14246    }
14247}
14248
14249/* Check operand types to see if this is a VFP instruction, and if so call
14250   PFN ().  */
14251
14252static int
14253try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
14254{
14255  enum neon_shape rs;
14256  struct neon_type_el et;
14257
14258  switch (args)
14259    {
14260    case 2:
14261      rs = neon_select_shape (NS_HH, NS_FF, NS_DD, NS_NULL);
14262      et = neon_check_type (2, rs, N_EQK | N_VFP, N_F_ALL | N_KEY | N_VFP);
14263      break;
14264
14265    case 3:
14266      rs = neon_select_shape (NS_HHH, NS_FFF, NS_DDD, NS_NULL);
14267      et = neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
14268			    N_F_ALL | N_KEY | N_VFP);
14269      break;
14270
14271    default:
14272      abort ();
14273    }
14274
14275  if (et.type != NT_invtype)
14276    {
14277      pfn (rs);
14278      return SUCCESS;
14279    }
14280
14281  inst.error = NULL;
14282  return FAIL;
14283}
14284
14285static void
14286do_vfp_nsyn_mla_mls (enum neon_shape rs)
14287{
14288  int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
14289
14290  if (rs == NS_FFF || rs == NS_HHH)
14291    {
14292      if (is_mla)
14293	do_vfp_nsyn_opcode ("fmacs");
14294      else
14295	do_vfp_nsyn_opcode ("fnmacs");
14296
14297      /* ARMv8.2 fp16 instruction.  */
14298      if (rs == NS_HHH)
14299	do_scalar_fp16_v82_encode ();
14300    }
14301  else
14302    {
14303      if (is_mla)
14304	do_vfp_nsyn_opcode ("fmacd");
14305      else
14306	do_vfp_nsyn_opcode ("fnmacd");
14307    }
14308}
14309
14310static void
14311do_vfp_nsyn_fma_fms (enum neon_shape rs)
14312{
14313  int is_fma = (inst.instruction & 0x0fffffff) == N_MNEM_vfma;
14314
14315  if (rs == NS_FFF || rs == NS_HHH)
14316    {
14317      if (is_fma)
14318	do_vfp_nsyn_opcode ("ffmas");
14319      else
14320	do_vfp_nsyn_opcode ("ffnmas");
14321
14322      /* ARMv8.2 fp16 instruction.  */
14323      if (rs == NS_HHH)
14324	do_scalar_fp16_v82_encode ();
14325    }
14326  else
14327    {
14328      if (is_fma)
14329	do_vfp_nsyn_opcode ("ffmad");
14330      else
14331	do_vfp_nsyn_opcode ("ffnmad");
14332    }
14333}
14334
14335static void
14336do_vfp_nsyn_mul (enum neon_shape rs)
14337{
14338  if (rs == NS_FFF || rs == NS_HHH)
14339    {
14340      do_vfp_nsyn_opcode ("fmuls");
14341
14342      /* ARMv8.2 fp16 instruction.  */
14343      if (rs == NS_HHH)
14344	do_scalar_fp16_v82_encode ();
14345    }
14346  else
14347    do_vfp_nsyn_opcode ("fmuld");
14348}
14349
14350static void
14351do_vfp_nsyn_abs_neg (enum neon_shape rs)
14352{
14353  int is_neg = (inst.instruction & 0x80) != 0;
14354  neon_check_type (2, rs, N_EQK | N_VFP, N_F_ALL | N_VFP | N_KEY);
14355
14356  if (rs == NS_FF || rs == NS_HH)
14357    {
14358      if (is_neg)
14359	do_vfp_nsyn_opcode ("fnegs");
14360      else
14361	do_vfp_nsyn_opcode ("fabss");
14362
14363      /* ARMv8.2 fp16 instruction.  */
14364      if (rs == NS_HH)
14365	do_scalar_fp16_v82_encode ();
14366    }
14367  else
14368    {
14369      if (is_neg)
14370	do_vfp_nsyn_opcode ("fnegd");
14371      else
14372	do_vfp_nsyn_opcode ("fabsd");
14373    }
14374}
14375
14376/* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
14377   insns belong to Neon, and are handled elsewhere.  */
14378
14379static void
14380do_vfp_nsyn_ldm_stm (int is_dbmode)
14381{
14382  int is_ldm = (inst.instruction & (1 << 20)) != 0;
14383  if (is_ldm)
14384    {
14385      if (is_dbmode)
14386	do_vfp_nsyn_opcode ("fldmdbs");
14387      else
14388	do_vfp_nsyn_opcode ("fldmias");
14389    }
14390  else
14391    {
14392      if (is_dbmode)
14393	do_vfp_nsyn_opcode ("fstmdbs");
14394      else
14395	do_vfp_nsyn_opcode ("fstmias");
14396    }
14397}
14398
14399static void
14400do_vfp_nsyn_sqrt (void)
14401{
14402  enum neon_shape rs = neon_select_shape (NS_HH, NS_FF, NS_DD, NS_NULL);
14403  neon_check_type (2, rs, N_EQK | N_VFP, N_F_ALL | N_KEY | N_VFP);
14404
14405  if (rs == NS_FF || rs == NS_HH)
14406    {
14407      do_vfp_nsyn_opcode ("fsqrts");
14408
14409      /* ARMv8.2 fp16 instruction.  */
14410      if (rs == NS_HH)
14411	do_scalar_fp16_v82_encode ();
14412    }
14413  else
14414    do_vfp_nsyn_opcode ("fsqrtd");
14415}
14416
14417static void
14418do_vfp_nsyn_div (void)
14419{
14420  enum neon_shape rs = neon_select_shape (NS_HHH, NS_FFF, NS_DDD, NS_NULL);
14421  neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
14422		   N_F_ALL | N_KEY | N_VFP);
14423
14424  if (rs == NS_FFF || rs == NS_HHH)
14425    {
14426      do_vfp_nsyn_opcode ("fdivs");
14427
14428      /* ARMv8.2 fp16 instruction.  */
14429      if (rs == NS_HHH)
14430	do_scalar_fp16_v82_encode ();
14431    }
14432  else
14433    do_vfp_nsyn_opcode ("fdivd");
14434}
14435
14436static void
14437do_vfp_nsyn_nmul (void)
14438{
14439  enum neon_shape rs = neon_select_shape (NS_HHH, NS_FFF, NS_DDD, NS_NULL);
14440  neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
14441		   N_F_ALL | N_KEY | N_VFP);
14442
14443  if (rs == NS_FFF || rs == NS_HHH)
14444    {
14445      NEON_ENCODE (SINGLE, inst);
14446      do_vfp_sp_dyadic ();
14447
14448      /* ARMv8.2 fp16 instruction.  */
14449      if (rs == NS_HHH)
14450	do_scalar_fp16_v82_encode ();
14451    }
14452  else
14453    {
14454      NEON_ENCODE (DOUBLE, inst);
14455      do_vfp_dp_rd_rn_rm ();
14456    }
14457  do_vfp_cond_or_thumb ();
14458
14459}
14460
14461static void
14462do_vfp_nsyn_cmp (void)
14463{
14464  enum neon_shape rs;
14465  if (inst.operands[1].isreg)
14466    {
14467      rs = neon_select_shape (NS_HH, NS_FF, NS_DD, NS_NULL);
14468      neon_check_type (2, rs, N_EQK | N_VFP, N_F_ALL | N_KEY | N_VFP);
14469
14470      if (rs == NS_FF || rs == NS_HH)
14471	{
14472	  NEON_ENCODE (SINGLE, inst);
14473	  do_vfp_sp_monadic ();
14474	}
14475      else
14476	{
14477	  NEON_ENCODE (DOUBLE, inst);
14478	  do_vfp_dp_rd_rm ();
14479	}
14480    }
14481  else
14482    {
14483      rs = neon_select_shape (NS_HI, NS_FI, NS_DI, NS_NULL);
14484      neon_check_type (2, rs, N_F_ALL | N_KEY | N_VFP, N_EQK);
14485
14486      switch (inst.instruction & 0x0fffffff)
14487	{
14488	case N_MNEM_vcmp:
14489	  inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
14490	  break;
14491	case N_MNEM_vcmpe:
14492	  inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
14493	  break;
14494	default:
14495	  abort ();
14496	}
14497
14498      if (rs == NS_FI || rs == NS_HI)
14499	{
14500	  NEON_ENCODE (SINGLE, inst);
14501	  do_vfp_sp_compare_z ();
14502	}
14503      else
14504	{
14505	  NEON_ENCODE (DOUBLE, inst);
14506	  do_vfp_dp_rd ();
14507	}
14508    }
14509  do_vfp_cond_or_thumb ();
14510
14511  /* ARMv8.2 fp16 instruction.  */
14512  if (rs == NS_HI || rs == NS_HH)
14513    do_scalar_fp16_v82_encode ();
14514}
14515
14516static void
14517nsyn_insert_sp (void)
14518{
14519  inst.operands[1] = inst.operands[0];
14520  memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
14521  inst.operands[0].reg = REG_SP;
14522  inst.operands[0].isreg = 1;
14523  inst.operands[0].writeback = 1;
14524  inst.operands[0].present = 1;
14525}
14526
14527static void
14528do_vfp_nsyn_push (void)
14529{
14530  nsyn_insert_sp ();
14531
14532  constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
14533	      _("register list must contain at least 1 and at most 16 "
14534		"registers"));
14535
14536  if (inst.operands[1].issingle)
14537    do_vfp_nsyn_opcode ("fstmdbs");
14538  else
14539    do_vfp_nsyn_opcode ("fstmdbd");
14540}
14541
14542static void
14543do_vfp_nsyn_pop (void)
14544{
14545  nsyn_insert_sp ();
14546
14547  constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
14548	      _("register list must contain at least 1 and at most 16 "
14549		"registers"));
14550
14551  if (inst.operands[1].issingle)
14552    do_vfp_nsyn_opcode ("fldmias");
14553  else
14554    do_vfp_nsyn_opcode ("fldmiad");
14555}
14556
14557/* Fix up Neon data-processing instructions, ORing in the correct bits for
14558   ARM mode or Thumb mode and moving the encoded bit 24 to bit 28.  */
14559
14560static void
14561neon_dp_fixup (struct arm_it* insn)
14562{
14563  unsigned int i = insn->instruction;
14564  insn->is_neon = 1;
14565
14566  if (thumb_mode)
14567    {
14568      /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode.  */
14569      if (i & (1 << 24))
14570	i |= 1 << 28;
14571
14572      i &= ~(1 << 24);
14573
14574      i |= 0xef000000;
14575    }
14576  else
14577    i |= 0xf2000000;
14578
14579  insn->instruction = i;
14580}
14581
14582/* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
14583   (0, 1, 2, 3).  */
14584
14585static unsigned
14586neon_logbits (unsigned x)
14587{
14588  return ffs (x) - 4;
14589}
14590
14591#define LOW4(R) ((R) & 0xf)
14592#define HI1(R) (((R) >> 4) & 1)
14593
14594/* Encode insns with bit pattern:
14595
14596  |28/24|23|22 |21 20|19 16|15 12|11    8|7|6|5|4|3  0|
14597  |  U  |x |D  |size | Rn  | Rd  |x x x x|N|Q|M|x| Rm |
14598
14599  SIZE is passed in bits. -1 means size field isn't changed, in case it has a
14600  different meaning for some instruction.  */
14601
14602static void
14603neon_three_same (int isquad, int ubit, int size)
14604{
14605  inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14606  inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14607  inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14608  inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14609  inst.instruction |= LOW4 (inst.operands[2].reg);
14610  inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14611  inst.instruction |= (isquad != 0) << 6;
14612  inst.instruction |= (ubit != 0) << 24;
14613  if (size != -1)
14614    inst.instruction |= neon_logbits (size) << 20;
14615
14616  neon_dp_fixup (&inst);
14617}
14618
14619/* Encode instructions of the form:
14620
14621  |28/24|23|22|21 20|19 18|17 16|15 12|11      7|6|5|4|3  0|
14622  |  U  |x |D |x  x |size |x  x | Rd  |x x x x x|Q|M|x| Rm |
14623
14624  Don't write size if SIZE == -1.  */
14625
14626static void
14627neon_two_same (int qbit, int ubit, int size)
14628{
14629  inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14630  inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14631  inst.instruction |= LOW4 (inst.operands[1].reg);
14632  inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14633  inst.instruction |= (qbit != 0) << 6;
14634  inst.instruction |= (ubit != 0) << 24;
14635
14636  if (size != -1)
14637    inst.instruction |= neon_logbits (size) << 18;
14638
14639  neon_dp_fixup (&inst);
14640}
14641
14642/* Neon instruction encoders, in approximate order of appearance.  */
14643
14644static void
14645do_neon_dyadic_i_su (void)
14646{
14647  enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14648  struct neon_type_el et = neon_check_type (3, rs,
14649    N_EQK, N_EQK, N_SU_32 | N_KEY);
14650  neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
14651}
14652
14653static void
14654do_neon_dyadic_i64_su (void)
14655{
14656  enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14657  struct neon_type_el et = neon_check_type (3, rs,
14658    N_EQK, N_EQK, N_SU_ALL | N_KEY);
14659  neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
14660}
14661
14662static void
14663neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
14664		unsigned immbits)
14665{
14666  unsigned size = et.size >> 3;
14667  inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14668  inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14669  inst.instruction |= LOW4 (inst.operands[1].reg);
14670  inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14671  inst.instruction |= (isquad != 0) << 6;
14672  inst.instruction |= immbits << 16;
14673  inst.instruction |= (size >> 3) << 7;
14674  inst.instruction |= (size & 0x7) << 19;
14675  if (write_ubit)
14676    inst.instruction |= (uval != 0) << 24;
14677
14678  neon_dp_fixup (&inst);
14679}
14680
14681static void
14682do_neon_shl_imm (void)
14683{
14684  if (!inst.operands[2].isreg)
14685    {
14686      enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14687      struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
14688      int imm = inst.operands[2].imm;
14689
14690      constraint (imm < 0 || (unsigned)imm >= et.size,
14691		  _("immediate out of range for shift"));
14692      NEON_ENCODE (IMMED, inst);
14693      neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
14694    }
14695  else
14696    {
14697      enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14698      struct neon_type_el et = neon_check_type (3, rs,
14699	N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
14700      unsigned int tmp;
14701
14702      /* VSHL/VQSHL 3-register variants have syntax such as:
14703	   vshl.xx Dd, Dm, Dn
14704	 whereas other 3-register operations encoded by neon_three_same have
14705	 syntax like:
14706	   vadd.xx Dd, Dn, Dm
14707	 (i.e. with Dn & Dm reversed). Swap operands[1].reg and operands[2].reg
14708	 here.  */
14709      tmp = inst.operands[2].reg;
14710      inst.operands[2].reg = inst.operands[1].reg;
14711      inst.operands[1].reg = tmp;
14712      NEON_ENCODE (INTEGER, inst);
14713      neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
14714    }
14715}
14716
14717static void
14718do_neon_qshl_imm (void)
14719{
14720  if (!inst.operands[2].isreg)
14721    {
14722      enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
14723      struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
14724      int imm = inst.operands[2].imm;
14725
14726      constraint (imm < 0 || (unsigned)imm >= et.size,
14727		  _("immediate out of range for shift"));
14728      NEON_ENCODE (IMMED, inst);
14729      neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et, imm);
14730    }
14731  else
14732    {
14733      enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14734      struct neon_type_el et = neon_check_type (3, rs,
14735	N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
14736      unsigned int tmp;
14737
14738      /* See note in do_neon_shl_imm.  */
14739      tmp = inst.operands[2].reg;
14740      inst.operands[2].reg = inst.operands[1].reg;
14741      inst.operands[1].reg = tmp;
14742      NEON_ENCODE (INTEGER, inst);
14743      neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
14744    }
14745}
14746
14747static void
14748do_neon_rshl (void)
14749{
14750  enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14751  struct neon_type_el et = neon_check_type (3, rs,
14752    N_EQK, N_EQK, N_SU_ALL | N_KEY);
14753  unsigned int tmp;
14754
14755  tmp = inst.operands[2].reg;
14756  inst.operands[2].reg = inst.operands[1].reg;
14757  inst.operands[1].reg = tmp;
14758  neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
14759}
14760
14761static int
14762neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
14763{
14764  /* Handle .I8 pseudo-instructions.  */
14765  if (size == 8)
14766    {
14767      /* Unfortunately, this will make everything apart from zero out-of-range.
14768	 FIXME is this the intended semantics? There doesn't seem much point in
14769	 accepting .I8 if so.  */
14770      immediate |= immediate << 8;
14771      size = 16;
14772    }
14773
14774  if (size >= 32)
14775    {
14776      if (immediate == (immediate & 0x000000ff))
14777	{
14778	  *immbits = immediate;
14779	  return 0x1;
14780	}
14781      else if (immediate == (immediate & 0x0000ff00))
14782	{
14783	  *immbits = immediate >> 8;
14784	  return 0x3;
14785	}
14786      else if (immediate == (immediate & 0x00ff0000))
14787	{
14788	  *immbits = immediate >> 16;
14789	  return 0x5;
14790	}
14791      else if (immediate == (immediate & 0xff000000))
14792	{
14793	  *immbits = immediate >> 24;
14794	  return 0x7;
14795	}
14796      if ((immediate & 0xffff) != (immediate >> 16))
14797	goto bad_immediate;
14798      immediate &= 0xffff;
14799    }
14800
14801  if (immediate == (immediate & 0x000000ff))
14802    {
14803      *immbits = immediate;
14804      return 0x9;
14805    }
14806  else if (immediate == (immediate & 0x0000ff00))
14807    {
14808      *immbits = immediate >> 8;
14809      return 0xb;
14810    }
14811
14812  bad_immediate:
14813  first_error (_("immediate value out of range"));
14814  return FAIL;
14815}
14816
14817static void
14818do_neon_logic (void)
14819{
14820  if (inst.operands[2].present && inst.operands[2].isreg)
14821    {
14822      enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14823      neon_check_type (3, rs, N_IGNORE_TYPE);
14824      /* U bit and size field were set as part of the bitmask.  */
14825      NEON_ENCODE (INTEGER, inst);
14826      neon_three_same (neon_quad (rs), 0, -1);
14827    }
14828  else
14829    {
14830      const int three_ops_form = (inst.operands[2].present
14831				  && !inst.operands[2].isreg);
14832      const int immoperand = (three_ops_form ? 2 : 1);
14833      enum neon_shape rs = (three_ops_form
14834			    ? neon_select_shape (NS_DDI, NS_QQI, NS_NULL)
14835			    : neon_select_shape (NS_DI, NS_QI, NS_NULL));
14836      struct neon_type_el et = neon_check_type (2, rs,
14837	N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
14838      enum neon_opc opcode = (enum neon_opc) inst.instruction & 0x0fffffff;
14839      unsigned immbits;
14840      int cmode;
14841
14842      if (et.type == NT_invtype)
14843	return;
14844
14845      if (three_ops_form)
14846	constraint (inst.operands[0].reg != inst.operands[1].reg,
14847		    _("first and second operands shall be the same register"));
14848
14849      NEON_ENCODE (IMMED, inst);
14850
14851      immbits = inst.operands[immoperand].imm;
14852      if (et.size == 64)
14853	{
14854	  /* .i64 is a pseudo-op, so the immediate must be a repeating
14855	     pattern.  */
14856	  if (immbits != (inst.operands[immoperand].regisimm ?
14857			  inst.operands[immoperand].reg : 0))
14858	    {
14859	      /* Set immbits to an invalid constant.  */
14860	      immbits = 0xdeadbeef;
14861	    }
14862	}
14863
14864      switch (opcode)
14865	{
14866	case N_MNEM_vbic:
14867	  cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
14868	  break;
14869
14870	case N_MNEM_vorr:
14871	  cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
14872	  break;
14873
14874	case N_MNEM_vand:
14875	  /* Pseudo-instruction for VBIC.  */
14876	  neon_invert_size (&immbits, 0, et.size);
14877	  cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
14878	  break;
14879
14880	case N_MNEM_vorn:
14881	  /* Pseudo-instruction for VORR.  */
14882	  neon_invert_size (&immbits, 0, et.size);
14883	  cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
14884	  break;
14885
14886	default:
14887	  abort ();
14888	}
14889
14890      if (cmode == FAIL)
14891	return;
14892
14893      inst.instruction |= neon_quad (rs) << 6;
14894      inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14895      inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14896      inst.instruction |= cmode << 8;
14897      neon_write_immbits (immbits);
14898
14899      neon_dp_fixup (&inst);
14900    }
14901}
14902
14903static void
14904do_neon_bitfield (void)
14905{
14906  enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14907  neon_check_type (3, rs, N_IGNORE_TYPE);
14908  neon_three_same (neon_quad (rs), 0, -1);
14909}
14910
14911static void
14912neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
14913		  unsigned destbits)
14914{
14915  enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
14916  struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
14917					    types | N_KEY);
14918  if (et.type == NT_float)
14919    {
14920      NEON_ENCODE (FLOAT, inst);
14921      neon_three_same (neon_quad (rs), 0, et.size == 16 ? (int) et.size : -1);
14922    }
14923  else
14924    {
14925      NEON_ENCODE (INTEGER, inst);
14926      neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
14927    }
14928}
14929
14930static void
14931do_neon_dyadic_if_su (void)
14932{
14933  neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
14934}
14935
14936static void
14937do_neon_dyadic_if_su_d (void)
14938{
14939  /* This version only allow D registers, but that constraint is enforced during
14940     operand parsing so we don't need to do anything extra here.  */
14941  neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
14942}
14943
14944static void
14945do_neon_dyadic_if_i_d (void)
14946{
14947  /* The "untyped" case can't happen. Do this to stop the "U" bit being
14948     affected if we specify unsigned args.  */
14949  neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14950}
14951
14952enum vfp_or_neon_is_neon_bits
14953{
14954  NEON_CHECK_CC = 1,
14955  NEON_CHECK_ARCH = 2,
14956  NEON_CHECK_ARCH8 = 4
14957};
14958
14959/* Call this function if an instruction which may have belonged to the VFP or
14960   Neon instruction sets, but turned out to be a Neon instruction (due to the
14961   operand types involved, etc.). We have to check and/or fix-up a couple of
14962   things:
14963
14964     - Make sure the user hasn't attempted to make a Neon instruction
14965       conditional.
14966     - Alter the value in the condition code field if necessary.
14967     - Make sure that the arch supports Neon instructions.
14968
14969   Which of these operations take place depends on bits from enum
14970   vfp_or_neon_is_neon_bits.
14971
14972   WARNING: This function has side effects! If NEON_CHECK_CC is used and the
14973   current instruction's condition is COND_ALWAYS, the condition field is
14974   changed to inst.uncond_value. This is necessary because instructions shared
14975   between VFP and Neon may be conditional for the VFP variants only, and the
14976   unconditional Neon version must have, e.g., 0xF in the condition field.  */
14977
14978static int
14979vfp_or_neon_is_neon (unsigned check)
14980{
14981  /* Conditions are always legal in Thumb mode (IT blocks).  */
14982  if (!thumb_mode && (check & NEON_CHECK_CC))
14983    {
14984      if (inst.cond != COND_ALWAYS)
14985	{
14986	  first_error (_(BAD_COND));
14987	  return FAIL;
14988	}
14989      if (inst.uncond_value != -1)
14990	inst.instruction |= inst.uncond_value << 28;
14991    }
14992
14993  if ((check & NEON_CHECK_ARCH)
14994      && !mark_feature_used (&fpu_neon_ext_v1))
14995    {
14996      first_error (_(BAD_FPU));
14997      return FAIL;
14998    }
14999
15000  if ((check & NEON_CHECK_ARCH8)
15001      && !mark_feature_used (&fpu_neon_ext_armv8))
15002    {
15003      first_error (_(BAD_FPU));
15004      return FAIL;
15005    }
15006
15007  return SUCCESS;
15008}
15009
15010static void
15011do_neon_addsub_if_i (void)
15012{
15013  if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
15014    return;
15015
15016  if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15017    return;
15018
15019  /* The "untyped" case can't happen. Do this to stop the "U" bit being
15020     affected if we specify unsigned args.  */
15021  neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
15022}
15023
15024/* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
15025   result to be:
15026     V<op> A,B     (A is operand 0, B is operand 2)
15027   to mean:
15028     V<op> A,B,A
15029   not:
15030     V<op> A,B,B
15031   so handle that case specially.  */
15032
15033static void
15034neon_exchange_operands (void)
15035{
15036  if (inst.operands[1].present)
15037    {
15038      void *scratch = xmalloc (sizeof (inst.operands[0]));
15039
15040      /* Swap operands[1] and operands[2].  */
15041      memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
15042      inst.operands[1] = inst.operands[2];
15043      memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
15044      free (scratch);
15045    }
15046  else
15047    {
15048      inst.operands[1] = inst.operands[2];
15049      inst.operands[2] = inst.operands[0];
15050    }
15051}
15052
15053static void
15054neon_compare (unsigned regtypes, unsigned immtypes, int invert)
15055{
15056  if (inst.operands[2].isreg)
15057    {
15058      if (invert)
15059	neon_exchange_operands ();
15060      neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
15061    }
15062  else
15063    {
15064      enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
15065      struct neon_type_el et = neon_check_type (2, rs,
15066	N_EQK | N_SIZ, immtypes | N_KEY);
15067
15068      NEON_ENCODE (IMMED, inst);
15069      inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15070      inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15071      inst.instruction |= LOW4 (inst.operands[1].reg);
15072      inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15073      inst.instruction |= neon_quad (rs) << 6;
15074      inst.instruction |= (et.type == NT_float) << 10;
15075      inst.instruction |= neon_logbits (et.size) << 18;
15076
15077      neon_dp_fixup (&inst);
15078    }
15079}
15080
15081static void
15082do_neon_cmp (void)
15083{
15084  neon_compare (N_SUF_32, N_S_32 | N_F_16_32, FALSE);
15085}
15086
15087static void
15088do_neon_cmp_inv (void)
15089{
15090  neon_compare (N_SUF_32, N_S_32 | N_F_16_32, TRUE);
15091}
15092
15093static void
15094do_neon_ceq (void)
15095{
15096  neon_compare (N_IF_32, N_IF_32, FALSE);
15097}
15098
15099/* For multiply instructions, we have the possibility of 16-bit or 32-bit
15100   scalars, which are encoded in 5 bits, M : Rm.
15101   For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
15102   M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
15103   index in M.
15104
15105   Dot Product instructions are similar to multiply instructions except elsize
15106   should always be 32.
15107
15108   This function translates SCALAR, which is GAS's internal encoding of indexed
15109   scalar register, to raw encoding.  There is also register and index range
15110   check based on ELSIZE.  */
15111
15112static unsigned
15113neon_scalar_for_mul (unsigned scalar, unsigned elsize)
15114{
15115  unsigned regno = NEON_SCALAR_REG (scalar);
15116  unsigned elno = NEON_SCALAR_INDEX (scalar);
15117
15118  switch (elsize)
15119    {
15120    case 16:
15121      if (regno > 7 || elno > 3)
15122	goto bad_scalar;
15123      return regno | (elno << 3);
15124
15125    case 32:
15126      if (regno > 15 || elno > 1)
15127	goto bad_scalar;
15128      return regno | (elno << 4);
15129
15130    default:
15131    bad_scalar:
15132      first_error (_("scalar out of range for multiply instruction"));
15133    }
15134
15135  return 0;
15136}
15137
15138/* Encode multiply / multiply-accumulate scalar instructions.  */
15139
15140static void
15141neon_mul_mac (struct neon_type_el et, int ubit)
15142{
15143  unsigned scalar;
15144
15145  /* Give a more helpful error message if we have an invalid type.  */
15146  if (et.type == NT_invtype)
15147    return;
15148
15149  scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
15150  inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15151  inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15152  inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15153  inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15154  inst.instruction |= LOW4 (scalar);
15155  inst.instruction |= HI1 (scalar) << 5;
15156  inst.instruction |= (et.type == NT_float) << 8;
15157  inst.instruction |= neon_logbits (et.size) << 20;
15158  inst.instruction |= (ubit != 0) << 24;
15159
15160  neon_dp_fixup (&inst);
15161}
15162
15163static void
15164do_neon_mac_maybe_scalar (void)
15165{
15166  if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
15167    return;
15168
15169  if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15170    return;
15171
15172  if (inst.operands[2].isscalar)
15173    {
15174      enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
15175      struct neon_type_el et = neon_check_type (3, rs,
15176	N_EQK, N_EQK, N_I16 | N_I32 | N_F_16_32 | N_KEY);
15177      NEON_ENCODE (SCALAR, inst);
15178      neon_mul_mac (et, neon_quad (rs));
15179    }
15180  else
15181    {
15182      /* The "untyped" case can't happen.  Do this to stop the "U" bit being
15183	 affected if we specify unsigned args.  */
15184      neon_dyadic_misc (NT_untyped, N_IF_32, 0);
15185    }
15186}
15187
15188static void
15189do_neon_fmac (void)
15190{
15191  if (try_vfp_nsyn (3, do_vfp_nsyn_fma_fms) == SUCCESS)
15192    return;
15193
15194  if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15195    return;
15196
15197  neon_dyadic_misc (NT_untyped, N_IF_32, 0);
15198}
15199
15200static void
15201do_neon_tst (void)
15202{
15203  enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
15204  struct neon_type_el et = neon_check_type (3, rs,
15205    N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
15206  neon_three_same (neon_quad (rs), 0, et.size);
15207}
15208
15209/* VMUL with 3 registers allows the P8 type. The scalar version supports the
15210   same types as the MAC equivalents. The polynomial type for this instruction
15211   is encoded the same as the integer type.  */
15212
15213static void
15214do_neon_mul (void)
15215{
15216  if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
15217    return;
15218
15219  if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15220    return;
15221
15222  if (inst.operands[2].isscalar)
15223    do_neon_mac_maybe_scalar ();
15224  else
15225    neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F16 | N_F32 | N_P8, 0);
15226}
15227
15228static void
15229do_neon_qdmulh (void)
15230{
15231  if (inst.operands[2].isscalar)
15232    {
15233      enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
15234      struct neon_type_el et = neon_check_type (3, rs,
15235	N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
15236      NEON_ENCODE (SCALAR, inst);
15237      neon_mul_mac (et, neon_quad (rs));
15238    }
15239  else
15240    {
15241      enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
15242      struct neon_type_el et = neon_check_type (3, rs,
15243	N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
15244      NEON_ENCODE (INTEGER, inst);
15245      /* The U bit (rounding) comes from bit mask.  */
15246      neon_three_same (neon_quad (rs), 0, et.size);
15247    }
15248}
15249
15250static void
15251do_neon_qrdmlah (void)
15252{
15253  /* Check we're on the correct architecture.  */
15254  if (!mark_feature_used (&fpu_neon_ext_armv8))
15255    inst.error =
15256      _("instruction form not available on this architecture.");
15257  else if (!mark_feature_used (&fpu_neon_ext_v8_1))
15258    {
15259      as_warn (_("this instruction implies use of ARMv8.1 AdvSIMD."));
15260      record_feature_use (&fpu_neon_ext_v8_1);
15261    }
15262
15263  if (inst.operands[2].isscalar)
15264    {
15265      enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
15266      struct neon_type_el et = neon_check_type (3, rs,
15267	N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
15268      NEON_ENCODE (SCALAR, inst);
15269      neon_mul_mac (et, neon_quad (rs));
15270    }
15271  else
15272    {
15273      enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
15274      struct neon_type_el et = neon_check_type (3, rs,
15275	N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
15276      NEON_ENCODE (INTEGER, inst);
15277      /* The U bit (rounding) comes from bit mask.  */
15278      neon_three_same (neon_quad (rs), 0, et.size);
15279    }
15280}
15281
15282static void
15283do_neon_fcmp_absolute (void)
15284{
15285  enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
15286  struct neon_type_el et = neon_check_type (3, rs, N_EQK, N_EQK,
15287					    N_F_16_32 | N_KEY);
15288  /* Size field comes from bit mask.  */
15289  neon_three_same (neon_quad (rs), 1, et.size == 16 ? (int) et.size : -1);
15290}
15291
15292static void
15293do_neon_fcmp_absolute_inv (void)
15294{
15295  neon_exchange_operands ();
15296  do_neon_fcmp_absolute ();
15297}
15298
15299static void
15300do_neon_step (void)
15301{
15302  enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
15303  struct neon_type_el et = neon_check_type (3, rs, N_EQK, N_EQK,
15304					    N_F_16_32 | N_KEY);
15305  neon_three_same (neon_quad (rs), 0, et.size == 16 ? (int) et.size : -1);
15306}
15307
15308static void
15309do_neon_abs_neg (void)
15310{
15311  enum neon_shape rs;
15312  struct neon_type_el et;
15313
15314  if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
15315    return;
15316
15317  if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15318    return;
15319
15320  rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15321  et = neon_check_type (2, rs, N_EQK, N_S_32 | N_F_16_32 | N_KEY);
15322
15323  inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15324  inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15325  inst.instruction |= LOW4 (inst.operands[1].reg);
15326  inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15327  inst.instruction |= neon_quad (rs) << 6;
15328  inst.instruction |= (et.type == NT_float) << 10;
15329  inst.instruction |= neon_logbits (et.size) << 18;
15330
15331  neon_dp_fixup (&inst);
15332}
15333
15334static void
15335do_neon_sli (void)
15336{
15337  enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
15338  struct neon_type_el et = neon_check_type (2, rs,
15339    N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
15340  int imm = inst.operands[2].imm;
15341  constraint (imm < 0 || (unsigned)imm >= et.size,
15342	      _("immediate out of range for insert"));
15343  neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
15344}
15345
15346static void
15347do_neon_sri (void)
15348{
15349  enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
15350  struct neon_type_el et = neon_check_type (2, rs,
15351    N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
15352  int imm = inst.operands[2].imm;
15353  constraint (imm < 1 || (unsigned)imm > et.size,
15354	      _("immediate out of range for insert"));
15355  neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
15356}
15357
15358static void
15359do_neon_qshlu_imm (void)
15360{
15361  enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
15362  struct neon_type_el et = neon_check_type (2, rs,
15363    N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
15364  int imm = inst.operands[2].imm;
15365  constraint (imm < 0 || (unsigned)imm >= et.size,
15366	      _("immediate out of range for shift"));
15367  /* Only encodes the 'U present' variant of the instruction.
15368     In this case, signed types have OP (bit 8) set to 0.
15369     Unsigned types have OP set to 1.  */
15370  inst.instruction |= (et.type == NT_unsigned) << 8;
15371  /* The rest of the bits are the same as other immediate shifts.  */
15372  neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
15373}
15374
15375static void
15376do_neon_qmovn (void)
15377{
15378  struct neon_type_el et = neon_check_type (2, NS_DQ,
15379    N_EQK | N_HLF, N_SU_16_64 | N_KEY);
15380  /* Saturating move where operands can be signed or unsigned, and the
15381     destination has the same signedness.  */
15382  NEON_ENCODE (INTEGER, inst);
15383  if (et.type == NT_unsigned)
15384    inst.instruction |= 0xc0;
15385  else
15386    inst.instruction |= 0x80;
15387  neon_two_same (0, 1, et.size / 2);
15388}
15389
15390static void
15391do_neon_qmovun (void)
15392{
15393  struct neon_type_el et = neon_check_type (2, NS_DQ,
15394    N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
15395  /* Saturating move with unsigned results. Operands must be signed.  */
15396  NEON_ENCODE (INTEGER, inst);
15397  neon_two_same (0, 1, et.size / 2);
15398}
15399
15400static void
15401do_neon_rshift_sat_narrow (void)
15402{
15403  /* FIXME: Types for narrowing. If operands are signed, results can be signed
15404     or unsigned. If operands are unsigned, results must also be unsigned.  */
15405  struct neon_type_el et = neon_check_type (2, NS_DQI,
15406    N_EQK | N_HLF, N_SU_16_64 | N_KEY);
15407  int imm = inst.operands[2].imm;
15408  /* This gets the bounds check, size encoding and immediate bits calculation
15409     right.  */
15410  et.size /= 2;
15411
15412  /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
15413     VQMOVN.I<size> <Dd>, <Qm>.  */
15414  if (imm == 0)
15415    {
15416      inst.operands[2].present = 0;
15417      inst.instruction = N_MNEM_vqmovn;
15418      do_neon_qmovn ();
15419      return;
15420    }
15421
15422  constraint (imm < 1 || (unsigned)imm > et.size,
15423	      _("immediate out of range"));
15424  neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
15425}
15426
15427static void
15428do_neon_rshift_sat_narrow_u (void)
15429{
15430  /* FIXME: Types for narrowing. If operands are signed, results can be signed
15431     or unsigned. If operands are unsigned, results must also be unsigned.  */
15432  struct neon_type_el et = neon_check_type (2, NS_DQI,
15433    N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
15434  int imm = inst.operands[2].imm;
15435  /* This gets the bounds check, size encoding and immediate bits calculation
15436     right.  */
15437  et.size /= 2;
15438
15439  /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
15440     VQMOVUN.I<size> <Dd>, <Qm>.  */
15441  if (imm == 0)
15442    {
15443      inst.operands[2].present = 0;
15444      inst.instruction = N_MNEM_vqmovun;
15445      do_neon_qmovun ();
15446      return;
15447    }
15448
15449  constraint (imm < 1 || (unsigned)imm > et.size,
15450	      _("immediate out of range"));
15451  /* FIXME: The manual is kind of unclear about what value U should have in
15452     VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
15453     must be 1.  */
15454  neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
15455}
15456
15457static void
15458do_neon_movn (void)
15459{
15460  struct neon_type_el et = neon_check_type (2, NS_DQ,
15461    N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
15462  NEON_ENCODE (INTEGER, inst);
15463  neon_two_same (0, 1, et.size / 2);
15464}
15465
15466static void
15467do_neon_rshift_narrow (void)
15468{
15469  struct neon_type_el et = neon_check_type (2, NS_DQI,
15470    N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
15471  int imm = inst.operands[2].imm;
15472  /* This gets the bounds check, size encoding and immediate bits calculation
15473     right.  */
15474  et.size /= 2;
15475
15476  /* If immediate is zero then we are a pseudo-instruction for
15477     VMOVN.I<size> <Dd>, <Qm>  */
15478  if (imm == 0)
15479    {
15480      inst.operands[2].present = 0;
15481      inst.instruction = N_MNEM_vmovn;
15482      do_neon_movn ();
15483      return;
15484    }
15485
15486  constraint (imm < 1 || (unsigned)imm > et.size,
15487	      _("immediate out of range for narrowing operation"));
15488  neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
15489}
15490
15491static void
15492do_neon_shll (void)
15493{
15494  /* FIXME: Type checking when lengthening.  */
15495  struct neon_type_el et = neon_check_type (2, NS_QDI,
15496    N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
15497  unsigned imm = inst.operands[2].imm;
15498
15499  if (imm == et.size)
15500    {
15501      /* Maximum shift variant.  */
15502      NEON_ENCODE (INTEGER, inst);
15503      inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15504      inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15505      inst.instruction |= LOW4 (inst.operands[1].reg);
15506      inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15507      inst.instruction |= neon_logbits (et.size) << 18;
15508
15509      neon_dp_fixup (&inst);
15510    }
15511  else
15512    {
15513      /* A more-specific type check for non-max versions.  */
15514      et = neon_check_type (2, NS_QDI,
15515	N_EQK | N_DBL, N_SU_32 | N_KEY);
15516      NEON_ENCODE (IMMED, inst);
15517      neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
15518    }
15519}
15520
15521/* Check the various types for the VCVT instruction, and return which version
15522   the current instruction is.  */
15523
15524#define CVT_FLAVOUR_VAR							      \
15525  CVT_VAR (s32_f32, N_S32, N_F32, whole_reg,   "ftosls", "ftosis", "ftosizs") \
15526  CVT_VAR (u32_f32, N_U32, N_F32, whole_reg,   "ftouls", "ftouis", "ftouizs") \
15527  CVT_VAR (f32_s32, N_F32, N_S32, whole_reg,   "fsltos", "fsitos", NULL)      \
15528  CVT_VAR (f32_u32, N_F32, N_U32, whole_reg,   "fultos", "fuitos", NULL)      \
15529  /* Half-precision conversions.  */					      \
15530  CVT_VAR (s16_f16, N_S16, N_F16 | N_KEY, whole_reg, NULL, NULL, NULL)	      \
15531  CVT_VAR (u16_f16, N_U16, N_F16 | N_KEY, whole_reg, NULL, NULL, NULL)	      \
15532  CVT_VAR (f16_s16, N_F16 | N_KEY, N_S16, whole_reg, NULL, NULL, NULL)	      \
15533  CVT_VAR (f16_u16, N_F16 | N_KEY, N_U16, whole_reg, NULL, NULL, NULL)	      \
15534  CVT_VAR (f32_f16, N_F32, N_F16, whole_reg,   NULL,     NULL,     NULL)      \
15535  CVT_VAR (f16_f32, N_F16, N_F32, whole_reg,   NULL,     NULL,     NULL)      \
15536  /* New VCVT instructions introduced by ARMv8.2 fp16 extension.	      \
15537     Compared with single/double precision variants, only the co-processor    \
15538     field is different, so the encoding flow is reused here.  */	      \
15539  CVT_VAR (f16_s32, N_F16 | N_KEY, N_S32, N_VFP, "fsltos", "fsitos", NULL)    \
15540  CVT_VAR (f16_u32, N_F16 | N_KEY, N_U32, N_VFP, "fultos", "fuitos", NULL)    \
15541  CVT_VAR (u32_f16, N_U32, N_F16 | N_KEY, N_VFP, "ftouls", "ftouis", "ftouizs")\
15542  CVT_VAR (s32_f16, N_S32, N_F16 | N_KEY, N_VFP, "ftosls", "ftosis", "ftosizs")\
15543  /* VFP instructions.  */						      \
15544  CVT_VAR (f32_f64, N_F32, N_F64, N_VFP,       NULL,     "fcvtsd", NULL)      \
15545  CVT_VAR (f64_f32, N_F64, N_F32, N_VFP,       NULL,     "fcvtds", NULL)      \
15546  CVT_VAR (s32_f64, N_S32, N_F64 | key, N_VFP, "ftosld", "ftosid", "ftosizd") \
15547  CVT_VAR (u32_f64, N_U32, N_F64 | key, N_VFP, "ftould", "ftouid", "ftouizd") \
15548  CVT_VAR (f64_s32, N_F64 | key, N_S32, N_VFP, "fsltod", "fsitod", NULL)      \
15549  CVT_VAR (f64_u32, N_F64 | key, N_U32, N_VFP, "fultod", "fuitod", NULL)      \
15550  /* VFP instructions with bitshift.  */				      \
15551  CVT_VAR (f32_s16, N_F32 | key, N_S16, N_VFP, "fshtos", NULL,     NULL)      \
15552  CVT_VAR (f32_u16, N_F32 | key, N_U16, N_VFP, "fuhtos", NULL,     NULL)      \
15553  CVT_VAR (f64_s16, N_F64 | key, N_S16, N_VFP, "fshtod", NULL,     NULL)      \
15554  CVT_VAR (f64_u16, N_F64 | key, N_U16, N_VFP, "fuhtod", NULL,     NULL)      \
15555  CVT_VAR (s16_f32, N_S16, N_F32 | key, N_VFP, "ftoshs", NULL,     NULL)      \
15556  CVT_VAR (u16_f32, N_U16, N_F32 | key, N_VFP, "ftouhs", NULL,     NULL)      \
15557  CVT_VAR (s16_f64, N_S16, N_F64 | key, N_VFP, "ftoshd", NULL,     NULL)      \
15558  CVT_VAR (u16_f64, N_U16, N_F64 | key, N_VFP, "ftouhd", NULL,     NULL)
15559
15560#define CVT_VAR(C, X, Y, R, BSN, CN, ZN) \
15561  neon_cvt_flavour_##C,
15562
15563/* The different types of conversions we can do.  */
15564enum neon_cvt_flavour
15565{
15566  CVT_FLAVOUR_VAR
15567  neon_cvt_flavour_invalid,
15568  neon_cvt_flavour_first_fp = neon_cvt_flavour_f32_f64
15569};
15570
15571#undef CVT_VAR
15572
15573static enum neon_cvt_flavour
15574get_neon_cvt_flavour (enum neon_shape rs)
15575{
15576#define CVT_VAR(C,X,Y,R,BSN,CN,ZN)			\
15577  et = neon_check_type (2, rs, (R) | (X), (R) | (Y));	\
15578  if (et.type != NT_invtype)				\
15579    {							\
15580      inst.error = NULL;				\
15581      return (neon_cvt_flavour_##C);			\
15582    }
15583
15584  struct neon_type_el et;
15585  unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
15586			|| rs == NS_FF) ? N_VFP : 0;
15587  /* The instruction versions which take an immediate take one register
15588     argument, which is extended to the width of the full register. Thus the
15589     "source" and "destination" registers must have the same width.  Hack that
15590     here by making the size equal to the key (wider, in this case) operand.  */
15591  unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
15592
15593  CVT_FLAVOUR_VAR;
15594
15595  return neon_cvt_flavour_invalid;
15596#undef CVT_VAR
15597}
15598
15599enum neon_cvt_mode
15600{
15601  neon_cvt_mode_a,
15602  neon_cvt_mode_n,
15603  neon_cvt_mode_p,
15604  neon_cvt_mode_m,
15605  neon_cvt_mode_z,
15606  neon_cvt_mode_x,
15607  neon_cvt_mode_r
15608};
15609
15610/* Neon-syntax VFP conversions.  */
15611
15612static void
15613do_vfp_nsyn_cvt (enum neon_shape rs, enum neon_cvt_flavour flavour)
15614{
15615  const char *opname = 0;
15616
15617  if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI
15618      || rs == NS_FHI || rs == NS_HFI)
15619    {
15620      /* Conversions with immediate bitshift.  */
15621      const char *enc[] =
15622	{
15623#define CVT_VAR(C,A,B,R,BSN,CN,ZN) BSN,
15624	  CVT_FLAVOUR_VAR
15625	  NULL
15626#undef CVT_VAR
15627	};
15628
15629      if (flavour < (int) ARRAY_SIZE (enc))
15630	{
15631	  opname = enc[flavour];
15632	  constraint (inst.operands[0].reg != inst.operands[1].reg,
15633		      _("operands 0 and 1 must be the same register"));
15634	  inst.operands[1] = inst.operands[2];
15635	  memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
15636	}
15637    }
15638  else
15639    {
15640      /* Conversions without bitshift.  */
15641      const char *enc[] =
15642	{
15643#define CVT_VAR(C,A,B,R,BSN,CN,ZN) CN,
15644	  CVT_FLAVOUR_VAR
15645	  NULL
15646#undef CVT_VAR
15647	};
15648
15649      if (flavour < (int) ARRAY_SIZE (enc))
15650	opname = enc[flavour];
15651    }
15652
15653  if (opname)
15654    do_vfp_nsyn_opcode (opname);
15655
15656  /* ARMv8.2 fp16 VCVT instruction.  */
15657  if (flavour == neon_cvt_flavour_s32_f16
15658      || flavour == neon_cvt_flavour_u32_f16
15659      || flavour == neon_cvt_flavour_f16_u32
15660      || flavour == neon_cvt_flavour_f16_s32)
15661    do_scalar_fp16_v82_encode ();
15662}
15663
15664static void
15665do_vfp_nsyn_cvtz (void)
15666{
15667  enum neon_shape rs = neon_select_shape (NS_FH, NS_FF, NS_FD, NS_NULL);
15668  enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
15669  const char *enc[] =
15670    {
15671#define CVT_VAR(C,A,B,R,BSN,CN,ZN) ZN,
15672      CVT_FLAVOUR_VAR
15673      NULL
15674#undef CVT_VAR
15675    };
15676
15677  if (flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
15678    do_vfp_nsyn_opcode (enc[flavour]);
15679}
15680
15681static void
15682do_vfp_nsyn_cvt_fpv8 (enum neon_cvt_flavour flavour,
15683		      enum neon_cvt_mode mode)
15684{
15685  int sz, op;
15686  int rm;
15687
15688  /* Targets like FPv5-SP-D16 don't support FP v8 instructions with
15689     D register operands.  */
15690  if (flavour == neon_cvt_flavour_s32_f64
15691      || flavour == neon_cvt_flavour_u32_f64)
15692    constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
15693		_(BAD_FPU));
15694
15695  if (flavour == neon_cvt_flavour_s32_f16
15696      || flavour == neon_cvt_flavour_u32_f16)
15697    constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16),
15698		_(BAD_FP16));
15699
15700  set_it_insn_type (OUTSIDE_IT_INSN);
15701
15702  switch (flavour)
15703    {
15704    case neon_cvt_flavour_s32_f64:
15705      sz = 1;
15706      op = 1;
15707      break;
15708    case neon_cvt_flavour_s32_f32:
15709      sz = 0;
15710      op = 1;
15711      break;
15712    case neon_cvt_flavour_s32_f16:
15713      sz = 0;
15714      op = 1;
15715      break;
15716    case neon_cvt_flavour_u32_f64:
15717      sz = 1;
15718      op = 0;
15719      break;
15720    case neon_cvt_flavour_u32_f32:
15721      sz = 0;
15722      op = 0;
15723      break;
15724    case neon_cvt_flavour_u32_f16:
15725      sz = 0;
15726      op = 0;
15727      break;
15728    default:
15729      first_error (_("invalid instruction shape"));
15730      return;
15731    }
15732
15733  switch (mode)
15734    {
15735    case neon_cvt_mode_a: rm = 0; break;
15736    case neon_cvt_mode_n: rm = 1; break;
15737    case neon_cvt_mode_p: rm = 2; break;
15738    case neon_cvt_mode_m: rm = 3; break;
15739    default: first_error (_("invalid rounding mode")); return;
15740    }
15741
15742  NEON_ENCODE (FPV8, inst);
15743  encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
15744  encode_arm_vfp_reg (inst.operands[1].reg, sz == 1 ? VFP_REG_Dm : VFP_REG_Sm);
15745  inst.instruction |= sz << 8;
15746
15747  /* ARMv8.2 fp16 VCVT instruction.  */
15748  if (flavour == neon_cvt_flavour_s32_f16
15749      ||flavour == neon_cvt_flavour_u32_f16)
15750    do_scalar_fp16_v82_encode ();
15751  inst.instruction |= op << 7;
15752  inst.instruction |= rm << 16;
15753  inst.instruction |= 0xf0000000;
15754  inst.is_neon = TRUE;
15755}
15756
15757static void
15758do_neon_cvt_1 (enum neon_cvt_mode mode)
15759{
15760  enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
15761					  NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ,
15762					  NS_FH, NS_HF, NS_FHI, NS_HFI,
15763					  NS_NULL);
15764  enum neon_cvt_flavour flavour = get_neon_cvt_flavour (rs);
15765
15766  if (flavour == neon_cvt_flavour_invalid)
15767    return;
15768
15769  /* PR11109: Handle round-to-zero for VCVT conversions.  */
15770  if (mode == neon_cvt_mode_z
15771      && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_vfp_v2)
15772      && (flavour == neon_cvt_flavour_s16_f16
15773	  || flavour == neon_cvt_flavour_u16_f16
15774	  || flavour == neon_cvt_flavour_s32_f32
15775	  || flavour == neon_cvt_flavour_u32_f32
15776	  || flavour == neon_cvt_flavour_s32_f64
15777	  || flavour == neon_cvt_flavour_u32_f64)
15778      && (rs == NS_FD || rs == NS_FF))
15779    {
15780      do_vfp_nsyn_cvtz ();
15781      return;
15782    }
15783
15784  /* ARMv8.2 fp16 VCVT conversions.  */
15785  if (mode == neon_cvt_mode_z
15786      && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16)
15787      && (flavour == neon_cvt_flavour_s32_f16
15788	  || flavour == neon_cvt_flavour_u32_f16)
15789      && (rs == NS_FH))
15790    {
15791      do_vfp_nsyn_cvtz ();
15792      do_scalar_fp16_v82_encode ();
15793      return;
15794    }
15795
15796  /* VFP rather than Neon conversions.  */
15797  if (flavour >= neon_cvt_flavour_first_fp)
15798    {
15799      if (mode == neon_cvt_mode_x || mode == neon_cvt_mode_z)
15800	do_vfp_nsyn_cvt (rs, flavour);
15801      else
15802	do_vfp_nsyn_cvt_fpv8 (flavour, mode);
15803
15804      return;
15805    }
15806
15807  switch (rs)
15808    {
15809    case NS_DDI:
15810    case NS_QQI:
15811      {
15812	unsigned immbits;
15813	unsigned enctab[] = {0x0000100, 0x1000100, 0x0, 0x1000000,
15814			     0x0000100, 0x1000100, 0x0, 0x1000000};
15815
15816	if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15817	  return;
15818
15819	/* Fixed-point conversion with #0 immediate is encoded as an
15820	   integer conversion.  */
15821	if (inst.operands[2].present && inst.operands[2].imm == 0)
15822	  goto int_encode;
15823	NEON_ENCODE (IMMED, inst);
15824	if (flavour != neon_cvt_flavour_invalid)
15825	  inst.instruction |= enctab[flavour];
15826	inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15827	inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15828	inst.instruction |= LOW4 (inst.operands[1].reg);
15829	inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15830	inst.instruction |= neon_quad (rs) << 6;
15831	inst.instruction |= 1 << 21;
15832	if (flavour < neon_cvt_flavour_s16_f16)
15833	  {
15834	    inst.instruction |= 1 << 21;
15835	    immbits = 32 - inst.operands[2].imm;
15836	    inst.instruction |= immbits << 16;
15837	  }
15838	else
15839	  {
15840	    inst.instruction |= 3 << 20;
15841	    immbits = 16 - inst.operands[2].imm;
15842	    inst.instruction |= immbits << 16;
15843	    inst.instruction &= ~(1 << 9);
15844	  }
15845
15846	neon_dp_fixup (&inst);
15847      }
15848      break;
15849
15850    case NS_DD:
15851    case NS_QQ:
15852      if (mode != neon_cvt_mode_x && mode != neon_cvt_mode_z)
15853	{
15854	  NEON_ENCODE (FLOAT, inst);
15855	  set_it_insn_type (OUTSIDE_IT_INSN);
15856
15857	  if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
15858	    return;
15859
15860	  inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15861	  inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15862	  inst.instruction |= LOW4 (inst.operands[1].reg);
15863	  inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15864	  inst.instruction |= neon_quad (rs) << 6;
15865	  inst.instruction |= (flavour == neon_cvt_flavour_u16_f16
15866			       || flavour == neon_cvt_flavour_u32_f32) << 7;
15867	  inst.instruction |= mode << 8;
15868	  if (flavour == neon_cvt_flavour_u16_f16
15869	      || flavour == neon_cvt_flavour_s16_f16)
15870	    /* Mask off the original size bits and reencode them.  */
15871	    inst.instruction = ((inst.instruction & 0xfff3ffff) | (1 << 18));
15872
15873	  if (thumb_mode)
15874	    inst.instruction |= 0xfc000000;
15875	  else
15876	    inst.instruction |= 0xf0000000;
15877	}
15878      else
15879	{
15880    int_encode:
15881	  {
15882	    unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080,
15883				  0x100, 0x180, 0x0, 0x080};
15884
15885	    NEON_ENCODE (INTEGER, inst);
15886
15887	    if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15888	      return;
15889
15890	    if (flavour != neon_cvt_flavour_invalid)
15891	      inst.instruction |= enctab[flavour];
15892
15893	    inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15894	    inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15895	    inst.instruction |= LOW4 (inst.operands[1].reg);
15896	    inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15897	    inst.instruction |= neon_quad (rs) << 6;
15898	    if (flavour >= neon_cvt_flavour_s16_f16
15899		&& flavour <= neon_cvt_flavour_f16_u16)
15900	      /* Half precision.  */
15901	      inst.instruction |= 1 << 18;
15902	    else
15903	      inst.instruction |= 2 << 18;
15904
15905	    neon_dp_fixup (&inst);
15906	  }
15907	}
15908      break;
15909
15910    /* Half-precision conversions for Advanced SIMD -- neon.  */
15911    case NS_QD:
15912    case NS_DQ:
15913
15914      if ((rs == NS_DQ)
15915	  && (inst.vectype.el[0].size != 16 || inst.vectype.el[1].size != 32))
15916	  {
15917	    as_bad (_("operand size must match register width"));
15918	    break;
15919	  }
15920
15921      if ((rs == NS_QD)
15922	  && ((inst.vectype.el[0].size != 32 || inst.vectype.el[1].size != 16)))
15923	  {
15924	    as_bad (_("operand size must match register width"));
15925	    break;
15926	  }
15927
15928      if (rs == NS_DQ)
15929	inst.instruction = 0x3b60600;
15930      else
15931	inst.instruction = 0x3b60700;
15932
15933      inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15934      inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15935      inst.instruction |= LOW4 (inst.operands[1].reg);
15936      inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15937      neon_dp_fixup (&inst);
15938      break;
15939
15940    default:
15941      /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32).  */
15942      if (mode == neon_cvt_mode_x || mode == neon_cvt_mode_z)
15943	do_vfp_nsyn_cvt (rs, flavour);
15944      else
15945	do_vfp_nsyn_cvt_fpv8 (flavour, mode);
15946    }
15947}
15948
15949static void
15950do_neon_cvtr (void)
15951{
15952  do_neon_cvt_1 (neon_cvt_mode_x);
15953}
15954
15955static void
15956do_neon_cvt (void)
15957{
15958  do_neon_cvt_1 (neon_cvt_mode_z);
15959}
15960
15961static void
15962do_neon_cvta (void)
15963{
15964  do_neon_cvt_1 (neon_cvt_mode_a);
15965}
15966
15967static void
15968do_neon_cvtn (void)
15969{
15970  do_neon_cvt_1 (neon_cvt_mode_n);
15971}
15972
15973static void
15974do_neon_cvtp (void)
15975{
15976  do_neon_cvt_1 (neon_cvt_mode_p);
15977}
15978
15979static void
15980do_neon_cvtm (void)
15981{
15982  do_neon_cvt_1 (neon_cvt_mode_m);
15983}
15984
15985static void
15986do_neon_cvttb_2 (bfd_boolean t, bfd_boolean to, bfd_boolean is_double)
15987{
15988  if (is_double)
15989    mark_feature_used (&fpu_vfp_ext_armv8);
15990
15991  encode_arm_vfp_reg (inst.operands[0].reg,
15992		      (is_double && !to) ? VFP_REG_Dd : VFP_REG_Sd);
15993  encode_arm_vfp_reg (inst.operands[1].reg,
15994		      (is_double && to) ? VFP_REG_Dm : VFP_REG_Sm);
15995  inst.instruction |= to ? 0x10000 : 0;
15996  inst.instruction |= t ? 0x80 : 0;
15997  inst.instruction |= is_double ? 0x100 : 0;
15998  do_vfp_cond_or_thumb ();
15999}
16000
16001static void
16002do_neon_cvttb_1 (bfd_boolean t)
16003{
16004  enum neon_shape rs = neon_select_shape (NS_HF, NS_HD, NS_FH, NS_FF, NS_FD,
16005					  NS_DF, NS_DH, NS_NULL);
16006
16007  if (rs == NS_NULL)
16008    return;
16009  else if (neon_check_type (2, rs, N_F16, N_F32 | N_VFP).type != NT_invtype)
16010    {
16011      inst.error = NULL;
16012      do_neon_cvttb_2 (t, /*to=*/TRUE, /*is_double=*/FALSE);
16013    }
16014  else if (neon_check_type (2, rs, N_F32 | N_VFP, N_F16).type != NT_invtype)
16015    {
16016      inst.error = NULL;
16017      do_neon_cvttb_2 (t, /*to=*/FALSE, /*is_double=*/FALSE);
16018    }
16019  else if (neon_check_type (2, rs, N_F16, N_F64 | N_VFP).type != NT_invtype)
16020    {
16021      /* The VCVTB and VCVTT instructions with D-register operands
16022         don't work for SP only targets.  */
16023      constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
16024		  _(BAD_FPU));
16025
16026      inst.error = NULL;
16027      do_neon_cvttb_2 (t, /*to=*/TRUE, /*is_double=*/TRUE);
16028    }
16029  else if (neon_check_type (2, rs, N_F64 | N_VFP, N_F16).type != NT_invtype)
16030    {
16031      /* The VCVTB and VCVTT instructions with D-register operands
16032         don't work for SP only targets.  */
16033      constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
16034		  _(BAD_FPU));
16035
16036      inst.error = NULL;
16037      do_neon_cvttb_2 (t, /*to=*/FALSE, /*is_double=*/TRUE);
16038    }
16039  else
16040    return;
16041}
16042
16043static void
16044do_neon_cvtb (void)
16045{
16046  do_neon_cvttb_1 (FALSE);
16047}
16048
16049
16050static void
16051do_neon_cvtt (void)
16052{
16053  do_neon_cvttb_1 (TRUE);
16054}
16055
16056static void
16057neon_move_immediate (void)
16058{
16059  enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
16060  struct neon_type_el et = neon_check_type (2, rs,
16061    N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
16062  unsigned immlo, immhi = 0, immbits;
16063  int op, cmode, float_p;
16064
16065  constraint (et.type == NT_invtype,
16066	      _("operand size must be specified for immediate VMOV"));
16067
16068  /* We start out as an MVN instruction if OP = 1, MOV otherwise.  */
16069  op = (inst.instruction & (1 << 5)) != 0;
16070
16071  immlo = inst.operands[1].imm;
16072  if (inst.operands[1].regisimm)
16073    immhi = inst.operands[1].reg;
16074
16075  constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
16076	      _("immediate has bits set outside the operand size"));
16077
16078  float_p = inst.operands[1].immisfloat;
16079
16080  if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
16081					et.size, et.type)) == FAIL)
16082    {
16083      /* Invert relevant bits only.  */
16084      neon_invert_size (&immlo, &immhi, et.size);
16085      /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
16086	 with one or the other; those cases are caught by
16087	 neon_cmode_for_move_imm.  */
16088      op = !op;
16089      if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
16090					    &op, et.size, et.type)) == FAIL)
16091	{
16092	  first_error (_("immediate out of range"));
16093	  return;
16094	}
16095    }
16096
16097  inst.instruction &= ~(1 << 5);
16098  inst.instruction |= op << 5;
16099
16100  inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16101  inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16102  inst.instruction |= neon_quad (rs) << 6;
16103  inst.instruction |= cmode << 8;
16104
16105  neon_write_immbits (immbits);
16106}
16107
16108static void
16109do_neon_mvn (void)
16110{
16111  if (inst.operands[1].isreg)
16112    {
16113      enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
16114
16115      NEON_ENCODE (INTEGER, inst);
16116      inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16117      inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16118      inst.instruction |= LOW4 (inst.operands[1].reg);
16119      inst.instruction |= HI1 (inst.operands[1].reg) << 5;
16120      inst.instruction |= neon_quad (rs) << 6;
16121    }
16122  else
16123    {
16124      NEON_ENCODE (IMMED, inst);
16125      neon_move_immediate ();
16126    }
16127
16128  neon_dp_fixup (&inst);
16129}
16130
16131/* Encode instructions of form:
16132
16133  |28/24|23|22|21 20|19 16|15 12|11    8|7|6|5|4|3  0|
16134  |  U  |x |D |size | Rn  | Rd  |x x x x|N|x|M|x| Rm |  */
16135
16136static void
16137neon_mixed_length (struct neon_type_el et, unsigned size)
16138{
16139  inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16140  inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16141  inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
16142  inst.instruction |= HI1 (inst.operands[1].reg) << 7;
16143  inst.instruction |= LOW4 (inst.operands[2].reg);
16144  inst.instruction |= HI1 (inst.operands[2].reg) << 5;
16145  inst.instruction |= (et.type == NT_unsigned) << 24;
16146  inst.instruction |= neon_logbits (size) << 20;
16147
16148  neon_dp_fixup (&inst);
16149}
16150
16151static void
16152do_neon_dyadic_long (void)
16153{
16154  /* FIXME: Type checking for lengthening op.  */
16155  struct neon_type_el et = neon_check_type (3, NS_QDD,
16156    N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
16157  neon_mixed_length (et, et.size);
16158}
16159
16160static void
16161do_neon_abal (void)
16162{
16163  struct neon_type_el et = neon_check_type (3, NS_QDD,
16164    N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
16165  neon_mixed_length (et, et.size);
16166}
16167
16168static void
16169neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
16170{
16171  if (inst.operands[2].isscalar)
16172    {
16173      struct neon_type_el et = neon_check_type (3, NS_QDS,
16174	N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
16175      NEON_ENCODE (SCALAR, inst);
16176      neon_mul_mac (et, et.type == NT_unsigned);
16177    }
16178  else
16179    {
16180      struct neon_type_el et = neon_check_type (3, NS_QDD,
16181	N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
16182      NEON_ENCODE (INTEGER, inst);
16183      neon_mixed_length (et, et.size);
16184    }
16185}
16186
16187static void
16188do_neon_mac_maybe_scalar_long (void)
16189{
16190  neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
16191}
16192
16193/* Like neon_scalar_for_mul, this function generate Rm encoding from GAS's
16194   internal SCALAR.  QUAD_P is 1 if it's for Q format, otherwise it's 0.  */
16195
16196static unsigned
16197neon_scalar_for_fmac_fp16_long (unsigned scalar, unsigned quad_p)
16198{
16199  unsigned regno = NEON_SCALAR_REG (scalar);
16200  unsigned elno = NEON_SCALAR_INDEX (scalar);
16201
16202  if (quad_p)
16203    {
16204      if (regno > 7 || elno > 3)
16205	goto bad_scalar;
16206
16207      return ((regno & 0x7)
16208	      | ((elno & 0x1) << 3)
16209	      | (((elno >> 1) & 0x1) << 5));
16210    }
16211  else
16212    {
16213      if (regno > 15 || elno > 1)
16214	goto bad_scalar;
16215
16216      return (((regno & 0x1) << 5)
16217	      | ((regno >> 1) & 0x7)
16218	      | ((elno & 0x1) << 3));
16219    }
16220
16221bad_scalar:
16222  first_error (_("scalar out of range for multiply instruction"));
16223  return 0;
16224}
16225
16226static void
16227do_neon_fmac_maybe_scalar_long (int subtype)
16228{
16229  enum neon_shape rs;
16230  int high8;
16231  /* NOTE: vfmal/vfmsl use slightly different NEON three-same encoding.  'size"
16232     field (bits[21:20]) has different meaning.  For scalar index variant, it's
16233     used to differentiate add and subtract, otherwise it's with fixed value
16234     0x2.  */
16235  int size = -1;
16236
16237  if (inst.cond != COND_ALWAYS)
16238    as_warn (_("vfmal/vfmsl with FP16 type cannot be conditional, the "
16239	       "behaviour is UNPREDICTABLE"));
16240
16241  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_fp16_fml),
16242	      _(BAD_FP16));
16243
16244  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_armv8),
16245	      _(BAD_FPU));
16246
16247  /* vfmal/vfmsl are in three-same D/Q register format or the third operand can
16248     be a scalar index register.  */
16249  if (inst.operands[2].isscalar)
16250    {
16251      high8 = 0xfe000000;
16252      if (subtype)
16253	size = 16;
16254      rs = neon_select_shape (NS_DHS, NS_QDS, NS_NULL);
16255    }
16256  else
16257    {
16258      high8 = 0xfc000000;
16259      size = 32;
16260      if (subtype)
16261	inst.instruction |= (0x1 << 23);
16262      rs = neon_select_shape (NS_DHH, NS_QDD, NS_NULL);
16263    }
16264
16265  neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_F16);
16266
16267  /* "opcode" from template has included "ubit", so simply pass 0 here.  Also,
16268     the "S" bit in size field has been reused to differentiate vfmal and vfmsl,
16269     so we simply pass -1 as size.  */
16270  unsigned quad_p = (rs == NS_QDD || rs == NS_QDS);
16271  neon_three_same (quad_p, 0, size);
16272
16273  /* Undo neon_dp_fixup.  Redo the high eight bits.  */
16274  inst.instruction &= 0x00ffffff;
16275  inst.instruction |= high8;
16276
16277#define LOW1(R) ((R) & 0x1)
16278#define HI4(R) (((R) >> 1) & 0xf)
16279  /* Unlike usually NEON three-same, encoding for Vn and Vm will depend on
16280     whether the instruction is in Q form and whether Vm is a scalar indexed
16281     operand.  */
16282  if (inst.operands[2].isscalar)
16283    {
16284      unsigned rm
16285	= neon_scalar_for_fmac_fp16_long (inst.operands[2].reg, quad_p);
16286      inst.instruction &= 0xffffffd0;
16287      inst.instruction |= rm;
16288
16289      if (!quad_p)
16290	{
16291	  /* Redo Rn as well.  */
16292	  inst.instruction &= 0xfff0ff7f;
16293	  inst.instruction |= HI4 (inst.operands[1].reg) << 16;
16294	  inst.instruction |= LOW1 (inst.operands[1].reg) << 7;
16295	}
16296    }
16297  else if (!quad_p)
16298    {
16299      /* Redo Rn and Rm.  */
16300      inst.instruction &= 0xfff0ff50;
16301      inst.instruction |= HI4 (inst.operands[1].reg) << 16;
16302      inst.instruction |= LOW1 (inst.operands[1].reg) << 7;
16303      inst.instruction |= HI4 (inst.operands[2].reg);
16304      inst.instruction |= LOW1 (inst.operands[2].reg) << 5;
16305    }
16306}
16307
16308static void
16309do_neon_vfmal (void)
16310{
16311  return do_neon_fmac_maybe_scalar_long (0);
16312}
16313
16314static void
16315do_neon_vfmsl (void)
16316{
16317  return do_neon_fmac_maybe_scalar_long (1);
16318}
16319
16320static void
16321do_neon_dyadic_wide (void)
16322{
16323  struct neon_type_el et = neon_check_type (3, NS_QQD,
16324    N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
16325  neon_mixed_length (et, et.size);
16326}
16327
16328static void
16329do_neon_dyadic_narrow (void)
16330{
16331  struct neon_type_el et = neon_check_type (3, NS_QDD,
16332    N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
16333  /* Operand sign is unimportant, and the U bit is part of the opcode,
16334     so force the operand type to integer.  */
16335  et.type = NT_integer;
16336  neon_mixed_length (et, et.size / 2);
16337}
16338
16339static void
16340do_neon_mul_sat_scalar_long (void)
16341{
16342  neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
16343}
16344
16345static void
16346do_neon_vmull (void)
16347{
16348  if (inst.operands[2].isscalar)
16349    do_neon_mac_maybe_scalar_long ();
16350  else
16351    {
16352      struct neon_type_el et = neon_check_type (3, NS_QDD,
16353	N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_P64 | N_KEY);
16354
16355      if (et.type == NT_poly)
16356	NEON_ENCODE (POLY, inst);
16357      else
16358	NEON_ENCODE (INTEGER, inst);
16359
16360      /* For polynomial encoding the U bit must be zero, and the size must
16361	 be 8 (encoded as 0b00) or, on ARMv8 or later 64 (encoded, non
16362	 obviously, as 0b10).  */
16363      if (et.size == 64)
16364	{
16365	  /* Check we're on the correct architecture.  */
16366	  if (!mark_feature_used (&fpu_crypto_ext_armv8))
16367	    inst.error =
16368	      _("Instruction form not available on this architecture.");
16369
16370	  et.size = 32;
16371	}
16372
16373      neon_mixed_length (et, et.size);
16374    }
16375}
16376
16377static void
16378do_neon_ext (void)
16379{
16380  enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
16381  struct neon_type_el et = neon_check_type (3, rs,
16382    N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
16383  unsigned imm = (inst.operands[3].imm * et.size) / 8;
16384
16385  constraint (imm >= (unsigned) (neon_quad (rs) ? 16 : 8),
16386	      _("shift out of range"));
16387  inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16388  inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16389  inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
16390  inst.instruction |= HI1 (inst.operands[1].reg) << 7;
16391  inst.instruction |= LOW4 (inst.operands[2].reg);
16392  inst.instruction |= HI1 (inst.operands[2].reg) << 5;
16393  inst.instruction |= neon_quad (rs) << 6;
16394  inst.instruction |= imm << 8;
16395
16396  neon_dp_fixup (&inst);
16397}
16398
16399static void
16400do_neon_rev (void)
16401{
16402  enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
16403  struct neon_type_el et = neon_check_type (2, rs,
16404    N_EQK, N_8 | N_16 | N_32 | N_KEY);
16405  unsigned op = (inst.instruction >> 7) & 3;
16406  /* N (width of reversed regions) is encoded as part of the bitmask. We
16407     extract it here to check the elements to be reversed are smaller.
16408     Otherwise we'd get a reserved instruction.  */
16409  unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
16410  gas_assert (elsize != 0);
16411  constraint (et.size >= elsize,
16412	      _("elements must be smaller than reversal region"));
16413  neon_two_same (neon_quad (rs), 1, et.size);
16414}
16415
16416static void
16417do_neon_dup (void)
16418{
16419  if (inst.operands[1].isscalar)
16420    {
16421      enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
16422      struct neon_type_el et = neon_check_type (2, rs,
16423	N_EQK, N_8 | N_16 | N_32 | N_KEY);
16424      unsigned sizebits = et.size >> 3;
16425      unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
16426      int logsize = neon_logbits (et.size);
16427      unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
16428
16429      if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
16430	return;
16431
16432      NEON_ENCODE (SCALAR, inst);
16433      inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16434      inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16435      inst.instruction |= LOW4 (dm);
16436      inst.instruction |= HI1 (dm) << 5;
16437      inst.instruction |= neon_quad (rs) << 6;
16438      inst.instruction |= x << 17;
16439      inst.instruction |= sizebits << 16;
16440
16441      neon_dp_fixup (&inst);
16442    }
16443  else
16444    {
16445      enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
16446      struct neon_type_el et = neon_check_type (2, rs,
16447	N_8 | N_16 | N_32 | N_KEY, N_EQK);
16448      /* Duplicate ARM register to lanes of vector.  */
16449      NEON_ENCODE (ARMREG, inst);
16450      switch (et.size)
16451	{
16452	case 8:  inst.instruction |= 0x400000; break;
16453	case 16: inst.instruction |= 0x000020; break;
16454	case 32: inst.instruction |= 0x000000; break;
16455	default: break;
16456	}
16457      inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
16458      inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
16459      inst.instruction |= HI1 (inst.operands[0].reg) << 7;
16460      inst.instruction |= neon_quad (rs) << 21;
16461      /* The encoding for this instruction is identical for the ARM and Thumb
16462	 variants, except for the condition field.  */
16463      do_vfp_cond_or_thumb ();
16464    }
16465}
16466
16467/* VMOV has particularly many variations. It can be one of:
16468     0. VMOV<c><q> <Qd>, <Qm>
16469     1. VMOV<c><q> <Dd>, <Dm>
16470   (Register operations, which are VORR with Rm = Rn.)
16471     2. VMOV<c><q>.<dt> <Qd>, #<imm>
16472     3. VMOV<c><q>.<dt> <Dd>, #<imm>
16473   (Immediate loads.)
16474     4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
16475   (ARM register to scalar.)
16476     5. VMOV<c><q> <Dm>, <Rd>, <Rn>
16477   (Two ARM registers to vector.)
16478     6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
16479   (Scalar to ARM register.)
16480     7. VMOV<c><q> <Rd>, <Rn>, <Dm>
16481   (Vector to two ARM registers.)
16482     8. VMOV.F32 <Sd>, <Sm>
16483     9. VMOV.F64 <Dd>, <Dm>
16484   (VFP register moves.)
16485    10. VMOV.F32 <Sd>, #imm
16486    11. VMOV.F64 <Dd>, #imm
16487   (VFP float immediate load.)
16488    12. VMOV <Rd>, <Sm>
16489   (VFP single to ARM reg.)
16490    13. VMOV <Sd>, <Rm>
16491   (ARM reg to VFP single.)
16492    14. VMOV <Rd>, <Re>, <Sn>, <Sm>
16493   (Two ARM regs to two VFP singles.)
16494    15. VMOV <Sd>, <Se>, <Rn>, <Rm>
16495   (Two VFP singles to two ARM regs.)
16496
16497   These cases can be disambiguated using neon_select_shape, except cases 1/9
16498   and 3/11 which depend on the operand type too.
16499
16500   All the encoded bits are hardcoded by this function.
16501
16502   Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
16503   Cases 5, 7 may be used with VFPv2 and above.
16504
16505   FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
16506   can specify a type where it doesn't make sense to, and is ignored).  */
16507
16508static void
16509do_neon_mov (void)
16510{
16511  enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
16512					  NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR,
16513					  NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
16514					  NS_HR, NS_RH, NS_HI, NS_NULL);
16515  struct neon_type_el et;
16516  const char *ldconst = 0;
16517
16518  switch (rs)
16519    {
16520    case NS_DD:  /* case 1/9.  */
16521      et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
16522      /* It is not an error here if no type is given.  */
16523      inst.error = NULL;
16524      if (et.type == NT_float && et.size == 64)
16525	{
16526	  do_vfp_nsyn_opcode ("fcpyd");
16527	  break;
16528	}
16529      /* fall through.  */
16530
16531    case NS_QQ:  /* case 0/1.  */
16532      {
16533	if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
16534	  return;
16535	/* The architecture manual I have doesn't explicitly state which
16536	   value the U bit should have for register->register moves, but
16537	   the equivalent VORR instruction has U = 0, so do that.  */
16538	inst.instruction = 0x0200110;
16539	inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16540	inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16541	inst.instruction |= LOW4 (inst.operands[1].reg);
16542	inst.instruction |= HI1 (inst.operands[1].reg) << 5;
16543	inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
16544	inst.instruction |= HI1 (inst.operands[1].reg) << 7;
16545	inst.instruction |= neon_quad (rs) << 6;
16546
16547	neon_dp_fixup (&inst);
16548      }
16549      break;
16550
16551    case NS_DI:  /* case 3/11.  */
16552      et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
16553      inst.error = NULL;
16554      if (et.type == NT_float && et.size == 64)
16555	{
16556	  /* case 11 (fconstd).  */
16557	  ldconst = "fconstd";
16558	  goto encode_fconstd;
16559	}
16560      /* fall through.  */
16561
16562    case NS_QI:  /* case 2/3.  */
16563      if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
16564	return;
16565      inst.instruction = 0x0800010;
16566      neon_move_immediate ();
16567      neon_dp_fixup (&inst);
16568      break;
16569
16570    case NS_SR:  /* case 4.  */
16571      {
16572	unsigned bcdebits = 0;
16573	int logsize;
16574	unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
16575	unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
16576
16577	/* .<size> is optional here, defaulting to .32. */
16578	if (inst.vectype.elems == 0
16579	    && inst.operands[0].vectype.type == NT_invtype
16580	    && inst.operands[1].vectype.type == NT_invtype)
16581	  {
16582	    inst.vectype.el[0].type = NT_untyped;
16583	    inst.vectype.el[0].size = 32;
16584	    inst.vectype.elems = 1;
16585	  }
16586
16587	et = neon_check_type (2, NS_NULL, N_8 | N_16 | N_32 | N_KEY, N_EQK);
16588	logsize = neon_logbits (et.size);
16589
16590	constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
16591		    _(BAD_FPU));
16592	constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
16593		    && et.size != 32, _(BAD_FPU));
16594	constraint (et.type == NT_invtype, _("bad type for scalar"));
16595	constraint (x >= 64 / et.size, _("scalar index out of range"));
16596
16597	switch (et.size)
16598	  {
16599	  case 8:  bcdebits = 0x8; break;
16600	  case 16: bcdebits = 0x1; break;
16601	  case 32: bcdebits = 0x0; break;
16602	  default: ;
16603	  }
16604
16605	bcdebits |= x << logsize;
16606
16607	inst.instruction = 0xe000b10;
16608	do_vfp_cond_or_thumb ();
16609	inst.instruction |= LOW4 (dn) << 16;
16610	inst.instruction |= HI1 (dn) << 7;
16611	inst.instruction |= inst.operands[1].reg << 12;
16612	inst.instruction |= (bcdebits & 3) << 5;
16613	inst.instruction |= (bcdebits >> 2) << 21;
16614      }
16615      break;
16616
16617    case NS_DRR:  /* case 5 (fmdrr).  */
16618      constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
16619		  _(BAD_FPU));
16620
16621      inst.instruction = 0xc400b10;
16622      do_vfp_cond_or_thumb ();
16623      inst.instruction |= LOW4 (inst.operands[0].reg);
16624      inst.instruction |= HI1 (inst.operands[0].reg) << 5;
16625      inst.instruction |= inst.operands[1].reg << 12;
16626      inst.instruction |= inst.operands[2].reg << 16;
16627      break;
16628
16629    case NS_RS:  /* case 6.  */
16630      {
16631	unsigned logsize;
16632	unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
16633	unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
16634	unsigned abcdebits = 0;
16635
16636	/* .<dt> is optional here, defaulting to .32. */
16637	if (inst.vectype.elems == 0
16638	    && inst.operands[0].vectype.type == NT_invtype
16639	    && inst.operands[1].vectype.type == NT_invtype)
16640	  {
16641	    inst.vectype.el[0].type = NT_untyped;
16642	    inst.vectype.el[0].size = 32;
16643	    inst.vectype.elems = 1;
16644	  }
16645
16646	et = neon_check_type (2, NS_NULL,
16647			      N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
16648	logsize = neon_logbits (et.size);
16649
16650	constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
16651		    _(BAD_FPU));
16652	constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
16653		    && et.size != 32, _(BAD_FPU));
16654	constraint (et.type == NT_invtype, _("bad type for scalar"));
16655	constraint (x >= 64 / et.size, _("scalar index out of range"));
16656
16657	switch (et.size)
16658	  {
16659	  case 8:  abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
16660	  case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
16661	  case 32: abcdebits = 0x00; break;
16662	  default: ;
16663	  }
16664
16665	abcdebits |= x << logsize;
16666	inst.instruction = 0xe100b10;
16667	do_vfp_cond_or_thumb ();
16668	inst.instruction |= LOW4 (dn) << 16;
16669	inst.instruction |= HI1 (dn) << 7;
16670	inst.instruction |= inst.operands[0].reg << 12;
16671	inst.instruction |= (abcdebits & 3) << 5;
16672	inst.instruction |= (abcdebits >> 2) << 21;
16673      }
16674      break;
16675
16676    case NS_RRD:  /* case 7 (fmrrd).  */
16677      constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
16678		  _(BAD_FPU));
16679
16680      inst.instruction = 0xc500b10;
16681      do_vfp_cond_or_thumb ();
16682      inst.instruction |= inst.operands[0].reg << 12;
16683      inst.instruction |= inst.operands[1].reg << 16;
16684      inst.instruction |= LOW4 (inst.operands[2].reg);
16685      inst.instruction |= HI1 (inst.operands[2].reg) << 5;
16686      break;
16687
16688    case NS_FF:  /* case 8 (fcpys).  */
16689      do_vfp_nsyn_opcode ("fcpys");
16690      break;
16691
16692    case NS_HI:
16693    case NS_FI:  /* case 10 (fconsts).  */
16694      ldconst = "fconsts";
16695    encode_fconstd:
16696      if (!inst.operands[1].immisfloat)
16697	{
16698	  unsigned new_imm;
16699	  /* Immediate has to fit in 8 bits so float is enough.  */
16700	  float imm = (float) inst.operands[1].imm;
16701	  memcpy (&new_imm, &imm, sizeof (float));
16702	  /* But the assembly may have been written to provide an integer
16703	     bit pattern that equates to a float, so check that the
16704	     conversion has worked.  */
16705	  if (is_quarter_float (new_imm))
16706	    {
16707	      if (is_quarter_float (inst.operands[1].imm))
16708		as_warn (_("immediate constant is valid both as a bit-pattern and a floating point value (using the fp value)"));
16709
16710	      inst.operands[1].imm = new_imm;
16711	      inst.operands[1].immisfloat = 1;
16712	    }
16713	}
16714
16715      if (is_quarter_float (inst.operands[1].imm))
16716	{
16717	  inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
16718	  do_vfp_nsyn_opcode (ldconst);
16719
16720	  /* ARMv8.2 fp16 vmov.f16 instruction.  */
16721	  if (rs == NS_HI)
16722	    do_scalar_fp16_v82_encode ();
16723	}
16724      else
16725	first_error (_("immediate out of range"));
16726      break;
16727
16728    case NS_RH:
16729    case NS_RF:  /* case 12 (fmrs).  */
16730      do_vfp_nsyn_opcode ("fmrs");
16731      /* ARMv8.2 fp16 vmov.f16 instruction.  */
16732      if (rs == NS_RH)
16733	do_scalar_fp16_v82_encode ();
16734      break;
16735
16736    case NS_HR:
16737    case NS_FR:  /* case 13 (fmsr).  */
16738      do_vfp_nsyn_opcode ("fmsr");
16739      /* ARMv8.2 fp16 vmov.f16 instruction.  */
16740      if (rs == NS_HR)
16741	do_scalar_fp16_v82_encode ();
16742      break;
16743
16744    /* The encoders for the fmrrs and fmsrr instructions expect three operands
16745       (one of which is a list), but we have parsed four.  Do some fiddling to
16746       make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
16747       expect.  */
16748    case NS_RRFF:  /* case 14 (fmrrs).  */
16749      constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
16750		  _("VFP registers must be adjacent"));
16751      inst.operands[2].imm = 2;
16752      memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
16753      do_vfp_nsyn_opcode ("fmrrs");
16754      break;
16755
16756    case NS_FFRR:  /* case 15 (fmsrr).  */
16757      constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
16758		  _("VFP registers must be adjacent"));
16759      inst.operands[1] = inst.operands[2];
16760      inst.operands[2] = inst.operands[3];
16761      inst.operands[0].imm = 2;
16762      memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
16763      do_vfp_nsyn_opcode ("fmsrr");
16764      break;
16765
16766    case NS_NULL:
16767      /* neon_select_shape has determined that the instruction
16768	 shape is wrong and has already set the error message.  */
16769      break;
16770
16771    default:
16772      abort ();
16773    }
16774}
16775
16776static void
16777do_neon_rshift_round_imm (void)
16778{
16779  enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
16780  struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
16781  int imm = inst.operands[2].imm;
16782
16783  /* imm == 0 case is encoded as VMOV for V{R}SHR.  */
16784  if (imm == 0)
16785    {
16786      inst.operands[2].present = 0;
16787      do_neon_mov ();
16788      return;
16789    }
16790
16791  constraint (imm < 1 || (unsigned)imm > et.size,
16792	      _("immediate out of range for shift"));
16793  neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
16794		  et.size - imm);
16795}
16796
16797static void
16798do_neon_movhf (void)
16799{
16800  enum neon_shape rs = neon_select_shape (NS_HH, NS_NULL);
16801  constraint (rs != NS_HH, _("invalid suffix"));
16802
16803  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
16804	      _(BAD_FPU));
16805
16806  if (inst.cond != COND_ALWAYS)
16807    {
16808      if (thumb_mode)
16809	{
16810	  as_warn (_("ARMv8.2 scalar fp16 instruction cannot be conditional,"
16811		     " the behaviour is UNPREDICTABLE"));
16812	}
16813      else
16814	{
16815	  inst.error = BAD_COND;
16816	  return;
16817	}
16818    }
16819
16820  do_vfp_sp_monadic ();
16821
16822  inst.is_neon = 1;
16823  inst.instruction |= 0xf0000000;
16824}
16825
16826static void
16827do_neon_movl (void)
16828{
16829  struct neon_type_el et = neon_check_type (2, NS_QD,
16830    N_EQK | N_DBL, N_SU_32 | N_KEY);
16831  unsigned sizebits = et.size >> 3;
16832  inst.instruction |= sizebits << 19;
16833  neon_two_same (0, et.type == NT_unsigned, -1);
16834}
16835
16836static void
16837do_neon_trn (void)
16838{
16839  enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
16840  struct neon_type_el et = neon_check_type (2, rs,
16841    N_EQK, N_8 | N_16 | N_32 | N_KEY);
16842  NEON_ENCODE (INTEGER, inst);
16843  neon_two_same (neon_quad (rs), 1, et.size);
16844}
16845
16846static void
16847do_neon_zip_uzp (void)
16848{
16849  enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
16850  struct neon_type_el et = neon_check_type (2, rs,
16851    N_EQK, N_8 | N_16 | N_32 | N_KEY);
16852  if (rs == NS_DD && et.size == 32)
16853    {
16854      /* Special case: encode as VTRN.32 <Dd>, <Dm>.  */
16855      inst.instruction = N_MNEM_vtrn;
16856      do_neon_trn ();
16857      return;
16858    }
16859  neon_two_same (neon_quad (rs), 1, et.size);
16860}
16861
16862static void
16863do_neon_sat_abs_neg (void)
16864{
16865  enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
16866  struct neon_type_el et = neon_check_type (2, rs,
16867    N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
16868  neon_two_same (neon_quad (rs), 1, et.size);
16869}
16870
16871static void
16872do_neon_pair_long (void)
16873{
16874  enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
16875  struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
16876  /* Unsigned is encoded in OP field (bit 7) for these instruction.  */
16877  inst.instruction |= (et.type == NT_unsigned) << 7;
16878  neon_two_same (neon_quad (rs), 1, et.size);
16879}
16880
16881static void
16882do_neon_recip_est (void)
16883{
16884  enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
16885  struct neon_type_el et = neon_check_type (2, rs,
16886    N_EQK | N_FLT, N_F_16_32 | N_U32 | N_KEY);
16887  inst.instruction |= (et.type == NT_float) << 8;
16888  neon_two_same (neon_quad (rs), 1, et.size);
16889}
16890
16891static void
16892do_neon_cls (void)
16893{
16894  enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
16895  struct neon_type_el et = neon_check_type (2, rs,
16896    N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
16897  neon_two_same (neon_quad (rs), 1, et.size);
16898}
16899
16900static void
16901do_neon_clz (void)
16902{
16903  enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
16904  struct neon_type_el et = neon_check_type (2, rs,
16905    N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
16906  neon_two_same (neon_quad (rs), 1, et.size);
16907}
16908
16909static void
16910do_neon_cnt (void)
16911{
16912  enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
16913  struct neon_type_el et = neon_check_type (2, rs,
16914    N_EQK | N_INT, N_8 | N_KEY);
16915  neon_two_same (neon_quad (rs), 1, et.size);
16916}
16917
16918static void
16919do_neon_swp (void)
16920{
16921  enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
16922  neon_two_same (neon_quad (rs), 1, -1);
16923}
16924
16925static void
16926do_neon_tbl_tbx (void)
16927{
16928  unsigned listlenbits;
16929  neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
16930
16931  if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
16932    {
16933      first_error (_("bad list length for table lookup"));
16934      return;
16935    }
16936
16937  listlenbits = inst.operands[1].imm - 1;
16938  inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
16939  inst.instruction |= HI1 (inst.operands[0].reg) << 22;
16940  inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
16941  inst.instruction |= HI1 (inst.operands[1].reg) << 7;
16942  inst.instruction |= LOW4 (inst.operands[2].reg);
16943  inst.instruction |= HI1 (inst.operands[2].reg) << 5;
16944  inst.instruction |= listlenbits << 8;
16945
16946  neon_dp_fixup (&inst);
16947}
16948
16949static void
16950do_neon_ldm_stm (void)
16951{
16952  /* P, U and L bits are part of bitmask.  */
16953  int is_dbmode = (inst.instruction & (1 << 24)) != 0;
16954  unsigned offsetbits = inst.operands[1].imm * 2;
16955
16956  if (inst.operands[1].issingle)
16957    {
16958      do_vfp_nsyn_ldm_stm (is_dbmode);
16959      return;
16960    }
16961
16962  constraint (is_dbmode && !inst.operands[0].writeback,
16963	      _("writeback (!) must be used for VLDMDB and VSTMDB"));
16964
16965  constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
16966	      _("register list must contain at least 1 and at most 16 "
16967		"registers"));
16968
16969  inst.instruction |= inst.operands[0].reg << 16;
16970  inst.instruction |= inst.operands[0].writeback << 21;
16971  inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
16972  inst.instruction |= HI1 (inst.operands[1].reg) << 22;
16973
16974  inst.instruction |= offsetbits;
16975
16976  do_vfp_cond_or_thumb ();
16977}
16978
16979static void
16980do_neon_ldr_str (void)
16981{
16982  int is_ldr = (inst.instruction & (1 << 20)) != 0;
16983
16984  /* Use of PC in vstr in ARM mode is deprecated in ARMv7.
16985     And is UNPREDICTABLE in thumb mode.  */
16986  if (!is_ldr
16987      && inst.operands[1].reg == REG_PC
16988      && (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7) || thumb_mode))
16989    {
16990      if (thumb_mode)
16991	inst.error = _("Use of PC here is UNPREDICTABLE");
16992      else if (warn_on_deprecated)
16993	as_tsktsk (_("Use of PC here is deprecated"));
16994    }
16995
16996  if (inst.operands[0].issingle)
16997    {
16998      if (is_ldr)
16999	do_vfp_nsyn_opcode ("flds");
17000      else
17001	do_vfp_nsyn_opcode ("fsts");
17002
17003      /* ARMv8.2 vldr.16/vstr.16 instruction.  */
17004      if (inst.vectype.el[0].size == 16)
17005	do_scalar_fp16_v82_encode ();
17006    }
17007  else
17008    {
17009      if (is_ldr)
17010	do_vfp_nsyn_opcode ("fldd");
17011      else
17012	do_vfp_nsyn_opcode ("fstd");
17013    }
17014}
17015
17016/* "interleave" version also handles non-interleaving register VLD1/VST1
17017   instructions.  */
17018
17019static void
17020do_neon_ld_st_interleave (void)
17021{
17022  struct neon_type_el et = neon_check_type (1, NS_NULL,
17023					    N_8 | N_16 | N_32 | N_64);
17024  unsigned alignbits = 0;
17025  unsigned idx;
17026  /* The bits in this table go:
17027     0: register stride of one (0) or two (1)
17028     1,2: register list length, minus one (1, 2, 3, 4).
17029     3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
17030     We use -1 for invalid entries.  */
17031  const int typetable[] =
17032    {
17033      0x7,  -1, 0xa,  -1, 0x6,  -1, 0x2,  -1, /* VLD1 / VST1.  */
17034       -1,  -1, 0x8, 0x9,  -1,  -1, 0x3,  -1, /* VLD2 / VST2.  */
17035       -1,  -1,  -1,  -1, 0x4, 0x5,  -1,  -1, /* VLD3 / VST3.  */
17036       -1,  -1,  -1,  -1,  -1,  -1, 0x0, 0x1  /* VLD4 / VST4.  */
17037    };
17038  int typebits;
17039
17040  if (et.type == NT_invtype)
17041    return;
17042
17043  if (inst.operands[1].immisalign)
17044    switch (inst.operands[1].imm >> 8)
17045      {
17046      case 64: alignbits = 1; break;
17047      case 128:
17048	if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2
17049	    && NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
17050	  goto bad_alignment;
17051	alignbits = 2;
17052	break;
17053      case 256:
17054	if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
17055	  goto bad_alignment;
17056	alignbits = 3;
17057	break;
17058      default:
17059      bad_alignment:
17060	first_error (_("bad alignment"));
17061	return;
17062      }
17063
17064  inst.instruction |= alignbits << 4;
17065  inst.instruction |= neon_logbits (et.size) << 6;
17066
17067  /* Bits [4:6] of the immediate in a list specifier encode register stride
17068     (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
17069     VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
17070     up the right value for "type" in a table based on this value and the given
17071     list style, then stick it back.  */
17072  idx = ((inst.operands[0].imm >> 4) & 7)
17073	| (((inst.instruction >> 8) & 3) << 3);
17074
17075  typebits = typetable[idx];
17076
17077  constraint (typebits == -1, _("bad list type for instruction"));
17078  constraint (((inst.instruction >> 8) & 3) && et.size == 64,
17079	      _("bad element type for instruction"));
17080
17081  inst.instruction &= ~0xf00;
17082  inst.instruction |= typebits << 8;
17083}
17084
17085/* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
17086   *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
17087   otherwise. The variable arguments are a list of pairs of legal (size, align)
17088   values, terminated with -1.  */
17089
17090static int
17091neon_alignment_bit (int size, int align, int *do_alignment, ...)
17092{
17093  va_list ap;
17094  int result = FAIL, thissize, thisalign;
17095
17096  if (!inst.operands[1].immisalign)
17097    {
17098      *do_alignment = 0;
17099      return SUCCESS;
17100    }
17101
17102  va_start (ap, do_alignment);
17103
17104  do
17105    {
17106      thissize = va_arg (ap, int);
17107      if (thissize == -1)
17108	break;
17109      thisalign = va_arg (ap, int);
17110
17111      if (size == thissize && align == thisalign)
17112	result = SUCCESS;
17113    }
17114  while (result != SUCCESS);
17115
17116  va_end (ap);
17117
17118  if (result == SUCCESS)
17119    *do_alignment = 1;
17120  else
17121    first_error (_("unsupported alignment for instruction"));
17122
17123  return result;
17124}
17125
17126static void
17127do_neon_ld_st_lane (void)
17128{
17129  struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
17130  int align_good, do_alignment = 0;
17131  int logsize = neon_logbits (et.size);
17132  int align = inst.operands[1].imm >> 8;
17133  int n = (inst.instruction >> 8) & 3;
17134  int max_el = 64 / et.size;
17135
17136  if (et.type == NT_invtype)
17137    return;
17138
17139  constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
17140	      _("bad list length"));
17141  constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
17142	      _("scalar index out of range"));
17143  constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
17144	      && et.size == 8,
17145	      _("stride of 2 unavailable when element size is 8"));
17146
17147  switch (n)
17148    {
17149    case 0:  /* VLD1 / VST1.  */
17150      align_good = neon_alignment_bit (et.size, align, &do_alignment, 16, 16,
17151				       32, 32, -1);
17152      if (align_good == FAIL)
17153	return;
17154      if (do_alignment)
17155	{
17156	  unsigned alignbits = 0;
17157	  switch (et.size)
17158	    {
17159	    case 16: alignbits = 0x1; break;
17160	    case 32: alignbits = 0x3; break;
17161	    default: ;
17162	    }
17163	  inst.instruction |= alignbits << 4;
17164	}
17165      break;
17166
17167    case 1:  /* VLD2 / VST2.  */
17168      align_good = neon_alignment_bit (et.size, align, &do_alignment, 8, 16,
17169		      16, 32, 32, 64, -1);
17170      if (align_good == FAIL)
17171	return;
17172      if (do_alignment)
17173	inst.instruction |= 1 << 4;
17174      break;
17175
17176    case 2:  /* VLD3 / VST3.  */
17177      constraint (inst.operands[1].immisalign,
17178		  _("can't use alignment with this instruction"));
17179      break;
17180
17181    case 3:  /* VLD4 / VST4.  */
17182      align_good = neon_alignment_bit (et.size, align, &do_alignment, 8, 32,
17183				       16, 64, 32, 64, 32, 128, -1);
17184      if (align_good == FAIL)
17185	return;
17186      if (do_alignment)
17187	{
17188	  unsigned alignbits = 0;
17189	  switch (et.size)
17190	    {
17191	    case 8:  alignbits = 0x1; break;
17192	    case 16: alignbits = 0x1; break;
17193	    case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
17194	    default: ;
17195	    }
17196	  inst.instruction |= alignbits << 4;
17197	}
17198      break;
17199
17200    default: ;
17201    }
17202
17203  /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32.  */
17204  if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
17205    inst.instruction |= 1 << (4 + logsize);
17206
17207  inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
17208  inst.instruction |= logsize << 10;
17209}
17210
17211/* Encode single n-element structure to all lanes VLD<n> instructions.  */
17212
17213static void
17214do_neon_ld_dup (void)
17215{
17216  struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
17217  int align_good, do_alignment = 0;
17218
17219  if (et.type == NT_invtype)
17220    return;
17221
17222  switch ((inst.instruction >> 8) & 3)
17223    {
17224    case 0:  /* VLD1.  */
17225      gas_assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
17226      align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
17227				       &do_alignment, 16, 16, 32, 32, -1);
17228      if (align_good == FAIL)
17229	return;
17230      switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
17231	{
17232	case 1: break;
17233	case 2: inst.instruction |= 1 << 5; break;
17234	default: first_error (_("bad list length")); return;
17235	}
17236      inst.instruction |= neon_logbits (et.size) << 6;
17237      break;
17238
17239    case 1:  /* VLD2.  */
17240      align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
17241				       &do_alignment, 8, 16, 16, 32, 32, 64,
17242				       -1);
17243      if (align_good == FAIL)
17244	return;
17245      constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
17246		  _("bad list length"));
17247      if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
17248	inst.instruction |= 1 << 5;
17249      inst.instruction |= neon_logbits (et.size) << 6;
17250      break;
17251
17252    case 2:  /* VLD3.  */
17253      constraint (inst.operands[1].immisalign,
17254		  _("can't use alignment with this instruction"));
17255      constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
17256		  _("bad list length"));
17257      if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
17258	inst.instruction |= 1 << 5;
17259      inst.instruction |= neon_logbits (et.size) << 6;
17260      break;
17261
17262    case 3:  /* VLD4.  */
17263      {
17264	int align = inst.operands[1].imm >> 8;
17265	align_good = neon_alignment_bit (et.size, align, &do_alignment, 8, 32,
17266					 16, 64, 32, 64, 32, 128, -1);
17267	if (align_good == FAIL)
17268	  return;
17269	constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
17270		    _("bad list length"));
17271	if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
17272	  inst.instruction |= 1 << 5;
17273	if (et.size == 32 && align == 128)
17274	  inst.instruction |= 0x3 << 6;
17275	else
17276	  inst.instruction |= neon_logbits (et.size) << 6;
17277      }
17278      break;
17279
17280    default: ;
17281    }
17282
17283  inst.instruction |= do_alignment << 4;
17284}
17285
17286/* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
17287   apart from bits [11:4].  */
17288
17289static void
17290do_neon_ldx_stx (void)
17291{
17292  if (inst.operands[1].isreg)
17293    constraint (inst.operands[1].reg == REG_PC, BAD_PC);
17294
17295  switch (NEON_LANE (inst.operands[0].imm))
17296    {
17297    case NEON_INTERLEAVE_LANES:
17298      NEON_ENCODE (INTERLV, inst);
17299      do_neon_ld_st_interleave ();
17300      break;
17301
17302    case NEON_ALL_LANES:
17303      NEON_ENCODE (DUP, inst);
17304      if (inst.instruction == N_INV)
17305	{
17306	  first_error ("only loads support such operands");
17307	  break;
17308	}
17309      do_neon_ld_dup ();
17310      break;
17311
17312    default:
17313      NEON_ENCODE (LANE, inst);
17314      do_neon_ld_st_lane ();
17315    }
17316
17317  /* L bit comes from bit mask.  */
17318  inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
17319  inst.instruction |= HI1 (inst.operands[0].reg) << 22;
17320  inst.instruction |= inst.operands[1].reg << 16;
17321
17322  if (inst.operands[1].postind)
17323    {
17324      int postreg = inst.operands[1].imm & 0xf;
17325      constraint (!inst.operands[1].immisreg,
17326		  _("post-index must be a register"));
17327      constraint (postreg == 0xd || postreg == 0xf,
17328		  _("bad register for post-index"));
17329      inst.instruction |= postreg;
17330    }
17331  else
17332    {
17333      constraint (inst.operands[1].immisreg, BAD_ADDR_MODE);
17334      constraint (inst.reloc.exp.X_op != O_constant
17335		  || inst.reloc.exp.X_add_number != 0,
17336		  BAD_ADDR_MODE);
17337
17338      if (inst.operands[1].writeback)
17339	{
17340	  inst.instruction |= 0xd;
17341	}
17342      else
17343	inst.instruction |= 0xf;
17344    }
17345
17346  if (thumb_mode)
17347    inst.instruction |= 0xf9000000;
17348  else
17349    inst.instruction |= 0xf4000000;
17350}
17351
17352/* FP v8.  */
17353static void
17354do_vfp_nsyn_fpv8 (enum neon_shape rs)
17355{
17356  /* Targets like FPv5-SP-D16 don't support FP v8 instructions with
17357     D register operands.  */
17358  if (neon_shape_class[rs] == SC_DOUBLE)
17359    constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
17360		_(BAD_FPU));
17361
17362  NEON_ENCODE (FPV8, inst);
17363
17364  if (rs == NS_FFF || rs == NS_HHH)
17365    {
17366      do_vfp_sp_dyadic ();
17367
17368      /* ARMv8.2 fp16 instruction.  */
17369      if (rs == NS_HHH)
17370	do_scalar_fp16_v82_encode ();
17371    }
17372  else
17373    do_vfp_dp_rd_rn_rm ();
17374
17375  if (rs == NS_DDD)
17376    inst.instruction |= 0x100;
17377
17378  inst.instruction |= 0xf0000000;
17379}
17380
17381static void
17382do_vsel (void)
17383{
17384  set_it_insn_type (OUTSIDE_IT_INSN);
17385
17386  if (try_vfp_nsyn (3, do_vfp_nsyn_fpv8) != SUCCESS)
17387    first_error (_("invalid instruction shape"));
17388}
17389
17390static void
17391do_vmaxnm (void)
17392{
17393  set_it_insn_type (OUTSIDE_IT_INSN);
17394
17395  if (try_vfp_nsyn (3, do_vfp_nsyn_fpv8) == SUCCESS)
17396    return;
17397
17398  if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
17399    return;
17400
17401  neon_dyadic_misc (NT_untyped, N_F_16_32, 0);
17402}
17403
17404static void
17405do_vrint_1 (enum neon_cvt_mode mode)
17406{
17407  enum neon_shape rs = neon_select_shape (NS_HH, NS_FF, NS_DD, NS_QQ, NS_NULL);
17408  struct neon_type_el et;
17409
17410  if (rs == NS_NULL)
17411    return;
17412
17413  /* Targets like FPv5-SP-D16 don't support FP v8 instructions with
17414     D register operands.  */
17415  if (neon_shape_class[rs] == SC_DOUBLE)
17416    constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
17417		_(BAD_FPU));
17418
17419  et = neon_check_type (2, rs, N_EQK | N_VFP, N_F_ALL | N_KEY
17420			| N_VFP);
17421  if (et.type != NT_invtype)
17422    {
17423      /* VFP encodings.  */
17424      if (mode == neon_cvt_mode_a || mode == neon_cvt_mode_n
17425	  || mode == neon_cvt_mode_p || mode == neon_cvt_mode_m)
17426	set_it_insn_type (OUTSIDE_IT_INSN);
17427
17428      NEON_ENCODE (FPV8, inst);
17429      if (rs == NS_FF || rs == NS_HH)
17430	do_vfp_sp_monadic ();
17431      else
17432	do_vfp_dp_rd_rm ();
17433
17434      switch (mode)
17435	{
17436	case neon_cvt_mode_r: inst.instruction |= 0x00000000; break;
17437	case neon_cvt_mode_z: inst.instruction |= 0x00000080; break;
17438	case neon_cvt_mode_x: inst.instruction |= 0x00010000; break;
17439	case neon_cvt_mode_a: inst.instruction |= 0xf0000000; break;
17440	case neon_cvt_mode_n: inst.instruction |= 0xf0010000; break;
17441	case neon_cvt_mode_p: inst.instruction |= 0xf0020000; break;
17442	case neon_cvt_mode_m: inst.instruction |= 0xf0030000; break;
17443	default: abort ();
17444	}
17445
17446      inst.instruction |= (rs == NS_DD) << 8;
17447      do_vfp_cond_or_thumb ();
17448
17449      /* ARMv8.2 fp16 vrint instruction.  */
17450      if (rs == NS_HH)
17451      do_scalar_fp16_v82_encode ();
17452    }
17453  else
17454    {
17455      /* Neon encodings (or something broken...).  */
17456      inst.error = NULL;
17457      et = neon_check_type (2, rs, N_EQK, N_F_16_32 | N_KEY);
17458
17459      if (et.type == NT_invtype)
17460	return;
17461
17462      set_it_insn_type (OUTSIDE_IT_INSN);
17463      NEON_ENCODE (FLOAT, inst);
17464
17465      if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH8) == FAIL)
17466	return;
17467
17468      inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
17469      inst.instruction |= HI1 (inst.operands[0].reg) << 22;
17470      inst.instruction |= LOW4 (inst.operands[1].reg);
17471      inst.instruction |= HI1 (inst.operands[1].reg) << 5;
17472      inst.instruction |= neon_quad (rs) << 6;
17473      /* Mask off the original size bits and reencode them.  */
17474      inst.instruction = ((inst.instruction & 0xfff3ffff)
17475			  | neon_logbits (et.size) << 18);
17476
17477      switch (mode)
17478	{
17479	case neon_cvt_mode_z: inst.instruction |= 3 << 7; break;
17480	case neon_cvt_mode_x: inst.instruction |= 1 << 7; break;
17481	case neon_cvt_mode_a: inst.instruction |= 2 << 7; break;
17482	case neon_cvt_mode_n: inst.instruction |= 0 << 7; break;
17483	case neon_cvt_mode_p: inst.instruction |= 7 << 7; break;
17484	case neon_cvt_mode_m: inst.instruction |= 5 << 7; break;
17485	case neon_cvt_mode_r: inst.error = _("invalid rounding mode"); break;
17486	default: abort ();
17487	}
17488
17489      if (thumb_mode)
17490	inst.instruction |= 0xfc000000;
17491      else
17492	inst.instruction |= 0xf0000000;
17493    }
17494}
17495
17496static void
17497do_vrintx (void)
17498{
17499  do_vrint_1 (neon_cvt_mode_x);
17500}
17501
17502static void
17503do_vrintz (void)
17504{
17505  do_vrint_1 (neon_cvt_mode_z);
17506}
17507
17508static void
17509do_vrintr (void)
17510{
17511  do_vrint_1 (neon_cvt_mode_r);
17512}
17513
17514static void
17515do_vrinta (void)
17516{
17517  do_vrint_1 (neon_cvt_mode_a);
17518}
17519
17520static void
17521do_vrintn (void)
17522{
17523  do_vrint_1 (neon_cvt_mode_n);
17524}
17525
17526static void
17527do_vrintp (void)
17528{
17529  do_vrint_1 (neon_cvt_mode_p);
17530}
17531
17532static void
17533do_vrintm (void)
17534{
17535  do_vrint_1 (neon_cvt_mode_m);
17536}
17537
17538static unsigned
17539neon_scalar_for_vcmla (unsigned opnd, unsigned elsize)
17540{
17541  unsigned regno = NEON_SCALAR_REG (opnd);
17542  unsigned elno = NEON_SCALAR_INDEX (opnd);
17543
17544  if (elsize == 16 && elno < 2 && regno < 16)
17545    return regno | (elno << 4);
17546  else if (elsize == 32 && elno == 0)
17547    return regno;
17548
17549  first_error (_("scalar out of range"));
17550  return 0;
17551}
17552
17553static void
17554do_vcmla (void)
17555{
17556  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_armv8),
17557	      _(BAD_FPU));
17558  constraint (inst.reloc.exp.X_op != O_constant, _("expression too complex"));
17559  unsigned rot = inst.reloc.exp.X_add_number;
17560  constraint (rot != 0 && rot != 90 && rot != 180 && rot != 270,
17561	      _("immediate out of range"));
17562  rot /= 90;
17563  if (inst.operands[2].isscalar)
17564    {
17565      enum neon_shape rs = neon_select_shape (NS_DDSI, NS_QQSI, NS_NULL);
17566      unsigned size = neon_check_type (3, rs, N_EQK, N_EQK,
17567				       N_KEY | N_F16 | N_F32).size;
17568      unsigned m = neon_scalar_for_vcmla (inst.operands[2].reg, size);
17569      inst.is_neon = 1;
17570      inst.instruction = 0xfe000800;
17571      inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
17572      inst.instruction |= HI1 (inst.operands[0].reg) << 22;
17573      inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
17574      inst.instruction |= HI1 (inst.operands[1].reg) << 7;
17575      inst.instruction |= LOW4 (m);
17576      inst.instruction |= HI1 (m) << 5;
17577      inst.instruction |= neon_quad (rs) << 6;
17578      inst.instruction |= rot << 20;
17579      inst.instruction |= (size == 32) << 23;
17580    }
17581  else
17582    {
17583      enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
17584      unsigned size = neon_check_type (3, rs, N_EQK, N_EQK,
17585				       N_KEY | N_F16 | N_F32).size;
17586      neon_three_same (neon_quad (rs), 0, -1);
17587      inst.instruction &= 0x00ffffff; /* Undo neon_dp_fixup.  */
17588      inst.instruction |= 0xfc200800;
17589      inst.instruction |= rot << 23;
17590      inst.instruction |= (size == 32) << 20;
17591    }
17592}
17593
17594static void
17595do_vcadd (void)
17596{
17597  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_armv8),
17598	      _(BAD_FPU));
17599  constraint (inst.reloc.exp.X_op != O_constant, _("expression too complex"));
17600  unsigned rot = inst.reloc.exp.X_add_number;
17601  constraint (rot != 90 && rot != 270, _("immediate out of range"));
17602  enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
17603  unsigned size = neon_check_type (3, rs, N_EQK, N_EQK,
17604				   N_KEY | N_F16 | N_F32).size;
17605  neon_three_same (neon_quad (rs), 0, -1);
17606  inst.instruction &= 0x00ffffff; /* Undo neon_dp_fixup.  */
17607  inst.instruction |= 0xfc800800;
17608  inst.instruction |= (rot == 270) << 24;
17609  inst.instruction |= (size == 32) << 20;
17610}
17611
17612/* Dot Product instructions encoding support.  */
17613
17614static void
17615do_neon_dotproduct (int unsigned_p)
17616{
17617  enum neon_shape rs;
17618  unsigned scalar_oprd2 = 0;
17619  int high8;
17620
17621  if (inst.cond != COND_ALWAYS)
17622    as_warn (_("Dot Product instructions cannot be conditional,  the behaviour "
17623	       "is UNPREDICTABLE"));
17624
17625  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_armv8),
17626	      _(BAD_FPU));
17627
17628  /* Dot Product instructions are in three-same D/Q register format or the third
17629     operand can be a scalar index register.  */
17630  if (inst.operands[2].isscalar)
17631    {
17632      scalar_oprd2 = neon_scalar_for_mul (inst.operands[2].reg, 32);
17633      high8 = 0xfe000000;
17634      rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
17635    }
17636  else
17637    {
17638      high8 = 0xfc000000;
17639      rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
17640    }
17641
17642  if (unsigned_p)
17643    neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_U8);
17644  else
17645    neon_check_type (3, rs, N_EQK, N_EQK, N_KEY | N_S8);
17646
17647  /* The "U" bit in traditional Three Same encoding is fixed to 0 for Dot
17648     Product instruction, so we pass 0 as the "ubit" parameter.  And the
17649     "Size" field are fixed to 0x2, so we pass 32 as the "size" parameter.  */
17650  neon_three_same (neon_quad (rs), 0, 32);
17651
17652  /* Undo neon_dp_fixup.  Dot Product instructions are using a slightly
17653     different NEON three-same encoding.  */
17654  inst.instruction &= 0x00ffffff;
17655  inst.instruction |= high8;
17656  /* Encode 'U' bit which indicates signedness.  */
17657  inst.instruction |= (unsigned_p ? 1 : 0) << 4;
17658  /* Re-encode operand2 if it's indexed scalar operand.  What has been encoded
17659     from inst.operand[2].reg in neon_three_same is GAS's internal encoding, not
17660     the instruction encoding.  */
17661  if (inst.operands[2].isscalar)
17662    {
17663      inst.instruction &= 0xffffffd0;
17664      inst.instruction |= LOW4 (scalar_oprd2);
17665      inst.instruction |= HI1 (scalar_oprd2) << 5;
17666    }
17667}
17668
17669/* Dot Product instructions for signed integer.  */
17670
17671static void
17672do_neon_dotproduct_s (void)
17673{
17674  return do_neon_dotproduct (0);
17675}
17676
17677/* Dot Product instructions for unsigned integer.  */
17678
17679static void
17680do_neon_dotproduct_u (void)
17681{
17682  return do_neon_dotproduct (1);
17683}
17684
17685/* Crypto v1 instructions.  */
17686static void
17687do_crypto_2op_1 (unsigned elttype, int op)
17688{
17689  set_it_insn_type (OUTSIDE_IT_INSN);
17690
17691  if (neon_check_type (2, NS_QQ, N_EQK | N_UNT, elttype | N_UNT | N_KEY).type
17692      == NT_invtype)
17693    return;
17694
17695  inst.error = NULL;
17696
17697  NEON_ENCODE (INTEGER, inst);
17698  inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
17699  inst.instruction |= HI1 (inst.operands[0].reg) << 22;
17700  inst.instruction |= LOW4 (inst.operands[1].reg);
17701  inst.instruction |= HI1 (inst.operands[1].reg) << 5;
17702  if (op != -1)
17703    inst.instruction |= op << 6;
17704
17705  if (thumb_mode)
17706    inst.instruction |= 0xfc000000;
17707  else
17708    inst.instruction |= 0xf0000000;
17709}
17710
17711static void
17712do_crypto_3op_1 (int u, int op)
17713{
17714  set_it_insn_type (OUTSIDE_IT_INSN);
17715
17716  if (neon_check_type (3, NS_QQQ, N_EQK | N_UNT, N_EQK | N_UNT,
17717		       N_32 | N_UNT | N_KEY).type == NT_invtype)
17718    return;
17719
17720  inst.error = NULL;
17721
17722  NEON_ENCODE (INTEGER, inst);
17723  neon_three_same (1, u, 8 << op);
17724}
17725
17726static void
17727do_aese (void)
17728{
17729  do_crypto_2op_1 (N_8, 0);
17730}
17731
17732static void
17733do_aesd (void)
17734{
17735  do_crypto_2op_1 (N_8, 1);
17736}
17737
17738static void
17739do_aesmc (void)
17740{
17741  do_crypto_2op_1 (N_8, 2);
17742}
17743
17744static void
17745do_aesimc (void)
17746{
17747  do_crypto_2op_1 (N_8, 3);
17748}
17749
17750static void
17751do_sha1c (void)
17752{
17753  do_crypto_3op_1 (0, 0);
17754}
17755
17756static void
17757do_sha1p (void)
17758{
17759  do_crypto_3op_1 (0, 1);
17760}
17761
17762static void
17763do_sha1m (void)
17764{
17765  do_crypto_3op_1 (0, 2);
17766}
17767
17768static void
17769do_sha1su0 (void)
17770{
17771  do_crypto_3op_1 (0, 3);
17772}
17773
17774static void
17775do_sha256h (void)
17776{
17777  do_crypto_3op_1 (1, 0);
17778}
17779
17780static void
17781do_sha256h2 (void)
17782{
17783  do_crypto_3op_1 (1, 1);
17784}
17785
17786static void
17787do_sha256su1 (void)
17788{
17789  do_crypto_3op_1 (1, 2);
17790}
17791
17792static void
17793do_sha1h (void)
17794{
17795  do_crypto_2op_1 (N_32, -1);
17796}
17797
17798static void
17799do_sha1su1 (void)
17800{
17801  do_crypto_2op_1 (N_32, 0);
17802}
17803
17804static void
17805do_sha256su0 (void)
17806{
17807  do_crypto_2op_1 (N_32, 1);
17808}
17809
17810static void
17811do_crc32_1 (unsigned int poly, unsigned int sz)
17812{
17813  unsigned int Rd = inst.operands[0].reg;
17814  unsigned int Rn = inst.operands[1].reg;
17815  unsigned int Rm = inst.operands[2].reg;
17816
17817  set_it_insn_type (OUTSIDE_IT_INSN);
17818  inst.instruction |= LOW4 (Rd) << (thumb_mode ? 8 : 12);
17819  inst.instruction |= LOW4 (Rn) << 16;
17820  inst.instruction |= LOW4 (Rm);
17821  inst.instruction |= sz << (thumb_mode ? 4 : 21);
17822  inst.instruction |= poly << (thumb_mode ? 20 : 9);
17823
17824  if (Rd == REG_PC || Rn == REG_PC || Rm == REG_PC)
17825    as_warn (UNPRED_REG ("r15"));
17826}
17827
17828static void
17829do_crc32b (void)
17830{
17831  do_crc32_1 (0, 0);
17832}
17833
17834static void
17835do_crc32h (void)
17836{
17837  do_crc32_1 (0, 1);
17838}
17839
17840static void
17841do_crc32w (void)
17842{
17843  do_crc32_1 (0, 2);
17844}
17845
17846static void
17847do_crc32cb (void)
17848{
17849  do_crc32_1 (1, 0);
17850}
17851
17852static void
17853do_crc32ch (void)
17854{
17855  do_crc32_1 (1, 1);
17856}
17857
17858static void
17859do_crc32cw (void)
17860{
17861  do_crc32_1 (1, 2);
17862}
17863
17864static void
17865do_vjcvt (void)
17866{
17867  constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_armv8),
17868	      _(BAD_FPU));
17869  neon_check_type (2, NS_FD, N_S32, N_F64);
17870  do_vfp_sp_dp_cvt ();
17871  do_vfp_cond_or_thumb ();
17872}
17873
17874
17875/* Overall per-instruction processing.	*/
17876
17877/* We need to be able to fix up arbitrary expressions in some statements.
17878   This is so that we can handle symbols that are an arbitrary distance from
17879   the pc.  The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
17880   which returns part of an address in a form which will be valid for
17881   a data instruction.	We do this by pushing the expression into a symbol
17882   in the expr_section, and creating a fix for that.  */
17883
17884static void
17885fix_new_arm (fragS *	   frag,
17886	     int	   where,
17887	     short int	   size,
17888	     expressionS * exp,
17889	     int	   pc_rel,
17890	     int	   reloc)
17891{
17892  fixS *	   new_fix;
17893
17894  switch (exp->X_op)
17895    {
17896    case O_constant:
17897      if (pc_rel)
17898	{
17899	  /* Create an absolute valued symbol, so we have something to
17900	     refer to in the object file.  Unfortunately for us, gas's
17901	     generic expression parsing will already have folded out
17902	     any use of .set foo/.type foo %function that may have
17903	     been used to set type information of the target location,
17904	     that's being specified symbolically.  We have to presume
17905	     the user knows what they are doing.  */
17906	  char name[16 + 8];
17907	  symbolS *symbol;
17908
17909	  sprintf (name, "*ABS*0x%lx", (unsigned long)exp->X_add_number);
17910
17911	  symbol = symbol_find_or_make (name);
17912	  S_SET_SEGMENT (symbol, absolute_section);
17913	  symbol_set_frag (symbol, &zero_address_frag);
17914	  S_SET_VALUE (symbol, exp->X_add_number);
17915	  exp->X_op = O_symbol;
17916	  exp->X_add_symbol = symbol;
17917	  exp->X_add_number = 0;
17918	}
17919      /* FALLTHROUGH */
17920    case O_symbol:
17921    case O_add:
17922    case O_subtract:
17923      new_fix = fix_new_exp (frag, where, size, exp, pc_rel,
17924			     (enum bfd_reloc_code_real) reloc);
17925      break;
17926
17927    default:
17928      new_fix = (fixS *) fix_new (frag, where, size, make_expr_symbol (exp), 0,
17929				  pc_rel, (enum bfd_reloc_code_real) reloc);
17930      break;
17931    }
17932
17933  /* Mark whether the fix is to a THUMB instruction, or an ARM
17934     instruction.  */
17935  new_fix->tc_fix_data = thumb_mode;
17936}
17937
17938/* Create a frg for an instruction requiring relaxation.  */
17939static void
17940output_relax_insn (void)
17941{
17942  char * to;
17943  symbolS *sym;
17944  int offset;
17945
17946  /* The size of the instruction is unknown, so tie the debug info to the
17947     start of the instruction.  */
17948  dwarf2_emit_insn (0);
17949
17950  switch (inst.reloc.exp.X_op)
17951    {
17952    case O_symbol:
17953      sym = inst.reloc.exp.X_add_symbol;
17954      offset = inst.reloc.exp.X_add_number;
17955      break;
17956    case O_constant:
17957      sym = NULL;
17958      offset = inst.reloc.exp.X_add_number;
17959      break;
17960    default:
17961      sym = make_expr_symbol (&inst.reloc.exp);
17962      offset = 0;
17963      break;
17964  }
17965  to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
17966		 inst.relax, sym, offset, NULL/*offset, opcode*/);
17967  md_number_to_chars (to, inst.instruction, THUMB_SIZE);
17968}
17969
17970/* Write a 32-bit thumb instruction to buf.  */
17971static void
17972put_thumb32_insn (char * buf, unsigned long insn)
17973{
17974  md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
17975  md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
17976}
17977
17978static void
17979output_inst (const char * str)
17980{
17981  char * to = NULL;
17982
17983  if (inst.error)
17984    {
17985      as_bad ("%s -- `%s'", inst.error, str);
17986      return;
17987    }
17988  if (inst.relax)
17989    {
17990      output_relax_insn ();
17991      return;
17992    }
17993  if (inst.size == 0)
17994    return;
17995
17996  to = frag_more (inst.size);
17997  /* PR 9814: Record the thumb mode into the current frag so that we know
17998     what type of NOP padding to use, if necessary.  We override any previous
17999     setting so that if the mode has changed then the NOPS that we use will
18000     match the encoding of the last instruction in the frag.  */
18001  frag_now->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
18002
18003  if (thumb_mode && (inst.size > THUMB_SIZE))
18004    {
18005      gas_assert (inst.size == (2 * THUMB_SIZE));
18006      put_thumb32_insn (to, inst.instruction);
18007    }
18008  else if (inst.size > INSN_SIZE)
18009    {
18010      gas_assert (inst.size == (2 * INSN_SIZE));
18011      md_number_to_chars (to, inst.instruction, INSN_SIZE);
18012      md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
18013    }
18014  else
18015    md_number_to_chars (to, inst.instruction, inst.size);
18016
18017  if (inst.reloc.type != BFD_RELOC_UNUSED)
18018    fix_new_arm (frag_now, to - frag_now->fr_literal,
18019		 inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
18020		 inst.reloc.type);
18021
18022  dwarf2_emit_insn (inst.size);
18023}
18024
18025static char *
18026output_it_inst (int cond, int mask, char * to)
18027{
18028  unsigned long instruction = 0xbf00;
18029
18030  mask &= 0xf;
18031  instruction |= mask;
18032  instruction |= cond << 4;
18033
18034  if (to == NULL)
18035    {
18036      to = frag_more (2);
18037#ifdef OBJ_ELF
18038      dwarf2_emit_insn (2);
18039#endif
18040    }
18041
18042  md_number_to_chars (to, instruction, 2);
18043
18044  return to;
18045}
18046
18047/* Tag values used in struct asm_opcode's tag field.  */
18048enum opcode_tag
18049{
18050  OT_unconditional,	/* Instruction cannot be conditionalized.
18051			   The ARM condition field is still 0xE.  */
18052  OT_unconditionalF,	/* Instruction cannot be conditionalized
18053			   and carries 0xF in its ARM condition field.  */
18054  OT_csuffix,		/* Instruction takes a conditional suffix.  */
18055  OT_csuffixF,		/* Some forms of the instruction take a conditional
18056			   suffix, others place 0xF where the condition field
18057			   would be.  */
18058  OT_cinfix3,		/* Instruction takes a conditional infix,
18059			   beginning at character index 3.  (In
18060			   unified mode, it becomes a suffix.)  */
18061  OT_cinfix3_deprecated, /* The same as OT_cinfix3.  This is used for
18062			    tsts, cmps, cmns, and teqs. */
18063  OT_cinfix3_legacy,	/* Legacy instruction takes a conditional infix at
18064			   character index 3, even in unified mode.  Used for
18065			   legacy instructions where suffix and infix forms
18066			   may be ambiguous.  */
18067  OT_csuf_or_in3,	/* Instruction takes either a conditional
18068			   suffix or an infix at character index 3.  */
18069  OT_odd_infix_unc,	/* This is the unconditional variant of an
18070			   instruction that takes a conditional infix
18071			   at an unusual position.  In unified mode,
18072			   this variant will accept a suffix.  */
18073  OT_odd_infix_0	/* Values greater than or equal to OT_odd_infix_0
18074			   are the conditional variants of instructions that
18075			   take conditional infixes in unusual positions.
18076			   The infix appears at character index
18077			   (tag - OT_odd_infix_0).  These are not accepted
18078			   in unified mode.  */
18079};
18080
18081/* Subroutine of md_assemble, responsible for looking up the primary
18082   opcode from the mnemonic the user wrote.  STR points to the
18083   beginning of the mnemonic.
18084
18085   This is not simply a hash table lookup, because of conditional
18086   variants.  Most instructions have conditional variants, which are
18087   expressed with a _conditional affix_ to the mnemonic.  If we were
18088   to encode each conditional variant as a literal string in the opcode
18089   table, it would have approximately 20,000 entries.
18090
18091   Most mnemonics take this affix as a suffix, and in unified syntax,
18092   'most' is upgraded to 'all'.  However, in the divided syntax, some
18093   instructions take the affix as an infix, notably the s-variants of
18094   the arithmetic instructions.  Of those instructions, all but six
18095   have the infix appear after the third character of the mnemonic.
18096
18097   Accordingly, the algorithm for looking up primary opcodes given
18098   an identifier is:
18099
18100   1. Look up the identifier in the opcode table.
18101      If we find a match, go to step U.
18102
18103   2. Look up the last two characters of the identifier in the
18104      conditions table.  If we find a match, look up the first N-2
18105      characters of the identifier in the opcode table.  If we
18106      find a match, go to step CE.
18107
18108   3. Look up the fourth and fifth characters of the identifier in
18109      the conditions table.  If we find a match, extract those
18110      characters from the identifier, and look up the remaining
18111      characters in the opcode table.  If we find a match, go
18112      to step CM.
18113
18114   4. Fail.
18115
18116   U. Examine the tag field of the opcode structure, in case this is
18117      one of the six instructions with its conditional infix in an
18118      unusual place.  If it is, the tag tells us where to find the
18119      infix; look it up in the conditions table and set inst.cond
18120      accordingly.  Otherwise, this is an unconditional instruction.
18121      Again set inst.cond accordingly.  Return the opcode structure.
18122
18123  CE. Examine the tag field to make sure this is an instruction that
18124      should receive a conditional suffix.  If it is not, fail.
18125      Otherwise, set inst.cond from the suffix we already looked up,
18126      and return the opcode structure.
18127
18128  CM. Examine the tag field to make sure this is an instruction that
18129      should receive a conditional infix after the third character.
18130      If it is not, fail.  Otherwise, undo the edits to the current
18131      line of input and proceed as for case CE.  */
18132
18133static const struct asm_opcode *
18134opcode_lookup (char **str)
18135{
18136  char *end, *base;
18137  char *affix;
18138  const struct asm_opcode *opcode;
18139  const struct asm_cond *cond;
18140  char save[2];
18141
18142  /* Scan up to the end of the mnemonic, which must end in white space,
18143     '.' (in unified mode, or for Neon/VFP instructions), or end of string.  */
18144  for (base = end = *str; *end != '\0'; end++)
18145    if (*end == ' ' || *end == '.')
18146      break;
18147
18148  if (end == base)
18149    return NULL;
18150
18151  /* Handle a possible width suffix and/or Neon type suffix.  */
18152  if (end[0] == '.')
18153    {
18154      int offset = 2;
18155
18156      /* The .w and .n suffixes are only valid if the unified syntax is in
18157	 use.  */
18158      if (unified_syntax && end[1] == 'w')
18159	inst.size_req = 4;
18160      else if (unified_syntax && end[1] == 'n')
18161	inst.size_req = 2;
18162      else
18163	offset = 0;
18164
18165      inst.vectype.elems = 0;
18166
18167      *str = end + offset;
18168
18169      if (end[offset] == '.')
18170	{
18171	  /* See if we have a Neon type suffix (possible in either unified or
18172	     non-unified ARM syntax mode).  */
18173	  if (parse_neon_type (&inst.vectype, str) == FAIL)
18174	    return NULL;
18175	}
18176      else if (end[offset] != '\0' && end[offset] != ' ')
18177	return NULL;
18178    }
18179  else
18180    *str = end;
18181
18182  /* Look for unaffixed or special-case affixed mnemonic.  */
18183  opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
18184						    end - base);
18185  if (opcode)
18186    {
18187      /* step U */
18188      if (opcode->tag < OT_odd_infix_0)
18189	{
18190	  inst.cond = COND_ALWAYS;
18191	  return opcode;
18192	}
18193
18194      if (warn_on_deprecated && unified_syntax)
18195	as_tsktsk (_("conditional infixes are deprecated in unified syntax"));
18196      affix = base + (opcode->tag - OT_odd_infix_0);
18197      cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
18198      gas_assert (cond);
18199
18200      inst.cond = cond->value;
18201      return opcode;
18202    }
18203
18204  /* Cannot have a conditional suffix on a mnemonic of less than two
18205     characters.  */
18206  if (end - base < 3)
18207    return NULL;
18208
18209  /* Look for suffixed mnemonic.  */
18210  affix = end - 2;
18211  cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
18212  opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
18213						    affix - base);
18214  if (opcode && cond)
18215    {
18216      /* step CE */
18217      switch (opcode->tag)
18218	{
18219	case OT_cinfix3_legacy:
18220	  /* Ignore conditional suffixes matched on infix only mnemonics.  */
18221	  break;
18222
18223	case OT_cinfix3:
18224	case OT_cinfix3_deprecated:
18225	case OT_odd_infix_unc:
18226	  if (!unified_syntax)
18227	    return NULL;
18228	  /* Fall through.  */
18229
18230	case OT_csuffix:
18231	case OT_csuffixF:
18232	case OT_csuf_or_in3:
18233	  inst.cond = cond->value;
18234	  return opcode;
18235
18236	case OT_unconditional:
18237	case OT_unconditionalF:
18238	  if (thumb_mode)
18239	    inst.cond = cond->value;
18240	  else
18241	    {
18242	      /* Delayed diagnostic.  */
18243	      inst.error = BAD_COND;
18244	      inst.cond = COND_ALWAYS;
18245	    }
18246	  return opcode;
18247
18248	default:
18249	  return NULL;
18250	}
18251    }
18252
18253  /* Cannot have a usual-position infix on a mnemonic of less than
18254     six characters (five would be a suffix).  */
18255  if (end - base < 6)
18256    return NULL;
18257
18258  /* Look for infixed mnemonic in the usual position.  */
18259  affix = base + 3;
18260  cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
18261  if (!cond)
18262    return NULL;
18263
18264  memcpy (save, affix, 2);
18265  memmove (affix, affix + 2, (end - affix) - 2);
18266  opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
18267						    (end - base) - 2);
18268  memmove (affix + 2, affix, (end - affix) - 2);
18269  memcpy (affix, save, 2);
18270
18271  if (opcode
18272      && (opcode->tag == OT_cinfix3
18273	  || opcode->tag == OT_cinfix3_deprecated
18274	  || opcode->tag == OT_csuf_or_in3
18275	  || opcode->tag == OT_cinfix3_legacy))
18276    {
18277      /* Step CM.  */
18278      if (warn_on_deprecated && unified_syntax
18279	  && (opcode->tag == OT_cinfix3
18280	      || opcode->tag == OT_cinfix3_deprecated))
18281	as_tsktsk (_("conditional infixes are deprecated in unified syntax"));
18282
18283      inst.cond = cond->value;
18284      return opcode;
18285    }
18286
18287  return NULL;
18288}
18289
18290/* This function generates an initial IT instruction, leaving its block
18291   virtually open for the new instructions. Eventually,
18292   the mask will be updated by now_it_add_mask () each time
18293   a new instruction needs to be included in the IT block.
18294   Finally, the block is closed with close_automatic_it_block ().
18295   The block closure can be requested either from md_assemble (),
18296   a tencode (), or due to a label hook.  */
18297
18298static void
18299new_automatic_it_block (int cond)
18300{
18301  now_it.state = AUTOMATIC_IT_BLOCK;
18302  now_it.mask = 0x18;
18303  now_it.cc = cond;
18304  now_it.block_length = 1;
18305  mapping_state (MAP_THUMB);
18306  now_it.insn = output_it_inst (cond, now_it.mask, NULL);
18307  now_it.warn_deprecated = FALSE;
18308  now_it.insn_cond = TRUE;
18309}
18310
18311/* Close an automatic IT block.
18312   See comments in new_automatic_it_block ().  */
18313
18314static void
18315close_automatic_it_block (void)
18316{
18317  now_it.mask = 0x10;
18318  now_it.block_length = 0;
18319}
18320
18321/* Update the mask of the current automatically-generated IT
18322   instruction. See comments in new_automatic_it_block ().  */
18323
18324static void
18325now_it_add_mask (int cond)
18326{
18327#define CLEAR_BIT(value, nbit)  ((value) & ~(1 << (nbit)))
18328#define SET_BIT_VALUE(value, bitvalue, nbit)  (CLEAR_BIT (value, nbit) \
18329					      | ((bitvalue) << (nbit)))
18330  const int resulting_bit = (cond & 1);
18331
18332  now_it.mask &= 0xf;
18333  now_it.mask = SET_BIT_VALUE (now_it.mask,
18334				   resulting_bit,
18335				  (5 - now_it.block_length));
18336  now_it.mask = SET_BIT_VALUE (now_it.mask,
18337				   1,
18338				   ((5 - now_it.block_length) - 1) );
18339  output_it_inst (now_it.cc, now_it.mask, now_it.insn);
18340
18341#undef CLEAR_BIT
18342#undef SET_BIT_VALUE
18343}
18344
18345/* The IT blocks handling machinery is accessed through the these functions:
18346     it_fsm_pre_encode ()               from md_assemble ()
18347     set_it_insn_type ()                optional, from the tencode functions
18348     set_it_insn_type_last ()           ditto
18349     in_it_block ()                     ditto
18350     it_fsm_post_encode ()              from md_assemble ()
18351     force_automatic_it_block_close ()  from label handling functions
18352
18353   Rationale:
18354     1) md_assemble () calls it_fsm_pre_encode () before calling tencode (),
18355	initializing the IT insn type with a generic initial value depending
18356	on the inst.condition.
18357     2) During the tencode function, two things may happen:
18358	a) The tencode function overrides the IT insn type by
18359	   calling either set_it_insn_type (type) or set_it_insn_type_last ().
18360	b) The tencode function queries the IT block state by
18361	   calling in_it_block () (i.e. to determine narrow/not narrow mode).
18362
18363	Both set_it_insn_type and in_it_block run the internal FSM state
18364	handling function (handle_it_state), because: a) setting the IT insn
18365	type may incur in an invalid state (exiting the function),
18366	and b) querying the state requires the FSM to be updated.
18367	Specifically we want to avoid creating an IT block for conditional
18368	branches, so it_fsm_pre_encode is actually a guess and we can't
18369	determine whether an IT block is required until the tencode () routine
18370	has decided what type of instruction this actually it.
18371	Because of this, if set_it_insn_type and in_it_block have to be used,
18372	set_it_insn_type has to be called first.
18373
18374	set_it_insn_type_last () is a wrapper of set_it_insn_type (type), that
18375	determines the insn IT type depending on the inst.cond code.
18376	When a tencode () routine encodes an instruction that can be
18377	either outside an IT block, or, in the case of being inside, has to be
18378	the last one, set_it_insn_type_last () will determine the proper
18379	IT instruction type based on the inst.cond code. Otherwise,
18380	set_it_insn_type can be called for overriding that logic or
18381	for covering other cases.
18382
18383	Calling handle_it_state () may not transition the IT block state to
18384	OUTSIDE_IT_BLOCK immediately, since the (current) state could be
18385	still queried. Instead, if the FSM determines that the state should
18386	be transitioned to OUTSIDE_IT_BLOCK, a flag is marked to be closed
18387	after the tencode () function: that's what it_fsm_post_encode () does.
18388
18389	Since in_it_block () calls the state handling function to get an
18390	updated state, an error may occur (due to invalid insns combination).
18391	In that case, inst.error is set.
18392	Therefore, inst.error has to be checked after the execution of
18393	the tencode () routine.
18394
18395     3) Back in md_assemble(), it_fsm_post_encode () is called to commit
18396	any pending state change (if any) that didn't take place in
18397	handle_it_state () as explained above.  */
18398
18399static void
18400it_fsm_pre_encode (void)
18401{
18402  if (inst.cond != COND_ALWAYS)
18403    inst.it_insn_type = INSIDE_IT_INSN;
18404  else
18405    inst.it_insn_type = OUTSIDE_IT_INSN;
18406
18407  now_it.state_handled = 0;
18408}
18409
18410/* IT state FSM handling function.  */
18411
18412static int
18413handle_it_state (void)
18414{
18415  now_it.state_handled = 1;
18416  now_it.insn_cond = FALSE;
18417
18418  switch (now_it.state)
18419    {
18420    case OUTSIDE_IT_BLOCK:
18421      switch (inst.it_insn_type)
18422	{
18423	case OUTSIDE_IT_INSN:
18424	  break;
18425
18426	case INSIDE_IT_INSN:
18427	case INSIDE_IT_LAST_INSN:
18428	  if (thumb_mode == 0)
18429	    {
18430	      if (unified_syntax
18431		  && !(implicit_it_mode & IMPLICIT_IT_MODE_ARM))
18432		as_tsktsk (_("Warning: conditional outside an IT block"\
18433			     " for Thumb."));
18434	    }
18435	  else
18436	    {
18437	      if ((implicit_it_mode & IMPLICIT_IT_MODE_THUMB)
18438		  && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2))
18439		{
18440		  /* Automatically generate the IT instruction.  */
18441		  new_automatic_it_block (inst.cond);
18442		  if (inst.it_insn_type == INSIDE_IT_LAST_INSN)
18443		    close_automatic_it_block ();
18444		}
18445	      else
18446		{
18447		  inst.error = BAD_OUT_IT;
18448		  return FAIL;
18449		}
18450	    }
18451	  break;
18452
18453	case IF_INSIDE_IT_LAST_INSN:
18454	case NEUTRAL_IT_INSN:
18455	  break;
18456
18457	case IT_INSN:
18458	  now_it.state = MANUAL_IT_BLOCK;
18459	  now_it.block_length = 0;
18460	  break;
18461	}
18462      break;
18463
18464    case AUTOMATIC_IT_BLOCK:
18465      /* Three things may happen now:
18466	 a) We should increment current it block size;
18467	 b) We should close current it block (closing insn or 4 insns);
18468	 c) We should close current it block and start a new one (due
18469	 to incompatible conditions or
18470	 4 insns-length block reached).  */
18471
18472      switch (inst.it_insn_type)
18473	{
18474	case OUTSIDE_IT_INSN:
18475	  /* The closure of the block shall happen immediately,
18476	     so any in_it_block () call reports the block as closed.  */
18477	  force_automatic_it_block_close ();
18478	  break;
18479
18480	case INSIDE_IT_INSN:
18481	case INSIDE_IT_LAST_INSN:
18482	case IF_INSIDE_IT_LAST_INSN:
18483	  now_it.block_length++;
18484
18485	  if (now_it.block_length > 4
18486	      || !now_it_compatible (inst.cond))
18487	    {
18488	      force_automatic_it_block_close ();
18489	      if (inst.it_insn_type != IF_INSIDE_IT_LAST_INSN)
18490		new_automatic_it_block (inst.cond);
18491	    }
18492	  else
18493	    {
18494	      now_it.insn_cond = TRUE;
18495	      now_it_add_mask (inst.cond);
18496	    }
18497
18498	  if (now_it.state == AUTOMATIC_IT_BLOCK
18499	      && (inst.it_insn_type == INSIDE_IT_LAST_INSN
18500		  || inst.it_insn_type == IF_INSIDE_IT_LAST_INSN))
18501	    close_automatic_it_block ();
18502	  break;
18503
18504	case NEUTRAL_IT_INSN:
18505	  now_it.block_length++;
18506	  now_it.insn_cond = TRUE;
18507
18508	  if (now_it.block_length > 4)
18509	    force_automatic_it_block_close ();
18510	  else
18511	    now_it_add_mask (now_it.cc & 1);
18512	  break;
18513
18514	case IT_INSN:
18515	  close_automatic_it_block ();
18516	  now_it.state = MANUAL_IT_BLOCK;
18517	  break;
18518	}
18519      break;
18520
18521    case MANUAL_IT_BLOCK:
18522      {
18523	/* Check conditional suffixes.  */
18524	const int cond = now_it.cc ^ ((now_it.mask >> 4) & 1) ^ 1;
18525	int is_last;
18526	now_it.mask <<= 1;
18527	now_it.mask &= 0x1f;
18528	is_last = (now_it.mask == 0x10);
18529	now_it.insn_cond = TRUE;
18530
18531	switch (inst.it_insn_type)
18532	  {
18533	  case OUTSIDE_IT_INSN:
18534	    inst.error = BAD_NOT_IT;
18535	    return FAIL;
18536
18537	  case INSIDE_IT_INSN:
18538	    if (cond != inst.cond)
18539	      {
18540		inst.error = BAD_IT_COND;
18541		return FAIL;
18542	      }
18543	    break;
18544
18545	  case INSIDE_IT_LAST_INSN:
18546	  case IF_INSIDE_IT_LAST_INSN:
18547	    if (cond != inst.cond)
18548	      {
18549		inst.error = BAD_IT_COND;
18550		return FAIL;
18551	      }
18552	    if (!is_last)
18553	      {
18554		inst.error = BAD_BRANCH;
18555		return FAIL;
18556	      }
18557	    break;
18558
18559	  case NEUTRAL_IT_INSN:
18560	    /* The BKPT instruction is unconditional even in an IT block.  */
18561	    break;
18562
18563	  case IT_INSN:
18564	    inst.error = BAD_IT_IT;
18565	    return FAIL;
18566	  }
18567      }
18568      break;
18569    }
18570
18571  return SUCCESS;
18572}
18573
18574struct depr_insn_mask
18575{
18576  unsigned long pattern;
18577  unsigned long mask;
18578  const char* description;
18579};
18580
18581/* List of 16-bit instruction patterns deprecated in an IT block in
18582   ARMv8.  */
18583static const struct depr_insn_mask depr_it_insns[] = {
18584  { 0xc000, 0xc000, N_("Short branches, Undefined, SVC, LDM/STM") },
18585  { 0xb000, 0xb000, N_("Miscellaneous 16-bit instructions") },
18586  { 0xa000, 0xb800, N_("ADR") },
18587  { 0x4800, 0xf800, N_("Literal loads") },
18588  { 0x4478, 0xf478, N_("Hi-register ADD, MOV, CMP, BX, BLX using pc") },
18589  { 0x4487, 0xfc87, N_("Hi-register ADD, MOV, CMP using pc") },
18590  /* NOTE: 0x00dd is not the real encoding, instead, it is the 'tvalue'
18591     field in asm_opcode. 'tvalue' is used at the stage this check happen.  */
18592  { 0x00dd, 0x7fff, N_("ADD/SUB sp, sp #imm") },
18593  { 0, 0, NULL }
18594};
18595
18596static void
18597it_fsm_post_encode (void)
18598{
18599  int is_last;
18600
18601  if (!now_it.state_handled)
18602    handle_it_state ();
18603
18604  if (now_it.insn_cond
18605      && !now_it.warn_deprecated
18606      && warn_on_deprecated
18607      && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8)
18608      && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_m))
18609    {
18610      if (inst.instruction >= 0x10000)
18611	{
18612	  as_tsktsk (_("IT blocks containing 32-bit Thumb instructions are "
18613		     "performance deprecated in ARMv8-A and ARMv8-R"));
18614	  now_it.warn_deprecated = TRUE;
18615	}
18616      else
18617	{
18618	  const struct depr_insn_mask *p = depr_it_insns;
18619
18620	  while (p->mask != 0)
18621	    {
18622	      if ((inst.instruction & p->mask) == p->pattern)
18623		{
18624		  as_tsktsk (_("IT blocks containing 16-bit Thumb "
18625			       "instructions of the following class are "
18626			       "performance deprecated in ARMv8-A and "
18627			       "ARMv8-R: %s"), p->description);
18628		  now_it.warn_deprecated = TRUE;
18629		  break;
18630		}
18631
18632	      ++p;
18633	    }
18634	}
18635
18636      if (now_it.block_length > 1)
18637	{
18638	  as_tsktsk (_("IT blocks containing more than one conditional "
18639		     "instruction are performance deprecated in ARMv8-A and "
18640		     "ARMv8-R"));
18641	  now_it.warn_deprecated = TRUE;
18642	}
18643    }
18644
18645  is_last = (now_it.mask == 0x10);
18646  if (is_last)
18647    {
18648      now_it.state = OUTSIDE_IT_BLOCK;
18649      now_it.mask = 0;
18650    }
18651}
18652
18653static void
18654force_automatic_it_block_close (void)
18655{
18656  if (now_it.state == AUTOMATIC_IT_BLOCK)
18657    {
18658      close_automatic_it_block ();
18659      now_it.state = OUTSIDE_IT_BLOCK;
18660      now_it.mask = 0;
18661    }
18662}
18663
18664static int
18665in_it_block (void)
18666{
18667  if (!now_it.state_handled)
18668    handle_it_state ();
18669
18670  return now_it.state != OUTSIDE_IT_BLOCK;
18671}
18672
18673/* Whether OPCODE only has T32 encoding.  Since this function is only used by
18674   t32_insn_ok, OPCODE enabled by v6t2 extension bit do not need to be listed
18675   here, hence the "known" in the function name.  */
18676
18677static bfd_boolean
18678known_t32_only_insn (const struct asm_opcode *opcode)
18679{
18680  /* Original Thumb-1 wide instruction.  */
18681  if (opcode->tencode == do_t_blx
18682      || opcode->tencode == do_t_branch23
18683      || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
18684      || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier))
18685    return TRUE;
18686
18687  /* Wide-only instruction added to ARMv8-M Baseline.  */
18688  if (ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_v8m_m_only)
18689      || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_atomics)
18690      || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_v6t2_v8m)
18691      || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_div))
18692    return TRUE;
18693
18694  return FALSE;
18695}
18696
18697/* Whether wide instruction variant can be used if available for a valid OPCODE
18698   in ARCH.  */
18699
18700static bfd_boolean
18701t32_insn_ok (arm_feature_set arch, const struct asm_opcode *opcode)
18702{
18703  if (known_t32_only_insn (opcode))
18704    return TRUE;
18705
18706  /* Instruction with narrow and wide encoding added to ARMv8-M.  Availability
18707     of variant T3 of B.W is checked in do_t_branch.  */
18708  if (ARM_CPU_HAS_FEATURE (arch, arm_ext_v8m)
18709      && opcode->tencode == do_t_branch)
18710    return TRUE;
18711
18712  /* MOV accepts T1/T3 encodings under Baseline, T3 encoding is 32bit.  */
18713  if (ARM_CPU_HAS_FEATURE (arch, arm_ext_v8m)
18714      && opcode->tencode == do_t_mov_cmp
18715      /* Make sure CMP instruction is not affected.  */
18716      && opcode->aencode == do_mov)
18717    return TRUE;
18718
18719  /* Wide instruction variants of all instructions with narrow *and* wide
18720     variants become available with ARMv6t2.  Other opcodes are either
18721     narrow-only or wide-only and are thus available if OPCODE is valid.  */
18722  if (ARM_CPU_HAS_FEATURE (arch, arm_ext_v6t2))
18723    return TRUE;
18724
18725  /* OPCODE with narrow only instruction variant or wide variant not
18726     available.  */
18727  return FALSE;
18728}
18729
18730void
18731md_assemble (char *str)
18732{
18733  char *p = str;
18734  const struct asm_opcode * opcode;
18735
18736  /* Align the previous label if needed.  */
18737  if (last_label_seen != NULL)
18738    {
18739      symbol_set_frag (last_label_seen, frag_now);
18740      S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
18741      S_SET_SEGMENT (last_label_seen, now_seg);
18742    }
18743
18744  memset (&inst, '\0', sizeof (inst));
18745  inst.reloc.type = BFD_RELOC_UNUSED;
18746
18747  opcode = opcode_lookup (&p);
18748  if (!opcode)
18749    {
18750      /* It wasn't an instruction, but it might be a register alias of
18751	 the form alias .req reg, or a Neon .dn/.qn directive.  */
18752      if (! create_register_alias (str, p)
18753	  && ! create_neon_reg_alias (str, p))
18754	as_bad (_("bad instruction `%s'"), str);
18755
18756      return;
18757    }
18758
18759  if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
18760    as_tsktsk (_("s suffix on comparison instruction is deprecated"));
18761
18762  /* The value which unconditional instructions should have in place of the
18763     condition field.  */
18764  inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
18765
18766  if (thumb_mode)
18767    {
18768      arm_feature_set variant;
18769
18770      variant = cpu_variant;
18771      /* Only allow coprocessor instructions on Thumb-2 capable devices.  */
18772      if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
18773	ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
18774      /* Check that this instruction is supported for this CPU.  */
18775      if (!opcode->tvariant
18776	  || (thumb_mode == 1
18777	      && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
18778	{
18779	  if (opcode->tencode == do_t_swi)
18780	    as_bad (_("SVC is not permitted on this architecture"));
18781	  else
18782	    as_bad (_("selected processor does not support `%s' in Thumb mode"), str);
18783	  return;
18784	}
18785      if (inst.cond != COND_ALWAYS && !unified_syntax
18786	  && opcode->tencode != do_t_branch)
18787	{
18788	  as_bad (_("Thumb does not support conditional execution"));
18789	  return;
18790	}
18791
18792      /* Two things are addressed here:
18793	 1) Implicit require narrow instructions on Thumb-1.
18794	    This avoids relaxation accidentally introducing Thumb-2
18795	    instructions.
18796	 2) Reject wide instructions in non Thumb-2 cores.
18797
18798	 Only instructions with narrow and wide variants need to be handled
18799	 but selecting all non wide-only instructions is easier.  */
18800      if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2)
18801	  && !t32_insn_ok (variant, opcode))
18802	{
18803	  if (inst.size_req == 0)
18804	    inst.size_req = 2;
18805	  else if (inst.size_req == 4)
18806	    {
18807	      if (ARM_CPU_HAS_FEATURE (variant, arm_ext_v8m))
18808		as_bad (_("selected processor does not support 32bit wide "
18809			  "variant of instruction `%s'"), str);
18810	      else
18811		as_bad (_("selected processor does not support `%s' in "
18812			  "Thumb-2 mode"), str);
18813	      return;
18814	    }
18815	}
18816
18817      inst.instruction = opcode->tvalue;
18818
18819      if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
18820	{
18821	  /* Prepare the it_insn_type for those encodings that don't set
18822	     it.  */
18823	  it_fsm_pre_encode ();
18824
18825	  opcode->tencode ();
18826
18827	  it_fsm_post_encode ();
18828	}
18829
18830      if (!(inst.error || inst.relax))
18831	{
18832	  gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
18833	  inst.size = (inst.instruction > 0xffff ? 4 : 2);
18834	  if (inst.size_req && inst.size_req != inst.size)
18835	    {
18836	      as_bad (_("cannot honor width suffix -- `%s'"), str);
18837	      return;
18838	    }
18839	}
18840
18841      /* Something has gone badly wrong if we try to relax a fixed size
18842	 instruction.  */
18843      gas_assert (inst.size_req == 0 || !inst.relax);
18844
18845      ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
18846			      *opcode->tvariant);
18847      /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
18848	 set those bits when Thumb-2 32-bit instructions are seen.  The impact
18849	 of relaxable instructions will be considered later after we finish all
18850	 relaxation.  */
18851      if (ARM_FEATURE_CORE_EQUAL (cpu_variant, arm_arch_any))
18852	variant = arm_arch_none;
18853      else
18854	variant = cpu_variant;
18855      if (inst.size == 4 && !t32_insn_ok (variant, opcode))
18856	ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
18857				arm_ext_v6t2);
18858
18859      check_neon_suffixes;
18860
18861      if (!inst.error)
18862	{
18863	  mapping_state (MAP_THUMB);
18864	}
18865    }
18866  else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
18867    {
18868      bfd_boolean is_bx;
18869
18870      /* bx is allowed on v5 cores, and sometimes on v4 cores.  */
18871      is_bx = (opcode->aencode == do_bx);
18872
18873      /* Check that this instruction is supported for this CPU.  */
18874      if (!(is_bx && fix_v4bx)
18875	  && !(opcode->avariant &&
18876	       ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
18877	{
18878	  as_bad (_("selected processor does not support `%s' in ARM mode"), str);
18879	  return;
18880	}
18881      if (inst.size_req)
18882	{
18883	  as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
18884	  return;
18885	}
18886
18887      inst.instruction = opcode->avalue;
18888      if (opcode->tag == OT_unconditionalF)
18889	inst.instruction |= 0xFU << 28;
18890      else
18891	inst.instruction |= inst.cond << 28;
18892      inst.size = INSN_SIZE;
18893      if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
18894	{
18895	  it_fsm_pre_encode ();
18896	  opcode->aencode ();
18897	  it_fsm_post_encode ();
18898	}
18899      /* Arm mode bx is marked as both v4T and v5 because it's still required
18900	 on a hypothetical non-thumb v5 core.  */
18901      if (is_bx)
18902	ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
18903      else
18904	ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
18905				*opcode->avariant);
18906
18907      check_neon_suffixes;
18908
18909      if (!inst.error)
18910	{
18911	  mapping_state (MAP_ARM);
18912	}
18913    }
18914  else
18915    {
18916      as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
18917		"-- `%s'"), str);
18918      return;
18919    }
18920  output_inst (str);
18921}
18922
18923static void
18924check_it_blocks_finished (void)
18925{
18926#ifdef OBJ_ELF
18927  asection *sect;
18928
18929  for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
18930    {
18931      segment_info_type *seginfo = seg_info (sect);
18932
18933      if (seginfo && seginfo->tc_segment_info_data.current_it.state
18934	  == MANUAL_IT_BLOCK)
18935        {
18936	  as_warn (_("section '%s' finished with an open IT block."),
18937		   sect->name);
18938        }
18939    }
18940#else
18941  if (now_it.state == MANUAL_IT_BLOCK)
18942    as_warn (_("file finished with an open IT block."));
18943#endif
18944}
18945
18946/* Various frobbings of labels and their addresses.  */
18947
18948void
18949arm_start_line_hook (void)
18950{
18951  last_label_seen = NULL;
18952}
18953
18954void
18955arm_frob_label (symbolS * sym)
18956{
18957  last_label_seen = sym;
18958
18959  ARM_SET_THUMB (sym, thumb_mode);
18960
18961#if defined OBJ_COFF || defined OBJ_ELF
18962  ARM_SET_INTERWORK (sym, support_interwork);
18963#endif
18964
18965  force_automatic_it_block_close ();
18966
18967  /* Note - do not allow local symbols (.Lxxx) to be labelled
18968     as Thumb functions.  This is because these labels, whilst
18969     they exist inside Thumb code, are not the entry points for
18970     possible ARM->Thumb calls.	 Also, these labels can be used
18971     as part of a computed goto or switch statement.  eg gcc
18972     can generate code that looks like this:
18973
18974		ldr  r2, [pc, .Laaa]
18975		lsl  r3, r3, #2
18976		ldr  r2, [r3, r2]
18977		mov  pc, r2
18978
18979       .Lbbb:  .word .Lxxx
18980       .Lccc:  .word .Lyyy
18981       ..etc...
18982       .Laaa:	.word Lbbb
18983
18984     The first instruction loads the address of the jump table.
18985     The second instruction converts a table index into a byte offset.
18986     The third instruction gets the jump address out of the table.
18987     The fourth instruction performs the jump.
18988
18989     If the address stored at .Laaa is that of a symbol which has the
18990     Thumb_Func bit set, then the linker will arrange for this address
18991     to have the bottom bit set, which in turn would mean that the
18992     address computation performed by the third instruction would end
18993     up with the bottom bit set.  Since the ARM is capable of unaligned
18994     word loads, the instruction would then load the incorrect address
18995     out of the jump table, and chaos would ensue.  */
18996  if (label_is_thumb_function_name
18997      && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
18998      && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
18999    {
19000      /* When the address of a Thumb function is taken the bottom
19001	 bit of that address should be set.  This will allow
19002	 interworking between Arm and Thumb functions to work
19003	 correctly.  */
19004
19005      THUMB_SET_FUNC (sym, 1);
19006
19007      label_is_thumb_function_name = FALSE;
19008    }
19009
19010  dwarf2_emit_label (sym);
19011}
19012
19013bfd_boolean
19014arm_data_in_code (void)
19015{
19016  if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
19017    {
19018      *input_line_pointer = '/';
19019      input_line_pointer += 5;
19020      *input_line_pointer = 0;
19021      return TRUE;
19022    }
19023
19024  return FALSE;
19025}
19026
19027char *
19028arm_canonicalize_symbol_name (char * name)
19029{
19030  int len;
19031
19032  if (thumb_mode && (len = strlen (name)) > 5
19033      && streq (name + len - 5, "/data"))
19034    *(name + len - 5) = 0;
19035
19036  return name;
19037}
19038
19039/* Table of all register names defined by default.  The user can
19040   define additional names with .req.  Note that all register names
19041   should appear in both upper and lowercase variants.	Some registers
19042   also have mixed-case names.	*/
19043
19044#define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
19045#define REGNUM(p,n,t) REGDEF(p##n, n, t)
19046#define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
19047#define REGSET(p,t) \
19048  REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
19049  REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
19050  REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
19051  REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
19052#define REGSETH(p,t) \
19053  REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
19054  REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
19055  REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
19056  REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
19057#define REGSET2(p,t) \
19058  REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
19059  REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
19060  REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
19061  REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
19062#define SPLRBANK(base,bank,t) \
19063  REGDEF(lr_##bank, 768|((base+0)<<16), t), \
19064  REGDEF(sp_##bank, 768|((base+1)<<16), t), \
19065  REGDEF(spsr_##bank, 768|(base<<16)|SPSR_BIT, t), \
19066  REGDEF(LR_##bank, 768|((base+0)<<16), t), \
19067  REGDEF(SP_##bank, 768|((base+1)<<16), t), \
19068  REGDEF(SPSR_##bank, 768|(base<<16)|SPSR_BIT, t)
19069
19070static const struct reg_entry reg_names[] =
19071{
19072  /* ARM integer registers.  */
19073  REGSET(r, RN), REGSET(R, RN),
19074
19075  /* ATPCS synonyms.  */
19076  REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
19077  REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
19078  REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
19079
19080  REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
19081  REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
19082  REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
19083
19084  /* Well-known aliases.  */
19085  REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
19086  REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
19087
19088  REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
19089  REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
19090
19091  /* Coprocessor numbers.  */
19092  REGSET(p, CP), REGSET(P, CP),
19093
19094  /* Coprocessor register numbers.  The "cr" variants are for backward
19095     compatibility.  */
19096  REGSET(c,  CN), REGSET(C, CN),
19097  REGSET(cr, CN), REGSET(CR, CN),
19098
19099  /* ARM banked registers.  */
19100  REGDEF(R8_usr,512|(0<<16),RNB), REGDEF(r8_usr,512|(0<<16),RNB),
19101  REGDEF(R9_usr,512|(1<<16),RNB), REGDEF(r9_usr,512|(1<<16),RNB),
19102  REGDEF(R10_usr,512|(2<<16),RNB), REGDEF(r10_usr,512|(2<<16),RNB),
19103  REGDEF(R11_usr,512|(3<<16),RNB), REGDEF(r11_usr,512|(3<<16),RNB),
19104  REGDEF(R12_usr,512|(4<<16),RNB), REGDEF(r12_usr,512|(4<<16),RNB),
19105  REGDEF(SP_usr,512|(5<<16),RNB), REGDEF(sp_usr,512|(5<<16),RNB),
19106  REGDEF(LR_usr,512|(6<<16),RNB), REGDEF(lr_usr,512|(6<<16),RNB),
19107
19108  REGDEF(R8_fiq,512|(8<<16),RNB), REGDEF(r8_fiq,512|(8<<16),RNB),
19109  REGDEF(R9_fiq,512|(9<<16),RNB), REGDEF(r9_fiq,512|(9<<16),RNB),
19110  REGDEF(R10_fiq,512|(10<<16),RNB), REGDEF(r10_fiq,512|(10<<16),RNB),
19111  REGDEF(R11_fiq,512|(11<<16),RNB), REGDEF(r11_fiq,512|(11<<16),RNB),
19112  REGDEF(R12_fiq,512|(12<<16),RNB), REGDEF(r12_fiq,512|(12<<16),RNB),
19113  REGDEF(SP_fiq,512|(13<<16),RNB), REGDEF(sp_fiq,512|(13<<16),RNB),
19114  REGDEF(LR_fiq,512|(14<<16),RNB), REGDEF(lr_fiq,512|(14<<16),RNB),
19115  REGDEF(SPSR_fiq,512|(14<<16)|SPSR_BIT,RNB), REGDEF(spsr_fiq,512|(14<<16)|SPSR_BIT,RNB),
19116
19117  SPLRBANK(0,IRQ,RNB), SPLRBANK(0,irq,RNB),
19118  SPLRBANK(2,SVC,RNB), SPLRBANK(2,svc,RNB),
19119  SPLRBANK(4,ABT,RNB), SPLRBANK(4,abt,RNB),
19120  SPLRBANK(6,UND,RNB), SPLRBANK(6,und,RNB),
19121  SPLRBANK(12,MON,RNB), SPLRBANK(12,mon,RNB),
19122  REGDEF(elr_hyp,768|(14<<16),RNB), REGDEF(ELR_hyp,768|(14<<16),RNB),
19123  REGDEF(sp_hyp,768|(15<<16),RNB), REGDEF(SP_hyp,768|(15<<16),RNB),
19124  REGDEF(spsr_hyp,768|(14<<16)|SPSR_BIT,RNB),
19125  REGDEF(SPSR_hyp,768|(14<<16)|SPSR_BIT,RNB),
19126
19127  /* FPA registers.  */
19128  REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
19129  REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
19130
19131  REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
19132  REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
19133
19134  /* VFP SP registers.	*/
19135  REGSET(s,VFS),  REGSET(S,VFS),
19136  REGSETH(s,VFS), REGSETH(S,VFS),
19137
19138  /* VFP DP Registers.	*/
19139  REGSET(d,VFD),  REGSET(D,VFD),
19140  /* Extra Neon DP registers.  */
19141  REGSETH(d,VFD), REGSETH(D,VFD),
19142
19143  /* Neon QP registers.  */
19144  REGSET2(q,NQ),  REGSET2(Q,NQ),
19145
19146  /* VFP control registers.  */
19147  REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
19148  REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
19149  REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
19150  REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
19151  REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
19152  REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
19153  REGDEF(mvfr2,5,VFC), REGDEF(MVFR2,5,VFC),
19154
19155  /* Maverick DSP coprocessor registers.  */
19156  REGSET(mvf,MVF),  REGSET(mvd,MVD),  REGSET(mvfx,MVFX),  REGSET(mvdx,MVDX),
19157  REGSET(MVF,MVF),  REGSET(MVD,MVD),  REGSET(MVFX,MVFX),  REGSET(MVDX,MVDX),
19158
19159  REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
19160  REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
19161  REGDEF(dspsc,0,DSPSC),
19162
19163  REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
19164  REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
19165  REGDEF(DSPSC,0,DSPSC),
19166
19167  /* iWMMXt data registers - p0, c0-15.	 */
19168  REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
19169
19170  /* iWMMXt control registers - p1, c0-3.  */
19171  REGDEF(wcid,	0,MMXWC),  REGDEF(wCID,	 0,MMXWC),  REGDEF(WCID,  0,MMXWC),
19172  REGDEF(wcon,	1,MMXWC),  REGDEF(wCon,	 1,MMXWC),  REGDEF(WCON,  1,MMXWC),
19173  REGDEF(wcssf, 2,MMXWC),  REGDEF(wCSSF, 2,MMXWC),  REGDEF(WCSSF, 2,MMXWC),
19174  REGDEF(wcasf, 3,MMXWC),  REGDEF(wCASF, 3,MMXWC),  REGDEF(WCASF, 3,MMXWC),
19175
19176  /* iWMMXt scalar (constant/offset) registers - p1, c8-11.  */
19177  REGDEF(wcgr0, 8,MMXWCG),  REGDEF(wCGR0, 8,MMXWCG),  REGDEF(WCGR0, 8,MMXWCG),
19178  REGDEF(wcgr1, 9,MMXWCG),  REGDEF(wCGR1, 9,MMXWCG),  REGDEF(WCGR1, 9,MMXWCG),
19179  REGDEF(wcgr2,10,MMXWCG),  REGDEF(wCGR2,10,MMXWCG),  REGDEF(WCGR2,10,MMXWCG),
19180  REGDEF(wcgr3,11,MMXWCG),  REGDEF(wCGR3,11,MMXWCG),  REGDEF(WCGR3,11,MMXWCG),
19181
19182  /* XScale accumulator registers.  */
19183  REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
19184};
19185#undef REGDEF
19186#undef REGNUM
19187#undef REGSET
19188
19189/* Table of all PSR suffixes.  Bare "CPSR" and "SPSR" are handled
19190   within psr_required_here.  */
19191static const struct asm_psr psrs[] =
19192{
19193  /* Backward compatibility notation.  Note that "all" is no longer
19194     truly all possible PSR bits.  */
19195  {"all",  PSR_c | PSR_f},
19196  {"flg",  PSR_f},
19197  {"ctl",  PSR_c},
19198
19199  /* Individual flags.	*/
19200  {"f",	   PSR_f},
19201  {"c",	   PSR_c},
19202  {"x",	   PSR_x},
19203  {"s",	   PSR_s},
19204
19205  /* Combinations of flags.  */
19206  {"fs",   PSR_f | PSR_s},
19207  {"fx",   PSR_f | PSR_x},
19208  {"fc",   PSR_f | PSR_c},
19209  {"sf",   PSR_s | PSR_f},
19210  {"sx",   PSR_s | PSR_x},
19211  {"sc",   PSR_s | PSR_c},
19212  {"xf",   PSR_x | PSR_f},
19213  {"xs",   PSR_x | PSR_s},
19214  {"xc",   PSR_x | PSR_c},
19215  {"cf",   PSR_c | PSR_f},
19216  {"cs",   PSR_c | PSR_s},
19217  {"cx",   PSR_c | PSR_x},
19218  {"fsx",  PSR_f | PSR_s | PSR_x},
19219  {"fsc",  PSR_f | PSR_s | PSR_c},
19220  {"fxs",  PSR_f | PSR_x | PSR_s},
19221  {"fxc",  PSR_f | PSR_x | PSR_c},
19222  {"fcs",  PSR_f | PSR_c | PSR_s},
19223  {"fcx",  PSR_f | PSR_c | PSR_x},
19224  {"sfx",  PSR_s | PSR_f | PSR_x},
19225  {"sfc",  PSR_s | PSR_f | PSR_c},
19226  {"sxf",  PSR_s | PSR_x | PSR_f},
19227  {"sxc",  PSR_s | PSR_x | PSR_c},
19228  {"scf",  PSR_s | PSR_c | PSR_f},
19229  {"scx",  PSR_s | PSR_c | PSR_x},
19230  {"xfs",  PSR_x | PSR_f | PSR_s},
19231  {"xfc",  PSR_x | PSR_f | PSR_c},
19232  {"xsf",  PSR_x | PSR_s | PSR_f},
19233  {"xsc",  PSR_x | PSR_s | PSR_c},
19234  {"xcf",  PSR_x | PSR_c | PSR_f},
19235  {"xcs",  PSR_x | PSR_c | PSR_s},
19236  {"cfs",  PSR_c | PSR_f | PSR_s},
19237  {"cfx",  PSR_c | PSR_f | PSR_x},
19238  {"csf",  PSR_c | PSR_s | PSR_f},
19239  {"csx",  PSR_c | PSR_s | PSR_x},
19240  {"cxf",  PSR_c | PSR_x | PSR_f},
19241  {"cxs",  PSR_c | PSR_x | PSR_s},
19242  {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
19243  {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
19244  {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
19245  {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
19246  {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
19247  {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
19248  {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
19249  {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
19250  {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
19251  {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
19252  {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
19253  {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
19254  {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
19255  {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
19256  {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
19257  {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
19258  {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
19259  {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
19260  {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
19261  {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
19262  {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
19263  {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
19264  {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
19265  {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
19266};
19267
19268/* Table of V7M psr names.  */
19269static const struct asm_psr v7m_psrs[] =
19270{
19271  {"apsr",	   0x0 }, {"APSR",	   0x0 },
19272  {"iapsr",	   0x1 }, {"IAPSR",	   0x1 },
19273  {"eapsr",	   0x2 }, {"EAPSR",	   0x2 },
19274  {"psr",	   0x3 }, {"PSR",	   0x3 },
19275  {"xpsr",	   0x3 }, {"XPSR",	   0x3 }, {"xPSR",	  3 },
19276  {"ipsr",	   0x5 }, {"IPSR",	   0x5 },
19277  {"epsr",	   0x6 }, {"EPSR",	   0x6 },
19278  {"iepsr",	   0x7 }, {"IEPSR",	   0x7 },
19279  {"msp",	   0x8 }, {"MSP",	   0x8 },
19280  {"psp",	   0x9 }, {"PSP",	   0x9 },
19281  {"msplim",	   0xa }, {"MSPLIM",	   0xa },
19282  {"psplim",	   0xb }, {"PSPLIM",	   0xb },
19283  {"primask",	   0x10}, {"PRIMASK",	   0x10},
19284  {"basepri",	   0x11}, {"BASEPRI",	   0x11},
19285  {"basepri_max",  0x12}, {"BASEPRI_MAX",  0x12},
19286  {"faultmask",	   0x13}, {"FAULTMASK",	   0x13},
19287  {"control",	   0x14}, {"CONTROL",	   0x14},
19288  {"msp_ns",	   0x88}, {"MSP_NS",	   0x88},
19289  {"psp_ns",	   0x89}, {"PSP_NS",	   0x89},
19290  {"msplim_ns",	   0x8a}, {"MSPLIM_NS",	   0x8a},
19291  {"psplim_ns",	   0x8b}, {"PSPLIM_NS",	   0x8b},
19292  {"primask_ns",   0x90}, {"PRIMASK_NS",   0x90},
19293  {"basepri_ns",   0x91}, {"BASEPRI_NS",   0x91},
19294  {"faultmask_ns", 0x93}, {"FAULTMASK_NS", 0x93},
19295  {"control_ns",   0x94}, {"CONTROL_NS",   0x94},
19296  {"sp_ns",	   0x98}, {"SP_NS",	   0x98 }
19297};
19298
19299/* Table of all shift-in-operand names.	 */
19300static const struct asm_shift_name shift_names [] =
19301{
19302  { "asl", SHIFT_LSL },	 { "ASL", SHIFT_LSL },
19303  { "lsl", SHIFT_LSL },	 { "LSL", SHIFT_LSL },
19304  { "lsr", SHIFT_LSR },	 { "LSR", SHIFT_LSR },
19305  { "asr", SHIFT_ASR },	 { "ASR", SHIFT_ASR },
19306  { "ror", SHIFT_ROR },	 { "ROR", SHIFT_ROR },
19307  { "rrx", SHIFT_RRX },	 { "RRX", SHIFT_RRX }
19308};
19309
19310/* Table of all explicit relocation names.  */
19311#ifdef OBJ_ELF
19312static struct reloc_entry reloc_names[] =
19313{
19314  { "got",     BFD_RELOC_ARM_GOT32   },	 { "GOT",     BFD_RELOC_ARM_GOT32   },
19315  { "gotoff",  BFD_RELOC_ARM_GOTOFF  },	 { "GOTOFF",  BFD_RELOC_ARM_GOTOFF  },
19316  { "plt",     BFD_RELOC_ARM_PLT32   },	 { "PLT",     BFD_RELOC_ARM_PLT32   },
19317  { "target1", BFD_RELOC_ARM_TARGET1 },	 { "TARGET1", BFD_RELOC_ARM_TARGET1 },
19318  { "target2", BFD_RELOC_ARM_TARGET2 },	 { "TARGET2", BFD_RELOC_ARM_TARGET2 },
19319  { "sbrel",   BFD_RELOC_ARM_SBREL32 },	 { "SBREL",   BFD_RELOC_ARM_SBREL32 },
19320  { "tlsgd",   BFD_RELOC_ARM_TLS_GD32},  { "TLSGD",   BFD_RELOC_ARM_TLS_GD32},
19321  { "tlsldm",  BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM",  BFD_RELOC_ARM_TLS_LDM32},
19322  { "tlsldo",  BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO",  BFD_RELOC_ARM_TLS_LDO32},
19323  { "gottpoff",BFD_RELOC_ARM_TLS_IE32},  { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
19324  { "tpoff",   BFD_RELOC_ARM_TLS_LE32},  { "TPOFF",   BFD_RELOC_ARM_TLS_LE32},
19325  { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL},
19326  { "tlsdesc", BFD_RELOC_ARM_TLS_GOTDESC},
19327	{ "TLSDESC", BFD_RELOC_ARM_TLS_GOTDESC},
19328  { "tlscall", BFD_RELOC_ARM_TLS_CALL},
19329	{ "TLSCALL", BFD_RELOC_ARM_TLS_CALL},
19330  { "tlsdescseq", BFD_RELOC_ARM_TLS_DESCSEQ},
19331	{ "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ},
19332  { "gotfuncdesc", BFD_RELOC_ARM_GOTFUNCDESC },
19333	{ "GOTFUNCDESC", BFD_RELOC_ARM_GOTFUNCDESC },
19334  { "gotofffuncdesc", BFD_RELOC_ARM_GOTOFFFUNCDESC },
19335	{ "GOTOFFFUNCDESC", BFD_RELOC_ARM_GOTOFFFUNCDESC },
19336  { "funcdesc", BFD_RELOC_ARM_FUNCDESC },
19337	{ "FUNCDESC", BFD_RELOC_ARM_FUNCDESC },
19338   { "tlsgd_fdpic", BFD_RELOC_ARM_TLS_GD32_FDPIC },      { "TLSGD_FDPIC", BFD_RELOC_ARM_TLS_GD32_FDPIC },
19339   { "tlsldm_fdpic", BFD_RELOC_ARM_TLS_LDM32_FDPIC },    { "TLSLDM_FDPIC", BFD_RELOC_ARM_TLS_LDM32_FDPIC },
19340   { "gottpoff_fdpic", BFD_RELOC_ARM_TLS_IE32_FDPIC },   { "GOTTPOFF_FDIC", BFD_RELOC_ARM_TLS_IE32_FDPIC },
19341};
19342#endif
19343
19344/* Table of all conditional affixes.  0xF is not defined as a condition code.  */
19345static const struct asm_cond conds[] =
19346{
19347  {"eq", 0x0},
19348  {"ne", 0x1},
19349  {"cs", 0x2}, {"hs", 0x2},
19350  {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
19351  {"mi", 0x4},
19352  {"pl", 0x5},
19353  {"vs", 0x6},
19354  {"vc", 0x7},
19355  {"hi", 0x8},
19356  {"ls", 0x9},
19357  {"ge", 0xa},
19358  {"lt", 0xb},
19359  {"gt", 0xc},
19360  {"le", 0xd},
19361  {"al", 0xe}
19362};
19363
19364#define UL_BARRIER(L,U,CODE,FEAT) \
19365  { L, CODE, ARM_FEATURE_CORE_LOW (FEAT) }, \
19366  { U, CODE, ARM_FEATURE_CORE_LOW (FEAT) }
19367
19368static struct asm_barrier_opt barrier_opt_names[] =
19369{
19370  UL_BARRIER ("sy",	"SY",	 0xf, ARM_EXT_BARRIER),
19371  UL_BARRIER ("st",	"ST",	 0xe, ARM_EXT_BARRIER),
19372  UL_BARRIER ("ld",	"LD",	 0xd, ARM_EXT_V8),
19373  UL_BARRIER ("ish",	"ISH",	 0xb, ARM_EXT_BARRIER),
19374  UL_BARRIER ("sh",	"SH",	 0xb, ARM_EXT_BARRIER),
19375  UL_BARRIER ("ishst",	"ISHST", 0xa, ARM_EXT_BARRIER),
19376  UL_BARRIER ("shst",	"SHST",	 0xa, ARM_EXT_BARRIER),
19377  UL_BARRIER ("ishld",	"ISHLD", 0x9, ARM_EXT_V8),
19378  UL_BARRIER ("un",	"UN",	 0x7, ARM_EXT_BARRIER),
19379  UL_BARRIER ("nsh",	"NSH",	 0x7, ARM_EXT_BARRIER),
19380  UL_BARRIER ("unst",	"UNST",	 0x6, ARM_EXT_BARRIER),
19381  UL_BARRIER ("nshst",	"NSHST", 0x6, ARM_EXT_BARRIER),
19382  UL_BARRIER ("nshld",	"NSHLD", 0x5, ARM_EXT_V8),
19383  UL_BARRIER ("osh",	"OSH",	 0x3, ARM_EXT_BARRIER),
19384  UL_BARRIER ("oshst",	"OSHST", 0x2, ARM_EXT_BARRIER),
19385  UL_BARRIER ("oshld",	"OSHLD", 0x1, ARM_EXT_V8)
19386};
19387
19388#undef UL_BARRIER
19389
19390/* Table of ARM-format instructions.	*/
19391
19392/* Macros for gluing together operand strings.  N.B. In all cases
19393   other than OPS0, the trailing OP_stop comes from default
19394   zero-initialization of the unspecified elements of the array.  */
19395#define OPS0()		  { OP_stop, }
19396#define OPS1(a)		  { OP_##a, }
19397#define OPS2(a,b)	  { OP_##a,OP_##b, }
19398#define OPS3(a,b,c)	  { OP_##a,OP_##b,OP_##c, }
19399#define OPS4(a,b,c,d)	  { OP_##a,OP_##b,OP_##c,OP_##d, }
19400#define OPS5(a,b,c,d,e)	  { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
19401#define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
19402
19403/* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
19404   This is useful when mixing operands for ARM and THUMB, i.e. using the
19405   MIX_ARM_THUMB_OPERANDS macro.
19406   In order to use these macros, prefix the number of operands with _
19407   e.g. _3.  */
19408#define OPS_1(a)	   { a, }
19409#define OPS_2(a,b)	   { a,b, }
19410#define OPS_3(a,b,c)	   { a,b,c, }
19411#define OPS_4(a,b,c,d)	   { a,b,c,d, }
19412#define OPS_5(a,b,c,d,e)   { a,b,c,d,e, }
19413#define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
19414
19415/* These macros abstract out the exact format of the mnemonic table and
19416   save some repeated characters.  */
19417
19418/* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix.  */
19419#define TxCE(mnem, op, top, nops, ops, ae, te) \
19420  { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
19421    THUMB_VARIANT, do_##ae, do_##te }
19422
19423/* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
19424   a T_MNEM_xyz enumerator.  */
19425#define TCE(mnem, aop, top, nops, ops, ae, te) \
19426      TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
19427#define tCE(mnem, aop, top, nops, ops, ae, te) \
19428      TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
19429
19430/* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
19431   infix after the third character.  */
19432#define TxC3(mnem, op, top, nops, ops, ae, te) \
19433  { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
19434    THUMB_VARIANT, do_##ae, do_##te }
19435#define TxC3w(mnem, op, top, nops, ops, ae, te) \
19436  { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
19437    THUMB_VARIANT, do_##ae, do_##te }
19438#define TC3(mnem, aop, top, nops, ops, ae, te) \
19439      TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
19440#define TC3w(mnem, aop, top, nops, ops, ae, te) \
19441      TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
19442#define tC3(mnem, aop, top, nops, ops, ae, te) \
19443      TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
19444#define tC3w(mnem, aop, top, nops, ops, ae, te) \
19445      TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
19446
19447/* Mnemonic that cannot be conditionalized.  The ARM condition-code
19448   field is still 0xE.  Many of the Thumb variants can be executed
19449   conditionally, so this is checked separately.  */
19450#define TUE(mnem, op, top, nops, ops, ae, te)				\
19451  { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
19452    THUMB_VARIANT, do_##ae, do_##te }
19453
19454/* Same as TUE but the encoding function for ARM and Thumb modes is the same.
19455   Used by mnemonics that have very minimal differences in the encoding for
19456   ARM and Thumb variants and can be handled in a common function.  */
19457#define TUEc(mnem, op, top, nops, ops, en) \
19458  { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
19459    THUMB_VARIANT, do_##en, do_##en }
19460
19461/* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
19462   condition code field.  */
19463#define TUF(mnem, op, top, nops, ops, ae, te)				\
19464  { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
19465    THUMB_VARIANT, do_##ae, do_##te }
19466
19467/* ARM-only variants of all the above.  */
19468#define CE(mnem,  op, nops, ops, ae)	\
19469  { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
19470
19471#define C3(mnem, op, nops, ops, ae)	\
19472  { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
19473
19474/* Thumb-only variants of TCE and TUE.  */
19475#define ToC(mnem, top, nops, ops, te) \
19476  { mnem, OPS##nops ops, OT_csuffix, 0x0, 0x##top, 0, THUMB_VARIANT, NULL, \
19477    do_##te }
19478
19479#define ToU(mnem, top, nops, ops, te) \
19480  { mnem, OPS##nops ops, OT_unconditional, 0x0, 0x##top, 0, THUMB_VARIANT, \
19481    NULL, do_##te }
19482
19483/* Legacy mnemonics that always have conditional infix after the third
19484   character.  */
19485#define CL(mnem, op, nops, ops, ae)	\
19486  { mnem, OPS##nops ops, OT_cinfix3_legacy, \
19487    0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
19488
19489/* Coprocessor instructions.  Isomorphic between Arm and Thumb-2.  */
19490#define cCE(mnem,  op, nops, ops, ae)	\
19491  { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
19492
19493/* Legacy coprocessor instructions where conditional infix and conditional
19494   suffix are ambiguous.  For consistency this includes all FPA instructions,
19495   not just the potentially ambiguous ones.  */
19496#define cCL(mnem, op, nops, ops, ae)	\
19497  { mnem, OPS##nops ops, OT_cinfix3_legacy, \
19498    0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
19499
19500/* Coprocessor, takes either a suffix or a position-3 infix
19501   (for an FPA corner case). */
19502#define C3E(mnem, op, nops, ops, ae) \
19503  { mnem, OPS##nops ops, OT_csuf_or_in3, \
19504    0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
19505
19506#define xCM_(m1, m2, m3, op, nops, ops, ae)	\
19507  { m1 #m2 m3, OPS##nops ops, \
19508    sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
19509    0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
19510
19511#define CM(m1, m2, op, nops, ops, ae)	\
19512  xCM_ (m1,   , m2, op, nops, ops, ae),	\
19513  xCM_ (m1, eq, m2, op, nops, ops, ae),	\
19514  xCM_ (m1, ne, m2, op, nops, ops, ae),	\
19515  xCM_ (m1, cs, m2, op, nops, ops, ae),	\
19516  xCM_ (m1, hs, m2, op, nops, ops, ae),	\
19517  xCM_ (m1, cc, m2, op, nops, ops, ae),	\
19518  xCM_ (m1, ul, m2, op, nops, ops, ae),	\
19519  xCM_ (m1, lo, m2, op, nops, ops, ae),	\
19520  xCM_ (m1, mi, m2, op, nops, ops, ae),	\
19521  xCM_ (m1, pl, m2, op, nops, ops, ae),	\
19522  xCM_ (m1, vs, m2, op, nops, ops, ae),	\
19523  xCM_ (m1, vc, m2, op, nops, ops, ae),	\
19524  xCM_ (m1, hi, m2, op, nops, ops, ae),	\
19525  xCM_ (m1, ls, m2, op, nops, ops, ae),	\
19526  xCM_ (m1, ge, m2, op, nops, ops, ae),	\
19527  xCM_ (m1, lt, m2, op, nops, ops, ae),	\
19528  xCM_ (m1, gt, m2, op, nops, ops, ae),	\
19529  xCM_ (m1, le, m2, op, nops, ops, ae),	\
19530  xCM_ (m1, al, m2, op, nops, ops, ae)
19531
19532#define UE(mnem, op, nops, ops, ae)	\
19533  { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
19534
19535#define UF(mnem, op, nops, ops, ae)	\
19536  { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
19537
19538/* Neon data-processing. ARM versions are unconditional with cond=0xf.
19539   The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
19540   use the same encoding function for each.  */
19541#define NUF(mnem, op, nops, ops, enc)					\
19542  { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op,		\
19543    ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
19544
19545/* Neon data processing, version which indirects through neon_enc_tab for
19546   the various overloaded versions of opcodes.  */
19547#define nUF(mnem, op, nops, ops, enc)					\
19548  { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op,	\
19549    ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
19550
19551/* Neon insn with conditional suffix for the ARM version, non-overloaded
19552   version.  */
19553#define NCE_tag(mnem, op, nops, ops, enc, tag)				\
19554  { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT,		\
19555    THUMB_VARIANT, do_##enc, do_##enc }
19556
19557#define NCE(mnem, op, nops, ops, enc)					\
19558   NCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
19559
19560#define NCEF(mnem, op, nops, ops, enc)					\
19561    NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
19562
19563/* Neon insn with conditional suffix for the ARM version, overloaded types.  */
19564#define nCE_tag(mnem, op, nops, ops, enc, tag)				\
19565  { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op,		\
19566    ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
19567
19568#define nCE(mnem, op, nops, ops, enc)					\
19569   nCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
19570
19571#define nCEF(mnem, op, nops, ops, enc)					\
19572    nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
19573
19574#define do_0 0
19575
19576static const struct asm_opcode insns[] =
19577{
19578#define ARM_VARIANT    & arm_ext_v1 /* Core ARM Instructions.  */
19579#define THUMB_VARIANT  & arm_ext_v4t
19580 tCE("and",	0000000, _and,     3, (RR, oRR, SH), arit, t_arit3c),
19581 tC3("ands",	0100000, _ands,	   3, (RR, oRR, SH), arit, t_arit3c),
19582 tCE("eor",	0200000, _eor,	   3, (RR, oRR, SH), arit, t_arit3c),
19583 tC3("eors",	0300000, _eors,	   3, (RR, oRR, SH), arit, t_arit3c),
19584 tCE("sub",	0400000, _sub,	   3, (RR, oRR, SH), arit, t_add_sub),
19585 tC3("subs",	0500000, _subs,	   3, (RR, oRR, SH), arit, t_add_sub),
19586 tCE("add",	0800000, _add,	   3, (RR, oRR, SHG), arit, t_add_sub),
19587 tC3("adds",	0900000, _adds,	   3, (RR, oRR, SHG), arit, t_add_sub),
19588 tCE("adc",	0a00000, _adc,	   3, (RR, oRR, SH), arit, t_arit3c),
19589 tC3("adcs",	0b00000, _adcs,	   3, (RR, oRR, SH), arit, t_arit3c),
19590 tCE("sbc",	0c00000, _sbc,	   3, (RR, oRR, SH), arit, t_arit3),
19591 tC3("sbcs",	0d00000, _sbcs,	   3, (RR, oRR, SH), arit, t_arit3),
19592 tCE("orr",	1800000, _orr,	   3, (RR, oRR, SH), arit, t_arit3c),
19593 tC3("orrs",	1900000, _orrs,	   3, (RR, oRR, SH), arit, t_arit3c),
19594 tCE("bic",	1c00000, _bic,	   3, (RR, oRR, SH), arit, t_arit3),
19595 tC3("bics",	1d00000, _bics,	   3, (RR, oRR, SH), arit, t_arit3),
19596
19597 /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
19598    for setting PSR flag bits.  They are obsolete in V6 and do not
19599    have Thumb equivalents. */
19600 tCE("tst",	1100000, _tst,	   2, (RR, SH),      cmp,  t_mvn_tst),
19601 tC3w("tsts",	1100000, _tst,	   2, (RR, SH),      cmp,  t_mvn_tst),
19602  CL("tstp",	110f000,     	   2, (RR, SH),      cmp),
19603 tCE("cmp",	1500000, _cmp,	   2, (RR, SH),      cmp,  t_mov_cmp),
19604 tC3w("cmps",	1500000, _cmp,	   2, (RR, SH),      cmp,  t_mov_cmp),
19605  CL("cmpp",	150f000,     	   2, (RR, SH),      cmp),
19606 tCE("cmn",	1700000, _cmn,	   2, (RR, SH),      cmp,  t_mvn_tst),
19607 tC3w("cmns",	1700000, _cmn,	   2, (RR, SH),      cmp,  t_mvn_tst),
19608  CL("cmnp",	170f000,     	   2, (RR, SH),      cmp),
19609
19610 tCE("mov",	1a00000, _mov,	   2, (RR, SH),      mov,  t_mov_cmp),
19611 tC3("movs",	1b00000, _movs,	   2, (RR, SHG),     mov,  t_mov_cmp),
19612 tCE("mvn",	1e00000, _mvn,	   2, (RR, SH),      mov,  t_mvn_tst),
19613 tC3("mvns",	1f00000, _mvns,	   2, (RR, SH),      mov,  t_mvn_tst),
19614
19615 tCE("ldr",	4100000, _ldr,	   2, (RR, ADDRGLDR),ldst, t_ldst),
19616 tC3("ldrb",	4500000, _ldrb,	   2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
19617 tCE("str",	4000000, _str,	   _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
19618								OP_RRnpc),
19619					OP_ADDRGLDR),ldst, t_ldst),
19620 tC3("strb",	4400000, _strb,	   2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
19621
19622 tCE("stm",	8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
19623 tC3("stmia",	8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
19624 tC3("stmea",	8800000, _stmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
19625 tCE("ldm",	8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
19626 tC3("ldmia",	8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
19627 tC3("ldmfd",	8900000, _ldmia,    2, (RRw, REGLST), ldmstm, t_ldmstm),
19628
19629 tCE("b",	a000000, _b,	   1, (EXPr),	     branch, t_branch),
19630 TCE("bl",	b000000, f000f800, 1, (EXPr),	     bl, t_branch23),
19631
19632  /* Pseudo ops.  */
19633 tCE("adr",	28f0000, _adr,	   2, (RR, EXP),     adr,  t_adr),
19634  C3(adrl,	28f0000,           2, (RR, EXP),     adrl),
19635 tCE("nop",	1a00000, _nop,	   1, (oI255c),	     nop,  t_nop),
19636 tCE("udf",	7f000f0, _udf,     1, (oIffffb),     bkpt, t_udf),
19637
19638  /* Thumb-compatibility pseudo ops.  */
19639 tCE("lsl",	1a00000, _lsl,	   3, (RR, oRR, SH), shift, t_shift),
19640 tC3("lsls",	1b00000, _lsls,	   3, (RR, oRR, SH), shift, t_shift),
19641 tCE("lsr",	1a00020, _lsr,	   3, (RR, oRR, SH), shift, t_shift),
19642 tC3("lsrs",	1b00020, _lsrs,	   3, (RR, oRR, SH), shift, t_shift),
19643 tCE("asr",	1a00040, _asr,	   3, (RR, oRR, SH), shift, t_shift),
19644 tC3("asrs",      1b00040, _asrs,     3, (RR, oRR, SH), shift, t_shift),
19645 tCE("ror",	1a00060, _ror,	   3, (RR, oRR, SH), shift, t_shift),
19646 tC3("rors",	1b00060, _rors,	   3, (RR, oRR, SH), shift, t_shift),
19647 tCE("neg",	2600000, _neg,	   2, (RR, RR),      rd_rn, t_neg),
19648 tC3("negs",	2700000, _negs,	   2, (RR, RR),      rd_rn, t_neg),
19649 tCE("push",	92d0000, _push,     1, (REGLST),	     push_pop, t_push_pop),
19650 tCE("pop",	8bd0000, _pop,	   1, (REGLST),	     push_pop, t_push_pop),
19651
19652 /* These may simplify to neg.  */
19653 TCE("rsb",	0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
19654 TC3("rsbs",	0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
19655
19656#undef THUMB_VARIANT
19657#define THUMB_VARIANT  & arm_ext_os
19658
19659 TCE("swi",	f000000, df00,     1, (EXPi),        swi, t_swi),
19660 TCE("svc",	f000000, df00,     1, (EXPi),        swi, t_swi),
19661
19662#undef  THUMB_VARIANT
19663#define THUMB_VARIANT  & arm_ext_v6
19664
19665 TCE("cpy",       1a00000, 4600,     2, (RR, RR),      rd_rm, t_cpy),
19666
19667 /* V1 instructions with no Thumb analogue prior to V6T2.  */
19668#undef  THUMB_VARIANT
19669#define THUMB_VARIANT  & arm_ext_v6t2
19670
19671 TCE("teq",	1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
19672 TC3w("teqs",	1300000, ea900f00, 2, (RR, SH),      cmp,  t_mvn_tst),
19673  CL("teqp",	130f000,           2, (RR, SH),      cmp),
19674
19675 TC3("ldrt",	4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
19676 TC3("ldrbt",	4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
19677 TC3("strt",	4200000, f8400e00, 2, (RR_npcsp, ADDR),   ldstt, t_ldstt),
19678 TC3("strbt",	4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
19679
19680 TC3("stmdb",	9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
19681 TC3("stmfd",     9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
19682
19683 TC3("ldmdb",	9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
19684 TC3("ldmea",	9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
19685
19686 /* V1 instructions with no Thumb analogue at all.  */
19687  CE("rsc",	0e00000,	   3, (RR, oRR, SH), arit),
19688  C3(rscs,	0f00000,	   3, (RR, oRR, SH), arit),
19689
19690  C3(stmib,	9800000,	   2, (RRw, REGLST), ldmstm),
19691  C3(stmfa,	9800000,	   2, (RRw, REGLST), ldmstm),
19692  C3(stmda,	8000000,	   2, (RRw, REGLST), ldmstm),
19693  C3(stmed,	8000000,	   2, (RRw, REGLST), ldmstm),
19694  C3(ldmib,	9900000,	   2, (RRw, REGLST), ldmstm),
19695  C3(ldmed,	9900000,	   2, (RRw, REGLST), ldmstm),
19696  C3(ldmda,	8100000,	   2, (RRw, REGLST), ldmstm),
19697  C3(ldmfa,	8100000,	   2, (RRw, REGLST), ldmstm),
19698
19699#undef  ARM_VARIANT
19700#define ARM_VARIANT    & arm_ext_v2	/* ARM 2 - multiplies.	*/
19701#undef  THUMB_VARIANT
19702#define THUMB_VARIANT  & arm_ext_v4t
19703
19704 tCE("mul",	0000090, _mul,	   3, (RRnpc, RRnpc, oRR), mul, t_mul),
19705 tC3("muls",	0100090, _muls,	   3, (RRnpc, RRnpc, oRR), mul, t_mul),
19706
19707#undef  THUMB_VARIANT
19708#define THUMB_VARIANT  & arm_ext_v6t2
19709
19710 TCE("mla",	0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
19711  C3(mlas,	0300090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
19712
19713  /* Generic coprocessor instructions.	*/
19714 TCE("cdp",	e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
19715 TCE("ldc",	c100000, ec100000, 3, (RCP, RCN, ADDRGLDC),	        lstc,   lstc),
19716 TC3("ldcl",	c500000, ec500000, 3, (RCP, RCN, ADDRGLDC),	        lstc,   lstc),
19717 TCE("stc",	c000000, ec000000, 3, (RCP, RCN, ADDRGLDC),	        lstc,   lstc),
19718 TC3("stcl",	c400000, ec400000, 3, (RCP, RCN, ADDRGLDC),	        lstc,   lstc),
19719 TCE("mcr",	e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
19720 TCE("mrc",	e100010, ee100010, 6, (RCP, I7b, APSR_RR, RCN, RCN, oI7b),   co_reg, co_reg),
19721
19722#undef  ARM_VARIANT
19723#define ARM_VARIANT  & arm_ext_v2s /* ARM 3 - swp instructions.  */
19724
19725  CE("swp",	1000090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
19726  C3(swpb,	1400090,           3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
19727
19728#undef  ARM_VARIANT
19729#define ARM_VARIANT    & arm_ext_v3	/* ARM 6 Status register instructions.	*/
19730#undef  THUMB_VARIANT
19731#define THUMB_VARIANT  & arm_ext_msr
19732
19733 TCE("mrs",	1000000, f3e08000, 2, (RRnpc, rPSR), mrs, t_mrs),
19734 TCE("msr",	120f000, f3808000, 2, (wPSR, RR_EXi), msr, t_msr),
19735
19736#undef  ARM_VARIANT
19737#define ARM_VARIANT    & arm_ext_v3m	 /* ARM 7M long multiplies.  */
19738#undef  THUMB_VARIANT
19739#define THUMB_VARIANT  & arm_ext_v6t2
19740
19741 TCE("smull",	0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
19742  CM("smull","s",	0d00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
19743 TCE("umull",	0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
19744  CM("umull","s",	0900090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
19745 TCE("smlal",	0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
19746  CM("smlal","s",	0f00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
19747 TCE("umlal",	0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
19748  CM("umlal","s",	0b00090,           4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
19749
19750#undef  ARM_VARIANT
19751#define ARM_VARIANT    & arm_ext_v4	/* ARM Architecture 4.	*/
19752#undef  THUMB_VARIANT
19753#define THUMB_VARIANT  & arm_ext_v4t
19754
19755 tC3("ldrh",	01000b0, _ldrh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
19756 tC3("strh",	00000b0, _strh,     2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
19757 tC3("ldrsh",	01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
19758 tC3("ldrsb",	01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
19759 tC3("ldsh",	01000f0, _ldrsh,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
19760 tC3("ldsb",	01000d0, _ldrsb,    2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
19761
19762#undef  ARM_VARIANT
19763#define ARM_VARIANT  & arm_ext_v4t_5
19764
19765  /* ARM Architecture 4T.  */
19766  /* Note: bx (and blx) are required on V5, even if the processor does
19767     not support Thumb.	 */
19768 TCE("bx",	12fff10, 4700, 1, (RR),	bx, t_bx),
19769
19770#undef  ARM_VARIANT
19771#define ARM_VARIANT    & arm_ext_v5 /*  ARM Architecture 5T.	 */
19772#undef  THUMB_VARIANT
19773#define THUMB_VARIANT  & arm_ext_v5t
19774
19775  /* Note: blx has 2 variants; the .value coded here is for
19776     BLX(2).  Only this variant has conditional execution.  */
19777 TCE("blx",	12fff30, 4780, 1, (RR_EXr),			    blx,  t_blx),
19778 TUE("bkpt",	1200070, be00, 1, (oIffffb),			    bkpt, t_bkpt),
19779
19780#undef  THUMB_VARIANT
19781#define THUMB_VARIANT  & arm_ext_v6t2
19782
19783 TCE("clz",	16f0f10, fab0f080, 2, (RRnpc, RRnpc),		        rd_rm,  t_clz),
19784 TUF("ldc2",	c100000, fc100000, 3, (RCP, RCN, ADDRGLDC),	        lstc,	lstc),
19785 TUF("ldc2l",	c500000, fc500000, 3, (RCP, RCN, ADDRGLDC),		        lstc,	lstc),
19786 TUF("stc2",	c000000, fc000000, 3, (RCP, RCN, ADDRGLDC),	        lstc,	lstc),
19787 TUF("stc2l",	c400000, fc400000, 3, (RCP, RCN, ADDRGLDC),		        lstc,	lstc),
19788 TUF("cdp2",	e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp,    cdp),
19789 TUF("mcr2",	e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
19790 TUF("mrc2",	e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b),   co_reg, co_reg),
19791
19792#undef  ARM_VARIANT
19793#define ARM_VARIANT    & arm_ext_v5exp /*  ARM Architecture 5TExP.  */
19794#undef  THUMB_VARIANT
19795#define THUMB_VARIANT  & arm_ext_v5exp
19796
19797 TCE("smlabb",	1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
19798 TCE("smlatb",	10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
19799 TCE("smlabt",	10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
19800 TCE("smlatt",	10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
19801
19802 TCE("smlawb",	1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
19803 TCE("smlawt",	12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smla, t_mla),
19804
19805 TCE("smlalbb",	1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
19806 TCE("smlaltb",	14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
19807 TCE("smlalbt",	14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
19808 TCE("smlaltt",	14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),   smlal, t_mlal),
19809
19810 TCE("smulbb",	1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc),	    smul, t_simd),
19811 TCE("smultb",	16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc),	    smul, t_simd),
19812 TCE("smulbt",	16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc),	    smul, t_simd),
19813 TCE("smultt",	16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc),	    smul, t_simd),
19814
19815 TCE("smulwb",	12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc),	    smul, t_simd),
19816 TCE("smulwt",	12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc),	    smul, t_simd),
19817
19818 TCE("qadd",	1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc),	    rd_rm_rn, t_simd2),
19819 TCE("qdadd",	1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc),	    rd_rm_rn, t_simd2),
19820 TCE("qsub",	1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc),	    rd_rm_rn, t_simd2),
19821 TCE("qdsub",	1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc),	    rd_rm_rn, t_simd2),
19822
19823#undef  ARM_VARIANT
19824#define ARM_VARIANT    & arm_ext_v5e /*  ARM Architecture 5TE.  */
19825#undef  THUMB_VARIANT
19826#define THUMB_VARIANT  & arm_ext_v6t2
19827
19828 TUF("pld",	450f000, f810f000, 1, (ADDR),		     pld,  t_pld),
19829 TC3("ldrd",	00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
19830     ldrd, t_ldstd),
19831 TC3("strd",	00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
19832				       ADDRGLDRS), ldrd, t_ldstd),
19833
19834 TCE("mcrr",	c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
19835 TCE("mrrc",	c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
19836
19837#undef  ARM_VARIANT
19838#define ARM_VARIANT  & arm_ext_v5j /*  ARM Architecture 5TEJ.  */
19839
19840 TCE("bxj",	12fff20, f3c08f00, 1, (RR),			  bxj, t_bxj),
19841
19842#undef  ARM_VARIANT
19843#define ARM_VARIANT    & arm_ext_v6 /*  ARM V6.  */
19844#undef  THUMB_VARIANT
19845#define THUMB_VARIANT  & arm_ext_v6
19846
19847 TUF("cpsie",     1080000, b660,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
19848 TUF("cpsid",     10c0000, b670,     2, (CPSF, oI31b),              cpsi,   t_cpsi),
19849 tCE("rev",       6bf0f30, _rev,      2, (RRnpc, RRnpc),             rd_rm,  t_rev),
19850 tCE("rev16",     6bf0fb0, _rev16,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
19851 tCE("revsh",     6ff0fb0, _revsh,    2, (RRnpc, RRnpc),             rd_rm,  t_rev),
19852 tCE("sxth",      6bf0070, _sxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
19853 tCE("uxth",      6ff0070, _uxth,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
19854 tCE("sxtb",      6af0070, _sxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
19855 tCE("uxtb",      6ef0070, _uxtb,     3, (RRnpc, RRnpc, oROR),       sxth,   t_sxth),
19856 TUF("setend",    1010000, b650,     1, (ENDI),                     setend, t_setend),
19857
19858#undef  THUMB_VARIANT
19859#define THUMB_VARIANT  & arm_ext_v6t2_v8m
19860
19861 TCE("ldrex",	1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR),	  ldrex, t_ldrex),
19862 TCE("strex",	1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
19863				      strex,  t_strex),
19864#undef  THUMB_VARIANT
19865#define THUMB_VARIANT  & arm_ext_v6t2
19866
19867 TUF("mcrr2",	c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
19868 TUF("mrrc2",	c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
19869
19870 TCE("ssat",	6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat,   t_ssat),
19871 TCE("usat",	6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat,   t_usat),
19872
19873/*  ARM V6 not included in V7M.  */
19874#undef  THUMB_VARIANT
19875#define THUMB_VARIANT  & arm_ext_v6_notm
19876 TUF("rfeia",	8900a00, e990c000, 1, (RRw),			   rfe, rfe),
19877 TUF("rfe",	8900a00, e990c000, 1, (RRw),			   rfe, rfe),
19878  UF(rfeib,	9900a00,           1, (RRw),			   rfe),
19879  UF(rfeda,	8100a00,           1, (RRw),			   rfe),
19880 TUF("rfedb",	9100a00, e810c000, 1, (RRw),			   rfe, rfe),
19881 TUF("rfefd",	8900a00, e990c000, 1, (RRw),			   rfe, rfe),
19882  UF(rfefa,	8100a00,           1, (RRw),			   rfe),
19883 TUF("rfeea",	9100a00, e810c000, 1, (RRw),			   rfe, rfe),
19884  UF(rfeed,	9900a00,           1, (RRw),			   rfe),
19885 TUF("srsia",	8c00500, e980c000, 2, (oRRw, I31w),		   srs,  srs),
19886 TUF("srs",	8c00500, e980c000, 2, (oRRw, I31w),		   srs,  srs),
19887 TUF("srsea",	8c00500, e980c000, 2, (oRRw, I31w),		   srs,  srs),
19888  UF(srsib,	9c00500,           2, (oRRw, I31w),		   srs),
19889  UF(srsfa,	9c00500,           2, (oRRw, I31w),		   srs),
19890  UF(srsda,	8400500,	   2, (oRRw, I31w),		   srs),
19891  UF(srsed,	8400500,	   2, (oRRw, I31w),		   srs),
19892 TUF("srsdb",	9400500, e800c000, 2, (oRRw, I31w),		   srs,  srs),
19893 TUF("srsfd",	9400500, e800c000, 2, (oRRw, I31w),		   srs,  srs),
19894 TUF("cps",	1020000, f3af8100, 1, (I31b),			  imm0, t_cps),
19895
19896/*  ARM V6 not included in V7M (eg. integer SIMD).  */
19897#undef  THUMB_VARIANT
19898#define THUMB_VARIANT  & arm_ext_v6_dsp
19899 TCE("pkhbt",	6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll),   pkhbt, t_pkhbt),
19900 TCE("pkhtb",	6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar),   pkhtb, t_pkhtb),
19901 TCE("qadd16",	6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19902 TCE("qadd8",	6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19903 TCE("qasx",	6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19904 /* Old name for QASX.  */
19905 TCE("qaddsubx",6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19906 TCE("qsax",	6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19907 /* Old name for QSAX.  */
19908 TCE("qsubaddx",6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19909 TCE("qsub16",	6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19910 TCE("qsub8",	6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19911 TCE("sadd16",	6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19912 TCE("sadd8",	6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19913 TCE("sasx",	6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19914 /* Old name for SASX.  */
19915 TCE("saddsubx",6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19916 TCE("shadd16",	6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19917 TCE("shadd8",	6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19918 TCE("shasx",   6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19919 /* Old name for SHASX.  */
19920 TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19921 TCE("shsax",     6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19922 /* Old name for SHSAX.  */
19923 TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19924 TCE("shsub16",	6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19925 TCE("shsub8",	6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19926 TCE("ssax",	6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19927 /* Old name for SSAX.  */
19928 TCE("ssubaddx",6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19929 TCE("ssub16",	6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19930 TCE("ssub8",	6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19931 TCE("uadd16",	6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19932 TCE("uadd8",	6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19933 TCE("uasx",	6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19934 /* Old name for UASX.  */
19935 TCE("uaddsubx",6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19936 TCE("uhadd16",	6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19937 TCE("uhadd8",	6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19938 TCE("uhasx",   6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19939 /* Old name for UHASX.  */
19940 TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19941 TCE("uhsax",     6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19942 /* Old name for UHSAX.  */
19943 TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19944 TCE("uhsub16",	6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19945 TCE("uhsub8",	6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19946 TCE("uqadd16",	6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19947 TCE("uqadd8",	6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19948 TCE("uqasx",   6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19949 /* Old name for UQASX.  */
19950 TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19951 TCE("uqsax",     6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19952 /* Old name for UQSAX.  */
19953 TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19954 TCE("uqsub16",	6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19955 TCE("uqsub8",	6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19956 TCE("usub16",	6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19957 TCE("usax",	6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19958 /* Old name for USAX.  */
19959 TCE("usubaddx",6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19960 TCE("usub8",	6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19961 TCE("sxtah",	6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
19962 TCE("sxtab16",	6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
19963 TCE("sxtab",	6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
19964 TCE("sxtb16",	68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR),	   sxth,  t_sxth),
19965 TCE("uxtah",	6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
19966 TCE("uxtab16",	6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
19967 TCE("uxtab",	6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
19968 TCE("uxtb16",	6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR),	   sxth,  t_sxth),
19969 TCE("sel",	6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc),	   rd_rn_rm, t_simd),
19970 TCE("smlad",	7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
19971 TCE("smladx",	7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
19972 TCE("smlald",	7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
19973 TCE("smlaldx",	7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
19974 TCE("smlsd",	7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
19975 TCE("smlsdx",	7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
19976 TCE("smlsld",	7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
19977 TCE("smlsldx",	7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
19978 TCE("smmla",	7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
19979 TCE("smmlar",	7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
19980 TCE("smmls",	75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
19981 TCE("smmlsr",	75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
19982 TCE("smmul",	750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc),	   smul, t_simd),
19983 TCE("smmulr",	750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc),	   smul, t_simd),
19984 TCE("smuad",	700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc),	   smul, t_simd),
19985 TCE("smuadx",	700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc),	   smul, t_simd),
19986 TCE("smusd",	700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc),	   smul, t_simd),
19987 TCE("smusdx",	700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc),	   smul, t_simd),
19988 TCE("ssat16",	6a00f30, f3200000, 3, (RRnpc, I16, RRnpc),	   ssat16, t_ssat16),
19989 TCE("umaal",	0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,  t_mlal),
19990 TCE("usad8",	780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc),	   smul,   t_simd),
19991 TCE("usada8",	7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla,   t_mla),
19992 TCE("usat16",	6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc),	   usat16, t_usat16),
19993
19994#undef  ARM_VARIANT
19995#define ARM_VARIANT   & arm_ext_v6k
19996#undef  THUMB_VARIANT
19997#define THUMB_VARIANT & arm_ext_v6k
19998
19999 tCE("yield",	320f001, _yield,    0, (), noargs, t_hint),
20000 tCE("wfe",	320f002, _wfe,      0, (), noargs, t_hint),
20001 tCE("wfi",	320f003, _wfi,      0, (), noargs, t_hint),
20002 tCE("sev",	320f004, _sev,      0, (), noargs, t_hint),
20003
20004#undef  THUMB_VARIANT
20005#define THUMB_VARIANT  & arm_ext_v6_notm
20006 TCE("ldrexd",	1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
20007				      ldrexd, t_ldrexd),
20008 TCE("strexd",	1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
20009				       RRnpcb), strexd, t_strexd),
20010
20011#undef  THUMB_VARIANT
20012#define THUMB_VARIANT  & arm_ext_v6t2_v8m
20013 TCE("ldrexb",	1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
20014     rd_rn,  rd_rn),
20015 TCE("ldrexh",	1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
20016     rd_rn,  rd_rn),
20017 TCE("strexb",	1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
20018     strex, t_strexbh),
20019 TCE("strexh",	1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
20020     strex, t_strexbh),
20021 TUF("clrex",	57ff01f, f3bf8f2f, 0, (),			      noargs, noargs),
20022
20023#undef  ARM_VARIANT
20024#define ARM_VARIANT    & arm_ext_sec
20025#undef  THUMB_VARIANT
20026#define THUMB_VARIANT  & arm_ext_sec
20027
20028 TCE("smc",	1600070, f7f08000, 1, (EXPi), smc, t_smc),
20029
20030#undef	ARM_VARIANT
20031#define	ARM_VARIANT    & arm_ext_virt
20032#undef	THUMB_VARIANT
20033#define	THUMB_VARIANT    & arm_ext_virt
20034
20035 TCE("hvc",	1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
20036 TCE("eret",	160006e, f3de8f00, 0, (), noargs, noargs),
20037
20038#undef	ARM_VARIANT
20039#define	ARM_VARIANT    & arm_ext_pan
20040#undef	THUMB_VARIANT
20041#define	THUMB_VARIANT  & arm_ext_pan
20042
20043 TUF("setpan",	1100000, b610, 1, (I7), setpan, t_setpan),
20044
20045#undef  ARM_VARIANT
20046#define ARM_VARIANT    & arm_ext_v6t2
20047#undef  THUMB_VARIANT
20048#define THUMB_VARIANT  & arm_ext_v6t2
20049
20050 TCE("bfc",	7c0001f, f36f0000, 3, (RRnpc, I31, I32),	   bfc, t_bfc),
20051 TCE("bfi",	7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
20052 TCE("sbfx",	7a00050, f3400000, 4, (RR, RR, I31, I32),	   bfx, t_bfx),
20053 TCE("ubfx",	7e00050, f3c00000, 4, (RR, RR, I31, I32),	   bfx, t_bfx),
20054
20055 TCE("mls",	0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
20056 TCE("rbit",	6ff0f30, fa90f0a0, 2, (RR, RR),			    rd_rm, t_rbit),
20057
20058 TC3("ldrht",	03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
20059 TC3("ldrsht",	03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
20060 TC3("ldrsbt",	03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
20061 TC3("strht",	02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
20062
20063#undef  ARM_VARIANT
20064#define ARM_VARIANT    & arm_ext_v3
20065#undef  THUMB_VARIANT
20066#define THUMB_VARIANT  & arm_ext_v6t2
20067
20068 TUE("csdb",	320f014, f3af8014, 0, (), noargs, t_csdb),
20069 TUF("ssbb",	57ff040, f3bf8f40, 0, (), noargs, t_csdb),
20070 TUF("pssbb",	57ff044, f3bf8f44, 0, (), noargs, t_csdb),
20071
20072#undef  ARM_VARIANT
20073#define ARM_VARIANT    & arm_ext_v6t2
20074#undef  THUMB_VARIANT
20075#define THUMB_VARIANT  & arm_ext_v6t2_v8m
20076 TCE("movw",	3000000, f2400000, 2, (RRnpc, HALF),		    mov16, t_mov16),
20077 TCE("movt",	3400000, f2c00000, 2, (RRnpc, HALF),		    mov16, t_mov16),
20078
20079 /* Thumb-only instructions.  */
20080#undef  ARM_VARIANT
20081#define ARM_VARIANT NULL
20082  TUE("cbnz",     0,           b900,     2, (RR, EXP), 0, t_cbz),
20083  TUE("cbz",      0,           b100,     2, (RR, EXP), 0, t_cbz),
20084
20085 /* ARM does not really have an IT instruction, so always allow it.
20086    The opcode is copied from Thumb in order to allow warnings in
20087    -mimplicit-it=[never | arm] modes.  */
20088#undef  ARM_VARIANT
20089#define ARM_VARIANT  & arm_ext_v1
20090#undef  THUMB_VARIANT
20091#define THUMB_VARIANT  & arm_ext_v6t2
20092
20093 TUE("it",        bf08,        bf08,     1, (COND),   it,    t_it),
20094 TUE("itt",       bf0c,        bf0c,     1, (COND),   it,    t_it),
20095 TUE("ite",       bf04,        bf04,     1, (COND),   it,    t_it),
20096 TUE("ittt",      bf0e,        bf0e,     1, (COND),   it,    t_it),
20097 TUE("itet",      bf06,        bf06,     1, (COND),   it,    t_it),
20098 TUE("itte",      bf0a,        bf0a,     1, (COND),   it,    t_it),
20099 TUE("itee",      bf02,        bf02,     1, (COND),   it,    t_it),
20100 TUE("itttt",     bf0f,        bf0f,     1, (COND),   it,    t_it),
20101 TUE("itett",     bf07,        bf07,     1, (COND),   it,    t_it),
20102 TUE("ittet",     bf0b,        bf0b,     1, (COND),   it,    t_it),
20103 TUE("iteet",     bf03,        bf03,     1, (COND),   it,    t_it),
20104 TUE("ittte",     bf0d,        bf0d,     1, (COND),   it,    t_it),
20105 TUE("itete",     bf05,        bf05,     1, (COND),   it,    t_it),
20106 TUE("ittee",     bf09,        bf09,     1, (COND),   it,    t_it),
20107 TUE("iteee",     bf01,        bf01,     1, (COND),   it,    t_it),
20108 /* ARM/Thumb-2 instructions with no Thumb-1 equivalent.  */
20109 TC3("rrx",       01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
20110 TC3("rrxs",      01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
20111
20112 /* Thumb2 only instructions.  */
20113#undef  ARM_VARIANT
20114#define ARM_VARIANT  NULL
20115
20116 TCE("addw",	0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
20117 TCE("subw",	0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
20118 TCE("orn",       0, ea600000, 3, (RR, oRR, SH),  0, t_orn),
20119 TCE("orns",      0, ea700000, 3, (RR, oRR, SH),  0, t_orn),
20120 TCE("tbb",       0, e8d0f000, 1, (TB), 0, t_tb),
20121 TCE("tbh",       0, e8d0f010, 1, (TB), 0, t_tb),
20122
20123 /* Hardware division instructions.  */
20124#undef  ARM_VARIANT
20125#define ARM_VARIANT    & arm_ext_adiv
20126#undef  THUMB_VARIANT
20127#define THUMB_VARIANT  & arm_ext_div
20128
20129 TCE("sdiv",	710f010, fb90f0f0, 3, (RR, oRR, RR), div, t_div),
20130 TCE("udiv",	730f010, fbb0f0f0, 3, (RR, oRR, RR), div, t_div),
20131
20132 /* ARM V6M/V7 instructions.  */
20133#undef  ARM_VARIANT
20134#define ARM_VARIANT    & arm_ext_barrier
20135#undef  THUMB_VARIANT
20136#define THUMB_VARIANT  & arm_ext_barrier
20137
20138 TUF("dmb",	57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier, barrier),
20139 TUF("dsb",	57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier, barrier),
20140 TUF("isb",	57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier, barrier),
20141
20142 /* ARM V7 instructions.  */
20143#undef  ARM_VARIANT
20144#define ARM_VARIANT    & arm_ext_v7
20145#undef  THUMB_VARIANT
20146#define THUMB_VARIANT  & arm_ext_v7
20147
20148 TUF("pli",	450f000, f910f000, 1, (ADDR),	  pli,	    t_pld),
20149 TCE("dbg",	320f0f0, f3af80f0, 1, (I15),	  dbg,	    t_dbg),
20150
20151#undef  ARM_VARIANT
20152#define ARM_VARIANT    & arm_ext_mp
20153#undef  THUMB_VARIANT
20154#define THUMB_VARIANT  & arm_ext_mp
20155
20156 TUF("pldw",	410f000, f830f000, 1, (ADDR),	pld,	t_pld),
20157
20158 /* AArchv8 instructions.  */
20159#undef  ARM_VARIANT
20160#define ARM_VARIANT   & arm_ext_v8
20161
20162/* Instructions shared between armv8-a and armv8-m.  */
20163#undef  THUMB_VARIANT
20164#define THUMB_VARIANT & arm_ext_atomics
20165
20166 TCE("lda",	1900c9f, e8d00faf, 2, (RRnpc, RRnpcb),	rd_rn,	rd_rn),
20167 TCE("ldab",	1d00c9f, e8d00f8f, 2, (RRnpc, RRnpcb),	rd_rn,  rd_rn),
20168 TCE("ldah",	1f00c9f, e8d00f9f, 2, (RRnpc, RRnpcb),	rd_rn,  rd_rn),
20169 TCE("stl",	180fc90, e8c00faf, 2, (RRnpc, RRnpcb),	rm_rn,  rd_rn),
20170 TCE("stlb",	1c0fc90, e8c00f8f, 2, (RRnpc, RRnpcb),	rm_rn,  rd_rn),
20171 TCE("stlh",	1e0fc90, e8c00f9f, 2, (RRnpc, RRnpcb),	rm_rn,  rd_rn),
20172 TCE("ldaex",	1900e9f, e8d00fef, 2, (RRnpc, RRnpcb),	rd_rn,	rd_rn),
20173 TCE("ldaexb",	1d00e9f, e8d00fcf, 2, (RRnpc,RRnpcb),	rd_rn,  rd_rn),
20174 TCE("ldaexh",	1f00e9f, e8d00fdf, 2, (RRnpc, RRnpcb),	rd_rn,  rd_rn),
20175 TCE("stlex",	1800e90, e8c00fe0, 3, (RRnpc, RRnpc, RRnpcb),
20176							stlex,  t_stlex),
20177 TCE("stlexb",	1c00e90, e8c00fc0, 3, (RRnpc, RRnpc, RRnpcb),
20178							stlex, t_stlex),
20179 TCE("stlexh",	1e00e90, e8c00fd0, 3, (RRnpc, RRnpc, RRnpcb),
20180							stlex, t_stlex),
20181#undef  THUMB_VARIANT
20182#define THUMB_VARIANT & arm_ext_v8
20183
20184 tCE("sevl",	320f005, _sevl,    0, (),		noargs,	t_hint),
20185 TUE("hlt",	1000070, ba80,     1, (oIffffb),	bkpt,	t_hlt),
20186 TCE("ldaexd",	1b00e9f, e8d000ff, 3, (RRnpc, oRRnpc, RRnpcb),
20187							ldrexd, t_ldrexd),
20188 TCE("stlexd",	1a00e90, e8c000f0, 4, (RRnpc, RRnpc, oRRnpc, RRnpcb),
20189							strexd, t_strexd),
20190 /* ARMv8 T32 only.  */
20191#undef  ARM_VARIANT
20192#define ARM_VARIANT  NULL
20193 TUF("dcps1",	0,	 f78f8001, 0, (),	noargs, noargs),
20194 TUF("dcps2",	0,	 f78f8002, 0, (),	noargs, noargs),
20195 TUF("dcps3",	0,	 f78f8003, 0, (),	noargs, noargs),
20196
20197  /* FP for ARMv8.  */
20198#undef  ARM_VARIANT
20199#define ARM_VARIANT   & fpu_vfp_ext_armv8xd
20200#undef  THUMB_VARIANT
20201#define THUMB_VARIANT & fpu_vfp_ext_armv8xd
20202
20203  nUF(vseleq, _vseleq, 3, (RVSD, RVSD, RVSD),		vsel),
20204  nUF(vselvs, _vselvs, 3, (RVSD, RVSD, RVSD),		vsel),
20205  nUF(vselge, _vselge, 3, (RVSD, RVSD, RVSD),		vsel),
20206  nUF(vselgt, _vselgt, 3, (RVSD, RVSD, RVSD),		vsel),
20207  nUF(vmaxnm, _vmaxnm, 3, (RNSDQ, oRNSDQ, RNSDQ),	vmaxnm),
20208  nUF(vminnm, _vminnm, 3, (RNSDQ, oRNSDQ, RNSDQ),	vmaxnm),
20209  nUF(vcvta,  _vcvta,  2, (RNSDQ, oRNSDQ),		neon_cvta),
20210  nUF(vcvtn,  _vcvta,  2, (RNSDQ, oRNSDQ),		neon_cvtn),
20211  nUF(vcvtp,  _vcvta,  2, (RNSDQ, oRNSDQ),		neon_cvtp),
20212  nUF(vcvtm,  _vcvta,  2, (RNSDQ, oRNSDQ),		neon_cvtm),
20213  nCE(vrintr, _vrintr, 2, (RNSDQ, oRNSDQ),		vrintr),
20214  nCE(vrintz, _vrintr, 2, (RNSDQ, oRNSDQ),		vrintz),
20215  nCE(vrintx, _vrintr, 2, (RNSDQ, oRNSDQ),		vrintx),
20216  nUF(vrinta, _vrinta, 2, (RNSDQ, oRNSDQ),		vrinta),
20217  nUF(vrintn, _vrinta, 2, (RNSDQ, oRNSDQ),		vrintn),
20218  nUF(vrintp, _vrinta, 2, (RNSDQ, oRNSDQ),		vrintp),
20219  nUF(vrintm, _vrinta, 2, (RNSDQ, oRNSDQ),		vrintm),
20220
20221  /* Crypto v1 extensions.  */
20222#undef  ARM_VARIANT
20223#define ARM_VARIANT & fpu_crypto_ext_armv8
20224#undef  THUMB_VARIANT
20225#define THUMB_VARIANT & fpu_crypto_ext_armv8
20226
20227  nUF(aese, _aes, 2, (RNQ, RNQ), aese),
20228  nUF(aesd, _aes, 2, (RNQ, RNQ), aesd),
20229  nUF(aesmc, _aes, 2, (RNQ, RNQ), aesmc),
20230  nUF(aesimc, _aes, 2, (RNQ, RNQ), aesimc),
20231  nUF(sha1c, _sha3op, 3, (RNQ, RNQ, RNQ), sha1c),
20232  nUF(sha1p, _sha3op, 3, (RNQ, RNQ, RNQ), sha1p),
20233  nUF(sha1m, _sha3op, 3, (RNQ, RNQ, RNQ), sha1m),
20234  nUF(sha1su0, _sha3op, 3, (RNQ, RNQ, RNQ), sha1su0),
20235  nUF(sha256h, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h),
20236  nUF(sha256h2, _sha3op, 3, (RNQ, RNQ, RNQ), sha256h2),
20237  nUF(sha256su1, _sha3op, 3, (RNQ, RNQ, RNQ), sha256su1),
20238  nUF(sha1h, _sha1h, 2, (RNQ, RNQ), sha1h),
20239  nUF(sha1su1, _sha2op, 2, (RNQ, RNQ), sha1su1),
20240  nUF(sha256su0, _sha2op, 2, (RNQ, RNQ), sha256su0),
20241
20242#undef  ARM_VARIANT
20243#define ARM_VARIANT   & crc_ext_armv8
20244#undef  THUMB_VARIANT
20245#define THUMB_VARIANT & crc_ext_armv8
20246  TUEc("crc32b", 1000040, fac0f080, 3, (RR, oRR, RR), crc32b),
20247  TUEc("crc32h", 1200040, fac0f090, 3, (RR, oRR, RR), crc32h),
20248  TUEc("crc32w", 1400040, fac0f0a0, 3, (RR, oRR, RR), crc32w),
20249  TUEc("crc32cb",1000240, fad0f080, 3, (RR, oRR, RR), crc32cb),
20250  TUEc("crc32ch",1200240, fad0f090, 3, (RR, oRR, RR), crc32ch),
20251  TUEc("crc32cw",1400240, fad0f0a0, 3, (RR, oRR, RR), crc32cw),
20252
20253 /* ARMv8.2 RAS extension.  */
20254#undef  ARM_VARIANT
20255#define ARM_VARIANT   & arm_ext_ras
20256#undef  THUMB_VARIANT
20257#define THUMB_VARIANT & arm_ext_ras
20258 TUE ("esb", 320f010, f3af8010, 0, (), noargs,  noargs),
20259
20260#undef  ARM_VARIANT
20261#define ARM_VARIANT   & arm_ext_v8_3
20262#undef  THUMB_VARIANT
20263#define THUMB_VARIANT & arm_ext_v8_3
20264 NCE (vjcvt, eb90bc0, 2, (RVS, RVD), vjcvt),
20265 NUF (vcmla, 0, 4, (RNDQ, RNDQ, RNDQ_RNSC, EXPi), vcmla),
20266 NUF (vcadd, 0, 4, (RNDQ, RNDQ, RNDQ, EXPi), vcadd),
20267
20268#undef  ARM_VARIANT
20269#define ARM_VARIANT   & fpu_neon_ext_dotprod
20270#undef  THUMB_VARIANT
20271#define THUMB_VARIANT & fpu_neon_ext_dotprod
20272 NUF (vsdot, d00, 3, (RNDQ, RNDQ, RNDQ_RNSC), neon_dotproduct_s),
20273 NUF (vudot, d00, 3, (RNDQ, RNDQ, RNDQ_RNSC), neon_dotproduct_u),
20274
20275#undef  ARM_VARIANT
20276#define ARM_VARIANT  & fpu_fpa_ext_v1  /* Core FPA instruction set (V1).  */
20277#undef  THUMB_VARIANT
20278#define THUMB_VARIANT NULL
20279
20280 cCE("wfs",	e200110, 1, (RR),	     rd),
20281 cCE("rfs",	e300110, 1, (RR),	     rd),
20282 cCE("wfc",	e400110, 1, (RR),	     rd),
20283 cCE("rfc",	e500110, 1, (RR),	     rd),
20284
20285 cCL("ldfs",	c100100, 2, (RF, ADDRGLDC),  rd_cpaddr),
20286 cCL("ldfd",	c108100, 2, (RF, ADDRGLDC),  rd_cpaddr),
20287 cCL("ldfe",	c500100, 2, (RF, ADDRGLDC),  rd_cpaddr),
20288 cCL("ldfp",	c508100, 2, (RF, ADDRGLDC),  rd_cpaddr),
20289
20290 cCL("stfs",	c000100, 2, (RF, ADDRGLDC),  rd_cpaddr),
20291 cCL("stfd",	c008100, 2, (RF, ADDRGLDC),  rd_cpaddr),
20292 cCL("stfe",	c400100, 2, (RF, ADDRGLDC),  rd_cpaddr),
20293 cCL("stfp",	c408100, 2, (RF, ADDRGLDC),  rd_cpaddr),
20294
20295 cCL("mvfs",	e008100, 2, (RF, RF_IF),     rd_rm),
20296 cCL("mvfsp",	e008120, 2, (RF, RF_IF),     rd_rm),
20297 cCL("mvfsm",	e008140, 2, (RF, RF_IF),     rd_rm),
20298 cCL("mvfsz",	e008160, 2, (RF, RF_IF),     rd_rm),
20299 cCL("mvfd",	e008180, 2, (RF, RF_IF),     rd_rm),
20300 cCL("mvfdp",	e0081a0, 2, (RF, RF_IF),     rd_rm),
20301 cCL("mvfdm",	e0081c0, 2, (RF, RF_IF),     rd_rm),
20302 cCL("mvfdz",	e0081e0, 2, (RF, RF_IF),     rd_rm),
20303 cCL("mvfe",	e088100, 2, (RF, RF_IF),     rd_rm),
20304 cCL("mvfep",	e088120, 2, (RF, RF_IF),     rd_rm),
20305 cCL("mvfem",	e088140, 2, (RF, RF_IF),     rd_rm),
20306 cCL("mvfez",	e088160, 2, (RF, RF_IF),     rd_rm),
20307
20308 cCL("mnfs",	e108100, 2, (RF, RF_IF),     rd_rm),
20309 cCL("mnfsp",	e108120, 2, (RF, RF_IF),     rd_rm),
20310 cCL("mnfsm",	e108140, 2, (RF, RF_IF),     rd_rm),
20311 cCL("mnfsz",	e108160, 2, (RF, RF_IF),     rd_rm),
20312 cCL("mnfd",	e108180, 2, (RF, RF_IF),     rd_rm),
20313 cCL("mnfdp",	e1081a0, 2, (RF, RF_IF),     rd_rm),
20314 cCL("mnfdm",	e1081c0, 2, (RF, RF_IF),     rd_rm),
20315 cCL("mnfdz",	e1081e0, 2, (RF, RF_IF),     rd_rm),
20316 cCL("mnfe",	e188100, 2, (RF, RF_IF),     rd_rm),
20317 cCL("mnfep",	e188120, 2, (RF, RF_IF),     rd_rm),
20318 cCL("mnfem",	e188140, 2, (RF, RF_IF),     rd_rm),
20319 cCL("mnfez",	e188160, 2, (RF, RF_IF),     rd_rm),
20320
20321 cCL("abss",	e208100, 2, (RF, RF_IF),     rd_rm),
20322 cCL("abssp",	e208120, 2, (RF, RF_IF),     rd_rm),
20323 cCL("abssm",	e208140, 2, (RF, RF_IF),     rd_rm),
20324 cCL("abssz",	e208160, 2, (RF, RF_IF),     rd_rm),
20325 cCL("absd",	e208180, 2, (RF, RF_IF),     rd_rm),
20326 cCL("absdp",	e2081a0, 2, (RF, RF_IF),     rd_rm),
20327 cCL("absdm",	e2081c0, 2, (RF, RF_IF),     rd_rm),
20328 cCL("absdz",	e2081e0, 2, (RF, RF_IF),     rd_rm),
20329 cCL("abse",	e288100, 2, (RF, RF_IF),     rd_rm),
20330 cCL("absep",	e288120, 2, (RF, RF_IF),     rd_rm),
20331 cCL("absem",	e288140, 2, (RF, RF_IF),     rd_rm),
20332 cCL("absez",	e288160, 2, (RF, RF_IF),     rd_rm),
20333
20334 cCL("rnds",	e308100, 2, (RF, RF_IF),     rd_rm),
20335 cCL("rndsp",	e308120, 2, (RF, RF_IF),     rd_rm),
20336 cCL("rndsm",	e308140, 2, (RF, RF_IF),     rd_rm),
20337 cCL("rndsz",	e308160, 2, (RF, RF_IF),     rd_rm),
20338 cCL("rndd",	e308180, 2, (RF, RF_IF),     rd_rm),
20339 cCL("rnddp",	e3081a0, 2, (RF, RF_IF),     rd_rm),
20340 cCL("rnddm",	e3081c0, 2, (RF, RF_IF),     rd_rm),
20341 cCL("rnddz",	e3081e0, 2, (RF, RF_IF),     rd_rm),
20342 cCL("rnde",	e388100, 2, (RF, RF_IF),     rd_rm),
20343 cCL("rndep",	e388120, 2, (RF, RF_IF),     rd_rm),
20344 cCL("rndem",	e388140, 2, (RF, RF_IF),     rd_rm),
20345 cCL("rndez",	e388160, 2, (RF, RF_IF),     rd_rm),
20346
20347 cCL("sqts",	e408100, 2, (RF, RF_IF),     rd_rm),
20348 cCL("sqtsp",	e408120, 2, (RF, RF_IF),     rd_rm),
20349 cCL("sqtsm",	e408140, 2, (RF, RF_IF),     rd_rm),
20350 cCL("sqtsz",	e408160, 2, (RF, RF_IF),     rd_rm),
20351 cCL("sqtd",	e408180, 2, (RF, RF_IF),     rd_rm),
20352 cCL("sqtdp",	e4081a0, 2, (RF, RF_IF),     rd_rm),
20353 cCL("sqtdm",	e4081c0, 2, (RF, RF_IF),     rd_rm),
20354 cCL("sqtdz",	e4081e0, 2, (RF, RF_IF),     rd_rm),
20355 cCL("sqte",	e488100, 2, (RF, RF_IF),     rd_rm),
20356 cCL("sqtep",	e488120, 2, (RF, RF_IF),     rd_rm),
20357 cCL("sqtem",	e488140, 2, (RF, RF_IF),     rd_rm),
20358 cCL("sqtez",	e488160, 2, (RF, RF_IF),     rd_rm),
20359
20360 cCL("logs",	e508100, 2, (RF, RF_IF),     rd_rm),
20361 cCL("logsp",	e508120, 2, (RF, RF_IF),     rd_rm),
20362 cCL("logsm",	e508140, 2, (RF, RF_IF),     rd_rm),
20363 cCL("logsz",	e508160, 2, (RF, RF_IF),     rd_rm),
20364 cCL("logd",	e508180, 2, (RF, RF_IF),     rd_rm),
20365 cCL("logdp",	e5081a0, 2, (RF, RF_IF),     rd_rm),
20366 cCL("logdm",	e5081c0, 2, (RF, RF_IF),     rd_rm),
20367 cCL("logdz",	e5081e0, 2, (RF, RF_IF),     rd_rm),
20368 cCL("loge",	e588100, 2, (RF, RF_IF),     rd_rm),
20369 cCL("logep",	e588120, 2, (RF, RF_IF),     rd_rm),
20370 cCL("logem",	e588140, 2, (RF, RF_IF),     rd_rm),
20371 cCL("logez",	e588160, 2, (RF, RF_IF),     rd_rm),
20372
20373 cCL("lgns",	e608100, 2, (RF, RF_IF),     rd_rm),
20374 cCL("lgnsp",	e608120, 2, (RF, RF_IF),     rd_rm),
20375 cCL("lgnsm",	e608140, 2, (RF, RF_IF),     rd_rm),
20376 cCL("lgnsz",	e608160, 2, (RF, RF_IF),     rd_rm),
20377 cCL("lgnd",	e608180, 2, (RF, RF_IF),     rd_rm),
20378 cCL("lgndp",	e6081a0, 2, (RF, RF_IF),     rd_rm),
20379 cCL("lgndm",	e6081c0, 2, (RF, RF_IF),     rd_rm),
20380 cCL("lgndz",	e6081e0, 2, (RF, RF_IF),     rd_rm),
20381 cCL("lgne",	e688100, 2, (RF, RF_IF),     rd_rm),
20382 cCL("lgnep",	e688120, 2, (RF, RF_IF),     rd_rm),
20383 cCL("lgnem",	e688140, 2, (RF, RF_IF),     rd_rm),
20384 cCL("lgnez",	e688160, 2, (RF, RF_IF),     rd_rm),
20385
20386 cCL("exps",	e708100, 2, (RF, RF_IF),     rd_rm),
20387 cCL("expsp",	e708120, 2, (RF, RF_IF),     rd_rm),
20388 cCL("expsm",	e708140, 2, (RF, RF_IF),     rd_rm),
20389 cCL("expsz",	e708160, 2, (RF, RF_IF),     rd_rm),
20390 cCL("expd",	e708180, 2, (RF, RF_IF),     rd_rm),
20391 cCL("expdp",	e7081a0, 2, (RF, RF_IF),     rd_rm),
20392 cCL("expdm",	e7081c0, 2, (RF, RF_IF),     rd_rm),
20393 cCL("expdz",	e7081e0, 2, (RF, RF_IF),     rd_rm),
20394 cCL("expe",	e788100, 2, (RF, RF_IF),     rd_rm),
20395 cCL("expep",	e788120, 2, (RF, RF_IF),     rd_rm),
20396 cCL("expem",	e788140, 2, (RF, RF_IF),     rd_rm),
20397 cCL("expdz",	e788160, 2, (RF, RF_IF),     rd_rm),
20398
20399 cCL("sins",	e808100, 2, (RF, RF_IF),     rd_rm),
20400 cCL("sinsp",	e808120, 2, (RF, RF_IF),     rd_rm),
20401 cCL("sinsm",	e808140, 2, (RF, RF_IF),     rd_rm),
20402 cCL("sinsz",	e808160, 2, (RF, RF_IF),     rd_rm),
20403 cCL("sind",	e808180, 2, (RF, RF_IF),     rd_rm),
20404 cCL("sindp",	e8081a0, 2, (RF, RF_IF),     rd_rm),
20405 cCL("sindm",	e8081c0, 2, (RF, RF_IF),     rd_rm),
20406 cCL("sindz",	e8081e0, 2, (RF, RF_IF),     rd_rm),
20407 cCL("sine",	e888100, 2, (RF, RF_IF),     rd_rm),
20408 cCL("sinep",	e888120, 2, (RF, RF_IF),     rd_rm),
20409 cCL("sinem",	e888140, 2, (RF, RF_IF),     rd_rm),
20410 cCL("sinez",	e888160, 2, (RF, RF_IF),     rd_rm),
20411
20412 cCL("coss",	e908100, 2, (RF, RF_IF),     rd_rm),
20413 cCL("cossp",	e908120, 2, (RF, RF_IF),     rd_rm),
20414 cCL("cossm",	e908140, 2, (RF, RF_IF),     rd_rm),
20415 cCL("cossz",	e908160, 2, (RF, RF_IF),     rd_rm),
20416 cCL("cosd",	e908180, 2, (RF, RF_IF),     rd_rm),
20417 cCL("cosdp",	e9081a0, 2, (RF, RF_IF),     rd_rm),
20418 cCL("cosdm",	e9081c0, 2, (RF, RF_IF),     rd_rm),
20419 cCL("cosdz",	e9081e0, 2, (RF, RF_IF),     rd_rm),
20420 cCL("cose",	e988100, 2, (RF, RF_IF),     rd_rm),
20421 cCL("cosep",	e988120, 2, (RF, RF_IF),     rd_rm),
20422 cCL("cosem",	e988140, 2, (RF, RF_IF),     rd_rm),
20423 cCL("cosez",	e988160, 2, (RF, RF_IF),     rd_rm),
20424
20425 cCL("tans",	ea08100, 2, (RF, RF_IF),     rd_rm),
20426 cCL("tansp",	ea08120, 2, (RF, RF_IF),     rd_rm),
20427 cCL("tansm",	ea08140, 2, (RF, RF_IF),     rd_rm),
20428 cCL("tansz",	ea08160, 2, (RF, RF_IF),     rd_rm),
20429 cCL("tand",	ea08180, 2, (RF, RF_IF),     rd_rm),
20430 cCL("tandp",	ea081a0, 2, (RF, RF_IF),     rd_rm),
20431 cCL("tandm",	ea081c0, 2, (RF, RF_IF),     rd_rm),
20432 cCL("tandz",	ea081e0, 2, (RF, RF_IF),     rd_rm),
20433 cCL("tane",	ea88100, 2, (RF, RF_IF),     rd_rm),
20434 cCL("tanep",	ea88120, 2, (RF, RF_IF),     rd_rm),
20435 cCL("tanem",	ea88140, 2, (RF, RF_IF),     rd_rm),
20436 cCL("tanez",	ea88160, 2, (RF, RF_IF),     rd_rm),
20437
20438 cCL("asns",	eb08100, 2, (RF, RF_IF),     rd_rm),
20439 cCL("asnsp",	eb08120, 2, (RF, RF_IF),     rd_rm),
20440 cCL("asnsm",	eb08140, 2, (RF, RF_IF),     rd_rm),
20441 cCL("asnsz",	eb08160, 2, (RF, RF_IF),     rd_rm),
20442 cCL("asnd",	eb08180, 2, (RF, RF_IF),     rd_rm),
20443 cCL("asndp",	eb081a0, 2, (RF, RF_IF),     rd_rm),
20444 cCL("asndm",	eb081c0, 2, (RF, RF_IF),     rd_rm),
20445 cCL("asndz",	eb081e0, 2, (RF, RF_IF),     rd_rm),
20446 cCL("asne",	eb88100, 2, (RF, RF_IF),     rd_rm),
20447 cCL("asnep",	eb88120, 2, (RF, RF_IF),     rd_rm),
20448 cCL("asnem",	eb88140, 2, (RF, RF_IF),     rd_rm),
20449 cCL("asnez",	eb88160, 2, (RF, RF_IF),     rd_rm),
20450
20451 cCL("acss",	ec08100, 2, (RF, RF_IF),     rd_rm),
20452 cCL("acssp",	ec08120, 2, (RF, RF_IF),     rd_rm),
20453 cCL("acssm",	ec08140, 2, (RF, RF_IF),     rd_rm),
20454 cCL("acssz",	ec08160, 2, (RF, RF_IF),     rd_rm),
20455 cCL("acsd",	ec08180, 2, (RF, RF_IF),     rd_rm),
20456 cCL("acsdp",	ec081a0, 2, (RF, RF_IF),     rd_rm),
20457 cCL("acsdm",	ec081c0, 2, (RF, RF_IF),     rd_rm),
20458 cCL("acsdz",	ec081e0, 2, (RF, RF_IF),     rd_rm),
20459 cCL("acse",	ec88100, 2, (RF, RF_IF),     rd_rm),
20460 cCL("acsep",	ec88120, 2, (RF, RF_IF),     rd_rm),
20461 cCL("acsem",	ec88140, 2, (RF, RF_IF),     rd_rm),
20462 cCL("acsez",	ec88160, 2, (RF, RF_IF),     rd_rm),
20463
20464 cCL("atns",	ed08100, 2, (RF, RF_IF),     rd_rm),
20465 cCL("atnsp",	ed08120, 2, (RF, RF_IF),     rd_rm),
20466 cCL("atnsm",	ed08140, 2, (RF, RF_IF),     rd_rm),
20467 cCL("atnsz",	ed08160, 2, (RF, RF_IF),     rd_rm),
20468 cCL("atnd",	ed08180, 2, (RF, RF_IF),     rd_rm),
20469 cCL("atndp",	ed081a0, 2, (RF, RF_IF),     rd_rm),
20470 cCL("atndm",	ed081c0, 2, (RF, RF_IF),     rd_rm),
20471 cCL("atndz",	ed081e0, 2, (RF, RF_IF),     rd_rm),
20472 cCL("atne",	ed88100, 2, (RF, RF_IF),     rd_rm),
20473 cCL("atnep",	ed88120, 2, (RF, RF_IF),     rd_rm),
20474 cCL("atnem",	ed88140, 2, (RF, RF_IF),     rd_rm),
20475 cCL("atnez",	ed88160, 2, (RF, RF_IF),     rd_rm),
20476
20477 cCL("urds",	ee08100, 2, (RF, RF_IF),     rd_rm),
20478 cCL("urdsp",	ee08120, 2, (RF, RF_IF),     rd_rm),
20479 cCL("urdsm",	ee08140, 2, (RF, RF_IF),     rd_rm),
20480 cCL("urdsz",	ee08160, 2, (RF, RF_IF),     rd_rm),
20481 cCL("urdd",	ee08180, 2, (RF, RF_IF),     rd_rm),
20482 cCL("urddp",	ee081a0, 2, (RF, RF_IF),     rd_rm),
20483 cCL("urddm",	ee081c0, 2, (RF, RF_IF),     rd_rm),
20484 cCL("urddz",	ee081e0, 2, (RF, RF_IF),     rd_rm),
20485 cCL("urde",	ee88100, 2, (RF, RF_IF),     rd_rm),
20486 cCL("urdep",	ee88120, 2, (RF, RF_IF),     rd_rm),
20487 cCL("urdem",	ee88140, 2, (RF, RF_IF),     rd_rm),
20488 cCL("urdez",	ee88160, 2, (RF, RF_IF),     rd_rm),
20489
20490 cCL("nrms",	ef08100, 2, (RF, RF_IF),     rd_rm),
20491 cCL("nrmsp",	ef08120, 2, (RF, RF_IF),     rd_rm),
20492 cCL("nrmsm",	ef08140, 2, (RF, RF_IF),     rd_rm),
20493 cCL("nrmsz",	ef08160, 2, (RF, RF_IF),     rd_rm),
20494 cCL("nrmd",	ef08180, 2, (RF, RF_IF),     rd_rm),
20495 cCL("nrmdp",	ef081a0, 2, (RF, RF_IF),     rd_rm),
20496 cCL("nrmdm",	ef081c0, 2, (RF, RF_IF),     rd_rm),
20497 cCL("nrmdz",	ef081e0, 2, (RF, RF_IF),     rd_rm),
20498 cCL("nrme",	ef88100, 2, (RF, RF_IF),     rd_rm),
20499 cCL("nrmep",	ef88120, 2, (RF, RF_IF),     rd_rm),
20500 cCL("nrmem",	ef88140, 2, (RF, RF_IF),     rd_rm),
20501 cCL("nrmez",	ef88160, 2, (RF, RF_IF),     rd_rm),
20502
20503 cCL("adfs",	e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
20504 cCL("adfsp",	e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
20505 cCL("adfsm",	e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
20506 cCL("adfsz",	e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
20507 cCL("adfd",	e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
20508 cCL("adfdp",	e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20509 cCL("adfdm",	e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20510 cCL("adfdz",	e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20511 cCL("adfe",	e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
20512 cCL("adfep",	e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
20513 cCL("adfem",	e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
20514 cCL("adfez",	e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
20515
20516 cCL("sufs",	e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
20517 cCL("sufsp",	e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
20518 cCL("sufsm",	e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
20519 cCL("sufsz",	e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
20520 cCL("sufd",	e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
20521 cCL("sufdp",	e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20522 cCL("sufdm",	e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20523 cCL("sufdz",	e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20524 cCL("sufe",	e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
20525 cCL("sufep",	e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
20526 cCL("sufem",	e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
20527 cCL("sufez",	e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
20528
20529 cCL("rsfs",	e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
20530 cCL("rsfsp",	e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
20531 cCL("rsfsm",	e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
20532 cCL("rsfsz",	e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
20533 cCL("rsfd",	e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
20534 cCL("rsfdp",	e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20535 cCL("rsfdm",	e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20536 cCL("rsfdz",	e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20537 cCL("rsfe",	e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
20538 cCL("rsfep",	e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
20539 cCL("rsfem",	e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
20540 cCL("rsfez",	e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
20541
20542 cCL("mufs",	e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
20543 cCL("mufsp",	e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
20544 cCL("mufsm",	e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
20545 cCL("mufsz",	e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
20546 cCL("mufd",	e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
20547 cCL("mufdp",	e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20548 cCL("mufdm",	e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20549 cCL("mufdz",	e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20550 cCL("mufe",	e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
20551 cCL("mufep",	e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
20552 cCL("mufem",	e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
20553 cCL("mufez",	e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
20554
20555 cCL("dvfs",	e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
20556 cCL("dvfsp",	e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
20557 cCL("dvfsm",	e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
20558 cCL("dvfsz",	e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
20559 cCL("dvfd",	e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
20560 cCL("dvfdp",	e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20561 cCL("dvfdm",	e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20562 cCL("dvfdz",	e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20563 cCL("dvfe",	e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
20564 cCL("dvfep",	e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
20565 cCL("dvfem",	e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
20566 cCL("dvfez",	e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
20567
20568 cCL("rdfs",	e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
20569 cCL("rdfsp",	e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
20570 cCL("rdfsm",	e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
20571 cCL("rdfsz",	e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
20572 cCL("rdfd",	e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
20573 cCL("rdfdp",	e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20574 cCL("rdfdm",	e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20575 cCL("rdfdz",	e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20576 cCL("rdfe",	e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
20577 cCL("rdfep",	e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
20578 cCL("rdfem",	e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
20579 cCL("rdfez",	e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
20580
20581 cCL("pows",	e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
20582 cCL("powsp",	e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
20583 cCL("powsm",	e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
20584 cCL("powsz",	e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
20585 cCL("powd",	e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
20586 cCL("powdp",	e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20587 cCL("powdm",	e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20588 cCL("powdz",	e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20589 cCL("powe",	e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
20590 cCL("powep",	e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
20591 cCL("powem",	e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
20592 cCL("powez",	e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
20593
20594 cCL("rpws",	e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
20595 cCL("rpwsp",	e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
20596 cCL("rpwsm",	e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
20597 cCL("rpwsz",	e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
20598 cCL("rpwd",	e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
20599 cCL("rpwdp",	e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20600 cCL("rpwdm",	e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20601 cCL("rpwdz",	e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20602 cCL("rpwe",	e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
20603 cCL("rpwep",	e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
20604 cCL("rpwem",	e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
20605 cCL("rpwez",	e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
20606
20607 cCL("rmfs",	e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
20608 cCL("rmfsp",	e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
20609 cCL("rmfsm",	e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
20610 cCL("rmfsz",	e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
20611 cCL("rmfd",	e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
20612 cCL("rmfdp",	e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20613 cCL("rmfdm",	e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20614 cCL("rmfdz",	e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20615 cCL("rmfe",	e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
20616 cCL("rmfep",	e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
20617 cCL("rmfem",	e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
20618 cCL("rmfez",	e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
20619
20620 cCL("fmls",	e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
20621 cCL("fmlsp",	e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
20622 cCL("fmlsm",	e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
20623 cCL("fmlsz",	e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
20624 cCL("fmld",	e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
20625 cCL("fmldp",	e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20626 cCL("fmldm",	e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20627 cCL("fmldz",	e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20628 cCL("fmle",	e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
20629 cCL("fmlep",	e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
20630 cCL("fmlem",	e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
20631 cCL("fmlez",	e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
20632
20633 cCL("fdvs",	ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
20634 cCL("fdvsp",	ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
20635 cCL("fdvsm",	ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
20636 cCL("fdvsz",	ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
20637 cCL("fdvd",	ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
20638 cCL("fdvdp",	ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20639 cCL("fdvdm",	ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20640 cCL("fdvdz",	ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20641 cCL("fdve",	ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
20642 cCL("fdvep",	ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
20643 cCL("fdvem",	ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
20644 cCL("fdvez",	ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
20645
20646 cCL("frds",	eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
20647 cCL("frdsp",	eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
20648 cCL("frdsm",	eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
20649 cCL("frdsz",	eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
20650 cCL("frdd",	eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
20651 cCL("frddp",	eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20652 cCL("frddm",	eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20653 cCL("frddz",	eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20654 cCL("frde",	eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
20655 cCL("frdep",	eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
20656 cCL("frdem",	eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
20657 cCL("frdez",	eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
20658
20659 cCL("pols",	ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
20660 cCL("polsp",	ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
20661 cCL("polsm",	ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
20662 cCL("polsz",	ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
20663 cCL("pold",	ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
20664 cCL("poldp",	ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
20665 cCL("poldm",	ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
20666 cCL("poldz",	ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
20667 cCL("pole",	ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
20668 cCL("polep",	ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
20669 cCL("polem",	ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
20670 cCL("polez",	ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
20671
20672 cCE("cmf",	e90f110, 2, (RF, RF_IF),     fpa_cmp),
20673 C3E("cmfe",	ed0f110, 2, (RF, RF_IF),     fpa_cmp),
20674 cCE("cnf",	eb0f110, 2, (RF, RF_IF),     fpa_cmp),
20675 C3E("cnfe",	ef0f110, 2, (RF, RF_IF),     fpa_cmp),
20676
20677 cCL("flts",	e000110, 2, (RF, RR),	     rn_rd),
20678 cCL("fltsp",	e000130, 2, (RF, RR),	     rn_rd),
20679 cCL("fltsm",	e000150, 2, (RF, RR),	     rn_rd),
20680 cCL("fltsz",	e000170, 2, (RF, RR),	     rn_rd),
20681 cCL("fltd",	e000190, 2, (RF, RR),	     rn_rd),
20682 cCL("fltdp",	e0001b0, 2, (RF, RR),	     rn_rd),
20683 cCL("fltdm",	e0001d0, 2, (RF, RR),	     rn_rd),
20684 cCL("fltdz",	e0001f0, 2, (RF, RR),	     rn_rd),
20685 cCL("flte",	e080110, 2, (RF, RR),	     rn_rd),
20686 cCL("fltep",	e080130, 2, (RF, RR),	     rn_rd),
20687 cCL("fltem",	e080150, 2, (RF, RR),	     rn_rd),
20688 cCL("fltez",	e080170, 2, (RF, RR),	     rn_rd),
20689
20690  /* The implementation of the FIX instruction is broken on some
20691     assemblers, in that it accepts a precision specifier as well as a
20692     rounding specifier, despite the fact that this is meaningless.
20693     To be more compatible, we accept it as well, though of course it
20694     does not set any bits.  */
20695 cCE("fix",	e100110, 2, (RR, RF),	     rd_rm),
20696 cCL("fixp",	e100130, 2, (RR, RF),	     rd_rm),
20697 cCL("fixm",	e100150, 2, (RR, RF),	     rd_rm),
20698 cCL("fixz",	e100170, 2, (RR, RF),	     rd_rm),
20699 cCL("fixsp",	e100130, 2, (RR, RF),	     rd_rm),
20700 cCL("fixsm",	e100150, 2, (RR, RF),	     rd_rm),
20701 cCL("fixsz",	e100170, 2, (RR, RF),	     rd_rm),
20702 cCL("fixdp",	e100130, 2, (RR, RF),	     rd_rm),
20703 cCL("fixdm",	e100150, 2, (RR, RF),	     rd_rm),
20704 cCL("fixdz",	e100170, 2, (RR, RF),	     rd_rm),
20705 cCL("fixep",	e100130, 2, (RR, RF),	     rd_rm),
20706 cCL("fixem",	e100150, 2, (RR, RF),	     rd_rm),
20707 cCL("fixez",	e100170, 2, (RR, RF),	     rd_rm),
20708
20709  /* Instructions that were new with the real FPA, call them V2.  */
20710#undef  ARM_VARIANT
20711#define ARM_VARIANT  & fpu_fpa_ext_v2
20712
20713 cCE("lfm",	c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
20714 cCL("lfmfd",	c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
20715 cCL("lfmea",	d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
20716 cCE("sfm",	c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
20717 cCL("sfmfd",	d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
20718 cCL("sfmea",	c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
20719
20720#undef  ARM_VARIANT
20721#define ARM_VARIANT  & fpu_vfp_ext_v1xd  /* VFP V1xD (single precision).  */
20722
20723  /* Moves and type conversions.  */
20724 cCE("fcpys",	eb00a40, 2, (RVS, RVS),	      vfp_sp_monadic),
20725 cCE("fmrs",	e100a10, 2, (RR, RVS),	      vfp_reg_from_sp),
20726 cCE("fmsr",	e000a10, 2, (RVS, RR),	      vfp_sp_from_reg),
20727 cCE("fmstat",	ef1fa10, 0, (),		      noargs),
20728 cCE("vmrs",	ef00a10, 2, (APSR_RR, RVC),   vmrs),
20729 cCE("vmsr",	ee00a10, 2, (RVC, RR),        vmsr),
20730 cCE("fsitos",	eb80ac0, 2, (RVS, RVS),	      vfp_sp_monadic),
20731 cCE("fuitos",	eb80a40, 2, (RVS, RVS),	      vfp_sp_monadic),
20732 cCE("ftosis",	ebd0a40, 2, (RVS, RVS),	      vfp_sp_monadic),
20733 cCE("ftosizs",	ebd0ac0, 2, (RVS, RVS),	      vfp_sp_monadic),
20734 cCE("ftouis",	ebc0a40, 2, (RVS, RVS),	      vfp_sp_monadic),
20735 cCE("ftouizs",	ebc0ac0, 2, (RVS, RVS),	      vfp_sp_monadic),
20736 cCE("fmrx",	ef00a10, 2, (RR, RVC),	      rd_rn),
20737 cCE("fmxr",	ee00a10, 2, (RVC, RR),	      rn_rd),
20738
20739  /* Memory operations.	 */
20740 cCE("flds",	d100a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
20741 cCE("fsts",	d000a00, 2, (RVS, ADDRGLDC),  vfp_sp_ldst),
20742 cCE("fldmias",	c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
20743 cCE("fldmfds",	c900a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
20744 cCE("fldmdbs",	d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
20745 cCE("fldmeas",	d300a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
20746 cCE("fldmiax",	c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
20747 cCE("fldmfdx",	c900b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
20748 cCE("fldmdbx",	d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
20749 cCE("fldmeax",	d300b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
20750 cCE("fstmias",	c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
20751 cCE("fstmeas",	c800a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmia),
20752 cCE("fstmdbs",	d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
20753 cCE("fstmfds",	d200a00, 2, (RRnpctw, VRSLST),    vfp_sp_ldstmdb),
20754 cCE("fstmiax",	c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
20755 cCE("fstmeax",	c800b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmia),
20756 cCE("fstmdbx",	d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
20757 cCE("fstmfdx",	d200b00, 2, (RRnpctw, VRDLST),    vfp_xp_ldstmdb),
20758
20759  /* Monadic operations.  */
20760 cCE("fabss",	eb00ac0, 2, (RVS, RVS),	      vfp_sp_monadic),
20761 cCE("fnegs",	eb10a40, 2, (RVS, RVS),	      vfp_sp_monadic),
20762 cCE("fsqrts",	eb10ac0, 2, (RVS, RVS),	      vfp_sp_monadic),
20763
20764  /* Dyadic operations.	 */
20765 cCE("fadds",	e300a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
20766 cCE("fsubs",	e300a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
20767 cCE("fmuls",	e200a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
20768 cCE("fdivs",	e800a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
20769 cCE("fmacs",	e000a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
20770 cCE("fmscs",	e100a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
20771 cCE("fnmuls",	e200a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
20772 cCE("fnmacs",	e000a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
20773 cCE("fnmscs",	e100a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
20774
20775  /* Comparisons.  */
20776 cCE("fcmps",	eb40a40, 2, (RVS, RVS),	      vfp_sp_monadic),
20777 cCE("fcmpzs",	eb50a40, 1, (RVS),	      vfp_sp_compare_z),
20778 cCE("fcmpes",	eb40ac0, 2, (RVS, RVS),	      vfp_sp_monadic),
20779 cCE("fcmpezs",	eb50ac0, 1, (RVS),	      vfp_sp_compare_z),
20780
20781 /* Double precision load/store are still present on single precision
20782    implementations.  */
20783 cCE("fldd",	d100b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
20784 cCE("fstd",	d000b00, 2, (RVD, ADDRGLDC),  vfp_dp_ldst),
20785 cCE("fldmiad",	c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
20786 cCE("fldmfdd",	c900b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
20787 cCE("fldmdbd",	d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
20788 cCE("fldmead",	d300b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
20789 cCE("fstmiad",	c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
20790 cCE("fstmead",	c800b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmia),
20791 cCE("fstmdbd",	d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
20792 cCE("fstmfdd",	d200b00, 2, (RRnpctw, VRDLST),    vfp_dp_ldstmdb),
20793
20794#undef  ARM_VARIANT
20795#define ARM_VARIANT  & fpu_vfp_ext_v1 /* VFP V1 (Double precision).  */
20796
20797  /* Moves and type conversions.  */
20798 cCE("fcpyd",	eb00b40, 2, (RVD, RVD),	      vfp_dp_rd_rm),
20799 cCE("fcvtds",	eb70ac0, 2, (RVD, RVS),	      vfp_dp_sp_cvt),
20800 cCE("fcvtsd",	eb70bc0, 2, (RVS, RVD),	      vfp_sp_dp_cvt),
20801 cCE("fmdhr",	e200b10, 2, (RVD, RR),	      vfp_dp_rn_rd),
20802 cCE("fmdlr",	e000b10, 2, (RVD, RR),	      vfp_dp_rn_rd),
20803 cCE("fmrdh",	e300b10, 2, (RR, RVD),	      vfp_dp_rd_rn),
20804 cCE("fmrdl",	e100b10, 2, (RR, RVD),	      vfp_dp_rd_rn),
20805 cCE("fsitod",	eb80bc0, 2, (RVD, RVS),	      vfp_dp_sp_cvt),
20806 cCE("fuitod",	eb80b40, 2, (RVD, RVS),	      vfp_dp_sp_cvt),
20807 cCE("ftosid",	ebd0b40, 2, (RVS, RVD),	      vfp_sp_dp_cvt),
20808 cCE("ftosizd",	ebd0bc0, 2, (RVS, RVD),	      vfp_sp_dp_cvt),
20809 cCE("ftouid",	ebc0b40, 2, (RVS, RVD),	      vfp_sp_dp_cvt),
20810 cCE("ftouizd",	ebc0bc0, 2, (RVS, RVD),	      vfp_sp_dp_cvt),
20811
20812  /* Monadic operations.  */
20813 cCE("fabsd",	eb00bc0, 2, (RVD, RVD),	      vfp_dp_rd_rm),
20814 cCE("fnegd",	eb10b40, 2, (RVD, RVD),	      vfp_dp_rd_rm),
20815 cCE("fsqrtd",	eb10bc0, 2, (RVD, RVD),	      vfp_dp_rd_rm),
20816
20817  /* Dyadic operations.	 */
20818 cCE("faddd",	e300b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
20819 cCE("fsubd",	e300b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
20820 cCE("fmuld",	e200b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
20821 cCE("fdivd",	e800b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
20822 cCE("fmacd",	e000b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
20823 cCE("fmscd",	e100b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
20824 cCE("fnmuld",	e200b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
20825 cCE("fnmacd",	e000b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
20826 cCE("fnmscd",	e100b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
20827
20828  /* Comparisons.  */
20829 cCE("fcmpd",	eb40b40, 2, (RVD, RVD),	      vfp_dp_rd_rm),
20830 cCE("fcmpzd",	eb50b40, 1, (RVD),	      vfp_dp_rd),
20831 cCE("fcmped",	eb40bc0, 2, (RVD, RVD),	      vfp_dp_rd_rm),
20832 cCE("fcmpezd",	eb50bc0, 1, (RVD),	      vfp_dp_rd),
20833
20834#undef  ARM_VARIANT
20835#define ARM_VARIANT  & fpu_vfp_ext_v2
20836
20837 cCE("fmsrr",	c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
20838 cCE("fmrrs",	c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
20839 cCE("fmdrr",	c400b10, 3, (RVD, RR, RR),    vfp_dp_rm_rd_rn),
20840 cCE("fmrrd",	c500b10, 3, (RR, RR, RVD),    vfp_dp_rd_rn_rm),
20841
20842/* Instructions which may belong to either the Neon or VFP instruction sets.
20843   Individual encoder functions perform additional architecture checks.  */
20844#undef  ARM_VARIANT
20845#define ARM_VARIANT    & fpu_vfp_ext_v1xd
20846#undef  THUMB_VARIANT
20847#define THUMB_VARIANT  & fpu_vfp_ext_v1xd
20848
20849  /* These mnemonics are unique to VFP.  */
20850 NCE(vsqrt,     0,       2, (RVSD, RVSD),       vfp_nsyn_sqrt),
20851 NCE(vdiv,      0,       3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
20852 nCE(vnmul,     _vnmul,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
20853 nCE(vnmla,     _vnmla,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
20854 nCE(vnmls,     _vnmls,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
20855 nCE(vcmp,      _vcmp,    2, (RVSD, RSVD_FI0),    vfp_nsyn_cmp),
20856 nCE(vcmpe,     _vcmpe,   2, (RVSD, RSVD_FI0),    vfp_nsyn_cmp),
20857 NCE(vpush,     0,       1, (VRSDLST),          vfp_nsyn_push),
20858 NCE(vpop,      0,       1, (VRSDLST),          vfp_nsyn_pop),
20859 NCE(vcvtz,     0,       2, (RVSD, RVSD),       vfp_nsyn_cvtz),
20860
20861  /* Mnemonics shared by Neon and VFP.  */
20862 nCEF(vmul,     _vmul,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
20863 nCEF(vmla,     _vmla,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
20864 nCEF(vmls,     _vmls,    3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
20865
20866 nCEF(vadd,     _vadd,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
20867 nCEF(vsub,     _vsub,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
20868
20869 NCEF(vabs,     1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
20870 NCEF(vneg,     1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
20871
20872 NCE(vldm,      c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
20873 NCE(vldmia,    c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
20874 NCE(vldmdb,    d100b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
20875 NCE(vstm,      c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
20876 NCE(vstmia,    c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
20877 NCE(vstmdb,    d000b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
20878 NCE(vldr,      d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
20879 NCE(vstr,      d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
20880
20881 nCEF(vcvt,     _vcvt,   3, (RNSDQ, RNSDQ, oI32z), neon_cvt),
20882 nCEF(vcvtr,    _vcvt,   2, (RNSDQ, RNSDQ), neon_cvtr),
20883 NCEF(vcvtb,	eb20a40, 2, (RVSD, RVSD), neon_cvtb),
20884 NCEF(vcvtt,	eb20a40, 2, (RVSD, RVSD), neon_cvtt),
20885
20886
20887  /* NOTE: All VMOV encoding is special-cased!  */
20888 NCE(vmov,      0,       1, (VMOV), neon_mov),
20889 NCE(vmovq,     0,       1, (VMOV), neon_mov),
20890
20891#undef  ARM_VARIANT
20892#define ARM_VARIANT    & arm_ext_fp16
20893#undef  THUMB_VARIANT
20894#define THUMB_VARIANT  & arm_ext_fp16
20895 /* New instructions added from v8.2, allowing the extraction and insertion of
20896    the upper 16 bits of a 32-bit vector register.  */
20897 NCE (vmovx,     eb00a40,       2, (RVS, RVS), neon_movhf),
20898 NCE (vins,      eb00ac0,       2, (RVS, RVS), neon_movhf),
20899
20900 /* New backported fma/fms instructions optional in v8.2.  */
20901 NCE (vfmal, 810, 3, (RNDQ, RNSD, RNSD_RNSC), neon_vfmal),
20902 NCE (vfmsl, 810, 3, (RNDQ, RNSD, RNSD_RNSC), neon_vfmsl),
20903
20904#undef  THUMB_VARIANT
20905#define THUMB_VARIANT  & fpu_neon_ext_v1
20906#undef  ARM_VARIANT
20907#define ARM_VARIANT    & fpu_neon_ext_v1
20908
20909  /* Data processing with three registers of the same length.  */
20910  /* integer ops, valid types S8 S16 S32 U8 U16 U32.  */
20911 NUF(vaba,      0000710, 3, (RNDQ, RNDQ,  RNDQ), neon_dyadic_i_su),
20912 NUF(vabaq,     0000710, 3, (RNQ,  RNQ,   RNQ),  neon_dyadic_i_su),
20913 NUF(vhadd,     0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
20914 NUF(vhaddq,    0000000, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
20915 NUF(vrhadd,    0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
20916 NUF(vrhaddq,   0000100, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
20917 NUF(vhsub,     0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
20918 NUF(vhsubq,    0000200, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i_su),
20919  /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64.  */
20920 NUF(vqadd,     0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
20921 NUF(vqaddq,    0000010, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
20922 NUF(vqsub,     0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
20923 NUF(vqsubq,    0000210, 3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_i64_su),
20924 NUF(vrshl,     0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
20925 NUF(vrshlq,    0000500, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
20926 NUF(vqrshl,    0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
20927 NUF(vqrshlq,   0000510, 3, (RNQ,  oRNQ,  RNQ),  neon_rshl),
20928  /* If not immediate, fall back to neon_dyadic_i64_su.
20929     shl_imm should accept I8 I16 I32 I64,
20930     qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64.  */
20931 nUF(vshl,      _vshl,    3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
20932 nUF(vshlq,     _vshl,    3, (RNQ,  oRNQ,  RNDQ_I63b), neon_shl_imm),
20933 nUF(vqshl,     _vqshl,   3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
20934 nUF(vqshlq,    _vqshl,   3, (RNQ,  oRNQ,  RNDQ_I63b), neon_qshl_imm),
20935  /* Logic ops, types optional & ignored.  */
20936 nUF(vand,      _vand,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
20937 nUF(vandq,     _vand,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
20938 nUF(vbic,      _vbic,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
20939 nUF(vbicq,     _vbic,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
20940 nUF(vorr,      _vorr,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
20941 nUF(vorrq,     _vorr,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
20942 nUF(vorn,      _vorn,    3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
20943 nUF(vornq,     _vorn,    3, (RNQ,  oRNQ,  RNDQ_Ibig), neon_logic),
20944 nUF(veor,      _veor,    3, (RNDQ, oRNDQ, RNDQ),      neon_logic),
20945 nUF(veorq,     _veor,    3, (RNQ,  oRNQ,  RNQ),       neon_logic),
20946  /* Bitfield ops, untyped.  */
20947 NUF(vbsl,      1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
20948 NUF(vbslq,     1100110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
20949 NUF(vbit,      1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
20950 NUF(vbitq,     1200110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
20951 NUF(vbif,      1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
20952 NUF(vbifq,     1300110, 3, (RNQ,  RNQ,  RNQ),  neon_bitfield),
20953  /* Int and float variants, types S8 S16 S32 U8 U16 U32 F16 F32.  */
20954 nUF(vabd,      _vabd,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
20955 nUF(vabdq,     _vabd,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
20956 nUF(vmax,      _vmax,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
20957 nUF(vmaxq,     _vmax,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
20958 nUF(vmin,      _vmin,    3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
20959 nUF(vminq,     _vmin,    3, (RNQ,  oRNQ,  RNQ),  neon_dyadic_if_su),
20960  /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
20961     back to neon_dyadic_if_su.  */
20962 nUF(vcge,      _vcge,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
20963 nUF(vcgeq,     _vcge,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
20964 nUF(vcgt,      _vcgt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
20965 nUF(vcgtq,     _vcgt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp),
20966 nUF(vclt,      _vclt,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
20967 nUF(vcltq,     _vclt,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
20968 nUF(vcle,      _vcle,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
20969 nUF(vcleq,     _vcle,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_cmp_inv),
20970  /* Comparison. Type I8 I16 I32 F32.  */
20971 nUF(vceq,      _vceq,    3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
20972 nUF(vceqq,     _vceq,    3, (RNQ,  oRNQ,  RNDQ_I0), neon_ceq),
20973  /* As above, D registers only.  */
20974 nUF(vpmax,     _vpmax,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
20975 nUF(vpmin,     _vpmin,   3, (RND, oRND, RND), neon_dyadic_if_su_d),
20976  /* Int and float variants, signedness unimportant.  */
20977 nUF(vmlaq,     _vmla,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
20978 nUF(vmlsq,     _vmls,    3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mac_maybe_scalar),
20979 nUF(vpadd,     _vpadd,   3, (RND,  oRND,  RND),       neon_dyadic_if_i_d),
20980  /* Add/sub take types I8 I16 I32 I64 F32.  */
20981 nUF(vaddq,     _vadd,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
20982 nUF(vsubq,     _vsub,    3, (RNQ,  oRNQ,  RNQ),  neon_addsub_if_i),
20983  /* vtst takes sizes 8, 16, 32.  */
20984 NUF(vtst,      0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
20985 NUF(vtstq,     0000810, 3, (RNQ,  oRNQ,  RNQ),  neon_tst),
20986  /* VMUL takes I8 I16 I32 F32 P8.  */
20987 nUF(vmulq,     _vmul,     3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_mul),
20988  /* VQD{R}MULH takes S16 S32.  */
20989 nUF(vqdmulh,   _vqdmulh,  3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
20990 nUF(vqdmulhq,  _vqdmulh,  3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
20991 nUF(vqrdmulh,  _vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
20992 nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qdmulh),
20993 NUF(vacge,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
20994 NUF(vacgeq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
20995 NUF(vacgt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
20996 NUF(vacgtq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute),
20997 NUF(vaclt,     0200e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
20998 NUF(vacltq,    0200e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
20999 NUF(vacle,     0000e10,  3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
21000 NUF(vacleq,    0000e10,  3, (RNQ,  oRNQ,  RNQ),  neon_fcmp_absolute_inv),
21001 NUF(vrecps,    0000f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
21002 NUF(vrecpsq,   0000f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
21003 NUF(vrsqrts,   0200f10,  3, (RNDQ, oRNDQ, RNDQ), neon_step),
21004 NUF(vrsqrtsq,  0200f10,  3, (RNQ,  oRNQ,  RNQ),  neon_step),
21005 /* ARM v8.1 extension.  */
21006 nUF (vqrdmlah,  _vqrdmlah, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qrdmlah),
21007 nUF (vqrdmlahq, _vqrdmlah, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qrdmlah),
21008 nUF (vqrdmlsh,  _vqrdmlsh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qrdmlah),
21009 nUF (vqrdmlshq, _vqrdmlsh, 3, (RNQ,  oRNQ,  RNDQ_RNSC), neon_qrdmlah),
21010
21011  /* Two address, int/float. Types S8 S16 S32 F32.  */
21012 NUF(vabsq,     1b10300, 2, (RNQ,  RNQ),      neon_abs_neg),
21013 NUF(vnegq,     1b10380, 2, (RNQ,  RNQ),      neon_abs_neg),
21014
21015  /* Data processing with two registers and a shift amount.  */
21016  /* Right shifts, and variants with rounding.
21017     Types accepted S8 S16 S32 S64 U8 U16 U32 U64.  */
21018 NUF(vshr,      0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
21019 NUF(vshrq,     0800010, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
21020 NUF(vrshr,     0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
21021 NUF(vrshrq,    0800210, 3, (RNQ,  oRNQ,  I64z), neon_rshift_round_imm),
21022 NUF(vsra,      0800110, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
21023 NUF(vsraq,     0800110, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
21024 NUF(vrsra,     0800310, 3, (RNDQ, oRNDQ, I64),  neon_rshift_round_imm),
21025 NUF(vrsraq,    0800310, 3, (RNQ,  oRNQ,  I64),  neon_rshift_round_imm),
21026  /* Shift and insert. Sizes accepted 8 16 32 64.  */
21027 NUF(vsli,      1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
21028 NUF(vsliq,     1800510, 3, (RNQ,  oRNQ,  I63), neon_sli),
21029 NUF(vsri,      1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
21030 NUF(vsriq,     1800410, 3, (RNQ,  oRNQ,  I64), neon_sri),
21031  /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64.  */
21032 NUF(vqshlu,    1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
21033 NUF(vqshluq,   1800610, 3, (RNQ,  oRNQ,  I63), neon_qshlu_imm),
21034  /* Right shift immediate, saturating & narrowing, with rounding variants.
21035     Types accepted S16 S32 S64 U16 U32 U64.  */
21036 NUF(vqshrn,    0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
21037 NUF(vqrshrn,   0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
21038  /* As above, unsigned. Types accepted S16 S32 S64.  */
21039 NUF(vqshrun,   0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
21040 NUF(vqrshrun,  0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
21041  /* Right shift narrowing. Types accepted I16 I32 I64.  */
21042 NUF(vshrn,     0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
21043 NUF(vrshrn,    0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
21044  /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant.  */
21045 nUF(vshll,     _vshll,   3, (RNQ, RND, I32),  neon_shll),
21046  /* CVT with optional immediate for fixed-point variant.  */
21047 nUF(vcvtq,     _vcvt,    3, (RNQ, RNQ, oI32b), neon_cvt),
21048
21049 nUF(vmvn,      _vmvn,    2, (RNDQ, RNDQ_Ibig), neon_mvn),
21050 nUF(vmvnq,     _vmvn,    2, (RNQ,  RNDQ_Ibig), neon_mvn),
21051
21052  /* Data processing, three registers of different lengths.  */
21053  /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32.  */
21054 NUF(vabal,     0800500, 3, (RNQ, RND, RND),  neon_abal),
21055 NUF(vabdl,     0800700, 3, (RNQ, RND, RND),  neon_dyadic_long),
21056 NUF(vaddl,     0800000, 3, (RNQ, RND, RND),  neon_dyadic_long),
21057 NUF(vsubl,     0800200, 3, (RNQ, RND, RND),  neon_dyadic_long),
21058  /* If not scalar, fall back to neon_dyadic_long.
21059     Vector types as above, scalar types S16 S32 U16 U32.  */
21060 nUF(vmlal,     _vmlal,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
21061 nUF(vmlsl,     _vmlsl,   3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
21062  /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32.  */
21063 NUF(vaddw,     0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
21064 NUF(vsubw,     0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
21065  /* Dyadic, narrowing insns. Types I16 I32 I64.  */
21066 NUF(vaddhn,    0800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
21067 NUF(vraddhn,   1800400, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
21068 NUF(vsubhn,    0800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
21069 NUF(vrsubhn,   1800600, 3, (RND, RNQ, RNQ),  neon_dyadic_narrow),
21070  /* Saturating doubling multiplies. Types S16 S32.  */
21071 nUF(vqdmlal,   _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
21072 nUF(vqdmlsl,   _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
21073 nUF(vqdmull,   _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
21074  /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
21075     S16 S32 U16 U32.  */
21076 nUF(vmull,     _vmull,   3, (RNQ, RND, RND_RNSC), neon_vmull),
21077
21078  /* Extract. Size 8.  */
21079 NUF(vext,      0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
21080 NUF(vextq,     0b00000, 4, (RNQ,  oRNQ,  RNQ,  I15), neon_ext),
21081
21082  /* Two registers, miscellaneous.  */
21083  /* Reverse. Sizes 8 16 32 (must be < size in opcode).  */
21084 NUF(vrev64,    1b00000, 2, (RNDQ, RNDQ),     neon_rev),
21085 NUF(vrev64q,   1b00000, 2, (RNQ,  RNQ),      neon_rev),
21086 NUF(vrev32,    1b00080, 2, (RNDQ, RNDQ),     neon_rev),
21087 NUF(vrev32q,   1b00080, 2, (RNQ,  RNQ),      neon_rev),
21088 NUF(vrev16,    1b00100, 2, (RNDQ, RNDQ),     neon_rev),
21089 NUF(vrev16q,   1b00100, 2, (RNQ,  RNQ),      neon_rev),
21090  /* Vector replicate. Sizes 8 16 32.  */
21091 nCE(vdup,      _vdup,    2, (RNDQ, RR_RNSC),  neon_dup),
21092 nCE(vdupq,     _vdup,    2, (RNQ,  RR_RNSC),  neon_dup),
21093  /* VMOVL. Types S8 S16 S32 U8 U16 U32.  */
21094 NUF(vmovl,     0800a10, 2, (RNQ, RND),       neon_movl),
21095  /* VMOVN. Types I16 I32 I64.  */
21096 nUF(vmovn,     _vmovn,   2, (RND, RNQ),       neon_movn),
21097  /* VQMOVN. Types S16 S32 S64 U16 U32 U64.  */
21098 nUF(vqmovn,    _vqmovn,  2, (RND, RNQ),       neon_qmovn),
21099  /* VQMOVUN. Types S16 S32 S64.  */
21100 nUF(vqmovun,   _vqmovun, 2, (RND, RNQ),       neon_qmovun),
21101  /* VZIP / VUZP. Sizes 8 16 32.  */
21102 NUF(vzip,      1b20180, 2, (RNDQ, RNDQ),     neon_zip_uzp),
21103 NUF(vzipq,     1b20180, 2, (RNQ,  RNQ),      neon_zip_uzp),
21104 NUF(vuzp,      1b20100, 2, (RNDQ, RNDQ),     neon_zip_uzp),
21105 NUF(vuzpq,     1b20100, 2, (RNQ,  RNQ),      neon_zip_uzp),
21106  /* VQABS / VQNEG. Types S8 S16 S32.  */
21107 NUF(vqabs,     1b00700, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
21108 NUF(vqabsq,    1b00700, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
21109 NUF(vqneg,     1b00780, 2, (RNDQ, RNDQ),     neon_sat_abs_neg),
21110 NUF(vqnegq,    1b00780, 2, (RNQ,  RNQ),      neon_sat_abs_neg),
21111  /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32.  */
21112 NUF(vpadal,    1b00600, 2, (RNDQ, RNDQ),     neon_pair_long),
21113 NUF(vpadalq,   1b00600, 2, (RNQ,  RNQ),      neon_pair_long),
21114 NUF(vpaddl,    1b00200, 2, (RNDQ, RNDQ),     neon_pair_long),
21115 NUF(vpaddlq,   1b00200, 2, (RNQ,  RNQ),      neon_pair_long),
21116  /* Reciprocal estimates.  Types U32 F16 F32.  */
21117 NUF(vrecpe,    1b30400, 2, (RNDQ, RNDQ),     neon_recip_est),
21118 NUF(vrecpeq,   1b30400, 2, (RNQ,  RNQ),      neon_recip_est),
21119 NUF(vrsqrte,   1b30480, 2, (RNDQ, RNDQ),     neon_recip_est),
21120 NUF(vrsqrteq,  1b30480, 2, (RNQ,  RNQ),      neon_recip_est),
21121  /* VCLS. Types S8 S16 S32.  */
21122 NUF(vcls,      1b00400, 2, (RNDQ, RNDQ),     neon_cls),
21123 NUF(vclsq,     1b00400, 2, (RNQ,  RNQ),      neon_cls),
21124  /* VCLZ. Types I8 I16 I32.  */
21125 NUF(vclz,      1b00480, 2, (RNDQ, RNDQ),     neon_clz),
21126 NUF(vclzq,     1b00480, 2, (RNQ,  RNQ),      neon_clz),
21127  /* VCNT. Size 8.  */
21128 NUF(vcnt,      1b00500, 2, (RNDQ, RNDQ),     neon_cnt),
21129 NUF(vcntq,     1b00500, 2, (RNQ,  RNQ),      neon_cnt),
21130  /* Two address, untyped.  */
21131 NUF(vswp,      1b20000, 2, (RNDQ, RNDQ),     neon_swp),
21132 NUF(vswpq,     1b20000, 2, (RNQ,  RNQ),      neon_swp),
21133  /* VTRN. Sizes 8 16 32.  */
21134 nUF(vtrn,      _vtrn,    2, (RNDQ, RNDQ),     neon_trn),
21135 nUF(vtrnq,     _vtrn,    2, (RNQ,  RNQ),      neon_trn),
21136
21137  /* Table lookup. Size 8.  */
21138 NUF(vtbl,      1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
21139 NUF(vtbx,      1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
21140
21141#undef  THUMB_VARIANT
21142#define THUMB_VARIANT  & fpu_vfp_v3_or_neon_ext
21143#undef  ARM_VARIANT
21144#define ARM_VARIANT    & fpu_vfp_v3_or_neon_ext
21145
21146  /* Neon element/structure load/store.  */
21147 nUF(vld1,      _vld1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
21148 nUF(vst1,      _vst1,    2, (NSTRLST, ADDR),  neon_ldx_stx),
21149 nUF(vld2,      _vld2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
21150 nUF(vst2,      _vst2,    2, (NSTRLST, ADDR),  neon_ldx_stx),
21151 nUF(vld3,      _vld3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
21152 nUF(vst3,      _vst3,    2, (NSTRLST, ADDR),  neon_ldx_stx),
21153 nUF(vld4,      _vld4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
21154 nUF(vst4,      _vst4,    2, (NSTRLST, ADDR),  neon_ldx_stx),
21155
21156#undef  THUMB_VARIANT
21157#define THUMB_VARIANT & fpu_vfp_ext_v3xd
21158#undef  ARM_VARIANT
21159#define ARM_VARIANT   & fpu_vfp_ext_v3xd
21160 cCE("fconsts",   eb00a00, 2, (RVS, I255),      vfp_sp_const),
21161 cCE("fshtos",    eba0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
21162 cCE("fsltos",    eba0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
21163 cCE("fuhtos",    ebb0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
21164 cCE("fultos",    ebb0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
21165 cCE("ftoshs",    ebe0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
21166 cCE("ftosls",    ebe0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
21167 cCE("ftouhs",    ebf0a40, 2, (RVS, I16z),      vfp_sp_conv_16),
21168 cCE("ftouls",    ebf0ac0, 2, (RVS, I32),       vfp_sp_conv_32),
21169
21170#undef  THUMB_VARIANT
21171#define THUMB_VARIANT  & fpu_vfp_ext_v3
21172#undef  ARM_VARIANT
21173#define ARM_VARIANT    & fpu_vfp_ext_v3
21174
21175 cCE("fconstd",   eb00b00, 2, (RVD, I255),      vfp_dp_const),
21176 cCE("fshtod",    eba0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
21177 cCE("fsltod",    eba0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
21178 cCE("fuhtod",    ebb0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
21179 cCE("fultod",    ebb0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
21180 cCE("ftoshd",    ebe0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
21181 cCE("ftosld",    ebe0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
21182 cCE("ftouhd",    ebf0b40, 2, (RVD, I16z),      vfp_dp_conv_16),
21183 cCE("ftould",    ebf0bc0, 2, (RVD, I32),       vfp_dp_conv_32),
21184
21185#undef  ARM_VARIANT
21186#define ARM_VARIANT    & fpu_vfp_ext_fma
21187#undef  THUMB_VARIANT
21188#define THUMB_VARIANT  & fpu_vfp_ext_fma
21189 /* Mnemonics shared by Neon and VFP.  These are included in the
21190    VFP FMA variant; NEON and VFP FMA always includes the NEON
21191    FMA instructions.  */
21192 nCEF(vfma,     _vfma,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
21193 nCEF(vfms,     _vfms,    3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
21194 /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
21195    the v form should always be used.  */
21196 cCE("ffmas",	ea00a00, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
21197 cCE("ffnmas",	ea00a40, 3, (RVS, RVS, RVS),  vfp_sp_dyadic),
21198 cCE("ffmad",	ea00b00, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
21199 cCE("ffnmad",	ea00b40, 3, (RVD, RVD, RVD),  vfp_dp_rd_rn_rm),
21200 nCE(vfnma,     _vfnma,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
21201 nCE(vfnms,     _vfnms,   3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
21202
21203#undef THUMB_VARIANT
21204#undef  ARM_VARIANT
21205#define ARM_VARIANT  & arm_cext_xscale /* Intel XScale extensions.  */
21206
21207 cCE("mia",	e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
21208 cCE("miaph",	e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
21209 cCE("miabb",	e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
21210 cCE("miabt",	e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
21211 cCE("miatb",	e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
21212 cCE("miatt",	e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
21213 cCE("mar",	c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
21214 cCE("mra",	c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
21215
21216#undef  ARM_VARIANT
21217#define ARM_VARIANT  & arm_cext_iwmmxt /* Intel Wireless MMX technology.  */
21218
21219 cCE("tandcb",	e13f130, 1, (RR),		    iwmmxt_tandorc),
21220 cCE("tandch",	e53f130, 1, (RR),		    iwmmxt_tandorc),
21221 cCE("tandcw",	e93f130, 1, (RR),		    iwmmxt_tandorc),
21222 cCE("tbcstb",	e400010, 2, (RIWR, RR),		    rn_rd),
21223 cCE("tbcsth",	e400050, 2, (RIWR, RR),		    rn_rd),
21224 cCE("tbcstw",	e400090, 2, (RIWR, RR),		    rn_rd),
21225 cCE("textrcb",	e130170, 2, (RR, I7),		    iwmmxt_textrc),
21226 cCE("textrch",	e530170, 2, (RR, I7),		    iwmmxt_textrc),
21227 cCE("textrcw",	e930170, 2, (RR, I7),		    iwmmxt_textrc),
21228 cCE("textrmub",e100070, 3, (RR, RIWR, I7),	    iwmmxt_textrm),
21229 cCE("textrmuh",e500070, 3, (RR, RIWR, I7),	    iwmmxt_textrm),
21230 cCE("textrmuw",e900070, 3, (RR, RIWR, I7),	    iwmmxt_textrm),
21231 cCE("textrmsb",e100078, 3, (RR, RIWR, I7),	    iwmmxt_textrm),
21232 cCE("textrmsh",e500078, 3, (RR, RIWR, I7),	    iwmmxt_textrm),
21233 cCE("textrmsw",e900078, 3, (RR, RIWR, I7),	    iwmmxt_textrm),
21234 cCE("tinsrb",	e600010, 3, (RIWR, RR, I7),	    iwmmxt_tinsr),
21235 cCE("tinsrh",	e600050, 3, (RIWR, RR, I7),	    iwmmxt_tinsr),
21236 cCE("tinsrw",	e600090, 3, (RIWR, RR, I7),	    iwmmxt_tinsr),
21237 cCE("tmcr",	e000110, 2, (RIWC_RIWG, RR),	    rn_rd),
21238 cCE("tmcrr",	c400000, 3, (RIWR, RR, RR),	    rm_rd_rn),
21239 cCE("tmia",	e200010, 3, (RIWR, RR, RR),	    iwmmxt_tmia),
21240 cCE("tmiaph",	e280010, 3, (RIWR, RR, RR),	    iwmmxt_tmia),
21241 cCE("tmiabb",	e2c0010, 3, (RIWR, RR, RR),	    iwmmxt_tmia),
21242 cCE("tmiabt",	e2d0010, 3, (RIWR, RR, RR),	    iwmmxt_tmia),
21243 cCE("tmiatb",	e2e0010, 3, (RIWR, RR, RR),	    iwmmxt_tmia),
21244 cCE("tmiatt",	e2f0010, 3, (RIWR, RR, RR),	    iwmmxt_tmia),
21245 cCE("tmovmskb",e100030, 2, (RR, RIWR),		    rd_rn),
21246 cCE("tmovmskh",e500030, 2, (RR, RIWR),		    rd_rn),
21247 cCE("tmovmskw",e900030, 2, (RR, RIWR),		    rd_rn),
21248 cCE("tmrc",	e100110, 2, (RR, RIWC_RIWG),	    rd_rn),
21249 cCE("tmrrc",	c500000, 3, (RR, RR, RIWR),	    rd_rn_rm),
21250 cCE("torcb",	e13f150, 1, (RR),		    iwmmxt_tandorc),
21251 cCE("torch",	e53f150, 1, (RR),		    iwmmxt_tandorc),
21252 cCE("torcw",	e93f150, 1, (RR),		    iwmmxt_tandorc),
21253 cCE("waccb",	e0001c0, 2, (RIWR, RIWR),	    rd_rn),
21254 cCE("wacch",	e4001c0, 2, (RIWR, RIWR),	    rd_rn),
21255 cCE("waccw",	e8001c0, 2, (RIWR, RIWR),	    rd_rn),
21256 cCE("waddbss",	e300180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21257 cCE("waddb",	e000180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21258 cCE("waddbus",	e100180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21259 cCE("waddhss",	e700180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21260 cCE("waddh",	e400180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21261 cCE("waddhus",	e500180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21262 cCE("waddwss",	eb00180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21263 cCE("waddw",	e800180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21264 cCE("waddwus",	e900180, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21265 cCE("waligni",	e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
21266 cCE("walignr0",e800020, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21267 cCE("walignr1",e900020, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21268 cCE("walignr2",ea00020, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21269 cCE("walignr3",eb00020, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21270 cCE("wand",	e200000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21271 cCE("wandn",	e300000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21272 cCE("wavg2b",	e800000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21273 cCE("wavg2br",	e900000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21274 cCE("wavg2h",	ec00000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21275 cCE("wavg2hr",	ed00000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21276 cCE("wcmpeqb",	e000060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21277 cCE("wcmpeqh",	e400060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21278 cCE("wcmpeqw",	e800060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21279 cCE("wcmpgtub",e100060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21280 cCE("wcmpgtuh",e500060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21281 cCE("wcmpgtuw",e900060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21282 cCE("wcmpgtsb",e300060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21283 cCE("wcmpgtsh",e700060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21284 cCE("wcmpgtsw",eb00060, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21285 cCE("wldrb",	c100000, 2, (RIWR, ADDR),	    iwmmxt_wldstbh),
21286 cCE("wldrh",	c500000, 2, (RIWR, ADDR),	    iwmmxt_wldstbh),
21287 cCE("wldrw",	c100100, 2, (RIWR_RIWC, ADDR),	    iwmmxt_wldstw),
21288 cCE("wldrd",	c500100, 2, (RIWR, ADDR),	    iwmmxt_wldstd),
21289 cCE("wmacs",	e600100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21290 cCE("wmacsz",	e700100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21291 cCE("wmacu",	e400100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21292 cCE("wmacuz",	e500100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21293 cCE("wmadds",	ea00100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21294 cCE("wmaddu",	e800100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21295 cCE("wmaxsb",	e200160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21296 cCE("wmaxsh",	e600160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21297 cCE("wmaxsw",	ea00160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21298 cCE("wmaxub",	e000160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21299 cCE("wmaxuh",	e400160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21300 cCE("wmaxuw",	e800160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21301 cCE("wminsb",	e300160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21302 cCE("wminsh",	e700160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21303 cCE("wminsw",	eb00160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21304 cCE("wminub",	e100160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21305 cCE("wminuh",	e500160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21306 cCE("wminuw",	e900160, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21307 cCE("wmov",	e000000, 2, (RIWR, RIWR),	    iwmmxt_wmov),
21308 cCE("wmulsm",	e300100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21309 cCE("wmulsl",	e200100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21310 cCE("wmulum",	e100100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21311 cCE("wmulul",	e000100, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21312 cCE("wor",	e000000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21313 cCE("wpackhss",e700080, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21314 cCE("wpackhus",e500080, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21315 cCE("wpackwss",eb00080, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21316 cCE("wpackwus",e900080, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21317 cCE("wpackdss",ef00080, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21318 cCE("wpackdus",ed00080, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21319 cCE("wrorh",	e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
21320 cCE("wrorhg",	e700148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
21321 cCE("wrorw",	eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
21322 cCE("wrorwg",	eb00148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
21323 cCE("wrord",	ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
21324 cCE("wrordg",	ef00148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
21325 cCE("wsadb",	e000120, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21326 cCE("wsadbz",	e100120, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21327 cCE("wsadh",	e400120, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21328 cCE("wsadhz",	e500120, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21329 cCE("wshufh",	e0001e0, 3, (RIWR, RIWR, I255),	    iwmmxt_wshufh),
21330 cCE("wsllh",	e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
21331 cCE("wsllhg",	e500148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
21332 cCE("wsllw",	e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
21333 cCE("wsllwg",	e900148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
21334 cCE("wslld",	ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
21335 cCE("wslldg",	ed00148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
21336 cCE("wsrah",	e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
21337 cCE("wsrahg",	e400148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
21338 cCE("wsraw",	e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
21339 cCE("wsrawg",	e800148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
21340 cCE("wsrad",	ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
21341 cCE("wsradg",	ec00148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
21342 cCE("wsrlh",	e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
21343 cCE("wsrlhg",	e600148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
21344 cCE("wsrlw",	ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
21345 cCE("wsrlwg",	ea00148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
21346 cCE("wsrld",	ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
21347 cCE("wsrldg",	ee00148, 3, (RIWR, RIWR, RIWG),	    rd_rn_rm),
21348 cCE("wstrb",	c000000, 2, (RIWR, ADDR),	    iwmmxt_wldstbh),
21349 cCE("wstrh",	c400000, 2, (RIWR, ADDR),	    iwmmxt_wldstbh),
21350 cCE("wstrw",	c000100, 2, (RIWR_RIWC, ADDR),	    iwmmxt_wldstw),
21351 cCE("wstrd",	c400100, 2, (RIWR, ADDR),	    iwmmxt_wldstd),
21352 cCE("wsubbss",	e3001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21353 cCE("wsubb",	e0001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21354 cCE("wsubbus",	e1001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21355 cCE("wsubhss",	e7001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21356 cCE("wsubh",	e4001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21357 cCE("wsubhus",	e5001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21358 cCE("wsubwss",	eb001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21359 cCE("wsubw",	e8001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21360 cCE("wsubwus",	e9001a0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21361 cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR),	    rd_rn),
21362 cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR),	    rd_rn),
21363 cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR),	    rd_rn),
21364 cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR),	    rd_rn),
21365 cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR),	    rd_rn),
21366 cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR),	    rd_rn),
21367 cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21368 cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21369 cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21370 cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR),	    rd_rn),
21371 cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR),	    rd_rn),
21372 cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR),	    rd_rn),
21373 cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR),	    rd_rn),
21374 cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR),	    rd_rn),
21375 cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR),	    rd_rn),
21376 cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21377 cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21378 cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21379 cCE("wxor",	e100000, 3, (RIWR, RIWR, RIWR),	    rd_rn_rm),
21380 cCE("wzero",	e300000, 1, (RIWR),		    iwmmxt_wzero),
21381
21382#undef  ARM_VARIANT
21383#define ARM_VARIANT  & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2.  */
21384
21385 cCE("torvscb",   e12f190, 1, (RR),		    iwmmxt_tandorc),
21386 cCE("torvsch",   e52f190, 1, (RR),		    iwmmxt_tandorc),
21387 cCE("torvscw",   e92f190, 1, (RR),		    iwmmxt_tandorc),
21388 cCE("wabsb",     e2001c0, 2, (RIWR, RIWR),           rd_rn),
21389 cCE("wabsh",     e6001c0, 2, (RIWR, RIWR),           rd_rn),
21390 cCE("wabsw",     ea001c0, 2, (RIWR, RIWR),           rd_rn),
21391 cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21392 cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21393 cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21394 cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21395 cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21396 cCE("waddhc",    e600180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21397 cCE("waddwc",    ea00180, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21398 cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21399 cCE("wavg4",	e400000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21400 cCE("wavg4r",    e500000, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21401 cCE("wmaddsn",   ee00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21402 cCE("wmaddsx",   eb00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21403 cCE("wmaddun",   ec00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21404 cCE("wmaddux",   e900100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21405 cCE("wmerge",    e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
21406 cCE("wmiabb",    e0000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21407 cCE("wmiabt",    e1000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21408 cCE("wmiatb",    e2000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21409 cCE("wmiatt",    e3000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21410 cCE("wmiabbn",   e4000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21411 cCE("wmiabtn",   e5000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21412 cCE("wmiatbn",   e6000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21413 cCE("wmiattn",   e7000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21414 cCE("wmiawbb",   e800120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21415 cCE("wmiawbt",   e900120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21416 cCE("wmiawtb",   ea00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21417 cCE("wmiawtt",   eb00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21418 cCE("wmiawbbn",  ec00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21419 cCE("wmiawbtn",  ed00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21420 cCE("wmiawtbn",  ee00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21421 cCE("wmiawttn",  ef00120, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21422 cCE("wmulsmr",   ef00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21423 cCE("wmulumr",   ed00100, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21424 cCE("wmulwumr",  ec000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21425 cCE("wmulwsmr",  ee000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21426 cCE("wmulwum",   ed000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21427 cCE("wmulwsm",   ef000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21428 cCE("wmulwl",    eb000c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21429 cCE("wqmiabb",   e8000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21430 cCE("wqmiabt",   e9000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21431 cCE("wqmiatb",   ea000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21432 cCE("wqmiatt",   eb000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21433 cCE("wqmiabbn",  ec000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21434 cCE("wqmiabtn",  ed000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21435 cCE("wqmiatbn",  ee000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21436 cCE("wqmiattn",  ef000a0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21437 cCE("wqmulm",    e100080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21438 cCE("wqmulmr",   e300080, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21439 cCE("wqmulwm",   ec000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21440 cCE("wqmulwmr",  ee000e0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21441 cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR),     rd_rn_rm),
21442
21443#undef  ARM_VARIANT
21444#define ARM_VARIANT  & arm_cext_maverick /* Cirrus Maverick instructions.  */
21445
21446 cCE("cfldrs",	c100400, 2, (RMF, ADDRGLDC),	      rd_cpaddr),
21447 cCE("cfldrd",	c500400, 2, (RMD, ADDRGLDC),	      rd_cpaddr),
21448 cCE("cfldr32",	c100500, 2, (RMFX, ADDRGLDC),	      rd_cpaddr),
21449 cCE("cfldr64",	c500500, 2, (RMDX, ADDRGLDC),	      rd_cpaddr),
21450 cCE("cfstrs",	c000400, 2, (RMF, ADDRGLDC),	      rd_cpaddr),
21451 cCE("cfstrd",	c400400, 2, (RMD, ADDRGLDC),	      rd_cpaddr),
21452 cCE("cfstr32",	c000500, 2, (RMFX, ADDRGLDC),	      rd_cpaddr),
21453 cCE("cfstr64",	c400500, 2, (RMDX, ADDRGLDC),	      rd_cpaddr),
21454 cCE("cfmvsr",	e000450, 2, (RMF, RR),		      rn_rd),
21455 cCE("cfmvrs",	e100450, 2, (RR, RMF),		      rd_rn),
21456 cCE("cfmvdlr",	e000410, 2, (RMD, RR),		      rn_rd),
21457 cCE("cfmvrdl",	e100410, 2, (RR, RMD),		      rd_rn),
21458 cCE("cfmvdhr",	e000430, 2, (RMD, RR),		      rn_rd),
21459 cCE("cfmvrdh",	e100430, 2, (RR, RMD),		      rd_rn),
21460 cCE("cfmv64lr",e000510, 2, (RMDX, RR),		      rn_rd),
21461 cCE("cfmvr64l",e100510, 2, (RR, RMDX),		      rd_rn),
21462 cCE("cfmv64hr",e000530, 2, (RMDX, RR),		      rn_rd),
21463 cCE("cfmvr64h",e100530, 2, (RR, RMDX),		      rd_rn),
21464 cCE("cfmval32",e200440, 2, (RMAX, RMFX),	      rd_rn),
21465 cCE("cfmv32al",e100440, 2, (RMFX, RMAX),	      rd_rn),
21466 cCE("cfmvam32",e200460, 2, (RMAX, RMFX),	      rd_rn),
21467 cCE("cfmv32am",e100460, 2, (RMFX, RMAX),	      rd_rn),
21468 cCE("cfmvah32",e200480, 2, (RMAX, RMFX),	      rd_rn),
21469 cCE("cfmv32ah",e100480, 2, (RMFX, RMAX),	      rd_rn),
21470 cCE("cfmva32",	e2004a0, 2, (RMAX, RMFX),	      rd_rn),
21471 cCE("cfmv32a",	e1004a0, 2, (RMFX, RMAX),	      rd_rn),
21472 cCE("cfmva64",	e2004c0, 2, (RMAX, RMDX),	      rd_rn),
21473 cCE("cfmv64a",	e1004c0, 2, (RMDX, RMAX),	      rd_rn),
21474 cCE("cfmvsc32",e2004e0, 2, (RMDS, RMDX),	      mav_dspsc),
21475 cCE("cfmv32sc",e1004e0, 2, (RMDX, RMDS),	      rd),
21476 cCE("cfcpys",	e000400, 2, (RMF, RMF),		      rd_rn),
21477 cCE("cfcpyd",	e000420, 2, (RMD, RMD),		      rd_rn),
21478 cCE("cfcvtsd",	e000460, 2, (RMD, RMF),		      rd_rn),
21479 cCE("cfcvtds",	e000440, 2, (RMF, RMD),		      rd_rn),
21480 cCE("cfcvt32s",e000480, 2, (RMF, RMFX),	      rd_rn),
21481 cCE("cfcvt32d",e0004a0, 2, (RMD, RMFX),	      rd_rn),
21482 cCE("cfcvt64s",e0004c0, 2, (RMF, RMDX),	      rd_rn),
21483 cCE("cfcvt64d",e0004e0, 2, (RMD, RMDX),	      rd_rn),
21484 cCE("cfcvts32",e100580, 2, (RMFX, RMF),	      rd_rn),
21485 cCE("cfcvtd32",e1005a0, 2, (RMFX, RMD),	      rd_rn),
21486 cCE("cftruncs32",e1005c0, 2, (RMFX, RMF),	      rd_rn),
21487 cCE("cftruncd32",e1005e0, 2, (RMFX, RMD),	      rd_rn),
21488 cCE("cfrshl32",e000550, 3, (RMFX, RMFX, RR),	      mav_triple),
21489 cCE("cfrshl64",e000570, 3, (RMDX, RMDX, RR),	      mav_triple),
21490 cCE("cfsh32",	e000500, 3, (RMFX, RMFX, I63s),	      mav_shift),
21491 cCE("cfsh64",	e200500, 3, (RMDX, RMDX, I63s),	      mav_shift),
21492 cCE("cfcmps",	e100490, 3, (RR, RMF, RMF),	      rd_rn_rm),
21493 cCE("cfcmpd",	e1004b0, 3, (RR, RMD, RMD),	      rd_rn_rm),
21494 cCE("cfcmp32",	e100590, 3, (RR, RMFX, RMFX),	      rd_rn_rm),
21495 cCE("cfcmp64",	e1005b0, 3, (RR, RMDX, RMDX),	      rd_rn_rm),
21496 cCE("cfabss",	e300400, 2, (RMF, RMF),		      rd_rn),
21497 cCE("cfabsd",	e300420, 2, (RMD, RMD),		      rd_rn),
21498 cCE("cfnegs",	e300440, 2, (RMF, RMF),		      rd_rn),
21499 cCE("cfnegd",	e300460, 2, (RMD, RMD),		      rd_rn),
21500 cCE("cfadds",	e300480, 3, (RMF, RMF, RMF),	      rd_rn_rm),
21501 cCE("cfaddd",	e3004a0, 3, (RMD, RMD, RMD),	      rd_rn_rm),
21502 cCE("cfsubs",	e3004c0, 3, (RMF, RMF, RMF),	      rd_rn_rm),
21503 cCE("cfsubd",	e3004e0, 3, (RMD, RMD, RMD),	      rd_rn_rm),
21504 cCE("cfmuls",	e100400, 3, (RMF, RMF, RMF),	      rd_rn_rm),
21505 cCE("cfmuld",	e100420, 3, (RMD, RMD, RMD),	      rd_rn_rm),
21506 cCE("cfabs32",	e300500, 2, (RMFX, RMFX),	      rd_rn),
21507 cCE("cfabs64",	e300520, 2, (RMDX, RMDX),	      rd_rn),
21508 cCE("cfneg32",	e300540, 2, (RMFX, RMFX),	      rd_rn),
21509 cCE("cfneg64",	e300560, 2, (RMDX, RMDX),	      rd_rn),
21510 cCE("cfadd32",	e300580, 3, (RMFX, RMFX, RMFX),	      rd_rn_rm),
21511 cCE("cfadd64",	e3005a0, 3, (RMDX, RMDX, RMDX),	      rd_rn_rm),
21512 cCE("cfsub32",	e3005c0, 3, (RMFX, RMFX, RMFX),	      rd_rn_rm),
21513 cCE("cfsub64",	e3005e0, 3, (RMDX, RMDX, RMDX),	      rd_rn_rm),
21514 cCE("cfmul32",	e100500, 3, (RMFX, RMFX, RMFX),	      rd_rn_rm),
21515 cCE("cfmul64",	e100520, 3, (RMDX, RMDX, RMDX),	      rd_rn_rm),
21516 cCE("cfmac32",	e100540, 3, (RMFX, RMFX, RMFX),	      rd_rn_rm),
21517 cCE("cfmsc32",	e100560, 3, (RMFX, RMFX, RMFX),	      rd_rn_rm),
21518 cCE("cfmadd32",e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
21519 cCE("cfmsub32",e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
21520 cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
21521 cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
21522
21523 /* ARMv8-M instructions.  */
21524#undef  ARM_VARIANT
21525#define ARM_VARIANT NULL
21526#undef  THUMB_VARIANT
21527#define THUMB_VARIANT & arm_ext_v8m
21528 ToU("sg",    e97fe97f,	0, (),		   noargs),
21529 ToC("blxns", 4784,	1, (RRnpc),	   t_blx),
21530 ToC("bxns",  4704,	1, (RRnpc),	   t_bx),
21531 ToC("tt",    e840f000,	2, (RRnpc, RRnpc), tt),
21532 ToC("ttt",   e840f040,	2, (RRnpc, RRnpc), tt),
21533 ToC("tta",   e840f080,	2, (RRnpc, RRnpc), tt),
21534 ToC("ttat",  e840f0c0,	2, (RRnpc, RRnpc), tt),
21535
21536 /* FP for ARMv8-M Mainline.  Enabled for ARMv8-M Mainline because the
21537    instructions behave as nop if no VFP is present.  */
21538#undef  THUMB_VARIANT
21539#define THUMB_VARIANT & arm_ext_v8m_main
21540 ToC("vlldm", ec300a00, 1, (RRnpc), rn),
21541 ToC("vlstm", ec200a00, 1, (RRnpc), rn),
21542};
21543#undef ARM_VARIANT
21544#undef THUMB_VARIANT
21545#undef TCE
21546#undef TUE
21547#undef TUF
21548#undef TCC
21549#undef cCE
21550#undef cCL
21551#undef C3E
21552#undef CE
21553#undef CM
21554#undef UE
21555#undef UF
21556#undef UT
21557#undef NUF
21558#undef nUF
21559#undef NCE
21560#undef nCE
21561#undef OPS0
21562#undef OPS1
21563#undef OPS2
21564#undef OPS3
21565#undef OPS4
21566#undef OPS5
21567#undef OPS6
21568#undef do_0
21569
21570/* MD interface: bits in the object file.  */
21571
21572/* Turn an integer of n bytes (in val) into a stream of bytes appropriate
21573   for use in the a.out file, and stores them in the array pointed to by buf.
21574   This knows about the endian-ness of the target machine and does
21575   THE RIGHT THING, whatever it is.  Possible values for n are 1 (byte)
21576   2 (short) and 4 (long)  Floating numbers are put out as a series of
21577   LITTLENUMS (shorts, here at least).	*/
21578
21579void
21580md_number_to_chars (char * buf, valueT val, int n)
21581{
21582  if (target_big_endian)
21583    number_to_chars_bigendian (buf, val, n);
21584  else
21585    number_to_chars_littleendian (buf, val, n);
21586}
21587
21588static valueT
21589md_chars_to_number (char * buf, int n)
21590{
21591  valueT result = 0;
21592  unsigned char * where = (unsigned char *) buf;
21593
21594  if (target_big_endian)
21595    {
21596      while (n--)
21597	{
21598	  result <<= 8;
21599	  result |= (*where++ & 255);
21600	}
21601    }
21602  else
21603    {
21604      while (n--)
21605	{
21606	  result <<= 8;
21607	  result |= (where[n] & 255);
21608	}
21609    }
21610
21611  return result;
21612}
21613
21614/* MD interface: Sections.  */
21615
21616/* Calculate the maximum variable size (i.e., excluding fr_fix)
21617   that an rs_machine_dependent frag may reach.  */
21618
21619unsigned int
21620arm_frag_max_var (fragS *fragp)
21621{
21622  /* We only use rs_machine_dependent for variable-size Thumb instructions,
21623     which are either THUMB_SIZE (2) or INSN_SIZE (4).
21624
21625     Note that we generate relaxable instructions even for cases that don't
21626     really need it, like an immediate that's a trivial constant.  So we're
21627     overestimating the instruction size for some of those cases.  Rather
21628     than putting more intelligence here, it would probably be better to
21629     avoid generating a relaxation frag in the first place when it can be
21630     determined up front that a short instruction will suffice.  */
21631
21632  gas_assert (fragp->fr_type == rs_machine_dependent);
21633  return INSN_SIZE;
21634}
21635
21636/* Estimate the size of a frag before relaxing.  Assume everything fits in
21637   2 bytes.  */
21638
21639int
21640md_estimate_size_before_relax (fragS * fragp,
21641			       segT    segtype ATTRIBUTE_UNUSED)
21642{
21643  fragp->fr_var = 2;
21644  return 2;
21645}
21646
21647/* Convert a machine dependent frag.  */
21648
21649void
21650md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
21651{
21652  unsigned long insn;
21653  unsigned long old_op;
21654  char *buf;
21655  expressionS exp;
21656  fixS *fixp;
21657  int reloc_type;
21658  int pc_rel;
21659  int opcode;
21660
21661  buf = fragp->fr_literal + fragp->fr_fix;
21662
21663  old_op = bfd_get_16(abfd, buf);
21664  if (fragp->fr_symbol)
21665    {
21666      exp.X_op = O_symbol;
21667      exp.X_add_symbol = fragp->fr_symbol;
21668    }
21669  else
21670    {
21671      exp.X_op = O_constant;
21672    }
21673  exp.X_add_number = fragp->fr_offset;
21674  opcode = fragp->fr_subtype;
21675  switch (opcode)
21676    {
21677    case T_MNEM_ldr_pc:
21678    case T_MNEM_ldr_pc2:
21679    case T_MNEM_ldr_sp:
21680    case T_MNEM_str_sp:
21681    case T_MNEM_ldr:
21682    case T_MNEM_ldrb:
21683    case T_MNEM_ldrh:
21684    case T_MNEM_str:
21685    case T_MNEM_strb:
21686    case T_MNEM_strh:
21687      if (fragp->fr_var == 4)
21688	{
21689	  insn = THUMB_OP32 (opcode);
21690	  if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
21691	    {
21692	      insn |= (old_op & 0x700) << 4;
21693	    }
21694	  else
21695	    {
21696	      insn |= (old_op & 7) << 12;
21697	      insn |= (old_op & 0x38) << 13;
21698	    }
21699	  insn |= 0x00000c00;
21700	  put_thumb32_insn (buf, insn);
21701	  reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
21702	}
21703      else
21704	{
21705	  reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
21706	}
21707      pc_rel = (opcode == T_MNEM_ldr_pc2);
21708      break;
21709    case T_MNEM_adr:
21710      if (fragp->fr_var == 4)
21711	{
21712	  insn = THUMB_OP32 (opcode);
21713	  insn |= (old_op & 0xf0) << 4;
21714	  put_thumb32_insn (buf, insn);
21715	  reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
21716	}
21717      else
21718	{
21719	  reloc_type = BFD_RELOC_ARM_THUMB_ADD;
21720	  exp.X_add_number -= 4;
21721	}
21722      pc_rel = 1;
21723      break;
21724    case T_MNEM_mov:
21725    case T_MNEM_movs:
21726    case T_MNEM_cmp:
21727    case T_MNEM_cmn:
21728      if (fragp->fr_var == 4)
21729	{
21730	  int r0off = (opcode == T_MNEM_mov
21731		       || opcode == T_MNEM_movs) ? 0 : 8;
21732	  insn = THUMB_OP32 (opcode);
21733	  insn = (insn & 0xe1ffffff) | 0x10000000;
21734	  insn |= (old_op & 0x700) << r0off;
21735	  put_thumb32_insn (buf, insn);
21736	  reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
21737	}
21738      else
21739	{
21740	  reloc_type = BFD_RELOC_ARM_THUMB_IMM;
21741	}
21742      pc_rel = 0;
21743      break;
21744    case T_MNEM_b:
21745      if (fragp->fr_var == 4)
21746	{
21747	  insn = THUMB_OP32(opcode);
21748	  put_thumb32_insn (buf, insn);
21749	  reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
21750	}
21751      else
21752	reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
21753      pc_rel = 1;
21754      break;
21755    case T_MNEM_bcond:
21756      if (fragp->fr_var == 4)
21757	{
21758	  insn = THUMB_OP32(opcode);
21759	  insn |= (old_op & 0xf00) << 14;
21760	  put_thumb32_insn (buf, insn);
21761	  reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
21762	}
21763      else
21764	reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
21765      pc_rel = 1;
21766      break;
21767    case T_MNEM_add_sp:
21768    case T_MNEM_add_pc:
21769    case T_MNEM_inc_sp:
21770    case T_MNEM_dec_sp:
21771      if (fragp->fr_var == 4)
21772	{
21773	  /* ??? Choose between add and addw.  */
21774	  insn = THUMB_OP32 (opcode);
21775	  insn |= (old_op & 0xf0) << 4;
21776	  put_thumb32_insn (buf, insn);
21777	  if (opcode == T_MNEM_add_pc)
21778	    reloc_type = BFD_RELOC_ARM_T32_IMM12;
21779	  else
21780	    reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
21781	}
21782      else
21783	reloc_type = BFD_RELOC_ARM_THUMB_ADD;
21784      pc_rel = 0;
21785      break;
21786
21787    case T_MNEM_addi:
21788    case T_MNEM_addis:
21789    case T_MNEM_subi:
21790    case T_MNEM_subis:
21791      if (fragp->fr_var == 4)
21792	{
21793	  insn = THUMB_OP32 (opcode);
21794	  insn |= (old_op & 0xf0) << 4;
21795	  insn |= (old_op & 0xf) << 16;
21796	  put_thumb32_insn (buf, insn);
21797	  if (insn & (1 << 20))
21798	    reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
21799	  else
21800	    reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
21801	}
21802      else
21803	reloc_type = BFD_RELOC_ARM_THUMB_ADD;
21804      pc_rel = 0;
21805      break;
21806    default:
21807      abort ();
21808    }
21809  fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
21810		      (enum bfd_reloc_code_real) reloc_type);
21811  fixp->fx_file = fragp->fr_file;
21812  fixp->fx_line = fragp->fr_line;
21813  fragp->fr_fix += fragp->fr_var;
21814
21815  /* Set whether we use thumb-2 ISA based on final relaxation results.  */
21816  if (thumb_mode && fragp->fr_var == 4 && no_cpu_selected ()
21817      && !ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_t2))
21818    ARM_MERGE_FEATURE_SETS (arm_arch_used, thumb_arch_used, arm_ext_v6t2);
21819}
21820
21821/* Return the size of a relaxable immediate operand instruction.
21822   SHIFT and SIZE specify the form of the allowable immediate.  */
21823static int
21824relax_immediate (fragS *fragp, int size, int shift)
21825{
21826  offsetT offset;
21827  offsetT mask;
21828  offsetT low;
21829
21830  /* ??? Should be able to do better than this.  */
21831  if (fragp->fr_symbol)
21832    return 4;
21833
21834  low = (1 << shift) - 1;
21835  mask = (1 << (shift + size)) - (1 << shift);
21836  offset = fragp->fr_offset;
21837  /* Force misaligned offsets to 32-bit variant.  */
21838  if (offset & low)
21839    return 4;
21840  if (offset & ~mask)
21841    return 4;
21842  return 2;
21843}
21844
21845/* Get the address of a symbol during relaxation.  */
21846static addressT
21847relaxed_symbol_addr (fragS *fragp, long stretch)
21848{
21849  fragS *sym_frag;
21850  addressT addr;
21851  symbolS *sym;
21852
21853  sym = fragp->fr_symbol;
21854  sym_frag = symbol_get_frag (sym);
21855  know (S_GET_SEGMENT (sym) != absolute_section
21856	|| sym_frag == &zero_address_frag);
21857  addr = S_GET_VALUE (sym) + fragp->fr_offset;
21858
21859  /* If frag has yet to be reached on this pass, assume it will
21860     move by STRETCH just as we did.  If this is not so, it will
21861     be because some frag between grows, and that will force
21862     another pass.  */
21863
21864  if (stretch != 0
21865      && sym_frag->relax_marker != fragp->relax_marker)
21866    {
21867      fragS *f;
21868
21869      /* Adjust stretch for any alignment frag.  Note that if have
21870	 been expanding the earlier code, the symbol may be
21871	 defined in what appears to be an earlier frag.  FIXME:
21872	 This doesn't handle the fr_subtype field, which specifies
21873	 a maximum number of bytes to skip when doing an
21874	 alignment.  */
21875      for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
21876	{
21877	  if (f->fr_type == rs_align || f->fr_type == rs_align_code)
21878	    {
21879	      if (stretch < 0)
21880		stretch = - ((- stretch)
21881			     & ~ ((1 << (int) f->fr_offset) - 1));
21882	      else
21883		stretch &= ~ ((1 << (int) f->fr_offset) - 1);
21884	      if (stretch == 0)
21885		break;
21886	    }
21887	}
21888      if (f != NULL)
21889	addr += stretch;
21890    }
21891
21892  return addr;
21893}
21894
21895/* Return the size of a relaxable adr pseudo-instruction or PC-relative
21896   load.  */
21897static int
21898relax_adr (fragS *fragp, asection *sec, long stretch)
21899{
21900  addressT addr;
21901  offsetT val;
21902
21903  /* Assume worst case for symbols not known to be in the same section.  */
21904  if (fragp->fr_symbol == NULL
21905      || !S_IS_DEFINED (fragp->fr_symbol)
21906      || sec != S_GET_SEGMENT (fragp->fr_symbol)
21907      || S_IS_WEAK (fragp->fr_symbol))
21908    return 4;
21909
21910  val = relaxed_symbol_addr (fragp, stretch);
21911  addr = fragp->fr_address + fragp->fr_fix;
21912  addr = (addr + 4) & ~3;
21913  /* Force misaligned targets to 32-bit variant.  */
21914  if (val & 3)
21915    return 4;
21916  val -= addr;
21917  if (val < 0 || val > 1020)
21918    return 4;
21919  return 2;
21920}
21921
21922/* Return the size of a relaxable add/sub immediate instruction.  */
21923static int
21924relax_addsub (fragS *fragp, asection *sec)
21925{
21926  char *buf;
21927  int op;
21928
21929  buf = fragp->fr_literal + fragp->fr_fix;
21930  op = bfd_get_16(sec->owner, buf);
21931  if ((op & 0xf) == ((op >> 4) & 0xf))
21932    return relax_immediate (fragp, 8, 0);
21933  else
21934    return relax_immediate (fragp, 3, 0);
21935}
21936
21937/* Return TRUE iff the definition of symbol S could be pre-empted
21938   (overridden) at link or load time.  */
21939static bfd_boolean
21940symbol_preemptible (symbolS *s)
21941{
21942  /* Weak symbols can always be pre-empted.  */
21943  if (S_IS_WEAK (s))
21944    return TRUE;
21945
21946  /* Non-global symbols cannot be pre-empted. */
21947  if (! S_IS_EXTERNAL (s))
21948    return FALSE;
21949
21950#ifdef OBJ_ELF
21951  /* In ELF, a global symbol can be marked protected, or private.  In that
21952     case it can't be pre-empted (other definitions in the same link unit
21953     would violate the ODR).  */
21954  if (ELF_ST_VISIBILITY (S_GET_OTHER (s)) > STV_DEFAULT)
21955    return FALSE;
21956#endif
21957
21958  /* Other global symbols might be pre-empted.  */
21959  return TRUE;
21960}
21961
21962/* Return the size of a relaxable branch instruction.  BITS is the
21963   size of the offset field in the narrow instruction.  */
21964
21965static int
21966relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
21967{
21968  addressT addr;
21969  offsetT val;
21970  offsetT limit;
21971
21972  /* Assume worst case for symbols not known to be in the same section.  */
21973  if (!S_IS_DEFINED (fragp->fr_symbol)
21974      || sec != S_GET_SEGMENT (fragp->fr_symbol)
21975      || S_IS_WEAK (fragp->fr_symbol))
21976    return 4;
21977
21978#ifdef OBJ_ELF
21979  /* A branch to a function in ARM state will require interworking.  */
21980  if (S_IS_DEFINED (fragp->fr_symbol)
21981      && ARM_IS_FUNC (fragp->fr_symbol))
21982      return 4;
21983#endif
21984
21985  if (symbol_preemptible (fragp->fr_symbol))
21986    return 4;
21987
21988  val = relaxed_symbol_addr (fragp, stretch);
21989  addr = fragp->fr_address + fragp->fr_fix + 4;
21990  val -= addr;
21991
21992  /* Offset is a signed value *2 */
21993  limit = 1 << bits;
21994  if (val >= limit || val < -limit)
21995    return 4;
21996  return 2;
21997}
21998
21999
22000/* Relax a machine dependent frag.  This returns the amount by which
22001   the current size of the frag should change.  */
22002
22003int
22004arm_relax_frag (asection *sec, fragS *fragp, long stretch)
22005{
22006  int oldsize;
22007  int newsize;
22008
22009  oldsize = fragp->fr_var;
22010  switch (fragp->fr_subtype)
22011    {
22012    case T_MNEM_ldr_pc2:
22013      newsize = relax_adr (fragp, sec, stretch);
22014      break;
22015    case T_MNEM_ldr_pc:
22016    case T_MNEM_ldr_sp:
22017    case T_MNEM_str_sp:
22018      newsize = relax_immediate (fragp, 8, 2);
22019      break;
22020    case T_MNEM_ldr:
22021    case T_MNEM_str:
22022      newsize = relax_immediate (fragp, 5, 2);
22023      break;
22024    case T_MNEM_ldrh:
22025    case T_MNEM_strh:
22026      newsize = relax_immediate (fragp, 5, 1);
22027      break;
22028    case T_MNEM_ldrb:
22029    case T_MNEM_strb:
22030      newsize = relax_immediate (fragp, 5, 0);
22031      break;
22032    case T_MNEM_adr:
22033      newsize = relax_adr (fragp, sec, stretch);
22034      break;
22035    case T_MNEM_mov:
22036    case T_MNEM_movs:
22037    case T_MNEM_cmp:
22038    case T_MNEM_cmn:
22039      newsize = relax_immediate (fragp, 8, 0);
22040      break;
22041    case T_MNEM_b:
22042      newsize = relax_branch (fragp, sec, 11, stretch);
22043      break;
22044    case T_MNEM_bcond:
22045      newsize = relax_branch (fragp, sec, 8, stretch);
22046      break;
22047    case T_MNEM_add_sp:
22048    case T_MNEM_add_pc:
22049      newsize = relax_immediate (fragp, 8, 2);
22050      break;
22051    case T_MNEM_inc_sp:
22052    case T_MNEM_dec_sp:
22053      newsize = relax_immediate (fragp, 7, 2);
22054      break;
22055    case T_MNEM_addi:
22056    case T_MNEM_addis:
22057    case T_MNEM_subi:
22058    case T_MNEM_subis:
22059      newsize = relax_addsub (fragp, sec);
22060      break;
22061    default:
22062      abort ();
22063    }
22064
22065  fragp->fr_var = newsize;
22066  /* Freeze wide instructions that are at or before the same location as
22067     in the previous pass.  This avoids infinite loops.
22068     Don't freeze them unconditionally because targets may be artificially
22069     misaligned by the expansion of preceding frags.  */
22070  if (stretch <= 0 && newsize > 2)
22071    {
22072      md_convert_frag (sec->owner, sec, fragp);
22073      frag_wane (fragp);
22074    }
22075
22076  return newsize - oldsize;
22077}
22078
22079/* Round up a section size to the appropriate boundary.	 */
22080
22081valueT
22082md_section_align (segT	 segment ATTRIBUTE_UNUSED,
22083		  valueT size)
22084{
22085  return size;
22086}
22087
22088/* This is called from HANDLE_ALIGN in write.c.	 Fill in the contents
22089   of an rs_align_code fragment.  */
22090
22091void
22092arm_handle_align (fragS * fragP)
22093{
22094  static unsigned char const arm_noop[2][2][4] =
22095    {
22096      {  /* ARMv1 */
22097	{0x00, 0x00, 0xa0, 0xe1},  /* LE */
22098	{0xe1, 0xa0, 0x00, 0x00},  /* BE */
22099      },
22100      {  /* ARMv6k */
22101	{0x00, 0xf0, 0x20, 0xe3},  /* LE */
22102	{0xe3, 0x20, 0xf0, 0x00},  /* BE */
22103      },
22104    };
22105  static unsigned char const thumb_noop[2][2][2] =
22106    {
22107      {  /* Thumb-1 */
22108	{0xc0, 0x46},  /* LE */
22109	{0x46, 0xc0},  /* BE */
22110      },
22111      {  /* Thumb-2 */
22112	{0x00, 0xbf},  /* LE */
22113	{0xbf, 0x00}   /* BE */
22114      }
22115    };
22116  static unsigned char const wide_thumb_noop[2][4] =
22117    {  /* Wide Thumb-2 */
22118      {0xaf, 0xf3, 0x00, 0x80},  /* LE */
22119      {0xf3, 0xaf, 0x80, 0x00},  /* BE */
22120    };
22121
22122  unsigned bytes, fix, noop_size;
22123  char * p;
22124  const unsigned char * noop;
22125  const unsigned char *narrow_noop = NULL;
22126#ifdef OBJ_ELF
22127  enum mstate state;
22128#endif
22129
22130  if (fragP->fr_type != rs_align_code)
22131    return;
22132
22133  bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
22134  p = fragP->fr_literal + fragP->fr_fix;
22135  fix = 0;
22136
22137  if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
22138    bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
22139
22140  gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
22141
22142  if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
22143    {
22144      if (ARM_CPU_HAS_FEATURE (selected_cpu_name[0]
22145			       ? selected_cpu : arm_arch_none, arm_ext_v6t2))
22146	{
22147	  narrow_noop = thumb_noop[1][target_big_endian];
22148	  noop = wide_thumb_noop[target_big_endian];
22149	}
22150      else
22151	noop = thumb_noop[0][target_big_endian];
22152      noop_size = 2;
22153#ifdef OBJ_ELF
22154      state = MAP_THUMB;
22155#endif
22156    }
22157  else
22158    {
22159      noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu_name[0]
22160					   ? selected_cpu : arm_arch_none,
22161					   arm_ext_v6k) != 0]
22162		     [target_big_endian];
22163      noop_size = 4;
22164#ifdef OBJ_ELF
22165      state = MAP_ARM;
22166#endif
22167    }
22168
22169  fragP->fr_var = noop_size;
22170
22171  if (bytes & (noop_size - 1))
22172    {
22173      fix = bytes & (noop_size - 1);
22174#ifdef OBJ_ELF
22175      insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
22176#endif
22177      memset (p, 0, fix);
22178      p += fix;
22179      bytes -= fix;
22180    }
22181
22182  if (narrow_noop)
22183    {
22184      if (bytes & noop_size)
22185	{
22186	  /* Insert a narrow noop.  */
22187	  memcpy (p, narrow_noop, noop_size);
22188	  p += noop_size;
22189	  bytes -= noop_size;
22190	  fix += noop_size;
22191	}
22192
22193      /* Use wide noops for the remainder */
22194      noop_size = 4;
22195    }
22196
22197  while (bytes >= noop_size)
22198    {
22199      memcpy (p, noop, noop_size);
22200      p += noop_size;
22201      bytes -= noop_size;
22202      fix += noop_size;
22203    }
22204
22205  fragP->fr_fix += fix;
22206}
22207
22208/* Called from md_do_align.  Used to create an alignment
22209   frag in a code section.  */
22210
22211void
22212arm_frag_align_code (int n, int max)
22213{
22214  char * p;
22215
22216  /* We assume that there will never be a requirement
22217     to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes.  */
22218  if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
22219    {
22220      char err_msg[128];
22221
22222      sprintf (err_msg,
22223	_("alignments greater than %d bytes not supported in .text sections."),
22224	MAX_MEM_FOR_RS_ALIGN_CODE + 1);
22225      as_fatal ("%s", err_msg);
22226    }
22227
22228  p = frag_var (rs_align_code,
22229		MAX_MEM_FOR_RS_ALIGN_CODE,
22230		1,
22231		(relax_substateT) max,
22232		(symbolS *) NULL,
22233		(offsetT) n,
22234		(char *) NULL);
22235  *p = 0;
22236}
22237
22238/* Perform target specific initialisation of a frag.
22239   Note - despite the name this initialisation is not done when the frag
22240   is created, but only when its type is assigned.  A frag can be created
22241   and used a long time before its type is set, so beware of assuming that
22242   this initialisation is performed first.  */
22243
22244#ifndef OBJ_ELF
22245void
22246arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
22247{
22248  /* Record whether this frag is in an ARM or a THUMB area.  */
22249  fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
22250}
22251
22252#else /* OBJ_ELF is defined.  */
22253void
22254arm_init_frag (fragS * fragP, int max_chars)
22255{
22256  bfd_boolean frag_thumb_mode;
22257
22258  /* If the current ARM vs THUMB mode has not already
22259     been recorded into this frag then do so now.  */
22260  if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
22261    fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
22262
22263  /* PR 21809: Do not set a mapping state for debug sections
22264     - it just confuses other tools.  */
22265  if (bfd_get_section_flags (NULL, now_seg) & SEC_DEBUGGING)
22266    return;
22267
22268  frag_thumb_mode = fragP->tc_frag_data.thumb_mode ^ MODE_RECORDED;
22269
22270  /* Record a mapping symbol for alignment frags.  We will delete this
22271     later if the alignment ends up empty.  */
22272  switch (fragP->fr_type)
22273    {
22274    case rs_align:
22275    case rs_align_test:
22276    case rs_fill:
22277      mapping_state_2 (MAP_DATA, max_chars);
22278      break;
22279    case rs_align_code:
22280      mapping_state_2 (frag_thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
22281      break;
22282    default:
22283      break;
22284    }
22285}
22286
22287/* When we change sections we need to issue a new mapping symbol.  */
22288
22289void
22290arm_elf_change_section (void)
22291{
22292  /* Link an unlinked unwind index table section to the .text section.	*/
22293  if (elf_section_type (now_seg) == SHT_ARM_EXIDX
22294      && elf_linked_to_section (now_seg) == NULL)
22295    elf_linked_to_section (now_seg) = text_section;
22296}
22297
22298int
22299arm_elf_section_type (const char * str, size_t len)
22300{
22301  if (len == 5 && strncmp (str, "exidx", 5) == 0)
22302    return SHT_ARM_EXIDX;
22303
22304  return -1;
22305}
22306
22307/* Code to deal with unwinding tables.	*/
22308
22309static void add_unwind_adjustsp (offsetT);
22310
22311/* Generate any deferred unwind frame offset.  */
22312
22313static void
22314flush_pending_unwind (void)
22315{
22316  offsetT offset;
22317
22318  offset = unwind.pending_offset;
22319  unwind.pending_offset = 0;
22320  if (offset != 0)
22321    add_unwind_adjustsp (offset);
22322}
22323
22324/* Add an opcode to this list for this function.  Two-byte opcodes should
22325   be passed as op[0] << 8 | op[1].  The list of opcodes is built in reverse
22326   order.  */
22327
22328static void
22329add_unwind_opcode (valueT op, int length)
22330{
22331  /* Add any deferred stack adjustment.	 */
22332  if (unwind.pending_offset)
22333    flush_pending_unwind ();
22334
22335  unwind.sp_restored = 0;
22336
22337  if (unwind.opcode_count + length > unwind.opcode_alloc)
22338    {
22339      unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
22340      if (unwind.opcodes)
22341	unwind.opcodes = XRESIZEVEC (unsigned char, unwind.opcodes,
22342				     unwind.opcode_alloc);
22343      else
22344	unwind.opcodes = XNEWVEC (unsigned char, unwind.opcode_alloc);
22345    }
22346  while (length > 0)
22347    {
22348      length--;
22349      unwind.opcodes[unwind.opcode_count] = op & 0xff;
22350      op >>= 8;
22351      unwind.opcode_count++;
22352    }
22353}
22354
22355/* Add unwind opcodes to adjust the stack pointer.  */
22356
22357static void
22358add_unwind_adjustsp (offsetT offset)
22359{
22360  valueT op;
22361
22362  if (offset > 0x200)
22363    {
22364      /* We need at most 5 bytes to hold a 32-bit value in a uleb128.  */
22365      char bytes[5];
22366      int n;
22367      valueT o;
22368
22369      /* Long form: 0xb2, uleb128.  */
22370      /* This might not fit in a word so add the individual bytes,
22371	 remembering the list is built in reverse order.  */
22372      o = (valueT) ((offset - 0x204) >> 2);
22373      if (o == 0)
22374	add_unwind_opcode (0, 1);
22375
22376      /* Calculate the uleb128 encoding of the offset.	*/
22377      n = 0;
22378      while (o)
22379	{
22380	  bytes[n] = o & 0x7f;
22381	  o >>= 7;
22382	  if (o)
22383	    bytes[n] |= 0x80;
22384	  n++;
22385	}
22386      /* Add the insn.	*/
22387      for (; n; n--)
22388	add_unwind_opcode (bytes[n - 1], 1);
22389      add_unwind_opcode (0xb2, 1);
22390    }
22391  else if (offset > 0x100)
22392    {
22393      /* Two short opcodes.  */
22394      add_unwind_opcode (0x3f, 1);
22395      op = (offset - 0x104) >> 2;
22396      add_unwind_opcode (op, 1);
22397    }
22398  else if (offset > 0)
22399    {
22400      /* Short opcode.	*/
22401      op = (offset - 4) >> 2;
22402      add_unwind_opcode (op, 1);
22403    }
22404  else if (offset < 0)
22405    {
22406      offset = -offset;
22407      while (offset > 0x100)
22408	{
22409	  add_unwind_opcode (0x7f, 1);
22410	  offset -= 0x100;
22411	}
22412      op = ((offset - 4) >> 2) | 0x40;
22413      add_unwind_opcode (op, 1);
22414    }
22415}
22416
22417/* Finish the list of unwind opcodes for this function.	 */
22418
22419static void
22420finish_unwind_opcodes (void)
22421{
22422  valueT op;
22423
22424  if (unwind.fp_used)
22425    {
22426      /* Adjust sp as necessary.  */
22427      unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
22428      flush_pending_unwind ();
22429
22430      /* After restoring sp from the frame pointer.  */
22431      op = 0x90 | unwind.fp_reg;
22432      add_unwind_opcode (op, 1);
22433    }
22434  else
22435    flush_pending_unwind ();
22436}
22437
22438
22439/* Start an exception table entry.  If idx is nonzero this is an index table
22440   entry.  */
22441
22442static void
22443start_unwind_section (const segT text_seg, int idx)
22444{
22445  const char * text_name;
22446  const char * prefix;
22447  const char * prefix_once;
22448  const char * group_name;
22449  char * sec_name;
22450  int type;
22451  int flags;
22452  int linkonce;
22453
22454  if (idx)
22455    {
22456      prefix = ELF_STRING_ARM_unwind;
22457      prefix_once = ELF_STRING_ARM_unwind_once;
22458      type = SHT_ARM_EXIDX;
22459    }
22460  else
22461    {
22462      prefix = ELF_STRING_ARM_unwind_info;
22463      prefix_once = ELF_STRING_ARM_unwind_info_once;
22464      type = SHT_PROGBITS;
22465    }
22466
22467  text_name = segment_name (text_seg);
22468  if (streq (text_name, ".text"))
22469    text_name = "";
22470
22471  if (strncmp (text_name, ".gnu.linkonce.t.",
22472	       strlen (".gnu.linkonce.t.")) == 0)
22473    {
22474      prefix = prefix_once;
22475      text_name += strlen (".gnu.linkonce.t.");
22476    }
22477
22478  sec_name = concat (prefix, text_name, (char *) NULL);
22479
22480  flags = SHF_ALLOC;
22481  linkonce = 0;
22482  group_name = 0;
22483
22484  /* Handle COMDAT group.  */
22485  if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
22486    {
22487      group_name = elf_group_name (text_seg);
22488      if (group_name == NULL)
22489	{
22490	  as_bad (_("Group section `%s' has no group signature"),
22491		  segment_name (text_seg));
22492	  ignore_rest_of_line ();
22493	  return;
22494	}
22495      flags |= SHF_GROUP;
22496      linkonce = 1;
22497    }
22498
22499  obj_elf_change_section (sec_name, type, 0, flags, 0, group_name,
22500			  linkonce, 0);
22501
22502  /* Set the section link for index tables.  */
22503  if (idx)
22504    elf_linked_to_section (now_seg) = text_seg;
22505}
22506
22507
22508/* Start an unwind table entry.	 HAVE_DATA is nonzero if we have additional
22509   personality routine data.  Returns zero, or the index table value for
22510   an inline entry.  */
22511
22512static valueT
22513create_unwind_entry (int have_data)
22514{
22515  int size;
22516  addressT where;
22517  char *ptr;
22518  /* The current word of data.	*/
22519  valueT data;
22520  /* The number of bytes left in this word.  */
22521  int n;
22522
22523  finish_unwind_opcodes ();
22524
22525  /* Remember the current text section.	 */
22526  unwind.saved_seg = now_seg;
22527  unwind.saved_subseg = now_subseg;
22528
22529  start_unwind_section (now_seg, 0);
22530
22531  if (unwind.personality_routine == NULL)
22532    {
22533      if (unwind.personality_index == -2)
22534	{
22535	  if (have_data)
22536	    as_bad (_("handlerdata in cantunwind frame"));
22537	  return 1; /* EXIDX_CANTUNWIND.  */
22538	}
22539
22540      /* Use a default personality routine if none is specified.  */
22541      if (unwind.personality_index == -1)
22542	{
22543	  if (unwind.opcode_count > 3)
22544	    unwind.personality_index = 1;
22545	  else
22546	    unwind.personality_index = 0;
22547	}
22548
22549      /* Space for the personality routine entry.  */
22550      if (unwind.personality_index == 0)
22551	{
22552	  if (unwind.opcode_count > 3)
22553	    as_bad (_("too many unwind opcodes for personality routine 0"));
22554
22555	  if (!have_data)
22556	    {
22557	      /* All the data is inline in the index table.  */
22558	      data = 0x80;
22559	      n = 3;
22560	      while (unwind.opcode_count > 0)
22561		{
22562		  unwind.opcode_count--;
22563		  data = (data << 8) | unwind.opcodes[unwind.opcode_count];
22564		  n--;
22565		}
22566
22567	      /* Pad with "finish" opcodes.  */
22568	      while (n--)
22569		data = (data << 8) | 0xb0;
22570
22571	      return data;
22572	    }
22573	  size = 0;
22574	}
22575      else
22576	/* We get two opcodes "free" in the first word.	 */
22577	size = unwind.opcode_count - 2;
22578    }
22579  else
22580    {
22581      /* PR 16765: Missing or misplaced unwind directives can trigger this.  */
22582      if (unwind.personality_index != -1)
22583	{
22584	  as_bad (_("attempt to recreate an unwind entry"));
22585	  return 1;
22586	}
22587
22588      /* An extra byte is required for the opcode count.	*/
22589      size = unwind.opcode_count + 1;
22590    }
22591
22592  size = (size + 3) >> 2;
22593  if (size > 0xff)
22594    as_bad (_("too many unwind opcodes"));
22595
22596  frag_align (2, 0, 0);
22597  record_alignment (now_seg, 2);
22598  unwind.table_entry = expr_build_dot ();
22599
22600  /* Allocate the table entry.	*/
22601  ptr = frag_more ((size << 2) + 4);
22602  /* PR 13449: Zero the table entries in case some of them are not used.  */
22603  memset (ptr, 0, (size << 2) + 4);
22604  where = frag_now_fix () - ((size << 2) + 4);
22605
22606  switch (unwind.personality_index)
22607    {
22608    case -1:
22609      /* ??? Should this be a PLT generating relocation?  */
22610      /* Custom personality routine.  */
22611      fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
22612	       BFD_RELOC_ARM_PREL31);
22613
22614      where += 4;
22615      ptr += 4;
22616
22617      /* Set the first byte to the number of additional words.	*/
22618      data = size > 0 ? size - 1 : 0;
22619      n = 3;
22620      break;
22621
22622    /* ABI defined personality routines.  */
22623    case 0:
22624      /* Three opcodes bytes are packed into the first word.  */
22625      data = 0x80;
22626      n = 3;
22627      break;
22628
22629    case 1:
22630    case 2:
22631      /* The size and first two opcode bytes go in the first word.  */
22632      data = ((0x80 + unwind.personality_index) << 8) | size;
22633      n = 2;
22634      break;
22635
22636    default:
22637      /* Should never happen.  */
22638      abort ();
22639    }
22640
22641  /* Pack the opcodes into words (MSB first), reversing the list at the same
22642     time.  */
22643  while (unwind.opcode_count > 0)
22644    {
22645      if (n == 0)
22646	{
22647	  md_number_to_chars (ptr, data, 4);
22648	  ptr += 4;
22649	  n = 4;
22650	  data = 0;
22651	}
22652      unwind.opcode_count--;
22653      n--;
22654      data = (data << 8) | unwind.opcodes[unwind.opcode_count];
22655    }
22656
22657  /* Finish off the last word.	*/
22658  if (n < 4)
22659    {
22660      /* Pad with "finish" opcodes.  */
22661      while (n--)
22662	data = (data << 8) | 0xb0;
22663
22664      md_number_to_chars (ptr, data, 4);
22665    }
22666
22667  if (!have_data)
22668    {
22669      /* Add an empty descriptor if there is no user-specified data.   */
22670      ptr = frag_more (4);
22671      md_number_to_chars (ptr, 0, 4);
22672    }
22673
22674  return 0;
22675}
22676
22677
22678/* Initialize the DWARF-2 unwind information for this procedure.  */
22679
22680void
22681tc_arm_frame_initial_instructions (void)
22682{
22683  cfi_add_CFA_def_cfa (REG_SP, 0);
22684}
22685#endif /* OBJ_ELF */
22686
22687/* Convert REGNAME to a DWARF-2 register number.  */
22688
22689int
22690tc_arm_regname_to_dw2regnum (char *regname)
22691{
22692  int reg = arm_reg_parse (&regname, REG_TYPE_RN);
22693  if (reg != FAIL)
22694    return reg;
22695
22696  /* PR 16694: Allow VFP registers as well.  */
22697  reg = arm_reg_parse (&regname, REG_TYPE_VFS);
22698  if (reg != FAIL)
22699    return 64 + reg;
22700
22701  reg = arm_reg_parse (&regname, REG_TYPE_VFD);
22702  if (reg != FAIL)
22703    return reg + 256;
22704
22705  return FAIL;
22706}
22707
22708#ifdef TE_PE
22709void
22710tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
22711{
22712  expressionS exp;
22713
22714  exp.X_op = O_secrel;
22715  exp.X_add_symbol = symbol;
22716  exp.X_add_number = 0;
22717  emit_expr (&exp, size);
22718}
22719#endif
22720
22721/* MD interface: Symbol and relocation handling.  */
22722
22723/* Return the address within the segment that a PC-relative fixup is
22724   relative to.  For ARM, PC-relative fixups applied to instructions
22725   are generally relative to the location of the fixup plus 8 bytes.
22726   Thumb branches are offset by 4, and Thumb loads relative to PC
22727   require special handling.  */
22728
22729long
22730md_pcrel_from_section (fixS * fixP, segT seg)
22731{
22732  offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
22733
22734  /* If this is pc-relative and we are going to emit a relocation
22735     then we just want to put out any pipeline compensation that the linker
22736     will need.  Otherwise we want to use the calculated base.
22737     For WinCE we skip the bias for externals as well, since this
22738     is how the MS ARM-CE assembler behaves and we want to be compatible.  */
22739  if (fixP->fx_pcrel
22740      && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
22741	  || (arm_force_relocation (fixP)
22742#ifdef TE_WINCE
22743	      && !S_IS_EXTERNAL (fixP->fx_addsy)
22744#endif
22745	      )))
22746    base = 0;
22747
22748
22749  switch (fixP->fx_r_type)
22750    {
22751      /* PC relative addressing on the Thumb is slightly odd as the
22752	 bottom two bits of the PC are forced to zero for the
22753	 calculation.  This happens *after* application of the
22754	 pipeline offset.  However, Thumb adrl already adjusts for
22755	 this, so we need not do it again.  */
22756    case BFD_RELOC_ARM_THUMB_ADD:
22757      return base & ~3;
22758
22759    case BFD_RELOC_ARM_THUMB_OFFSET:
22760    case BFD_RELOC_ARM_T32_OFFSET_IMM:
22761    case BFD_RELOC_ARM_T32_ADD_PC12:
22762    case BFD_RELOC_ARM_T32_CP_OFF_IMM:
22763      return (base + 4) & ~3;
22764
22765      /* Thumb branches are simply offset by +4.  */
22766    case BFD_RELOC_THUMB_PCREL_BRANCH7:
22767    case BFD_RELOC_THUMB_PCREL_BRANCH9:
22768    case BFD_RELOC_THUMB_PCREL_BRANCH12:
22769    case BFD_RELOC_THUMB_PCREL_BRANCH20:
22770    case BFD_RELOC_THUMB_PCREL_BRANCH25:
22771      return base + 4;
22772
22773    case BFD_RELOC_THUMB_PCREL_BRANCH23:
22774      if (fixP->fx_addsy
22775	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22776	  && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22777	  && ARM_IS_FUNC (fixP->fx_addsy)
22778	  && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22779	base = fixP->fx_where + fixP->fx_frag->fr_address;
22780       return base + 4;
22781
22782      /* BLX is like branches above, but forces the low two bits of PC to
22783	 zero.  */
22784    case BFD_RELOC_THUMB_PCREL_BLX:
22785      if (fixP->fx_addsy
22786	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22787	  && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22788	  && THUMB_IS_FUNC (fixP->fx_addsy)
22789	  && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22790	base = fixP->fx_where + fixP->fx_frag->fr_address;
22791      return (base + 4) & ~3;
22792
22793      /* ARM mode branches are offset by +8.  However, the Windows CE
22794	 loader expects the relocation not to take this into account.  */
22795    case BFD_RELOC_ARM_PCREL_BLX:
22796      if (fixP->fx_addsy
22797	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22798	  && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22799	  && ARM_IS_FUNC (fixP->fx_addsy)
22800	  && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22801	base = fixP->fx_where + fixP->fx_frag->fr_address;
22802      return base + 8;
22803
22804    case BFD_RELOC_ARM_PCREL_CALL:
22805      if (fixP->fx_addsy
22806	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22807	  && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
22808	  && THUMB_IS_FUNC (fixP->fx_addsy)
22809	  && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
22810	base = fixP->fx_where + fixP->fx_frag->fr_address;
22811      return base + 8;
22812
22813    case BFD_RELOC_ARM_PCREL_BRANCH:
22814    case BFD_RELOC_ARM_PCREL_JUMP:
22815    case BFD_RELOC_ARM_PLT32:
22816#ifdef TE_WINCE
22817      /* When handling fixups immediately, because we have already
22818	 discovered the value of a symbol, or the address of the frag involved
22819	 we must account for the offset by +8, as the OS loader will never see the reloc.
22820	 see fixup_segment() in write.c
22821	 The S_IS_EXTERNAL test handles the case of global symbols.
22822	 Those need the calculated base, not just the pipe compensation the linker will need.  */
22823      if (fixP->fx_pcrel
22824	  && fixP->fx_addsy != NULL
22825	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
22826	  && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
22827	return base + 8;
22828      return base;
22829#else
22830      return base + 8;
22831#endif
22832
22833
22834      /* ARM mode loads relative to PC are also offset by +8.  Unlike
22835	 branches, the Windows CE loader *does* expect the relocation
22836	 to take this into account.  */
22837    case BFD_RELOC_ARM_OFFSET_IMM:
22838    case BFD_RELOC_ARM_OFFSET_IMM8:
22839    case BFD_RELOC_ARM_HWLITERAL:
22840    case BFD_RELOC_ARM_LITERAL:
22841    case BFD_RELOC_ARM_CP_OFF_IMM:
22842      return base + 8;
22843
22844
22845      /* Other PC-relative relocations are un-offset.  */
22846    default:
22847      return base;
22848    }
22849}
22850
22851static bfd_boolean flag_warn_syms = TRUE;
22852
22853bfd_boolean
22854arm_tc_equal_in_insn (int c ATTRIBUTE_UNUSED, char * name)
22855{
22856  /* PR 18347 - Warn if the user attempts to create a symbol with the same
22857     name as an ARM instruction.  Whilst strictly speaking it is allowed, it
22858     does mean that the resulting code might be very confusing to the reader.
22859     Also this warning can be triggered if the user omits an operand before
22860     an immediate address, eg:
22861
22862       LDR =foo
22863
22864     GAS treats this as an assignment of the value of the symbol foo to a
22865     symbol LDR, and so (without this code) it will not issue any kind of
22866     warning or error message.
22867
22868     Note - ARM instructions are case-insensitive but the strings in the hash
22869     table are all stored in lower case, so we must first ensure that name is
22870     lower case too.  */
22871  if (flag_warn_syms && arm_ops_hsh)
22872    {
22873      char * nbuf = strdup (name);
22874      char * p;
22875
22876      for (p = nbuf; *p; p++)
22877	*p = TOLOWER (*p);
22878      if (hash_find (arm_ops_hsh, nbuf) != NULL)
22879	{
22880	  static struct hash_control * already_warned = NULL;
22881
22882	  if (already_warned == NULL)
22883	    already_warned = hash_new ();
22884	  /* Only warn about the symbol once.  To keep the code
22885	     simple we let hash_insert do the lookup for us.  */
22886	  if (hash_insert (already_warned, name, NULL) == NULL)
22887	    as_warn (_("[-mwarn-syms]: Assignment makes a symbol match an ARM instruction: %s"), name);
22888	}
22889      else
22890	free (nbuf);
22891    }
22892
22893  return FALSE;
22894}
22895
22896/* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
22897   Otherwise we have no need to default values of symbols.  */
22898
22899symbolS *
22900md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
22901{
22902#ifdef OBJ_ELF
22903  if (name[0] == '_' && name[1] == 'G'
22904      && streq (name, GLOBAL_OFFSET_TABLE_NAME))
22905    {
22906      if (!GOT_symbol)
22907	{
22908	  if (symbol_find (name))
22909	    as_bad (_("GOT already in the symbol table"));
22910
22911	  GOT_symbol = symbol_new (name, undefined_section,
22912				   (valueT) 0, & zero_address_frag);
22913	}
22914
22915      return GOT_symbol;
22916    }
22917#endif
22918
22919  return NULL;
22920}
22921
22922/* Subroutine of md_apply_fix.	 Check to see if an immediate can be
22923   computed as two separate immediate values, added together.  We
22924   already know that this value cannot be computed by just one ARM
22925   instruction.	 */
22926
22927static unsigned int
22928validate_immediate_twopart (unsigned int   val,
22929			    unsigned int * highpart)
22930{
22931  unsigned int a;
22932  unsigned int i;
22933
22934  for (i = 0; i < 32; i += 2)
22935    if (((a = rotate_left (val, i)) & 0xff) != 0)
22936      {
22937	if (a & 0xff00)
22938	  {
22939	    if (a & ~ 0xffff)
22940	      continue;
22941	    * highpart = (a  >> 8) | ((i + 24) << 7);
22942	  }
22943	else if (a & 0xff0000)
22944	  {
22945	    if (a & 0xff000000)
22946	      continue;
22947	    * highpart = (a >> 16) | ((i + 16) << 7);
22948	  }
22949	else
22950	  {
22951	    gas_assert (a & 0xff000000);
22952	    * highpart = (a >> 24) | ((i + 8) << 7);
22953	  }
22954
22955	return (a & 0xff) | (i << 7);
22956      }
22957
22958  return FAIL;
22959}
22960
22961static int
22962validate_offset_imm (unsigned int val, int hwse)
22963{
22964  if ((hwse && val > 255) || val > 4095)
22965    return FAIL;
22966  return val;
22967}
22968
22969/* Subroutine of md_apply_fix.	 Do those data_ops which can take a
22970   negative immediate constant by altering the instruction.  A bit of
22971   a hack really.
22972	MOV <-> MVN
22973	AND <-> BIC
22974	ADC <-> SBC
22975	by inverting the second operand, and
22976	ADD <-> SUB
22977	CMP <-> CMN
22978	by negating the second operand.	 */
22979
22980static int
22981negate_data_op (unsigned long * instruction,
22982		unsigned long	value)
22983{
22984  int op, new_inst;
22985  unsigned long negated, inverted;
22986
22987  negated = encode_arm_immediate (-value);
22988  inverted = encode_arm_immediate (~value);
22989
22990  op = (*instruction >> DATA_OP_SHIFT) & 0xf;
22991  switch (op)
22992    {
22993      /* First negates.	 */
22994    case OPCODE_SUB:		 /* ADD <-> SUB	 */
22995      new_inst = OPCODE_ADD;
22996      value = negated;
22997      break;
22998
22999    case OPCODE_ADD:
23000      new_inst = OPCODE_SUB;
23001      value = negated;
23002      break;
23003
23004    case OPCODE_CMP:		 /* CMP <-> CMN	 */
23005      new_inst = OPCODE_CMN;
23006      value = negated;
23007      break;
23008
23009    case OPCODE_CMN:
23010      new_inst = OPCODE_CMP;
23011      value = negated;
23012      break;
23013
23014      /* Now Inverted ops.  */
23015    case OPCODE_MOV:		 /* MOV <-> MVN	 */
23016      new_inst = OPCODE_MVN;
23017      value = inverted;
23018      break;
23019
23020    case OPCODE_MVN:
23021      new_inst = OPCODE_MOV;
23022      value = inverted;
23023      break;
23024
23025    case OPCODE_AND:		 /* AND <-> BIC	 */
23026      new_inst = OPCODE_BIC;
23027      value = inverted;
23028      break;
23029
23030    case OPCODE_BIC:
23031      new_inst = OPCODE_AND;
23032      value = inverted;
23033      break;
23034
23035    case OPCODE_ADC:		  /* ADC <-> SBC  */
23036      new_inst = OPCODE_SBC;
23037      value = inverted;
23038      break;
23039
23040    case OPCODE_SBC:
23041      new_inst = OPCODE_ADC;
23042      value = inverted;
23043      break;
23044
23045      /* We cannot do anything.	 */
23046    default:
23047      return FAIL;
23048    }
23049
23050  if (value == (unsigned) FAIL)
23051    return FAIL;
23052
23053  *instruction &= OPCODE_MASK;
23054  *instruction |= new_inst << DATA_OP_SHIFT;
23055  return value;
23056}
23057
23058/* Like negate_data_op, but for Thumb-2.   */
23059
23060static unsigned int
23061thumb32_negate_data_op (offsetT *instruction, unsigned int value)
23062{
23063  int op, new_inst;
23064  int rd;
23065  unsigned int negated, inverted;
23066
23067  negated = encode_thumb32_immediate (-value);
23068  inverted = encode_thumb32_immediate (~value);
23069
23070  rd = (*instruction >> 8) & 0xf;
23071  op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
23072  switch (op)
23073    {
23074      /* ADD <-> SUB.  Includes CMP <-> CMN.  */
23075    case T2_OPCODE_SUB:
23076      new_inst = T2_OPCODE_ADD;
23077      value = negated;
23078      break;
23079
23080    case T2_OPCODE_ADD:
23081      new_inst = T2_OPCODE_SUB;
23082      value = negated;
23083      break;
23084
23085      /* ORR <-> ORN.  Includes MOV <-> MVN.  */
23086    case T2_OPCODE_ORR:
23087      new_inst = T2_OPCODE_ORN;
23088      value = inverted;
23089      break;
23090
23091    case T2_OPCODE_ORN:
23092      new_inst = T2_OPCODE_ORR;
23093      value = inverted;
23094      break;
23095
23096      /* AND <-> BIC.  TST has no inverted equivalent.  */
23097    case T2_OPCODE_AND:
23098      new_inst = T2_OPCODE_BIC;
23099      if (rd == 15)
23100	value = FAIL;
23101      else
23102	value = inverted;
23103      break;
23104
23105    case T2_OPCODE_BIC:
23106      new_inst = T2_OPCODE_AND;
23107      value = inverted;
23108      break;
23109
23110      /* ADC <-> SBC  */
23111    case T2_OPCODE_ADC:
23112      new_inst = T2_OPCODE_SBC;
23113      value = inverted;
23114      break;
23115
23116    case T2_OPCODE_SBC:
23117      new_inst = T2_OPCODE_ADC;
23118      value = inverted;
23119      break;
23120
23121      /* We cannot do anything.	 */
23122    default:
23123      return FAIL;
23124    }
23125
23126  if (value == (unsigned int)FAIL)
23127    return FAIL;
23128
23129  *instruction &= T2_OPCODE_MASK;
23130  *instruction |= new_inst << T2_DATA_OP_SHIFT;
23131  return value;
23132}
23133
23134/* Read a 32-bit thumb instruction from buf.  */
23135
23136static unsigned long
23137get_thumb32_insn (char * buf)
23138{
23139  unsigned long insn;
23140  insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
23141  insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
23142
23143  return insn;
23144}
23145
23146/* We usually want to set the low bit on the address of thumb function
23147   symbols.  In particular .word foo - . should have the low bit set.
23148   Generic code tries to fold the difference of two symbols to
23149   a constant.  Prevent this and force a relocation when the first symbols
23150   is a thumb function.  */
23151
23152bfd_boolean
23153arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
23154{
23155  if (op == O_subtract
23156      && l->X_op == O_symbol
23157      && r->X_op == O_symbol
23158      && THUMB_IS_FUNC (l->X_add_symbol))
23159    {
23160      l->X_op = O_subtract;
23161      l->X_op_symbol = r->X_add_symbol;
23162      l->X_add_number -= r->X_add_number;
23163      return TRUE;
23164    }
23165
23166  /* Process as normal.  */
23167  return FALSE;
23168}
23169
23170/* Encode Thumb2 unconditional branches and calls. The encoding
23171   for the 2 are identical for the immediate values.  */
23172
23173static void
23174encode_thumb2_b_bl_offset (char * buf, offsetT value)
23175{
23176#define T2I1I2MASK  ((1 << 13) | (1 << 11))
23177  offsetT newval;
23178  offsetT newval2;
23179  addressT S, I1, I2, lo, hi;
23180
23181  S = (value >> 24) & 0x01;
23182  I1 = (value >> 23) & 0x01;
23183  I2 = (value >> 22) & 0x01;
23184  hi = (value >> 12) & 0x3ff;
23185  lo = (value >> 1) & 0x7ff;
23186  newval   = md_chars_to_number (buf, THUMB_SIZE);
23187  newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
23188  newval  |= (S << 10) | hi;
23189  newval2 &=  ~T2I1I2MASK;
23190  newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
23191  md_number_to_chars (buf, newval, THUMB_SIZE);
23192  md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
23193}
23194
23195void
23196md_apply_fix (fixS *	fixP,
23197	       valueT * valP,
23198	       segT	seg)
23199{
23200  offsetT	 value = * valP;
23201  offsetT	 newval;
23202  unsigned int	 newimm;
23203  unsigned long	 temp;
23204  int		 sign;
23205  char *	 buf = fixP->fx_where + fixP->fx_frag->fr_literal;
23206
23207  gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
23208
23209  /* Note whether this will delete the relocation.  */
23210
23211  if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
23212    fixP->fx_done = 1;
23213
23214  /* On a 64-bit host, silently truncate 'value' to 32 bits for
23215     consistency with the behaviour on 32-bit hosts.  Remember value
23216     for emit_reloc.  */
23217  value &= 0xffffffff;
23218  value ^= 0x80000000;
23219  value -= 0x80000000;
23220
23221  *valP = value;
23222  fixP->fx_addnumber = value;
23223
23224  /* Same treatment for fixP->fx_offset.  */
23225  fixP->fx_offset &= 0xffffffff;
23226  fixP->fx_offset ^= 0x80000000;
23227  fixP->fx_offset -= 0x80000000;
23228
23229  switch (fixP->fx_r_type)
23230    {
23231    case BFD_RELOC_NONE:
23232      /* This will need to go in the object file.  */
23233      fixP->fx_done = 0;
23234      break;
23235
23236    case BFD_RELOC_ARM_IMMEDIATE:
23237      /* We claim that this fixup has been processed here,
23238	 even if in fact we generate an error because we do
23239	 not have a reloc for it, so tc_gen_reloc will reject it.  */
23240      fixP->fx_done = 1;
23241
23242      if (fixP->fx_addsy)
23243	{
23244	  const char *msg = 0;
23245
23246	  if (! S_IS_DEFINED (fixP->fx_addsy))
23247	    msg = _("undefined symbol %s used as an immediate value");
23248	  else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
23249	    msg = _("symbol %s is in a different section");
23250	  else if (S_IS_WEAK (fixP->fx_addsy))
23251	    msg = _("symbol %s is weak and may be overridden later");
23252
23253	  if (msg)
23254	    {
23255	      as_bad_where (fixP->fx_file, fixP->fx_line,
23256			    msg, S_GET_NAME (fixP->fx_addsy));
23257	      break;
23258	    }
23259	}
23260
23261      temp = md_chars_to_number (buf, INSN_SIZE);
23262
23263      /* If the offset is negative, we should use encoding A2 for ADR.  */
23264      if ((temp & 0xfff0000) == 0x28f0000 && value < 0)
23265	newimm = negate_data_op (&temp, value);
23266      else
23267	{
23268	  newimm = encode_arm_immediate (value);
23269
23270	  /* If the instruction will fail, see if we can fix things up by
23271	     changing the opcode.  */
23272	  if (newimm == (unsigned int) FAIL)
23273	    newimm = negate_data_op (&temp, value);
23274	  /* MOV accepts both ARM modified immediate (A1 encoding) and
23275	     UINT16 (A2 encoding) when possible, MOVW only accepts UINT16.
23276	     When disassembling, MOV is preferred when there is no encoding
23277	     overlap.  */
23278	  if (newimm == (unsigned int) FAIL
23279	      && ((temp >> DATA_OP_SHIFT) & 0xf) == OPCODE_MOV
23280	      && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2)
23281	      && !((temp >> SBIT_SHIFT) & 0x1)
23282	      && value >= 0 && value <= 0xffff)
23283	    {
23284	      /* Clear bits[23:20] to change encoding from A1 to A2.  */
23285	      temp &= 0xff0fffff;
23286	      /* Encoding high 4bits imm.  Code below will encode the remaining
23287		 low 12bits.  */
23288	      temp |= (value & 0x0000f000) << 4;
23289	      newimm = value & 0x00000fff;
23290	    }
23291	}
23292
23293      if (newimm == (unsigned int) FAIL)
23294	{
23295	  as_bad_where (fixP->fx_file, fixP->fx_line,
23296			_("invalid constant (%lx) after fixup"),
23297			(unsigned long) value);
23298	  break;
23299	}
23300
23301      newimm |= (temp & 0xfffff000);
23302      md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
23303      break;
23304
23305    case BFD_RELOC_ARM_ADRL_IMMEDIATE:
23306      {
23307	unsigned int highpart = 0;
23308	unsigned int newinsn  = 0xe1a00000; /* nop.  */
23309
23310	if (fixP->fx_addsy)
23311	  {
23312	    const char *msg = 0;
23313
23314	    if (! S_IS_DEFINED (fixP->fx_addsy))
23315	      msg = _("undefined symbol %s used as an immediate value");
23316	    else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
23317	      msg = _("symbol %s is in a different section");
23318	    else if (S_IS_WEAK (fixP->fx_addsy))
23319	      msg = _("symbol %s is weak and may be overridden later");
23320
23321	    if (msg)
23322	      {
23323		as_bad_where (fixP->fx_file, fixP->fx_line,
23324			      msg, S_GET_NAME (fixP->fx_addsy));
23325		break;
23326	      }
23327	  }
23328
23329	newimm = encode_arm_immediate (value);
23330	temp = md_chars_to_number (buf, INSN_SIZE);
23331
23332	/* If the instruction will fail, see if we can fix things up by
23333	   changing the opcode.	 */
23334	if (newimm == (unsigned int) FAIL
23335	    && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
23336	  {
23337	    /* No ?  OK - try using two ADD instructions to generate
23338	       the value.  */
23339	    newimm = validate_immediate_twopart (value, & highpart);
23340
23341	    /* Yes - then make sure that the second instruction is
23342	       also an add.  */
23343	    if (newimm != (unsigned int) FAIL)
23344	      newinsn = temp;
23345	    /* Still No ?  Try using a negated value.  */
23346	    else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
23347	      temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
23348	    /* Otherwise - give up.  */
23349	    else
23350	      {
23351		as_bad_where (fixP->fx_file, fixP->fx_line,
23352			      _("unable to compute ADRL instructions for PC offset of 0x%lx"),
23353			      (long) value);
23354		break;
23355	      }
23356
23357	    /* Replace the first operand in the 2nd instruction (which
23358	       is the PC) with the destination register.  We have
23359	       already added in the PC in the first instruction and we
23360	       do not want to do it again.  */
23361	    newinsn &= ~ 0xf0000;
23362	    newinsn |= ((newinsn & 0x0f000) << 4);
23363	  }
23364
23365	newimm |= (temp & 0xfffff000);
23366	md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
23367
23368	highpart |= (newinsn & 0xfffff000);
23369	md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
23370      }
23371      break;
23372
23373    case BFD_RELOC_ARM_OFFSET_IMM:
23374      if (!fixP->fx_done && seg->use_rela_p)
23375	value = 0;
23376      /* Fall through.  */
23377
23378    case BFD_RELOC_ARM_LITERAL:
23379      sign = value > 0;
23380
23381      if (value < 0)
23382	value = - value;
23383
23384      if (validate_offset_imm (value, 0) == FAIL)
23385	{
23386	  if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
23387	    as_bad_where (fixP->fx_file, fixP->fx_line,
23388			  _("invalid literal constant: pool needs to be closer"));
23389	  else
23390	    as_bad_where (fixP->fx_file, fixP->fx_line,
23391			  _("bad immediate value for offset (%ld)"),
23392			  (long) value);
23393	  break;
23394	}
23395
23396      newval = md_chars_to_number (buf, INSN_SIZE);
23397      if (value == 0)
23398	newval &= 0xfffff000;
23399      else
23400	{
23401	  newval &= 0xff7ff000;
23402	  newval |= value | (sign ? INDEX_UP : 0);
23403	}
23404      md_number_to_chars (buf, newval, INSN_SIZE);
23405      break;
23406
23407    case BFD_RELOC_ARM_OFFSET_IMM8:
23408    case BFD_RELOC_ARM_HWLITERAL:
23409      sign = value > 0;
23410
23411      if (value < 0)
23412	value = - value;
23413
23414      if (validate_offset_imm (value, 1) == FAIL)
23415	{
23416	  if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
23417	    as_bad_where (fixP->fx_file, fixP->fx_line,
23418			  _("invalid literal constant: pool needs to be closer"));
23419	  else
23420	    as_bad_where (fixP->fx_file, fixP->fx_line,
23421			  _("bad immediate value for 8-bit offset (%ld)"),
23422			  (long) value);
23423	  break;
23424	}
23425
23426      newval = md_chars_to_number (buf, INSN_SIZE);
23427      if (value == 0)
23428	newval &= 0xfffff0f0;
23429      else
23430	{
23431	  newval &= 0xff7ff0f0;
23432	  newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
23433	}
23434      md_number_to_chars (buf, newval, INSN_SIZE);
23435      break;
23436
23437    case BFD_RELOC_ARM_T32_OFFSET_U8:
23438      if (value < 0 || value > 1020 || value % 4 != 0)
23439	as_bad_where (fixP->fx_file, fixP->fx_line,
23440		      _("bad immediate value for offset (%ld)"), (long) value);
23441      value /= 4;
23442
23443      newval = md_chars_to_number (buf+2, THUMB_SIZE);
23444      newval |= value;
23445      md_number_to_chars (buf+2, newval, THUMB_SIZE);
23446      break;
23447
23448    case BFD_RELOC_ARM_T32_OFFSET_IMM:
23449      /* This is a complicated relocation used for all varieties of Thumb32
23450	 load/store instruction with immediate offset:
23451
23452	 1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
23453						   *4, optional writeback(W)
23454						   (doubleword load/store)
23455
23456	 1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
23457	 1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
23458	 1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
23459	 1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
23460	 1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
23461
23462	 Uppercase letters indicate bits that are already encoded at
23463	 this point.  Lowercase letters are our problem.  For the
23464	 second block of instructions, the secondary opcode nybble
23465	 (bits 8..11) is present, and bit 23 is zero, even if this is
23466	 a PC-relative operation.  */
23467      newval = md_chars_to_number (buf, THUMB_SIZE);
23468      newval <<= 16;
23469      newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
23470
23471      if ((newval & 0xf0000000) == 0xe0000000)
23472	{
23473	  /* Doubleword load/store: 8-bit offset, scaled by 4.  */
23474	  if (value >= 0)
23475	    newval |= (1 << 23);
23476	  else
23477	    value = -value;
23478	  if (value % 4 != 0)
23479	    {
23480	      as_bad_where (fixP->fx_file, fixP->fx_line,
23481			    _("offset not a multiple of 4"));
23482	      break;
23483	    }
23484	  value /= 4;
23485	  if (value > 0xff)
23486	    {
23487	      as_bad_where (fixP->fx_file, fixP->fx_line,
23488			    _("offset out of range"));
23489	      break;
23490	    }
23491	  newval &= ~0xff;
23492	}
23493      else if ((newval & 0x000f0000) == 0x000f0000)
23494	{
23495	  /* PC-relative, 12-bit offset.  */
23496	  if (value >= 0)
23497	    newval |= (1 << 23);
23498	  else
23499	    value = -value;
23500	  if (value > 0xfff)
23501	    {
23502	      as_bad_where (fixP->fx_file, fixP->fx_line,
23503			    _("offset out of range"));
23504	      break;
23505	    }
23506	  newval &= ~0xfff;
23507	}
23508      else if ((newval & 0x00000100) == 0x00000100)
23509	{
23510	  /* Writeback: 8-bit, +/- offset.  */
23511	  if (value >= 0)
23512	    newval |= (1 << 9);
23513	  else
23514	    value = -value;
23515	  if (value > 0xff)
23516	    {
23517	      as_bad_where (fixP->fx_file, fixP->fx_line,
23518			    _("offset out of range"));
23519	      break;
23520	    }
23521	  newval &= ~0xff;
23522	}
23523      else if ((newval & 0x00000f00) == 0x00000e00)
23524	{
23525	  /* T-instruction: positive 8-bit offset.  */
23526	  if (value < 0 || value > 0xff)
23527	    {
23528	      as_bad_where (fixP->fx_file, fixP->fx_line,
23529			    _("offset out of range"));
23530	      break;
23531	    }
23532	  newval &= ~0xff;
23533	  newval |= value;
23534	}
23535      else
23536	{
23537	  /* Positive 12-bit or negative 8-bit offset.  */
23538	  int limit;
23539	  if (value >= 0)
23540	    {
23541	      newval |= (1 << 23);
23542	      limit = 0xfff;
23543	    }
23544	  else
23545	    {
23546	      value = -value;
23547	      limit = 0xff;
23548	    }
23549	  if (value > limit)
23550	    {
23551	      as_bad_where (fixP->fx_file, fixP->fx_line,
23552			    _("offset out of range"));
23553	      break;
23554	    }
23555	  newval &= ~limit;
23556	}
23557
23558      newval |= value;
23559      md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
23560      md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
23561      break;
23562
23563    case BFD_RELOC_ARM_SHIFT_IMM:
23564      newval = md_chars_to_number (buf, INSN_SIZE);
23565      if (((unsigned long) value) > 32
23566	  || (value == 32
23567	      && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
23568	{
23569	  as_bad_where (fixP->fx_file, fixP->fx_line,
23570			_("shift expression is too large"));
23571	  break;
23572	}
23573
23574      if (value == 0)
23575	/* Shifts of zero must be done as lsl.	*/
23576	newval &= ~0x60;
23577      else if (value == 32)
23578	value = 0;
23579      newval &= 0xfffff07f;
23580      newval |= (value & 0x1f) << 7;
23581      md_number_to_chars (buf, newval, INSN_SIZE);
23582      break;
23583
23584    case BFD_RELOC_ARM_T32_IMMEDIATE:
23585    case BFD_RELOC_ARM_T32_ADD_IMM:
23586    case BFD_RELOC_ARM_T32_IMM12:
23587    case BFD_RELOC_ARM_T32_ADD_PC12:
23588      /* We claim that this fixup has been processed here,
23589	 even if in fact we generate an error because we do
23590	 not have a reloc for it, so tc_gen_reloc will reject it.  */
23591      fixP->fx_done = 1;
23592
23593      if (fixP->fx_addsy
23594	  && ! S_IS_DEFINED (fixP->fx_addsy))
23595	{
23596	  as_bad_where (fixP->fx_file, fixP->fx_line,
23597			_("undefined symbol %s used as an immediate value"),
23598			S_GET_NAME (fixP->fx_addsy));
23599	  break;
23600	}
23601
23602      newval = md_chars_to_number (buf, THUMB_SIZE);
23603      newval <<= 16;
23604      newval |= md_chars_to_number (buf+2, THUMB_SIZE);
23605
23606      newimm = FAIL;
23607      if ((fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
23608	   /* ARMv8-M Baseline MOV will reach here, but it doesn't support
23609	      Thumb2 modified immediate encoding (T2).  */
23610	   && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2))
23611	  || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
23612	{
23613	  newimm = encode_thumb32_immediate (value);
23614	  if (newimm == (unsigned int) FAIL)
23615	    newimm = thumb32_negate_data_op (&newval, value);
23616	}
23617      if (newimm == (unsigned int) FAIL)
23618	{
23619	  if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE)
23620	    {
23621	      /* Turn add/sum into addw/subw.  */
23622	      if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
23623		newval = (newval & 0xfeffffff) | 0x02000000;
23624	      /* No flat 12-bit imm encoding for addsw/subsw.  */
23625	      if ((newval & 0x00100000) == 0)
23626		{
23627		  /* 12 bit immediate for addw/subw.  */
23628		  if (value < 0)
23629		    {
23630		      value = -value;
23631		      newval ^= 0x00a00000;
23632		    }
23633		  if (value > 0xfff)
23634		    newimm = (unsigned int) FAIL;
23635		  else
23636		    newimm = value;
23637		}
23638	    }
23639	  else
23640	    {
23641	      /* MOV accepts both Thumb2 modified immediate (T2 encoding) and
23642		 UINT16 (T3 encoding), MOVW only accepts UINT16.  When
23643		 disassembling, MOV is preferred when there is no encoding
23644		 overlap.  */
23645	      if (((newval >> T2_DATA_OP_SHIFT) & 0xf) == T2_OPCODE_ORR
23646		  /* NOTE: MOV uses the ORR opcode in Thumb 2 mode
23647		     but with the Rn field [19:16] set to 1111.  */
23648		  && (((newval >> 16) & 0xf) == 0xf)
23649		  && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2_v8m)
23650		  && !((newval >> T2_SBIT_SHIFT) & 0x1)
23651		  && value >= 0 && value <= 0xffff)
23652		{
23653		  /* Toggle bit[25] to change encoding from T2 to T3.  */
23654		  newval ^= 1 << 25;
23655		  /* Clear bits[19:16].  */
23656		  newval &= 0xfff0ffff;
23657		  /* Encoding high 4bits imm.  Code below will encode the
23658		     remaining low 12bits.  */
23659		  newval |= (value & 0x0000f000) << 4;
23660		  newimm = value & 0x00000fff;
23661		}
23662	    }
23663	}
23664
23665      if (newimm == (unsigned int)FAIL)
23666	{
23667	  as_bad_where (fixP->fx_file, fixP->fx_line,
23668			_("invalid constant (%lx) after fixup"),
23669			(unsigned long) value);
23670	  break;
23671	}
23672
23673      newval |= (newimm & 0x800) << 15;
23674      newval |= (newimm & 0x700) << 4;
23675      newval |= (newimm & 0x0ff);
23676
23677      md_number_to_chars (buf,   (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
23678      md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
23679      break;
23680
23681    case BFD_RELOC_ARM_SMC:
23682      if (((unsigned long) value) > 0xffff)
23683	as_bad_where (fixP->fx_file, fixP->fx_line,
23684		      _("invalid smc expression"));
23685      newval = md_chars_to_number (buf, INSN_SIZE);
23686      newval |= (value & 0xf) | ((value & 0xfff0) << 4);
23687      md_number_to_chars (buf, newval, INSN_SIZE);
23688      break;
23689
23690    case BFD_RELOC_ARM_HVC:
23691      if (((unsigned long) value) > 0xffff)
23692	as_bad_where (fixP->fx_file, fixP->fx_line,
23693		      _("invalid hvc expression"));
23694      newval = md_chars_to_number (buf, INSN_SIZE);
23695      newval |= (value & 0xf) | ((value & 0xfff0) << 4);
23696      md_number_to_chars (buf, newval, INSN_SIZE);
23697      break;
23698
23699    case BFD_RELOC_ARM_SWI:
23700      if (fixP->tc_fix_data != 0)
23701	{
23702	  if (((unsigned long) value) > 0xff)
23703	    as_bad_where (fixP->fx_file, fixP->fx_line,
23704			  _("invalid swi expression"));
23705	  newval = md_chars_to_number (buf, THUMB_SIZE);
23706	  newval |= value;
23707	  md_number_to_chars (buf, newval, THUMB_SIZE);
23708	}
23709      else
23710	{
23711	  if (((unsigned long) value) > 0x00ffffff)
23712	    as_bad_where (fixP->fx_file, fixP->fx_line,
23713			  _("invalid swi expression"));
23714	  newval = md_chars_to_number (buf, INSN_SIZE);
23715	  newval |= value;
23716	  md_number_to_chars (buf, newval, INSN_SIZE);
23717	}
23718      break;
23719
23720    case BFD_RELOC_ARM_MULTI:
23721      if (((unsigned long) value) > 0xffff)
23722	as_bad_where (fixP->fx_file, fixP->fx_line,
23723		      _("invalid expression in load/store multiple"));
23724      newval = value | md_chars_to_number (buf, INSN_SIZE);
23725      md_number_to_chars (buf, newval, INSN_SIZE);
23726      break;
23727
23728#ifdef OBJ_ELF
23729    case BFD_RELOC_ARM_PCREL_CALL:
23730
23731      if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
23732	  && fixP->fx_addsy
23733	  && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
23734	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
23735	  && THUMB_IS_FUNC (fixP->fx_addsy))
23736	/* Flip the bl to blx. This is a simple flip
23737	   bit here because we generate PCREL_CALL for
23738	   unconditional bls.  */
23739	{
23740	  newval = md_chars_to_number (buf, INSN_SIZE);
23741	  newval = newval | 0x10000000;
23742	  md_number_to_chars (buf, newval, INSN_SIZE);
23743	  temp = 1;
23744	  fixP->fx_done = 1;
23745	}
23746      else
23747	temp = 3;
23748      goto arm_branch_common;
23749
23750    case BFD_RELOC_ARM_PCREL_JUMP:
23751      if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
23752	  && fixP->fx_addsy
23753	  && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
23754	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
23755	  && THUMB_IS_FUNC (fixP->fx_addsy))
23756	{
23757	  /* This would map to a bl<cond>, b<cond>,
23758	     b<always> to a Thumb function. We
23759	     need to force a relocation for this particular
23760	     case.  */
23761	  newval = md_chars_to_number (buf, INSN_SIZE);
23762	  fixP->fx_done = 0;
23763	}
23764      /* Fall through.  */
23765
23766    case BFD_RELOC_ARM_PLT32:
23767#endif
23768    case BFD_RELOC_ARM_PCREL_BRANCH:
23769      temp = 3;
23770      goto arm_branch_common;
23771
23772    case BFD_RELOC_ARM_PCREL_BLX:
23773
23774      temp = 1;
23775      if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
23776	  && fixP->fx_addsy
23777	  && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
23778	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
23779	  && ARM_IS_FUNC (fixP->fx_addsy))
23780	{
23781	  /* Flip the blx to a bl and warn.  */
23782	  const char *name = S_GET_NAME (fixP->fx_addsy);
23783	  newval = 0xeb000000;
23784	  as_warn_where (fixP->fx_file, fixP->fx_line,
23785			 _("blx to '%s' an ARM ISA state function changed to bl"),
23786			  name);
23787	  md_number_to_chars (buf, newval, INSN_SIZE);
23788	  temp = 3;
23789	  fixP->fx_done = 1;
23790	}
23791
23792#ifdef OBJ_ELF
23793       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
23794	 fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
23795#endif
23796
23797    arm_branch_common:
23798      /* We are going to store value (shifted right by two) in the
23799	 instruction, in a 24 bit, signed field.  Bits 26 through 32 either
23800	 all clear or all set and bit 0 must be clear.  For B/BL bit 1 must
23801	 also be clear.  */
23802      if (value & temp)
23803	as_bad_where (fixP->fx_file, fixP->fx_line,
23804		      _("misaligned branch destination"));
23805      if ((value & (offsetT)0xfe000000) != (offsetT)0
23806	  && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
23807	as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
23808
23809      if (fixP->fx_done || !seg->use_rela_p)
23810	{
23811	  newval = md_chars_to_number (buf, INSN_SIZE);
23812	  newval |= (value >> 2) & 0x00ffffff;
23813	  /* Set the H bit on BLX instructions.  */
23814	  if (temp == 1)
23815	    {
23816	      if (value & 2)
23817		newval |= 0x01000000;
23818	      else
23819		newval &= ~0x01000000;
23820	    }
23821	  md_number_to_chars (buf, newval, INSN_SIZE);
23822	}
23823      break;
23824
23825    case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
23826      /* CBZ can only branch forward.  */
23827
23828      /* Attempts to use CBZ to branch to the next instruction
23829	 (which, strictly speaking, are prohibited) will be turned into
23830	 no-ops.
23831
23832	 FIXME: It may be better to remove the instruction completely and
23833	 perform relaxation.  */
23834      if (value == -2)
23835	{
23836	  newval = md_chars_to_number (buf, THUMB_SIZE);
23837	  newval = 0xbf00; /* NOP encoding T1 */
23838	  md_number_to_chars (buf, newval, THUMB_SIZE);
23839	}
23840      else
23841	{
23842	  if (value & ~0x7e)
23843	    as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
23844
23845	  if (fixP->fx_done || !seg->use_rela_p)
23846	    {
23847	      newval = md_chars_to_number (buf, THUMB_SIZE);
23848	      newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
23849	      md_number_to_chars (buf, newval, THUMB_SIZE);
23850	    }
23851	}
23852      break;
23853
23854    case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch.	*/
23855      if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
23856	as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
23857
23858      if (fixP->fx_done || !seg->use_rela_p)
23859	{
23860	  newval = md_chars_to_number (buf, THUMB_SIZE);
23861	  newval |= (value & 0x1ff) >> 1;
23862	  md_number_to_chars (buf, newval, THUMB_SIZE);
23863	}
23864      break;
23865
23866    case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch.  */
23867      if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
23868	as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
23869
23870      if (fixP->fx_done || !seg->use_rela_p)
23871	{
23872	  newval = md_chars_to_number (buf, THUMB_SIZE);
23873	  newval |= (value & 0xfff) >> 1;
23874	  md_number_to_chars (buf, newval, THUMB_SIZE);
23875	}
23876      break;
23877
23878    case BFD_RELOC_THUMB_PCREL_BRANCH20:
23879      if (fixP->fx_addsy
23880	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
23881	  && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
23882	  && ARM_IS_FUNC (fixP->fx_addsy)
23883	  && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
23884	{
23885	  /* Force a relocation for a branch 20 bits wide.  */
23886	  fixP->fx_done = 0;
23887	}
23888      if ((value & ~0x1fffff) && ((value & ~0x0fffff) != ~0x0fffff))
23889	as_bad_where (fixP->fx_file, fixP->fx_line,
23890		      _("conditional branch out of range"));
23891
23892      if (fixP->fx_done || !seg->use_rela_p)
23893	{
23894	  offsetT newval2;
23895	  addressT S, J1, J2, lo, hi;
23896
23897	  S  = (value & 0x00100000) >> 20;
23898	  J2 = (value & 0x00080000) >> 19;
23899	  J1 = (value & 0x00040000) >> 18;
23900	  hi = (value & 0x0003f000) >> 12;
23901	  lo = (value & 0x00000ffe) >> 1;
23902
23903	  newval   = md_chars_to_number (buf, THUMB_SIZE);
23904	  newval2  = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
23905	  newval  |= (S << 10) | hi;
23906	  newval2 |= (J1 << 13) | (J2 << 11) | lo;
23907	  md_number_to_chars (buf, newval, THUMB_SIZE);
23908	  md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
23909	}
23910      break;
23911
23912    case BFD_RELOC_THUMB_PCREL_BLX:
23913      /* If there is a blx from a thumb state function to
23914	 another thumb function flip this to a bl and warn
23915	 about it.  */
23916
23917      if (fixP->fx_addsy
23918	  && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
23919	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
23920	  && THUMB_IS_FUNC (fixP->fx_addsy))
23921	{
23922	  const char *name = S_GET_NAME (fixP->fx_addsy);
23923	  as_warn_where (fixP->fx_file, fixP->fx_line,
23924			 _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
23925			 name);
23926	  newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
23927	  newval = newval | 0x1000;
23928	  md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
23929	  fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
23930	  fixP->fx_done = 1;
23931	}
23932
23933
23934      goto thumb_bl_common;
23935
23936    case BFD_RELOC_THUMB_PCREL_BRANCH23:
23937      /* A bl from Thumb state ISA to an internal ARM state function
23938	 is converted to a blx.  */
23939      if (fixP->fx_addsy
23940	  && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
23941	  && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
23942	  && ARM_IS_FUNC (fixP->fx_addsy)
23943	  && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
23944	{
23945	  newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
23946	  newval = newval & ~0x1000;
23947	  md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
23948	  fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
23949	  fixP->fx_done = 1;
23950	}
23951
23952    thumb_bl_common:
23953
23954      if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
23955	/* For a BLX instruction, make sure that the relocation is rounded up
23956	   to a word boundary.  This follows the semantics of the instruction
23957	   which specifies that bit 1 of the target address will come from bit
23958	   1 of the base address.  */
23959	value = (value + 3) & ~ 3;
23960
23961#ifdef OBJ_ELF
23962       if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4
23963	   && fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
23964	 fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
23965#endif
23966
23967      if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
23968	{
23969	  if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6t2)))
23970	    as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
23971	  else if ((value & ~0x1ffffff)
23972		   && ((value & ~0x1ffffff) != ~0x1ffffff))
23973	    as_bad_where (fixP->fx_file, fixP->fx_line,
23974			  _("Thumb2 branch out of range"));
23975	}
23976
23977      if (fixP->fx_done || !seg->use_rela_p)
23978	encode_thumb2_b_bl_offset (buf, value);
23979
23980      break;
23981
23982    case BFD_RELOC_THUMB_PCREL_BRANCH25:
23983      if ((value & ~0x0ffffff) && ((value & ~0x0ffffff) != ~0x0ffffff))
23984	as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
23985
23986      if (fixP->fx_done || !seg->use_rela_p)
23987	  encode_thumb2_b_bl_offset (buf, value);
23988
23989      break;
23990
23991    case BFD_RELOC_8:
23992      if (fixP->fx_done || !seg->use_rela_p)
23993	*buf = value;
23994      break;
23995
23996    case BFD_RELOC_16:
23997      if (fixP->fx_done || !seg->use_rela_p)
23998	md_number_to_chars (buf, value, 2);
23999      break;
24000
24001#ifdef OBJ_ELF
24002    case BFD_RELOC_ARM_TLS_CALL:
24003    case BFD_RELOC_ARM_THM_TLS_CALL:
24004    case BFD_RELOC_ARM_TLS_DESCSEQ:
24005    case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
24006    case BFD_RELOC_ARM_TLS_GOTDESC:
24007    case BFD_RELOC_ARM_TLS_GD32:
24008    case BFD_RELOC_ARM_TLS_LE32:
24009    case BFD_RELOC_ARM_TLS_IE32:
24010    case BFD_RELOC_ARM_TLS_LDM32:
24011    case BFD_RELOC_ARM_TLS_LDO32:
24012      S_SET_THREAD_LOCAL (fixP->fx_addsy);
24013      break;
24014
24015      /* Same handling as above, but with the arm_fdpic guard.  */
24016    case BFD_RELOC_ARM_TLS_GD32_FDPIC:
24017    case BFD_RELOC_ARM_TLS_IE32_FDPIC:
24018    case BFD_RELOC_ARM_TLS_LDM32_FDPIC:
24019      if (arm_fdpic)
24020	{
24021	  S_SET_THREAD_LOCAL (fixP->fx_addsy);
24022	}
24023      else
24024	{
24025	  as_bad_where (fixP->fx_file, fixP->fx_line,
24026			_("Relocation supported only in FDPIC mode"));
24027	}
24028      break;
24029
24030    case BFD_RELOC_ARM_GOT32:
24031    case BFD_RELOC_ARM_GOTOFF:
24032      break;
24033
24034    case BFD_RELOC_ARM_GOT_PREL:
24035      if (fixP->fx_done || !seg->use_rela_p)
24036	md_number_to_chars (buf, value, 4);
24037      break;
24038
24039    case BFD_RELOC_ARM_TARGET2:
24040      /* TARGET2 is not partial-inplace, so we need to write the
24041	 addend here for REL targets, because it won't be written out
24042	 during reloc processing later.  */
24043      if (fixP->fx_done || !seg->use_rela_p)
24044	md_number_to_chars (buf, fixP->fx_offset, 4);
24045      break;
24046
24047      /* Relocations for FDPIC.  */
24048    case BFD_RELOC_ARM_GOTFUNCDESC:
24049    case BFD_RELOC_ARM_GOTOFFFUNCDESC:
24050    case BFD_RELOC_ARM_FUNCDESC:
24051      if (arm_fdpic)
24052	{
24053	  if (fixP->fx_done || !seg->use_rela_p)
24054	    md_number_to_chars (buf, 0, 4);
24055	}
24056      else
24057	{
24058	  as_bad_where (fixP->fx_file, fixP->fx_line,
24059			_("Relocation supported only in FDPIC mode"));
24060      }
24061      break;
24062#endif
24063
24064    case BFD_RELOC_RVA:
24065    case BFD_RELOC_32:
24066    case BFD_RELOC_ARM_TARGET1:
24067    case BFD_RELOC_ARM_ROSEGREL32:
24068    case BFD_RELOC_ARM_SBREL32:
24069    case BFD_RELOC_32_PCREL:
24070#ifdef TE_PE
24071    case BFD_RELOC_32_SECREL:
24072#endif
24073      if (fixP->fx_done || !seg->use_rela_p)
24074#ifdef TE_WINCE
24075	/* For WinCE we only do this for pcrel fixups.  */
24076	if (fixP->fx_done || fixP->fx_pcrel)
24077#endif
24078	  md_number_to_chars (buf, value, 4);
24079      break;
24080
24081#ifdef OBJ_ELF
24082    case BFD_RELOC_ARM_PREL31:
24083      if (fixP->fx_done || !seg->use_rela_p)
24084	{
24085	  newval = md_chars_to_number (buf, 4) & 0x80000000;
24086	  if ((value ^ (value >> 1)) & 0x40000000)
24087	    {
24088	      as_bad_where (fixP->fx_file, fixP->fx_line,
24089			    _("rel31 relocation overflow"));
24090	    }
24091	  newval |= value & 0x7fffffff;
24092	  md_number_to_chars (buf, newval, 4);
24093	}
24094      break;
24095#endif
24096
24097    case BFD_RELOC_ARM_CP_OFF_IMM:
24098    case BFD_RELOC_ARM_T32_CP_OFF_IMM:
24099      if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM)
24100	newval = md_chars_to_number (buf, INSN_SIZE);
24101      else
24102	newval = get_thumb32_insn (buf);
24103      if ((newval & 0x0f200f00) == 0x0d000900)
24104	{
24105	  /* This is a fp16 vstr/vldr.  The immediate offset in the mnemonic
24106	     has permitted values that are multiples of 2, in the range 0
24107	     to 510.  */
24108	  if (value < -510 || value > 510 || (value & 1))
24109	    as_bad_where (fixP->fx_file, fixP->fx_line,
24110			  _("co-processor offset out of range"));
24111	}
24112      else if (value < -1023 || value > 1023 || (value & 3))
24113	as_bad_where (fixP->fx_file, fixP->fx_line,
24114		      _("co-processor offset out of range"));
24115    cp_off_common:
24116      sign = value > 0;
24117      if (value < 0)
24118	value = -value;
24119      if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
24120	  || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
24121	newval = md_chars_to_number (buf, INSN_SIZE);
24122      else
24123	newval = get_thumb32_insn (buf);
24124      if (value == 0)
24125	newval &= 0xffffff00;
24126      else
24127	{
24128	  newval &= 0xff7fff00;
24129	  if ((newval & 0x0f200f00) == 0x0d000900)
24130	    {
24131	      /* This is a fp16 vstr/vldr.
24132
24133		 It requires the immediate offset in the instruction is shifted
24134		 left by 1 to be a half-word offset.
24135
24136		 Here, left shift by 1 first, and later right shift by 2
24137		 should get the right offset.  */
24138	      value <<= 1;
24139	    }
24140	  newval |= (value >> 2) | (sign ? INDEX_UP : 0);
24141	}
24142      if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
24143	  || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
24144	md_number_to_chars (buf, newval, INSN_SIZE);
24145      else
24146	put_thumb32_insn (buf, newval);
24147      break;
24148
24149    case BFD_RELOC_ARM_CP_OFF_IMM_S2:
24150    case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
24151      if (value < -255 || value > 255)
24152	as_bad_where (fixP->fx_file, fixP->fx_line,
24153		      _("co-processor offset out of range"));
24154      value *= 4;
24155      goto cp_off_common;
24156
24157    case BFD_RELOC_ARM_THUMB_OFFSET:
24158      newval = md_chars_to_number (buf, THUMB_SIZE);
24159      /* Exactly what ranges, and where the offset is inserted depends
24160	 on the type of instruction, we can establish this from the
24161	 top 4 bits.  */
24162      switch (newval >> 12)
24163	{
24164	case 4: /* PC load.  */
24165	  /* Thumb PC loads are somewhat odd, bit 1 of the PC is
24166	     forced to zero for these loads; md_pcrel_from has already
24167	     compensated for this.  */
24168	  if (value & 3)
24169	    as_bad_where (fixP->fx_file, fixP->fx_line,
24170			  _("invalid offset, target not word aligned (0x%08lX)"),
24171			  (((unsigned long) fixP->fx_frag->fr_address
24172			    + (unsigned long) fixP->fx_where) & ~3)
24173			  + (unsigned long) value);
24174
24175	  if (value & ~0x3fc)
24176	    as_bad_where (fixP->fx_file, fixP->fx_line,
24177			  _("invalid offset, value too big (0x%08lX)"),
24178			  (long) value);
24179
24180	  newval |= value >> 2;
24181	  break;
24182
24183	case 9: /* SP load/store.  */
24184	  if (value & ~0x3fc)
24185	    as_bad_where (fixP->fx_file, fixP->fx_line,
24186			  _("invalid offset, value too big (0x%08lX)"),
24187			  (long) value);
24188	  newval |= value >> 2;
24189	  break;
24190
24191	case 6: /* Word load/store.  */
24192	  if (value & ~0x7c)
24193	    as_bad_where (fixP->fx_file, fixP->fx_line,
24194			  _("invalid offset, value too big (0x%08lX)"),
24195			  (long) value);
24196	  newval |= value << 4; /* 6 - 2.  */
24197	  break;
24198
24199	case 7: /* Byte load/store.  */
24200	  if (value & ~0x1f)
24201	    as_bad_where (fixP->fx_file, fixP->fx_line,
24202			  _("invalid offset, value too big (0x%08lX)"),
24203			  (long) value);
24204	  newval |= value << 6;
24205	  break;
24206
24207	case 8: /* Halfword load/store.	 */
24208	  if (value & ~0x3e)
24209	    as_bad_where (fixP->fx_file, fixP->fx_line,
24210			  _("invalid offset, value too big (0x%08lX)"),
24211			  (long) value);
24212	  newval |= value << 5; /* 6 - 1.  */
24213	  break;
24214
24215	default:
24216	  as_bad_where (fixP->fx_file, fixP->fx_line,
24217			"Unable to process relocation for thumb opcode: %lx",
24218			(unsigned long) newval);
24219	  break;
24220	}
24221      md_number_to_chars (buf, newval, THUMB_SIZE);
24222      break;
24223
24224    case BFD_RELOC_ARM_THUMB_ADD:
24225      /* This is a complicated relocation, since we use it for all of
24226	 the following immediate relocations:
24227
24228	    3bit ADD/SUB
24229	    8bit ADD/SUB
24230	    9bit ADD/SUB SP word-aligned
24231	   10bit ADD PC/SP word-aligned
24232
24233	 The type of instruction being processed is encoded in the
24234	 instruction field:
24235
24236	   0x8000  SUB
24237	   0x00F0  Rd
24238	   0x000F  Rs
24239      */
24240      newval = md_chars_to_number (buf, THUMB_SIZE);
24241      {
24242	int rd = (newval >> 4) & 0xf;
24243	int rs = newval & 0xf;
24244	int subtract = !!(newval & 0x8000);
24245
24246	/* Check for HI regs, only very restricted cases allowed:
24247	   Adjusting SP, and using PC or SP to get an address.	*/
24248	if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
24249	    || (rs > 7 && rs != REG_SP && rs != REG_PC))
24250	  as_bad_where (fixP->fx_file, fixP->fx_line,
24251			_("invalid Hi register with immediate"));
24252
24253	/* If value is negative, choose the opposite instruction.  */
24254	if (value < 0)
24255	  {
24256	    value = -value;
24257	    subtract = !subtract;
24258	    if (value < 0)
24259	      as_bad_where (fixP->fx_file, fixP->fx_line,
24260			    _("immediate value out of range"));
24261	  }
24262
24263	if (rd == REG_SP)
24264	  {
24265 	    if (value & ~0x1fc)
24266	      as_bad_where (fixP->fx_file, fixP->fx_line,
24267			    _("invalid immediate for stack address calculation"));
24268	    newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
24269	    newval |= value >> 2;
24270	  }
24271	else if (rs == REG_PC || rs == REG_SP)
24272	  {
24273	    /* PR gas/18541.  If the addition is for a defined symbol
24274	       within range of an ADR instruction then accept it.  */
24275	    if (subtract
24276		&& value == 4
24277		&& fixP->fx_addsy != NULL)
24278	      {
24279		subtract = 0;
24280
24281		if (! S_IS_DEFINED (fixP->fx_addsy)
24282		    || S_GET_SEGMENT (fixP->fx_addsy) != seg
24283		    || S_IS_WEAK (fixP->fx_addsy))
24284		  {
24285		    as_bad_where (fixP->fx_file, fixP->fx_line,
24286				  _("address calculation needs a strongly defined nearby symbol"));
24287		  }
24288		else
24289		  {
24290		    offsetT v = fixP->fx_where + fixP->fx_frag->fr_address;
24291
24292		    /* Round up to the next 4-byte boundary.  */
24293		    if (v & 3)
24294		      v = (v + 3) & ~ 3;
24295		    else
24296		      v += 4;
24297		    v = S_GET_VALUE (fixP->fx_addsy) - v;
24298
24299		    if (v & ~0x3fc)
24300		      {
24301			as_bad_where (fixP->fx_file, fixP->fx_line,
24302				      _("symbol too far away"));
24303		      }
24304		    else
24305		      {
24306			fixP->fx_done = 1;
24307			value = v;
24308		      }
24309		  }
24310	      }
24311
24312	    if (subtract || value & ~0x3fc)
24313	      as_bad_where (fixP->fx_file, fixP->fx_line,
24314			    _("invalid immediate for address calculation (value = 0x%08lX)"),
24315			    (unsigned long) (subtract ? - value : value));
24316	    newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
24317	    newval |= rd << 8;
24318	    newval |= value >> 2;
24319	  }
24320	else if (rs == rd)
24321	  {
24322	    if (value & ~0xff)
24323	      as_bad_where (fixP->fx_file, fixP->fx_line,
24324			    _("immediate value out of range"));
24325	    newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
24326	    newval |= (rd << 8) | value;
24327	  }
24328	else
24329	  {
24330	    if (value & ~0x7)
24331	      as_bad_where (fixP->fx_file, fixP->fx_line,
24332			    _("immediate value out of range"));
24333	    newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
24334	    newval |= rd | (rs << 3) | (value << 6);
24335	  }
24336      }
24337      md_number_to_chars (buf, newval, THUMB_SIZE);
24338      break;
24339
24340    case BFD_RELOC_ARM_THUMB_IMM:
24341      newval = md_chars_to_number (buf, THUMB_SIZE);
24342      if (value < 0 || value > 255)
24343	as_bad_where (fixP->fx_file, fixP->fx_line,
24344		      _("invalid immediate: %ld is out of range"),
24345		      (long) value);
24346      newval |= value;
24347      md_number_to_chars (buf, newval, THUMB_SIZE);
24348      break;
24349
24350    case BFD_RELOC_ARM_THUMB_SHIFT:
24351      /* 5bit shift value (0..32).  LSL cannot take 32.	 */
24352      newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
24353      temp = newval & 0xf800;
24354      if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
24355	as_bad_where (fixP->fx_file, fixP->fx_line,
24356		      _("invalid shift value: %ld"), (long) value);
24357      /* Shifts of zero must be encoded as LSL.	 */
24358      if (value == 0)
24359	newval = (newval & 0x003f) | T_OPCODE_LSL_I;
24360      /* Shifts of 32 are encoded as zero.  */
24361      else if (value == 32)
24362	value = 0;
24363      newval |= value << 6;
24364      md_number_to_chars (buf, newval, THUMB_SIZE);
24365      break;
24366
24367    case BFD_RELOC_VTABLE_INHERIT:
24368    case BFD_RELOC_VTABLE_ENTRY:
24369      fixP->fx_done = 0;
24370      return;
24371
24372    case BFD_RELOC_ARM_MOVW:
24373    case BFD_RELOC_ARM_MOVT:
24374    case BFD_RELOC_ARM_THUMB_MOVW:
24375    case BFD_RELOC_ARM_THUMB_MOVT:
24376      if (fixP->fx_done || !seg->use_rela_p)
24377	{
24378	  /* REL format relocations are limited to a 16-bit addend.  */
24379	  if (!fixP->fx_done)
24380	    {
24381	      if (value < -0x8000 || value > 0x7fff)
24382		  as_bad_where (fixP->fx_file, fixP->fx_line,
24383				_("offset out of range"));
24384	    }
24385	  else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
24386		   || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
24387	    {
24388	      value >>= 16;
24389	    }
24390
24391	  if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
24392	      || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
24393	    {
24394	      newval = get_thumb32_insn (buf);
24395	      newval &= 0xfbf08f00;
24396	      newval |= (value & 0xf000) << 4;
24397	      newval |= (value & 0x0800) << 15;
24398	      newval |= (value & 0x0700) << 4;
24399	      newval |= (value & 0x00ff);
24400	      put_thumb32_insn (buf, newval);
24401	    }
24402	  else
24403	    {
24404	      newval = md_chars_to_number (buf, 4);
24405	      newval &= 0xfff0f000;
24406	      newval |= value & 0x0fff;
24407	      newval |= (value & 0xf000) << 4;
24408	      md_number_to_chars (buf, newval, 4);
24409	    }
24410	}
24411      return;
24412
24413   case BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC:
24414   case BFD_RELOC_ARM_THUMB_ALU_ABS_G1_NC:
24415   case BFD_RELOC_ARM_THUMB_ALU_ABS_G2_NC:
24416   case BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC:
24417      gas_assert (!fixP->fx_done);
24418      {
24419	bfd_vma insn;
24420	bfd_boolean is_mov;
24421	bfd_vma encoded_addend = value;
24422
24423	/* Check that addend can be encoded in instruction.  */
24424	if (!seg->use_rela_p && (value < 0 || value > 255))
24425	  as_bad_where (fixP->fx_file, fixP->fx_line,
24426			_("the offset 0x%08lX is not representable"),
24427			(unsigned long) encoded_addend);
24428
24429	/* Extract the instruction.  */
24430	insn = md_chars_to_number (buf, THUMB_SIZE);
24431	is_mov = (insn & 0xf800) == 0x2000;
24432
24433	/* Encode insn.  */
24434	if (is_mov)
24435	  {
24436	    if (!seg->use_rela_p)
24437	      insn |= encoded_addend;
24438	  }
24439	else
24440	  {
24441	    int rd, rs;
24442
24443	    /* Extract the instruction.  */
24444	     /* Encoding is the following
24445		0x8000  SUB
24446		0x00F0  Rd
24447		0x000F  Rs
24448	     */
24449	     /* The following conditions must be true :
24450		- ADD
24451		- Rd == Rs
24452		- Rd <= 7
24453	     */
24454	    rd = (insn >> 4) & 0xf;
24455	    rs = insn & 0xf;
24456	    if ((insn & 0x8000) || (rd != rs) || rd > 7)
24457	      as_bad_where (fixP->fx_file, fixP->fx_line,
24458			_("Unable to process relocation for thumb opcode: %lx"),
24459			(unsigned long) insn);
24460
24461	    /* Encode as ADD immediate8 thumb 1 code.  */
24462	    insn = 0x3000 | (rd << 8);
24463
24464	    /* Place the encoded addend into the first 8 bits of the
24465	       instruction.  */
24466	    if (!seg->use_rela_p)
24467	      insn |= encoded_addend;
24468	  }
24469
24470	/* Update the instruction.  */
24471	md_number_to_chars (buf, insn, THUMB_SIZE);
24472      }
24473      break;
24474
24475   case BFD_RELOC_ARM_ALU_PC_G0_NC:
24476   case BFD_RELOC_ARM_ALU_PC_G0:
24477   case BFD_RELOC_ARM_ALU_PC_G1_NC:
24478   case BFD_RELOC_ARM_ALU_PC_G1:
24479   case BFD_RELOC_ARM_ALU_PC_G2:
24480   case BFD_RELOC_ARM_ALU_SB_G0_NC:
24481   case BFD_RELOC_ARM_ALU_SB_G0:
24482   case BFD_RELOC_ARM_ALU_SB_G1_NC:
24483   case BFD_RELOC_ARM_ALU_SB_G1:
24484   case BFD_RELOC_ARM_ALU_SB_G2:
24485     gas_assert (!fixP->fx_done);
24486     if (!seg->use_rela_p)
24487       {
24488	 bfd_vma insn;
24489	 bfd_vma encoded_addend;
24490	 bfd_vma addend_abs = abs (value);
24491
24492	 /* Check that the absolute value of the addend can be
24493	    expressed as an 8-bit constant plus a rotation.  */
24494	 encoded_addend = encode_arm_immediate (addend_abs);
24495	 if (encoded_addend == (unsigned int) FAIL)
24496	   as_bad_where (fixP->fx_file, fixP->fx_line,
24497			 _("the offset 0x%08lX is not representable"),
24498			 (unsigned long) addend_abs);
24499
24500	 /* Extract the instruction.  */
24501	 insn = md_chars_to_number (buf, INSN_SIZE);
24502
24503	 /* If the addend is positive, use an ADD instruction.
24504	    Otherwise use a SUB.  Take care not to destroy the S bit.  */
24505	 insn &= 0xff1fffff;
24506	 if (value < 0)
24507	   insn |= 1 << 22;
24508	 else
24509	   insn |= 1 << 23;
24510
24511	 /* Place the encoded addend into the first 12 bits of the
24512	    instruction.  */
24513	 insn &= 0xfffff000;
24514	 insn |= encoded_addend;
24515
24516	 /* Update the instruction.  */
24517	 md_number_to_chars (buf, insn, INSN_SIZE);
24518       }
24519     break;
24520
24521    case BFD_RELOC_ARM_LDR_PC_G0:
24522    case BFD_RELOC_ARM_LDR_PC_G1:
24523    case BFD_RELOC_ARM_LDR_PC_G2:
24524    case BFD_RELOC_ARM_LDR_SB_G0:
24525    case BFD_RELOC_ARM_LDR_SB_G1:
24526    case BFD_RELOC_ARM_LDR_SB_G2:
24527      gas_assert (!fixP->fx_done);
24528      if (!seg->use_rela_p)
24529	{
24530	  bfd_vma insn;
24531	  bfd_vma addend_abs = abs (value);
24532
24533	  /* Check that the absolute value of the addend can be
24534	     encoded in 12 bits.  */
24535	  if (addend_abs >= 0x1000)
24536	    as_bad_where (fixP->fx_file, fixP->fx_line,
24537			  _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
24538			  (unsigned long) addend_abs);
24539
24540	  /* Extract the instruction.  */
24541	  insn = md_chars_to_number (buf, INSN_SIZE);
24542
24543	  /* If the addend is negative, clear bit 23 of the instruction.
24544	     Otherwise set it.  */
24545	  if (value < 0)
24546	    insn &= ~(1 << 23);
24547	  else
24548	    insn |= 1 << 23;
24549
24550	  /* Place the absolute value of the addend into the first 12 bits
24551	     of the instruction.  */
24552	  insn &= 0xfffff000;
24553	  insn |= addend_abs;
24554
24555	  /* Update the instruction.  */
24556	  md_number_to_chars (buf, insn, INSN_SIZE);
24557	}
24558      break;
24559
24560    case BFD_RELOC_ARM_LDRS_PC_G0:
24561    case BFD_RELOC_ARM_LDRS_PC_G1:
24562    case BFD_RELOC_ARM_LDRS_PC_G2:
24563    case BFD_RELOC_ARM_LDRS_SB_G0:
24564    case BFD_RELOC_ARM_LDRS_SB_G1:
24565    case BFD_RELOC_ARM_LDRS_SB_G2:
24566      gas_assert (!fixP->fx_done);
24567      if (!seg->use_rela_p)
24568	{
24569	  bfd_vma insn;
24570	  bfd_vma addend_abs = abs (value);
24571
24572	  /* Check that the absolute value of the addend can be
24573	     encoded in 8 bits.  */
24574	  if (addend_abs >= 0x100)
24575	    as_bad_where (fixP->fx_file, fixP->fx_line,
24576			  _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
24577			  (unsigned long) addend_abs);
24578
24579	  /* Extract the instruction.  */
24580	  insn = md_chars_to_number (buf, INSN_SIZE);
24581
24582	  /* If the addend is negative, clear bit 23 of the instruction.
24583	     Otherwise set it.  */
24584	  if (value < 0)
24585	    insn &= ~(1 << 23);
24586	  else
24587	    insn |= 1 << 23;
24588
24589	  /* Place the first four bits of the absolute value of the addend
24590	     into the first 4 bits of the instruction, and the remaining
24591	     four into bits 8 .. 11.  */
24592	  insn &= 0xfffff0f0;
24593	  insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
24594
24595	  /* Update the instruction.  */
24596	  md_number_to_chars (buf, insn, INSN_SIZE);
24597	}
24598      break;
24599
24600    case BFD_RELOC_ARM_LDC_PC_G0:
24601    case BFD_RELOC_ARM_LDC_PC_G1:
24602    case BFD_RELOC_ARM_LDC_PC_G2:
24603    case BFD_RELOC_ARM_LDC_SB_G0:
24604    case BFD_RELOC_ARM_LDC_SB_G1:
24605    case BFD_RELOC_ARM_LDC_SB_G2:
24606      gas_assert (!fixP->fx_done);
24607      if (!seg->use_rela_p)
24608	{
24609	  bfd_vma insn;
24610	  bfd_vma addend_abs = abs (value);
24611
24612	  /* Check that the absolute value of the addend is a multiple of
24613	     four and, when divided by four, fits in 8 bits.  */
24614	  if (addend_abs & 0x3)
24615	    as_bad_where (fixP->fx_file, fixP->fx_line,
24616			  _("bad offset 0x%08lX (must be word-aligned)"),
24617			  (unsigned long) addend_abs);
24618
24619	  if ((addend_abs >> 2) > 0xff)
24620	    as_bad_where (fixP->fx_file, fixP->fx_line,
24621			  _("bad offset 0x%08lX (must be an 8-bit number of words)"),
24622			  (unsigned long) addend_abs);
24623
24624	  /* Extract the instruction.  */
24625	  insn = md_chars_to_number (buf, INSN_SIZE);
24626
24627	  /* If the addend is negative, clear bit 23 of the instruction.
24628	     Otherwise set it.  */
24629	  if (value < 0)
24630	    insn &= ~(1 << 23);
24631	  else
24632	    insn |= 1 << 23;
24633
24634	  /* Place the addend (divided by four) into the first eight
24635	     bits of the instruction.  */
24636	  insn &= 0xfffffff0;
24637	  insn |= addend_abs >> 2;
24638
24639	  /* Update the instruction.  */
24640	  md_number_to_chars (buf, insn, INSN_SIZE);
24641	}
24642      break;
24643
24644    case BFD_RELOC_ARM_V4BX:
24645      /* This will need to go in the object file.  */
24646      fixP->fx_done = 0;
24647      break;
24648
24649    case BFD_RELOC_UNUSED:
24650    default:
24651      as_bad_where (fixP->fx_file, fixP->fx_line,
24652		    _("bad relocation fixup type (%d)"), fixP->fx_r_type);
24653    }
24654}
24655
24656/* Translate internal representation of relocation info to BFD target
24657   format.  */
24658
24659arelent *
24660tc_gen_reloc (asection *section, fixS *fixp)
24661{
24662  arelent * reloc;
24663  bfd_reloc_code_real_type code;
24664
24665  reloc = XNEW (arelent);
24666
24667  reloc->sym_ptr_ptr = XNEW (asymbol *);
24668  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
24669  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
24670
24671  if (fixp->fx_pcrel)
24672    {
24673      if (section->use_rela_p)
24674	fixp->fx_offset -= md_pcrel_from_section (fixp, section);
24675      else
24676	fixp->fx_offset = reloc->address;
24677    }
24678  reloc->addend = fixp->fx_offset;
24679
24680  switch (fixp->fx_r_type)
24681    {
24682    case BFD_RELOC_8:
24683      if (fixp->fx_pcrel)
24684	{
24685	  code = BFD_RELOC_8_PCREL;
24686	  break;
24687	}
24688      /* Fall through.  */
24689
24690    case BFD_RELOC_16:
24691      if (fixp->fx_pcrel)
24692	{
24693	  code = BFD_RELOC_16_PCREL;
24694	  break;
24695	}
24696      /* Fall through.  */
24697
24698    case BFD_RELOC_32:
24699      if (fixp->fx_pcrel)
24700	{
24701	  code = BFD_RELOC_32_PCREL;
24702	  break;
24703	}
24704      /* Fall through.  */
24705
24706    case BFD_RELOC_ARM_MOVW:
24707      if (fixp->fx_pcrel)
24708	{
24709	  code = BFD_RELOC_ARM_MOVW_PCREL;
24710	  break;
24711	}
24712      /* Fall through.  */
24713
24714    case BFD_RELOC_ARM_MOVT:
24715      if (fixp->fx_pcrel)
24716	{
24717	  code = BFD_RELOC_ARM_MOVT_PCREL;
24718	  break;
24719	}
24720      /* Fall through.  */
24721
24722    case BFD_RELOC_ARM_THUMB_MOVW:
24723      if (fixp->fx_pcrel)
24724	{
24725	  code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
24726	  break;
24727	}
24728      /* Fall through.  */
24729
24730    case BFD_RELOC_ARM_THUMB_MOVT:
24731      if (fixp->fx_pcrel)
24732	{
24733	  code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
24734	  break;
24735	}
24736      /* Fall through.  */
24737
24738    case BFD_RELOC_NONE:
24739    case BFD_RELOC_ARM_PCREL_BRANCH:
24740    case BFD_RELOC_ARM_PCREL_BLX:
24741    case BFD_RELOC_RVA:
24742    case BFD_RELOC_THUMB_PCREL_BRANCH7:
24743    case BFD_RELOC_THUMB_PCREL_BRANCH9:
24744    case BFD_RELOC_THUMB_PCREL_BRANCH12:
24745    case BFD_RELOC_THUMB_PCREL_BRANCH20:
24746    case BFD_RELOC_THUMB_PCREL_BRANCH23:
24747    case BFD_RELOC_THUMB_PCREL_BRANCH25:
24748    case BFD_RELOC_VTABLE_ENTRY:
24749    case BFD_RELOC_VTABLE_INHERIT:
24750#ifdef TE_PE
24751    case BFD_RELOC_32_SECREL:
24752#endif
24753      code = fixp->fx_r_type;
24754      break;
24755
24756    case BFD_RELOC_THUMB_PCREL_BLX:
24757#ifdef OBJ_ELF
24758      if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
24759	code = BFD_RELOC_THUMB_PCREL_BRANCH23;
24760      else
24761#endif
24762	code = BFD_RELOC_THUMB_PCREL_BLX;
24763      break;
24764
24765    case BFD_RELOC_ARM_LITERAL:
24766    case BFD_RELOC_ARM_HWLITERAL:
24767      /* If this is called then the a literal has
24768	 been referenced across a section boundary.  */
24769      as_bad_where (fixp->fx_file, fixp->fx_line,
24770		    _("literal referenced across section boundary"));
24771      return NULL;
24772
24773#ifdef OBJ_ELF
24774    case BFD_RELOC_ARM_TLS_CALL:
24775    case BFD_RELOC_ARM_THM_TLS_CALL:
24776    case BFD_RELOC_ARM_TLS_DESCSEQ:
24777    case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
24778    case BFD_RELOC_ARM_GOT32:
24779    case BFD_RELOC_ARM_GOTOFF:
24780    case BFD_RELOC_ARM_GOT_PREL:
24781    case BFD_RELOC_ARM_PLT32:
24782    case BFD_RELOC_ARM_TARGET1:
24783    case BFD_RELOC_ARM_ROSEGREL32:
24784    case BFD_RELOC_ARM_SBREL32:
24785    case BFD_RELOC_ARM_PREL31:
24786    case BFD_RELOC_ARM_TARGET2:
24787    case BFD_RELOC_ARM_TLS_LDO32:
24788    case BFD_RELOC_ARM_PCREL_CALL:
24789    case BFD_RELOC_ARM_PCREL_JUMP:
24790    case BFD_RELOC_ARM_ALU_PC_G0_NC:
24791    case BFD_RELOC_ARM_ALU_PC_G0:
24792    case BFD_RELOC_ARM_ALU_PC_G1_NC:
24793    case BFD_RELOC_ARM_ALU_PC_G1:
24794    case BFD_RELOC_ARM_ALU_PC_G2:
24795    case BFD_RELOC_ARM_LDR_PC_G0:
24796    case BFD_RELOC_ARM_LDR_PC_G1:
24797    case BFD_RELOC_ARM_LDR_PC_G2:
24798    case BFD_RELOC_ARM_LDRS_PC_G0:
24799    case BFD_RELOC_ARM_LDRS_PC_G1:
24800    case BFD_RELOC_ARM_LDRS_PC_G2:
24801    case BFD_RELOC_ARM_LDC_PC_G0:
24802    case BFD_RELOC_ARM_LDC_PC_G1:
24803    case BFD_RELOC_ARM_LDC_PC_G2:
24804    case BFD_RELOC_ARM_ALU_SB_G0_NC:
24805    case BFD_RELOC_ARM_ALU_SB_G0:
24806    case BFD_RELOC_ARM_ALU_SB_G1_NC:
24807    case BFD_RELOC_ARM_ALU_SB_G1:
24808    case BFD_RELOC_ARM_ALU_SB_G2:
24809    case BFD_RELOC_ARM_LDR_SB_G0:
24810    case BFD_RELOC_ARM_LDR_SB_G1:
24811    case BFD_RELOC_ARM_LDR_SB_G2:
24812    case BFD_RELOC_ARM_LDRS_SB_G0:
24813    case BFD_RELOC_ARM_LDRS_SB_G1:
24814    case BFD_RELOC_ARM_LDRS_SB_G2:
24815    case BFD_RELOC_ARM_LDC_SB_G0:
24816    case BFD_RELOC_ARM_LDC_SB_G1:
24817    case BFD_RELOC_ARM_LDC_SB_G2:
24818    case BFD_RELOC_ARM_V4BX:
24819    case BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC:
24820    case BFD_RELOC_ARM_THUMB_ALU_ABS_G1_NC:
24821    case BFD_RELOC_ARM_THUMB_ALU_ABS_G2_NC:
24822    case BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC:
24823    case BFD_RELOC_ARM_GOTFUNCDESC:
24824    case BFD_RELOC_ARM_GOTOFFFUNCDESC:
24825    case BFD_RELOC_ARM_FUNCDESC:
24826      code = fixp->fx_r_type;
24827      break;
24828
24829    case BFD_RELOC_ARM_TLS_GOTDESC:
24830    case BFD_RELOC_ARM_TLS_GD32:
24831    case BFD_RELOC_ARM_TLS_GD32_FDPIC:
24832    case BFD_RELOC_ARM_TLS_LE32:
24833    case BFD_RELOC_ARM_TLS_IE32:
24834    case BFD_RELOC_ARM_TLS_IE32_FDPIC:
24835    case BFD_RELOC_ARM_TLS_LDM32:
24836    case BFD_RELOC_ARM_TLS_LDM32_FDPIC:
24837      /* BFD will include the symbol's address in the addend.
24838	 But we don't want that, so subtract it out again here.  */
24839      if (!S_IS_COMMON (fixp->fx_addsy))
24840	reloc->addend -= (*reloc->sym_ptr_ptr)->value;
24841      code = fixp->fx_r_type;
24842      break;
24843#endif
24844
24845    case BFD_RELOC_ARM_IMMEDIATE:
24846      as_bad_where (fixp->fx_file, fixp->fx_line,
24847		    _("internal relocation (type: IMMEDIATE) not fixed up"));
24848      return NULL;
24849
24850    case BFD_RELOC_ARM_ADRL_IMMEDIATE:
24851      as_bad_where (fixp->fx_file, fixp->fx_line,
24852		    _("ADRL used for a symbol not defined in the same file"));
24853      return NULL;
24854
24855    case BFD_RELOC_ARM_OFFSET_IMM:
24856      if (section->use_rela_p)
24857	{
24858	  code = fixp->fx_r_type;
24859	  break;
24860	}
24861
24862      if (fixp->fx_addsy != NULL
24863	  && !S_IS_DEFINED (fixp->fx_addsy)
24864	  && S_IS_LOCAL (fixp->fx_addsy))
24865	{
24866	  as_bad_where (fixp->fx_file, fixp->fx_line,
24867			_("undefined local label `%s'"),
24868			S_GET_NAME (fixp->fx_addsy));
24869	  return NULL;
24870	}
24871
24872      as_bad_where (fixp->fx_file, fixp->fx_line,
24873		    _("internal_relocation (type: OFFSET_IMM) not fixed up"));
24874      return NULL;
24875
24876    default:
24877      {
24878	const char * type;
24879
24880	switch (fixp->fx_r_type)
24881	  {
24882	  case BFD_RELOC_NONE:		   type = "NONE";	  break;
24883	  case BFD_RELOC_ARM_OFFSET_IMM8:  type = "OFFSET_IMM8";  break;
24884	  case BFD_RELOC_ARM_SHIFT_IMM:	   type = "SHIFT_IMM";	  break;
24885	  case BFD_RELOC_ARM_SMC:	   type = "SMC";	  break;
24886	  case BFD_RELOC_ARM_SWI:	   type = "SWI";	  break;
24887	  case BFD_RELOC_ARM_MULTI:	   type = "MULTI";	  break;
24888	  case BFD_RELOC_ARM_CP_OFF_IMM:   type = "CP_OFF_IMM";	  break;
24889	  case BFD_RELOC_ARM_T32_OFFSET_IMM: type = "T32_OFFSET_IMM"; break;
24890	  case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
24891	  case BFD_RELOC_ARM_THUMB_ADD:	   type = "THUMB_ADD";	  break;
24892	  case BFD_RELOC_ARM_THUMB_SHIFT:  type = "THUMB_SHIFT";  break;
24893	  case BFD_RELOC_ARM_THUMB_IMM:	   type = "THUMB_IMM";	  break;
24894	  case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
24895	  default:			   type = _("<unknown>"); break;
24896	  }
24897	as_bad_where (fixp->fx_file, fixp->fx_line,
24898		      _("cannot represent %s relocation in this object file format"),
24899		      type);
24900	return NULL;
24901      }
24902    }
24903
24904#ifdef OBJ_ELF
24905  if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
24906      && GOT_symbol
24907      && fixp->fx_addsy == GOT_symbol)
24908    {
24909      code = BFD_RELOC_ARM_GOTPC;
24910      reloc->addend = fixp->fx_offset = reloc->address;
24911    }
24912#endif
24913
24914  reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
24915
24916  if (reloc->howto == NULL)
24917    {
24918      as_bad_where (fixp->fx_file, fixp->fx_line,
24919		    _("cannot represent %s relocation in this object file format"),
24920		    bfd_get_reloc_code_name (code));
24921      return NULL;
24922    }
24923
24924  /* HACK: Since arm ELF uses Rel instead of Rela, encode the
24925     vtable entry to be used in the relocation's section offset.  */
24926  if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
24927    reloc->address = fixp->fx_offset;
24928
24929  return reloc;
24930}
24931
24932/* This fix_new is called by cons via TC_CONS_FIX_NEW.	*/
24933
24934void
24935cons_fix_new_arm (fragS *	frag,
24936		  int		where,
24937		  int		size,
24938		  expressionS * exp,
24939		  bfd_reloc_code_real_type reloc)
24940{
24941  int pcrel = 0;
24942
24943  /* Pick a reloc.
24944     FIXME: @@ Should look at CPU word size.  */
24945  switch (size)
24946    {
24947    case 1:
24948      reloc = BFD_RELOC_8;
24949      break;
24950    case 2:
24951      reloc = BFD_RELOC_16;
24952      break;
24953    case 4:
24954    default:
24955      reloc = BFD_RELOC_32;
24956      break;
24957    case 8:
24958      reloc = BFD_RELOC_64;
24959      break;
24960    }
24961
24962#ifdef TE_PE
24963  if (exp->X_op == O_secrel)
24964  {
24965    exp->X_op = O_symbol;
24966    reloc = BFD_RELOC_32_SECREL;
24967  }
24968#endif
24969
24970  fix_new_exp (frag, where, size, exp, pcrel, reloc);
24971}
24972
24973#if defined (OBJ_COFF)
24974void
24975arm_validate_fix (fixS * fixP)
24976{
24977  /* If the destination of the branch is a defined symbol which does not have
24978     the THUMB_FUNC attribute, then we must be calling a function which has
24979     the (interfacearm) attribute.  We look for the Thumb entry point to that
24980     function and change the branch to refer to that function instead.	*/
24981  if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
24982      && fixP->fx_addsy != NULL
24983      && S_IS_DEFINED (fixP->fx_addsy)
24984      && ! THUMB_IS_FUNC (fixP->fx_addsy))
24985    {
24986      fixP->fx_addsy = find_real_start (fixP->fx_addsy);
24987    }
24988}
24989#endif
24990
24991
24992int
24993arm_force_relocation (struct fix * fixp)
24994{
24995#if defined (OBJ_COFF) && defined (TE_PE)
24996  if (fixp->fx_r_type == BFD_RELOC_RVA)
24997    return 1;
24998#endif
24999
25000  /* In case we have a call or a branch to a function in ARM ISA mode from
25001     a thumb function or vice-versa force the relocation. These relocations
25002     are cleared off for some cores that might have blx and simple transformations
25003     are possible.  */
25004
25005#ifdef OBJ_ELF
25006  switch (fixp->fx_r_type)
25007    {
25008    case BFD_RELOC_ARM_PCREL_JUMP:
25009    case BFD_RELOC_ARM_PCREL_CALL:
25010    case BFD_RELOC_THUMB_PCREL_BLX:
25011      if (THUMB_IS_FUNC (fixp->fx_addsy))
25012	return 1;
25013      break;
25014
25015    case BFD_RELOC_ARM_PCREL_BLX:
25016    case BFD_RELOC_THUMB_PCREL_BRANCH25:
25017    case BFD_RELOC_THUMB_PCREL_BRANCH20:
25018    case BFD_RELOC_THUMB_PCREL_BRANCH23:
25019      if (ARM_IS_FUNC (fixp->fx_addsy))
25020	return 1;
25021      break;
25022
25023    default:
25024      break;
25025    }
25026#endif
25027
25028  /* Resolve these relocations even if the symbol is extern or weak.
25029     Technically this is probably wrong due to symbol preemption.
25030     In practice these relocations do not have enough range to be useful
25031     at dynamic link time, and some code (e.g. in the Linux kernel)
25032     expects these references to be resolved.  */
25033  if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
25034      || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
25035      || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM8
25036      || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
25037      || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
25038      || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2
25039      || fixp->fx_r_type == BFD_RELOC_ARM_THUMB_OFFSET
25040      || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
25041      || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
25042      || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
25043      || fixp->fx_r_type == BFD_RELOC_ARM_T32_OFFSET_IMM
25044      || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12
25045      || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM
25046      || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM_S2)
25047    return 0;
25048
25049  /* Always leave these relocations for the linker.  */
25050  if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
25051       && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
25052      || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
25053    return 1;
25054
25055  /* Always generate relocations against function symbols.  */
25056  if (fixp->fx_r_type == BFD_RELOC_32
25057      && fixp->fx_addsy
25058      && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
25059    return 1;
25060
25061  return generic_force_reloc (fixp);
25062}
25063
25064#if defined (OBJ_ELF) || defined (OBJ_COFF)
25065/* Relocations against function names must be left unadjusted,
25066   so that the linker can use this information to generate interworking
25067   stubs.  The MIPS version of this function
25068   also prevents relocations that are mips-16 specific, but I do not
25069   know why it does this.
25070
25071   FIXME:
25072   There is one other problem that ought to be addressed here, but
25073   which currently is not:  Taking the address of a label (rather
25074   than a function) and then later jumping to that address.  Such
25075   addresses also ought to have their bottom bit set (assuming that
25076   they reside in Thumb code), but at the moment they will not.	 */
25077
25078bfd_boolean
25079arm_fix_adjustable (fixS * fixP)
25080{
25081  if (fixP->fx_addsy == NULL)
25082    return 1;
25083
25084  /* Preserve relocations against symbols with function type.  */
25085  if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
25086    return FALSE;
25087
25088  if (THUMB_IS_FUNC (fixP->fx_addsy)
25089      && fixP->fx_subsy == NULL)
25090    return FALSE;
25091
25092  /* We need the symbol name for the VTABLE entries.  */
25093  if (	 fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
25094      || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
25095    return FALSE;
25096
25097  /* Don't allow symbols to be discarded on GOT related relocs.	 */
25098  if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
25099      || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
25100      || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
25101      || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
25102      || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32_FDPIC
25103      || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
25104      || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
25105      || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32_FDPIC
25106      || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
25107      || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32_FDPIC
25108      || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
25109      || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GOTDESC
25110      || fixP->fx_r_type == BFD_RELOC_ARM_TLS_CALL
25111      || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_CALL
25112      || fixP->fx_r_type == BFD_RELOC_ARM_TLS_DESCSEQ
25113      || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_DESCSEQ
25114      || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
25115    return FALSE;
25116
25117  /* Similarly for group relocations.  */
25118  if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
25119       && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
25120      || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
25121    return FALSE;
25122
25123  /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols.  */
25124  if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
25125      || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
25126      || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
25127      || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
25128      || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
25129      || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
25130      || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
25131      || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
25132    return FALSE;
25133
25134  /* BFD_RELOC_ARM_THUMB_ALU_ABS_Gx_NC relocations have VERY limited
25135     offsets, so keep these symbols.  */
25136  if (fixP->fx_r_type >= BFD_RELOC_ARM_THUMB_ALU_ABS_G0_NC
25137      && fixP->fx_r_type <= BFD_RELOC_ARM_THUMB_ALU_ABS_G3_NC)
25138    return FALSE;
25139
25140  return TRUE;
25141}
25142#endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
25143
25144#ifdef OBJ_ELF
25145const char *
25146elf32_arm_target_format (void)
25147{
25148#ifdef TE_SYMBIAN
25149  return (target_big_endian
25150	  ? "elf32-bigarm-symbian"
25151	  : "elf32-littlearm-symbian");
25152#elif defined (TE_VXWORKS)
25153  return (target_big_endian
25154	  ? "elf32-bigarm-vxworks"
25155	  : "elf32-littlearm-vxworks");
25156#elif defined (TE_NACL)
25157  return (target_big_endian
25158	  ? "elf32-bigarm-nacl"
25159	  : "elf32-littlearm-nacl");
25160#else
25161  if (arm_fdpic)
25162    {
25163      if (target_big_endian)
25164	return "elf32-bigarm-fdpic";
25165      else
25166	return "elf32-littlearm-fdpic";
25167    }
25168  else
25169    {
25170      if (target_big_endian)
25171	return "elf32-bigarm";
25172      else
25173	return "elf32-littlearm";
25174    }
25175#endif
25176}
25177
25178void
25179armelf_frob_symbol (symbolS * symp,
25180		    int *     puntp)
25181{
25182  elf_frob_symbol (symp, puntp);
25183}
25184#endif
25185
25186/* MD interface: Finalization.	*/
25187
25188void
25189arm_cleanup (void)
25190{
25191  literal_pool * pool;
25192
25193  /* Ensure that all the IT blocks are properly closed.  */
25194  check_it_blocks_finished ();
25195
25196  for (pool = list_of_pools; pool; pool = pool->next)
25197    {
25198      /* Put it at the end of the relevant section.  */
25199      subseg_set (pool->section, pool->sub_section);
25200#ifdef OBJ_ELF
25201      arm_elf_change_section ();
25202#endif
25203      s_ltorg (0);
25204    }
25205}
25206
25207#ifdef OBJ_ELF
25208/* Remove any excess mapping symbols generated for alignment frags in
25209   SEC.  We may have created a mapping symbol before a zero byte
25210   alignment; remove it if there's a mapping symbol after the
25211   alignment.  */
25212static void
25213check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
25214		       void *dummy ATTRIBUTE_UNUSED)
25215{
25216  segment_info_type *seginfo = seg_info (sec);
25217  fragS *fragp;
25218
25219  if (seginfo == NULL || seginfo->frchainP == NULL)
25220    return;
25221
25222  for (fragp = seginfo->frchainP->frch_root;
25223       fragp != NULL;
25224       fragp = fragp->fr_next)
25225    {
25226      symbolS *sym = fragp->tc_frag_data.last_map;
25227      fragS *next = fragp->fr_next;
25228
25229      /* Variable-sized frags have been converted to fixed size by
25230	 this point.  But if this was variable-sized to start with,
25231	 there will be a fixed-size frag after it.  So don't handle
25232	 next == NULL.  */
25233      if (sym == NULL || next == NULL)
25234	continue;
25235
25236      if (S_GET_VALUE (sym) < next->fr_address)
25237	/* Not at the end of this frag.  */
25238	continue;
25239      know (S_GET_VALUE (sym) == next->fr_address);
25240
25241      do
25242	{
25243	  if (next->tc_frag_data.first_map != NULL)
25244	    {
25245	      /* Next frag starts with a mapping symbol.  Discard this
25246		 one.  */
25247	      symbol_remove (sym, &symbol_rootP, &symbol_lastP);
25248	      break;
25249	    }
25250
25251	  if (next->fr_next == NULL)
25252	    {
25253	      /* This mapping symbol is at the end of the section.  Discard
25254		 it.  */
25255	      know (next->fr_fix == 0 && next->fr_var == 0);
25256	      symbol_remove (sym, &symbol_rootP, &symbol_lastP);
25257	      break;
25258	    }
25259
25260	  /* As long as we have empty frags without any mapping symbols,
25261	     keep looking.  */
25262	  /* If the next frag is non-empty and does not start with a
25263	     mapping symbol, then this mapping symbol is required.  */
25264	  if (next->fr_address != next->fr_next->fr_address)
25265	    break;
25266
25267	  next = next->fr_next;
25268	}
25269      while (next != NULL);
25270    }
25271}
25272#endif
25273
25274/* Adjust the symbol table.  This marks Thumb symbols as distinct from
25275   ARM ones.  */
25276
25277void
25278arm_adjust_symtab (void)
25279{
25280#ifdef OBJ_COFF
25281  symbolS * sym;
25282
25283  for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
25284    {
25285      if (ARM_IS_THUMB (sym))
25286	{
25287	  if (THUMB_IS_FUNC (sym))
25288	    {
25289	      /* Mark the symbol as a Thumb function.  */
25290	      if (   S_GET_STORAGE_CLASS (sym) == C_STAT
25291		  || S_GET_STORAGE_CLASS (sym) == C_LABEL)  /* This can happen!	 */
25292		S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
25293
25294	      else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
25295		S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
25296	      else
25297		as_bad (_("%s: unexpected function type: %d"),
25298			S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
25299	    }
25300	  else switch (S_GET_STORAGE_CLASS (sym))
25301	    {
25302	    case C_EXT:
25303	      S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
25304	      break;
25305	    case C_STAT:
25306	      S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
25307	      break;
25308	    case C_LABEL:
25309	      S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
25310	      break;
25311	    default:
25312	      /* Do nothing.  */
25313	      break;
25314	    }
25315	}
25316
25317      if (ARM_IS_INTERWORK (sym))
25318	coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
25319    }
25320#endif
25321#ifdef OBJ_ELF
25322  symbolS * sym;
25323  char	    bind;
25324
25325  for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
25326    {
25327      if (ARM_IS_THUMB (sym))
25328	{
25329	  elf_symbol_type * elf_sym;
25330
25331	  elf_sym = elf_symbol (symbol_get_bfdsym (sym));
25332	  bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
25333
25334	  if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
25335		BFD_ARM_SPECIAL_SYM_TYPE_ANY))
25336	    {
25337	      /* If it's a .thumb_func, declare it as so,
25338		 otherwise tag label as .code 16.  */
25339	      if (THUMB_IS_FUNC (sym))
25340		ARM_SET_SYM_BRANCH_TYPE (elf_sym->internal_elf_sym.st_target_internal,
25341					 ST_BRANCH_TO_THUMB);
25342	      else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
25343		elf_sym->internal_elf_sym.st_info =
25344		  ELF_ST_INFO (bind, STT_ARM_16BIT);
25345	    }
25346	}
25347    }
25348
25349  /* Remove any overlapping mapping symbols generated by alignment frags.  */
25350  bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
25351  /* Now do generic ELF adjustments.  */
25352  elf_adjust_symtab ();
25353#endif
25354}
25355
25356/* MD interface: Initialization.  */
25357
25358static void
25359set_constant_flonums (void)
25360{
25361  int i;
25362
25363  for (i = 0; i < NUM_FLOAT_VALS; i++)
25364    if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
25365      abort ();
25366}
25367
25368/* Auto-select Thumb mode if it's the only available instruction set for the
25369   given architecture.  */
25370
25371static void
25372autoselect_thumb_from_cpu_variant (void)
25373{
25374  if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
25375    opcode_select (16);
25376}
25377
25378void
25379md_begin (void)
25380{
25381  unsigned mach;
25382  unsigned int i;
25383
25384  if (	 (arm_ops_hsh = hash_new ()) == NULL
25385      || (arm_cond_hsh = hash_new ()) == NULL
25386      || (arm_shift_hsh = hash_new ()) == NULL
25387      || (arm_psr_hsh = hash_new ()) == NULL
25388      || (arm_v7m_psr_hsh = hash_new ()) == NULL
25389      || (arm_reg_hsh = hash_new ()) == NULL
25390      || (arm_reloc_hsh = hash_new ()) == NULL
25391      || (arm_barrier_opt_hsh = hash_new ()) == NULL)
25392    as_fatal (_("virtual memory exhausted"));
25393
25394  for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
25395    hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
25396  for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
25397    hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
25398  for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
25399    hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
25400  for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
25401    hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
25402  for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
25403    hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
25404		 (void *) (v7m_psrs + i));
25405  for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
25406    hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
25407  for (i = 0;
25408       i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
25409       i++)
25410    hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
25411		 (void *) (barrier_opt_names + i));
25412#ifdef OBJ_ELF
25413  for (i = 0; i < ARRAY_SIZE (reloc_names); i++)
25414    {
25415      struct reloc_entry * entry = reloc_names + i;
25416
25417      if (arm_is_eabi() && entry->reloc == BFD_RELOC_ARM_PLT32)
25418	/* This makes encode_branch() use the EABI versions of this relocation.  */
25419	entry->reloc = BFD_RELOC_UNUSED;
25420
25421      hash_insert (arm_reloc_hsh, entry->name, (void *) entry);
25422    }
25423#endif
25424
25425  set_constant_flonums ();
25426
25427  /* Set the cpu variant based on the command-line options.  We prefer
25428     -mcpu= over -march= if both are set (as for GCC); and we prefer
25429     -mfpu= over any other way of setting the floating point unit.
25430     Use of legacy options with new options are faulted.  */
25431  if (legacy_cpu)
25432    {
25433      if (mcpu_cpu_opt || march_cpu_opt)
25434	as_bad (_("use of old and new-style options to set CPU type"));
25435
25436      selected_arch = *legacy_cpu;
25437    }
25438  else if (mcpu_cpu_opt)
25439    {
25440      selected_arch = *mcpu_cpu_opt;
25441      selected_ext = *mcpu_ext_opt;
25442    }
25443  else if (march_cpu_opt)
25444    {
25445      selected_arch = *march_cpu_opt;
25446      selected_ext = *march_ext_opt;
25447    }
25448  ARM_MERGE_FEATURE_SETS (selected_cpu, selected_arch, selected_ext);
25449
25450  if (legacy_fpu)
25451    {
25452      if (mfpu_opt)
25453	as_bad (_("use of old and new-style options to set FPU type"));
25454
25455      selected_fpu = *legacy_fpu;
25456    }
25457  else if (mfpu_opt)
25458    selected_fpu = *mfpu_opt;
25459  else
25460    {
25461#if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
25462	|| defined (TE_NetBSD) || defined (TE_VXWORKS))
25463      /* Some environments specify a default FPU.  If they don't, infer it
25464	 from the processor.  */
25465      if (mcpu_fpu_opt)
25466	selected_fpu = *mcpu_fpu_opt;
25467      else if (march_fpu_opt)
25468	selected_fpu = *march_fpu_opt;
25469#else
25470      selected_fpu = fpu_default;
25471#endif
25472    }
25473
25474  if (ARM_FEATURE_ZERO (selected_fpu))
25475    {
25476      if (!no_cpu_selected ())
25477	selected_fpu = fpu_default;
25478      else
25479	selected_fpu = fpu_arch_fpa;
25480    }
25481
25482#ifdef CPU_DEFAULT
25483  if (ARM_FEATURE_ZERO (selected_arch))
25484    {
25485      selected_arch = cpu_default;
25486      selected_cpu = selected_arch;
25487    }
25488  ARM_MERGE_FEATURE_SETS (cpu_variant, selected_cpu, selected_fpu);
25489#else
25490  /*  Autodection of feature mode: allow all features in cpu_variant but leave
25491      selected_cpu unset.  It will be set in aeabi_set_public_attributes ()
25492      after all instruction have been processed and we can decide what CPU
25493      should be selected.  */
25494  if (ARM_FEATURE_ZERO (selected_arch))
25495    ARM_MERGE_FEATURE_SETS (cpu_variant, arm_arch_any, selected_fpu);
25496  else
25497    ARM_MERGE_FEATURE_SETS (cpu_variant, selected_cpu, selected_fpu);
25498#endif
25499
25500  autoselect_thumb_from_cpu_variant ();
25501
25502  arm_arch_used = thumb_arch_used = arm_arch_none;
25503
25504#if defined OBJ_COFF || defined OBJ_ELF
25505  {
25506    unsigned int flags = 0;
25507
25508#if defined OBJ_ELF
25509    flags = meabi_flags;
25510
25511    switch (meabi_flags)
25512      {
25513      case EF_ARM_EABI_UNKNOWN:
25514#endif
25515	/* Set the flags in the private structure.  */
25516	if (uses_apcs_26)      flags |= F_APCS26;
25517	if (support_interwork) flags |= F_INTERWORK;
25518	if (uses_apcs_float)   flags |= F_APCS_FLOAT;
25519	if (pic_code)	       flags |= F_PIC;
25520	if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
25521	  flags |= F_SOFT_FLOAT;
25522
25523	switch (mfloat_abi_opt)
25524	  {
25525	  case ARM_FLOAT_ABI_SOFT:
25526	  case ARM_FLOAT_ABI_SOFTFP:
25527	    flags |= F_SOFT_FLOAT;
25528	    break;
25529
25530	  case ARM_FLOAT_ABI_HARD:
25531	    if (flags & F_SOFT_FLOAT)
25532	      as_bad (_("hard-float conflicts with specified fpu"));
25533	    break;
25534	  }
25535
25536	/* Using pure-endian doubles (even if soft-float).	*/
25537	if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
25538	  flags |= F_VFP_FLOAT;
25539
25540#if defined OBJ_ELF
25541	if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
25542	    flags |= EF_ARM_MAVERICK_FLOAT;
25543	break;
25544
25545      case EF_ARM_EABI_VER4:
25546      case EF_ARM_EABI_VER5:
25547	/* No additional flags to set.	*/
25548	break;
25549
25550      default:
25551	abort ();
25552      }
25553#endif
25554    bfd_set_private_flags (stdoutput, flags);
25555
25556    /* We have run out flags in the COFF header to encode the
25557       status of ATPCS support, so instead we create a dummy,
25558       empty, debug section called .arm.atpcs.	*/
25559    if (atpcs)
25560      {
25561	asection * sec;
25562
25563	sec = bfd_make_section (stdoutput, ".arm.atpcs");
25564
25565	if (sec != NULL)
25566	  {
25567	    bfd_set_section_flags
25568	      (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
25569	    bfd_set_section_size (stdoutput, sec, 0);
25570	    bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
25571	  }
25572      }
25573  }
25574#endif
25575
25576  /* Record the CPU type as well.  */
25577  if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
25578    mach = bfd_mach_arm_iWMMXt2;
25579  else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
25580    mach = bfd_mach_arm_iWMMXt;
25581  else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
25582    mach = bfd_mach_arm_XScale;
25583  else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
25584    mach = bfd_mach_arm_ep9312;
25585  else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
25586    mach = bfd_mach_arm_5TE;
25587  else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
25588    {
25589      if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
25590	mach = bfd_mach_arm_5T;
25591      else
25592	mach = bfd_mach_arm_5;
25593    }
25594  else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
25595    {
25596      if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
25597	mach = bfd_mach_arm_4T;
25598      else
25599	mach = bfd_mach_arm_4;
25600    }
25601  else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
25602    mach = bfd_mach_arm_3M;
25603  else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
25604    mach = bfd_mach_arm_3;
25605  else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
25606    mach = bfd_mach_arm_2a;
25607  else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
25608    mach = bfd_mach_arm_2;
25609  else
25610    mach = bfd_mach_arm_unknown;
25611
25612  bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
25613}
25614
25615/* Command line processing.  */
25616
25617/* md_parse_option
25618      Invocation line includes a switch not recognized by the base assembler.
25619      See if it's a processor-specific option.
25620
25621      This routine is somewhat complicated by the need for backwards
25622      compatibility (since older releases of gcc can't be changed).
25623      The new options try to make the interface as compatible as
25624      possible with GCC.
25625
25626      New options (supported) are:
25627
25628	      -mcpu=<cpu name>		 Assemble for selected processor
25629	      -march=<architecture name> Assemble for selected architecture
25630	      -mfpu=<fpu architecture>	 Assemble for selected FPU.
25631	      -EB/-mbig-endian		 Big-endian
25632	      -EL/-mlittle-endian	 Little-endian
25633	      -k			 Generate PIC code
25634	      -mthumb			 Start in Thumb mode
25635	      -mthumb-interwork		 Code supports ARM/Thumb interworking
25636
25637	      -m[no-]warn-deprecated     Warn about deprecated features
25638	      -m[no-]warn-syms		 Warn when symbols match instructions
25639
25640      For now we will also provide support for:
25641
25642	      -mapcs-32			 32-bit Program counter
25643	      -mapcs-26			 26-bit Program counter
25644	      -macps-float		 Floats passed in FP registers
25645	      -mapcs-reentrant		 Reentrant code
25646	      -matpcs
25647      (sometime these will probably be replaced with -mapcs=<list of options>
25648      and -matpcs=<list of options>)
25649
25650      The remaining options are only supported for back-wards compatibility.
25651      Cpu variants, the arm part is optional:
25652	      -m[arm]1		      Currently not supported.
25653	      -m[arm]2, -m[arm]250    Arm 2 and Arm 250 processor
25654	      -m[arm]3		      Arm 3 processor
25655	      -m[arm]6[xx],	      Arm 6 processors
25656	      -m[arm]7[xx][t][[d]m]   Arm 7 processors
25657	      -m[arm]8[10]	      Arm 8 processors
25658	      -m[arm]9[20][tdmi]      Arm 9 processors
25659	      -mstrongarm[110[0]]     StrongARM processors
25660	      -mxscale		      XScale processors
25661	      -m[arm]v[2345[t[e]]]    Arm architectures
25662	      -mall		      All (except the ARM1)
25663      FP variants:
25664	      -mfpa10, -mfpa11	      FPA10 and 11 co-processor instructions
25665	      -mfpe-old		      (No float load/store multiples)
25666	      -mvfpxd		      VFP Single precision
25667	      -mvfp		      All VFP
25668	      -mno-fpu		      Disable all floating point instructions
25669
25670      The following CPU names are recognized:
25671	      arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
25672	      arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
25673	      arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
25674	      arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
25675	      arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
25676	      arm10t arm10e, arm1020t, arm1020e, arm10200e,
25677	      strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
25678
25679      */
25680
25681const char * md_shortopts = "m:k";
25682
25683#ifdef ARM_BI_ENDIAN
25684#define OPTION_EB (OPTION_MD_BASE + 0)
25685#define OPTION_EL (OPTION_MD_BASE + 1)
25686#else
25687#if TARGET_BYTES_BIG_ENDIAN
25688#define OPTION_EB (OPTION_MD_BASE + 0)
25689#else
25690#define OPTION_EL (OPTION_MD_BASE + 1)
25691#endif
25692#endif
25693#define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
25694#define OPTION_FDPIC (OPTION_MD_BASE + 3)
25695
25696struct option md_longopts[] =
25697{
25698#ifdef OPTION_EB
25699  {"EB", no_argument, NULL, OPTION_EB},
25700#endif
25701#ifdef OPTION_EL
25702  {"EL", no_argument, NULL, OPTION_EL},
25703#endif
25704  {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
25705#ifdef OBJ_ELF
25706  {"fdpic", no_argument, NULL, OPTION_FDPIC},
25707#endif
25708  {NULL, no_argument, NULL, 0}
25709};
25710
25711size_t md_longopts_size = sizeof (md_longopts);
25712
25713struct arm_option_table
25714{
25715  const char *  option;		/* Option name to match.  */
25716  const char *  help;		/* Help information.  */
25717  int *         var;		/* Variable to change.	*/
25718  int	        value;		/* What to change it to.  */
25719  const char *  deprecated;	/* If non-null, print this message.  */
25720};
25721
25722struct arm_option_table arm_opts[] =
25723{
25724  {"k",	     N_("generate PIC code"),	   &pic_code,	 1, NULL},
25725  {"mthumb", N_("assemble Thumb code"),	   &thumb_mode,	 1, NULL},
25726  {"mthumb-interwork", N_("support ARM/Thumb interworking"),
25727   &support_interwork, 1, NULL},
25728  {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
25729  {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
25730  {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
25731   1, NULL},
25732  {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
25733  {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
25734  {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
25735  {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
25736   NULL},
25737
25738  /* These are recognized by the assembler, but have no affect on code.	 */
25739  {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
25740  {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
25741
25742  {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
25743  {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
25744   &warn_on_deprecated, 0, NULL},
25745  {"mwarn-syms", N_("warn about symbols that match instruction names [default]"), (int *) (& flag_warn_syms), TRUE, NULL},
25746  {"mno-warn-syms", N_("disable warnings about symobls that match instructions"), (int *) (& flag_warn_syms), FALSE, NULL},
25747  {NULL, NULL, NULL, 0, NULL}
25748};
25749
25750struct arm_legacy_option_table
25751{
25752  const char *              option;		/* Option name to match.  */
25753  const arm_feature_set	**  var;		/* Variable to change.	*/
25754  const arm_feature_set	    value;		/* What to change it to.  */
25755  const char *              deprecated;		/* If non-null, print this message.  */
25756};
25757
25758const struct arm_legacy_option_table arm_legacy_opts[] =
25759{
25760  /* DON'T add any new processors to this list -- we want the whole list
25761     to go away...  Add them to the processors table instead.  */
25762  {"marm1",	 &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
25763  {"m1",	 &legacy_cpu, ARM_ARCH_V1,  N_("use -mcpu=arm1")},
25764  {"marm2",	 &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
25765  {"m2",	 &legacy_cpu, ARM_ARCH_V2,  N_("use -mcpu=arm2")},
25766  {"marm250",	 &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
25767  {"m250",	 &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
25768  {"marm3",	 &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
25769  {"m3",	 &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
25770  {"marm6",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
25771  {"m6",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm6")},
25772  {"marm600",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
25773  {"m600",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm600")},
25774  {"marm610",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
25775  {"m610",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm610")},
25776  {"marm620",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
25777  {"m620",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm620")},
25778  {"marm7",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
25779  {"m7",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7")},
25780  {"marm70",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
25781  {"m70",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm70")},
25782  {"marm700",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
25783  {"m700",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700")},
25784  {"marm700i",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
25785  {"m700i",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm700i")},
25786  {"marm710",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
25787  {"m710",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710")},
25788  {"marm710c",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
25789  {"m710c",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm710c")},
25790  {"marm720",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
25791  {"m720",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm720")},
25792  {"marm7d",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
25793  {"m7d",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7d")},
25794  {"marm7di",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
25795  {"m7di",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7di")},
25796  {"marm7m",	 &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
25797  {"m7m",	 &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
25798  {"marm7dm",	 &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
25799  {"m7dm",	 &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
25800  {"marm7dmi",	 &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
25801  {"m7dmi",	 &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
25802  {"marm7100",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
25803  {"m7100",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7100")},
25804  {"marm7500",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
25805  {"m7500",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500")},
25806  {"marm7500fe", &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
25807  {"m7500fe",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -mcpu=arm7500fe")},
25808  {"marm7t",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
25809  {"m7t",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
25810  {"marm7tdmi",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
25811  {"m7tdmi",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
25812  {"marm710t",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
25813  {"m710t",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
25814  {"marm720t",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
25815  {"m720t",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
25816  {"marm740t",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
25817  {"m740t",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
25818  {"marm8",	 &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
25819  {"m8",	 &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm8")},
25820  {"marm810",	 &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
25821  {"m810",	 &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=arm810")},
25822  {"marm9",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
25823  {"m9",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
25824  {"marm9tdmi",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
25825  {"m9tdmi",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
25826  {"marm920",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
25827  {"m920",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
25828  {"marm940",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
25829  {"m940",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
25830  {"mstrongarm", &legacy_cpu, ARM_ARCH_V4,  N_("use -mcpu=strongarm")},
25831  {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
25832   N_("use -mcpu=strongarm110")},
25833  {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
25834   N_("use -mcpu=strongarm1100")},
25835  {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
25836   N_("use -mcpu=strongarm1110")},
25837  {"mxscale",	 &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
25838  {"miwmmxt",	 &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
25839  {"mall",	 &legacy_cpu, ARM_ANY,	       N_("use -mcpu=all")},
25840
25841  /* Architecture variants -- don't add any more to this list either.  */
25842  {"mv2",	 &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
25843  {"marmv2",	 &legacy_cpu, ARM_ARCH_V2,  N_("use -march=armv2")},
25844  {"mv2a",	 &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
25845  {"marmv2a",	 &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
25846  {"mv3",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
25847  {"marmv3",	 &legacy_cpu, ARM_ARCH_V3,  N_("use -march=armv3")},
25848  {"mv3m",	 &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
25849  {"marmv3m",	 &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
25850  {"mv4",	 &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
25851  {"marmv4",	 &legacy_cpu, ARM_ARCH_V4,  N_("use -march=armv4")},
25852  {"mv4t",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
25853  {"marmv4t",	 &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
25854  {"mv5",	 &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
25855  {"marmv5",	 &legacy_cpu, ARM_ARCH_V5,  N_("use -march=armv5")},
25856  {"mv5t",	 &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
25857  {"marmv5t",	 &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
25858  {"mv5e",	 &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
25859  {"marmv5e",	 &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
25860
25861  /* Floating point variants -- don't add any more to this list either.	 */
25862  {"mfpe-old",   &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
25863  {"mfpa10",     &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
25864  {"mfpa11",     &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
25865  {"mno-fpu",    &legacy_fpu, ARM_ARCH_NONE,
25866   N_("use either -mfpu=softfpa or -mfpu=softvfp")},
25867
25868  {NULL, NULL, ARM_ARCH_NONE, NULL}
25869};
25870
25871struct arm_cpu_option_table
25872{
25873  const char *           name;
25874  size_t                 name_len;
25875  const arm_feature_set	 value;
25876  const arm_feature_set	 ext;
25877  /* For some CPUs we assume an FPU unless the user explicitly sets
25878     -mfpu=...	*/
25879  const arm_feature_set	 default_fpu;
25880  /* The canonical name of the CPU, or NULL to use NAME converted to upper
25881     case.  */
25882  const char *           canonical_name;
25883};
25884
25885/* This list should, at a minimum, contain all the cpu names
25886   recognized by GCC.  */
25887#define ARM_CPU_OPT(N, CN, V, E, DF) { N, sizeof (N) - 1, V, E, DF, CN }
25888
25889static const struct arm_cpu_option_table arm_cpus[] =
25890{
25891  ARM_CPU_OPT ("all",		  NULL,		       ARM_ANY,
25892	       ARM_ARCH_NONE,
25893	       FPU_ARCH_FPA),
25894  ARM_CPU_OPT ("arm1",		  NULL,		       ARM_ARCH_V1,
25895	       ARM_ARCH_NONE,
25896	       FPU_ARCH_FPA),
25897  ARM_CPU_OPT ("arm2",		  NULL,		       ARM_ARCH_V2,
25898	       ARM_ARCH_NONE,
25899	       FPU_ARCH_FPA),
25900  ARM_CPU_OPT ("arm250",	  NULL,		       ARM_ARCH_V2S,
25901	       ARM_ARCH_NONE,
25902	       FPU_ARCH_FPA),
25903  ARM_CPU_OPT ("arm3",		  NULL,		       ARM_ARCH_V2S,
25904	       ARM_ARCH_NONE,
25905	       FPU_ARCH_FPA),
25906  ARM_CPU_OPT ("arm6",		  NULL,		       ARM_ARCH_V3,
25907	       ARM_ARCH_NONE,
25908	       FPU_ARCH_FPA),
25909  ARM_CPU_OPT ("arm60",		  NULL,		       ARM_ARCH_V3,
25910	       ARM_ARCH_NONE,
25911	       FPU_ARCH_FPA),
25912  ARM_CPU_OPT ("arm600",	  NULL,		       ARM_ARCH_V3,
25913	       ARM_ARCH_NONE,
25914	       FPU_ARCH_FPA),
25915  ARM_CPU_OPT ("arm610",	  NULL,		       ARM_ARCH_V3,
25916	       ARM_ARCH_NONE,
25917	       FPU_ARCH_FPA),
25918  ARM_CPU_OPT ("arm620",	  NULL,		       ARM_ARCH_V3,
25919	       ARM_ARCH_NONE,
25920	       FPU_ARCH_FPA),
25921  ARM_CPU_OPT ("arm7",		  NULL,		       ARM_ARCH_V3,
25922	       ARM_ARCH_NONE,
25923	       FPU_ARCH_FPA),
25924  ARM_CPU_OPT ("arm7m",		  NULL,		       ARM_ARCH_V3M,
25925	       ARM_ARCH_NONE,
25926	       FPU_ARCH_FPA),
25927  ARM_CPU_OPT ("arm7d",		  NULL,		       ARM_ARCH_V3,
25928	       ARM_ARCH_NONE,
25929	       FPU_ARCH_FPA),
25930  ARM_CPU_OPT ("arm7dm",	  NULL,		       ARM_ARCH_V3M,
25931	       ARM_ARCH_NONE,
25932	       FPU_ARCH_FPA),
25933  ARM_CPU_OPT ("arm7di",	  NULL,		       ARM_ARCH_V3,
25934	       ARM_ARCH_NONE,
25935	       FPU_ARCH_FPA),
25936  ARM_CPU_OPT ("arm7dmi",	  NULL,		       ARM_ARCH_V3M,
25937	       ARM_ARCH_NONE,
25938	       FPU_ARCH_FPA),
25939  ARM_CPU_OPT ("arm70",		  NULL,		       ARM_ARCH_V3,
25940	       ARM_ARCH_NONE,
25941	       FPU_ARCH_FPA),
25942  ARM_CPU_OPT ("arm700",	  NULL,		       ARM_ARCH_V3,
25943	       ARM_ARCH_NONE,
25944	       FPU_ARCH_FPA),
25945  ARM_CPU_OPT ("arm700i",	  NULL,		       ARM_ARCH_V3,
25946	       ARM_ARCH_NONE,
25947	       FPU_ARCH_FPA),
25948  ARM_CPU_OPT ("arm710",	  NULL,		       ARM_ARCH_V3,
25949	       ARM_ARCH_NONE,
25950	       FPU_ARCH_FPA),
25951  ARM_CPU_OPT ("arm710t",	  NULL,		       ARM_ARCH_V4T,
25952	       ARM_ARCH_NONE,
25953	       FPU_ARCH_FPA),
25954  ARM_CPU_OPT ("arm720",	  NULL,		       ARM_ARCH_V3,
25955	       ARM_ARCH_NONE,
25956	       FPU_ARCH_FPA),
25957  ARM_CPU_OPT ("arm720t",	  NULL,		       ARM_ARCH_V4T,
25958	       ARM_ARCH_NONE,
25959	       FPU_ARCH_FPA),
25960  ARM_CPU_OPT ("arm740t",	  NULL,		       ARM_ARCH_V4T,
25961	       ARM_ARCH_NONE,
25962	       FPU_ARCH_FPA),
25963  ARM_CPU_OPT ("arm710c",	  NULL,		       ARM_ARCH_V3,
25964	       ARM_ARCH_NONE,
25965	       FPU_ARCH_FPA),
25966  ARM_CPU_OPT ("arm7100",	  NULL,		       ARM_ARCH_V3,
25967	       ARM_ARCH_NONE,
25968	       FPU_ARCH_FPA),
25969  ARM_CPU_OPT ("arm7500",	  NULL,		       ARM_ARCH_V3,
25970	       ARM_ARCH_NONE,
25971	       FPU_ARCH_FPA),
25972  ARM_CPU_OPT ("arm7500fe",	  NULL,		       ARM_ARCH_V3,
25973	       ARM_ARCH_NONE,
25974	       FPU_ARCH_FPA),
25975  ARM_CPU_OPT ("arm7t",		  NULL,		       ARM_ARCH_V4T,
25976	       ARM_ARCH_NONE,
25977	       FPU_ARCH_FPA),
25978  ARM_CPU_OPT ("arm7tdmi",	  NULL,		       ARM_ARCH_V4T,
25979	       ARM_ARCH_NONE,
25980	       FPU_ARCH_FPA),
25981  ARM_CPU_OPT ("arm7tdmi-s",	  NULL,		       ARM_ARCH_V4T,
25982	       ARM_ARCH_NONE,
25983	       FPU_ARCH_FPA),
25984  ARM_CPU_OPT ("arm8",		  NULL,		       ARM_ARCH_V4,
25985	       ARM_ARCH_NONE,
25986	       FPU_ARCH_FPA),
25987  ARM_CPU_OPT ("arm810",	  NULL,		       ARM_ARCH_V4,
25988	       ARM_ARCH_NONE,
25989	       FPU_ARCH_FPA),
25990  ARM_CPU_OPT ("strongarm",	  NULL,		       ARM_ARCH_V4,
25991	       ARM_ARCH_NONE,
25992	       FPU_ARCH_FPA),
25993  ARM_CPU_OPT ("strongarm1",	  NULL,		       ARM_ARCH_V4,
25994	       ARM_ARCH_NONE,
25995	       FPU_ARCH_FPA),
25996  ARM_CPU_OPT ("strongarm110",	  NULL,		       ARM_ARCH_V4,
25997	       ARM_ARCH_NONE,
25998	       FPU_ARCH_FPA),
25999  ARM_CPU_OPT ("strongarm1100",	  NULL,		       ARM_ARCH_V4,
26000	       ARM_ARCH_NONE,
26001	       FPU_ARCH_FPA),
26002  ARM_CPU_OPT ("strongarm1110",	  NULL,		       ARM_ARCH_V4,
26003	       ARM_ARCH_NONE,
26004	       FPU_ARCH_FPA),
26005  ARM_CPU_OPT ("arm9",		  NULL,		       ARM_ARCH_V4T,
26006	       ARM_ARCH_NONE,
26007	       FPU_ARCH_FPA),
26008  ARM_CPU_OPT ("arm920",	  "ARM920T",	       ARM_ARCH_V4T,
26009	       ARM_ARCH_NONE,
26010	       FPU_ARCH_FPA),
26011  ARM_CPU_OPT ("arm920t",	  NULL,		       ARM_ARCH_V4T,
26012	       ARM_ARCH_NONE,
26013	       FPU_ARCH_FPA),
26014  ARM_CPU_OPT ("arm922t",	  NULL,		       ARM_ARCH_V4T,
26015	       ARM_ARCH_NONE,
26016	       FPU_ARCH_FPA),
26017  ARM_CPU_OPT ("arm940t",	  NULL,		       ARM_ARCH_V4T,
26018	       ARM_ARCH_NONE,
26019	       FPU_ARCH_FPA),
26020  ARM_CPU_OPT ("arm9tdmi",	  NULL,		       ARM_ARCH_V4T,
26021	       ARM_ARCH_NONE,
26022	       FPU_ARCH_FPA),
26023  ARM_CPU_OPT ("fa526",		  NULL,		       ARM_ARCH_V4,
26024	       ARM_ARCH_NONE,
26025	       FPU_ARCH_FPA),
26026  ARM_CPU_OPT ("fa626",		  NULL,		       ARM_ARCH_V4,
26027	       ARM_ARCH_NONE,
26028	       FPU_ARCH_FPA),
26029
26030  /* For V5 or later processors we default to using VFP; but the user
26031     should really set the FPU type explicitly.	 */
26032  ARM_CPU_OPT ("arm9e-r0",	  NULL,		       ARM_ARCH_V5TExP,
26033	       ARM_ARCH_NONE,
26034	       FPU_ARCH_VFP_V2),
26035  ARM_CPU_OPT ("arm9e",		  NULL,		       ARM_ARCH_V5TE,
26036	       ARM_ARCH_NONE,
26037	       FPU_ARCH_VFP_V2),
26038  ARM_CPU_OPT ("arm926ej",	  "ARM926EJ-S",	       ARM_ARCH_V5TEJ,
26039	       ARM_ARCH_NONE,
26040	       FPU_ARCH_VFP_V2),
26041  ARM_CPU_OPT ("arm926ejs",	  "ARM926EJ-S",	       ARM_ARCH_V5TEJ,
26042	       ARM_ARCH_NONE,
26043	       FPU_ARCH_VFP_V2),
26044  ARM_CPU_OPT ("arm926ej-s",	  NULL,		       ARM_ARCH_V5TEJ,
26045	       ARM_ARCH_NONE,
26046	       FPU_ARCH_VFP_V2),
26047  ARM_CPU_OPT ("arm946e-r0",	  NULL,		       ARM_ARCH_V5TExP,
26048	       ARM_ARCH_NONE,
26049	       FPU_ARCH_VFP_V2),
26050  ARM_CPU_OPT ("arm946e",	  "ARM946E-S",	       ARM_ARCH_V5TE,
26051	       ARM_ARCH_NONE,
26052	       FPU_ARCH_VFP_V2),
26053  ARM_CPU_OPT ("arm946e-s",	  NULL,		       ARM_ARCH_V5TE,
26054	       ARM_ARCH_NONE,
26055	       FPU_ARCH_VFP_V2),
26056  ARM_CPU_OPT ("arm966e-r0",	  NULL,		       ARM_ARCH_V5TExP,
26057	       ARM_ARCH_NONE,
26058	       FPU_ARCH_VFP_V2),
26059  ARM_CPU_OPT ("arm966e",	  "ARM966E-S",	       ARM_ARCH_V5TE,
26060	       ARM_ARCH_NONE,
26061	       FPU_ARCH_VFP_V2),
26062  ARM_CPU_OPT ("arm966e-s",	  NULL,		       ARM_ARCH_V5TE,
26063	       ARM_ARCH_NONE,
26064	       FPU_ARCH_VFP_V2),
26065  ARM_CPU_OPT ("arm968e-s",	  NULL,		       ARM_ARCH_V5TE,
26066	       ARM_ARCH_NONE,
26067	       FPU_ARCH_VFP_V2),
26068  ARM_CPU_OPT ("arm10t",	  NULL,		       ARM_ARCH_V5T,
26069	       ARM_ARCH_NONE,
26070	       FPU_ARCH_VFP_V1),
26071  ARM_CPU_OPT ("arm10tdmi",	  NULL,		       ARM_ARCH_V5T,
26072	       ARM_ARCH_NONE,
26073	       FPU_ARCH_VFP_V1),
26074  ARM_CPU_OPT ("arm10e",	  NULL,		       ARM_ARCH_V5TE,
26075	       ARM_ARCH_NONE,
26076	       FPU_ARCH_VFP_V2),
26077  ARM_CPU_OPT ("arm1020",	  "ARM1020E",	       ARM_ARCH_V5TE,
26078	       ARM_ARCH_NONE,
26079	       FPU_ARCH_VFP_V2),
26080  ARM_CPU_OPT ("arm1020t",	  NULL,		       ARM_ARCH_V5T,
26081	       ARM_ARCH_NONE,
26082	       FPU_ARCH_VFP_V1),
26083  ARM_CPU_OPT ("arm1020e",	  NULL,		       ARM_ARCH_V5TE,
26084	       ARM_ARCH_NONE,
26085	       FPU_ARCH_VFP_V2),
26086  ARM_CPU_OPT ("arm1022e",	  NULL,		       ARM_ARCH_V5TE,
26087	       ARM_ARCH_NONE,
26088	       FPU_ARCH_VFP_V2),
26089  ARM_CPU_OPT ("arm1026ejs",	  "ARM1026EJ-S",       ARM_ARCH_V5TEJ,
26090	       ARM_ARCH_NONE,
26091	       FPU_ARCH_VFP_V2),
26092  ARM_CPU_OPT ("arm1026ej-s",	  NULL,		       ARM_ARCH_V5TEJ,
26093	       ARM_ARCH_NONE,
26094	       FPU_ARCH_VFP_V2),
26095  ARM_CPU_OPT ("fa606te",	  NULL,		       ARM_ARCH_V5TE,
26096	       ARM_ARCH_NONE,
26097	       FPU_ARCH_VFP_V2),
26098  ARM_CPU_OPT ("fa616te",	  NULL,		       ARM_ARCH_V5TE,
26099	       ARM_ARCH_NONE,
26100	       FPU_ARCH_VFP_V2),
26101  ARM_CPU_OPT ("fa626te",	  NULL,		       ARM_ARCH_V5TE,
26102	       ARM_ARCH_NONE,
26103	       FPU_ARCH_VFP_V2),
26104  ARM_CPU_OPT ("fmp626",	  NULL,		       ARM_ARCH_V5TE,
26105	       ARM_ARCH_NONE,
26106	       FPU_ARCH_VFP_V2),
26107  ARM_CPU_OPT ("fa726te",	  NULL,		       ARM_ARCH_V5TE,
26108	       ARM_ARCH_NONE,
26109	       FPU_ARCH_VFP_V2),
26110  ARM_CPU_OPT ("arm1136js",	  "ARM1136J-S",	       ARM_ARCH_V6,
26111	       ARM_ARCH_NONE,
26112	       FPU_NONE),
26113  ARM_CPU_OPT ("arm1136j-s",	  NULL,		       ARM_ARCH_V6,
26114	       ARM_ARCH_NONE,
26115	       FPU_NONE),
26116  ARM_CPU_OPT ("arm1136jfs",	  "ARM1136JF-S",       ARM_ARCH_V6,
26117	       ARM_ARCH_NONE,
26118	       FPU_ARCH_VFP_V2),
26119  ARM_CPU_OPT ("arm1136jf-s",	  NULL,		       ARM_ARCH_V6,
26120	       ARM_ARCH_NONE,
26121	       FPU_ARCH_VFP_V2),
26122  ARM_CPU_OPT ("mpcore",	  "MPCore",	       ARM_ARCH_V6K,
26123	       ARM_ARCH_NONE,
26124	       FPU_ARCH_VFP_V2),
26125  ARM_CPU_OPT ("mpcorenovfp",	  "MPCore",	       ARM_ARCH_V6K,
26126	       ARM_ARCH_NONE,
26127	       FPU_NONE),
26128  ARM_CPU_OPT ("arm1156t2-s",	  NULL,		       ARM_ARCH_V6T2,
26129	       ARM_ARCH_NONE,
26130	       FPU_NONE),
26131  ARM_CPU_OPT ("arm1156t2f-s",	  NULL,		       ARM_ARCH_V6T2,
26132	       ARM_ARCH_NONE,
26133	       FPU_ARCH_VFP_V2),
26134  ARM_CPU_OPT ("arm1176jz-s",	  NULL,		       ARM_ARCH_V6KZ,
26135	       ARM_ARCH_NONE,
26136	       FPU_NONE),
26137  ARM_CPU_OPT ("arm1176jzf-s",	  NULL,		       ARM_ARCH_V6KZ,
26138	       ARM_ARCH_NONE,
26139	       FPU_ARCH_VFP_V2),
26140  ARM_CPU_OPT ("cortex-a5",	  "Cortex-A5",	       ARM_ARCH_V7A,
26141	       ARM_FEATURE_CORE_LOW (ARM_EXT_MP | ARM_EXT_SEC),
26142	       FPU_NONE),
26143  ARM_CPU_OPT ("cortex-a7",	  "Cortex-A7",	       ARM_ARCH_V7VE,
26144	       ARM_ARCH_NONE,
26145	       FPU_ARCH_NEON_VFP_V4),
26146  ARM_CPU_OPT ("cortex-a8",	  "Cortex-A8",	       ARM_ARCH_V7A,
26147	       ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
26148	       ARM_FEATURE_COPROC (FPU_VFP_V3 | FPU_NEON_EXT_V1)),
26149  ARM_CPU_OPT ("cortex-a9",	  "Cortex-A9",	       ARM_ARCH_V7A,
26150	       ARM_FEATURE_CORE_LOW (ARM_EXT_MP | ARM_EXT_SEC),
26151	       ARM_FEATURE_COPROC (FPU_VFP_V3 | FPU_NEON_EXT_V1)),
26152  ARM_CPU_OPT ("cortex-a12",	  "Cortex-A12",	       ARM_ARCH_V7VE,
26153	       ARM_ARCH_NONE,
26154	       FPU_ARCH_NEON_VFP_V4),
26155  ARM_CPU_OPT ("cortex-a15",	  "Cortex-A15",	       ARM_ARCH_V7VE,
26156	       ARM_ARCH_NONE,
26157	       FPU_ARCH_NEON_VFP_V4),
26158  ARM_CPU_OPT ("cortex-a17",	  "Cortex-A17",	       ARM_ARCH_V7VE,
26159	       ARM_ARCH_NONE,
26160	       FPU_ARCH_NEON_VFP_V4),
26161  ARM_CPU_OPT ("cortex-a32",	  "Cortex-A32",	       ARM_ARCH_V8A,
26162	       ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
26163	       FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
26164  ARM_CPU_OPT ("cortex-a35",	  "Cortex-A35",	       ARM_ARCH_V8A,
26165	       ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
26166	       FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
26167  ARM_CPU_OPT ("cortex-a53",	  "Cortex-A53",	       ARM_ARCH_V8A,
26168	       ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
26169	       FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
26170  ARM_CPU_OPT ("cortex-a55",    "Cortex-A55",	       ARM_ARCH_V8_2A,
26171	       ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
26172	       FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_DOTPROD),
26173  ARM_CPU_OPT ("cortex-a57",	  "Cortex-A57",	       ARM_ARCH_V8A,
26174	       ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
26175	       FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
26176  ARM_CPU_OPT ("cortex-a72",	  "Cortex-A72",	       ARM_ARCH_V8A,
26177	      ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
26178	      FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
26179  ARM_CPU_OPT ("cortex-a73",	  "Cortex-A73",	       ARM_ARCH_V8A,
26180	      ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
26181	      FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
26182  ARM_CPU_OPT ("cortex-a75",    "Cortex-A75",	       ARM_ARCH_V8_2A,
26183	       ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
26184	       FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_DOTPROD),
26185  ARM_CPU_OPT ("cortex-a76",    "Cortex-A76",	       ARM_ARCH_V8_2A,
26186	       ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
26187	       FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_DOTPROD),
26188  ARM_CPU_OPT ("cortex-r4",	  "Cortex-R4",	       ARM_ARCH_V7R,
26189	       ARM_ARCH_NONE,
26190	       FPU_NONE),
26191  ARM_CPU_OPT ("cortex-r4f",	  "Cortex-R4F",	       ARM_ARCH_V7R,
26192	       ARM_ARCH_NONE,
26193	       FPU_ARCH_VFP_V3D16),
26194  ARM_CPU_OPT ("cortex-r5",	  "Cortex-R5",	       ARM_ARCH_V7R,
26195	       ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
26196	       FPU_NONE),
26197  ARM_CPU_OPT ("cortex-r7",	  "Cortex-R7",	       ARM_ARCH_V7R,
26198	       ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
26199	       FPU_ARCH_VFP_V3D16),
26200  ARM_CPU_OPT ("cortex-r8",	  "Cortex-R8",	       ARM_ARCH_V7R,
26201	       ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV),
26202	       FPU_ARCH_VFP_V3D16),
26203  ARM_CPU_OPT ("cortex-r52",	  "Cortex-R52",	       ARM_ARCH_V8R,
26204	      ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
26205	      FPU_ARCH_NEON_VFP_ARMV8),
26206  ARM_CPU_OPT ("cortex-m33",	  "Cortex-M33",	       ARM_ARCH_V8M_MAIN,
26207	       ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP),
26208	       FPU_NONE),
26209  ARM_CPU_OPT ("cortex-m23",	  "Cortex-M23",	       ARM_ARCH_V8M_BASE,
26210	       ARM_ARCH_NONE,
26211	       FPU_NONE),
26212  ARM_CPU_OPT ("cortex-m7",	  "Cortex-M7",	       ARM_ARCH_V7EM,
26213	       ARM_ARCH_NONE,
26214	       FPU_NONE),
26215  ARM_CPU_OPT ("cortex-m4",	  "Cortex-M4",	       ARM_ARCH_V7EM,
26216	       ARM_ARCH_NONE,
26217	       FPU_NONE),
26218  ARM_CPU_OPT ("cortex-m3",	  "Cortex-M3",	       ARM_ARCH_V7M,
26219	       ARM_ARCH_NONE,
26220	       FPU_NONE),
26221  ARM_CPU_OPT ("cortex-m1",	  "Cortex-M1",	       ARM_ARCH_V6SM,
26222	       ARM_ARCH_NONE,
26223	       FPU_NONE),
26224  ARM_CPU_OPT ("cortex-m0",	  "Cortex-M0",	       ARM_ARCH_V6SM,
26225	       ARM_ARCH_NONE,
26226	       FPU_NONE),
26227  ARM_CPU_OPT ("cortex-m0plus",	  "Cortex-M0+",	       ARM_ARCH_V6SM,
26228	       ARM_ARCH_NONE,
26229	       FPU_NONE),
26230  ARM_CPU_OPT ("exynos-m1",	  "Samsung Exynos M1", ARM_ARCH_V8A,
26231	       ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
26232	       FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
26233
26234  /* ??? XSCALE is really an architecture.  */
26235  ARM_CPU_OPT ("xscale",	  NULL,		       ARM_ARCH_XSCALE,
26236	       ARM_ARCH_NONE,
26237	       FPU_ARCH_VFP_V2),
26238
26239  /* ??? iwmmxt is not a processor.  */
26240  ARM_CPU_OPT ("iwmmxt",	  NULL,		       ARM_ARCH_IWMMXT,
26241	       ARM_ARCH_NONE,
26242	       FPU_ARCH_VFP_V2),
26243  ARM_CPU_OPT ("iwmmxt2",	  NULL,		       ARM_ARCH_IWMMXT2,
26244	       ARM_ARCH_NONE,
26245	       FPU_ARCH_VFP_V2),
26246  ARM_CPU_OPT ("i80200",	  NULL,		       ARM_ARCH_XSCALE,
26247	       ARM_ARCH_NONE,
26248	       FPU_ARCH_VFP_V2),
26249
26250  /* Maverick.  */
26251  ARM_CPU_OPT ("ep9312",	  "ARM920T",
26252	       ARM_FEATURE_LOW (ARM_AEXT_V4T, ARM_CEXT_MAVERICK),
26253	       ARM_ARCH_NONE, FPU_ARCH_MAVERICK),
26254
26255  /* Marvell processors.  */
26256  ARM_CPU_OPT ("marvell-pj4",	  NULL,		       ARM_ARCH_V7A,
26257	       ARM_FEATURE_CORE_LOW (ARM_EXT_MP | ARM_EXT_SEC),
26258	       FPU_ARCH_VFP_V3D16),
26259  ARM_CPU_OPT ("marvell-whitney", NULL,		       ARM_ARCH_V7A,
26260	       ARM_FEATURE_CORE_LOW (ARM_EXT_MP | ARM_EXT_SEC),
26261	       FPU_ARCH_NEON_VFP_V4),
26262
26263  /* APM X-Gene family.  */
26264  ARM_CPU_OPT ("xgene1",	  "APM X-Gene 1",      ARM_ARCH_V8A,
26265	       ARM_ARCH_NONE,
26266	       FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
26267  ARM_CPU_OPT ("xgene2",	  "APM X-Gene 2",      ARM_ARCH_V8A,
26268	       ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
26269	       FPU_ARCH_CRYPTO_NEON_VFP_ARMV8),
26270
26271  { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL }
26272};
26273#undef ARM_CPU_OPT
26274
26275struct arm_arch_option_table
26276{
26277  const char *           name;
26278  size_t                 name_len;
26279  const arm_feature_set	 value;
26280  const arm_feature_set	 default_fpu;
26281};
26282
26283/* This list should, at a minimum, contain all the architecture names
26284   recognized by GCC.  */
26285#define ARM_ARCH_OPT(N, V, DF) { N, sizeof (N) - 1, V, DF }
26286
26287static const struct arm_arch_option_table arm_archs[] =
26288{
26289  ARM_ARCH_OPT ("all",		ARM_ANY,	 FPU_ARCH_FPA),
26290  ARM_ARCH_OPT ("armv1",	ARM_ARCH_V1,	 FPU_ARCH_FPA),
26291  ARM_ARCH_OPT ("armv2",	ARM_ARCH_V2,	 FPU_ARCH_FPA),
26292  ARM_ARCH_OPT ("armv2a",	ARM_ARCH_V2S,	 FPU_ARCH_FPA),
26293  ARM_ARCH_OPT ("armv2s",	ARM_ARCH_V2S,	 FPU_ARCH_FPA),
26294  ARM_ARCH_OPT ("armv3",	ARM_ARCH_V3,	 FPU_ARCH_FPA),
26295  ARM_ARCH_OPT ("armv3m",	ARM_ARCH_V3M,	 FPU_ARCH_FPA),
26296  ARM_ARCH_OPT ("armv4",	ARM_ARCH_V4,	 FPU_ARCH_FPA),
26297  ARM_ARCH_OPT ("armv4xm",	ARM_ARCH_V4xM,	 FPU_ARCH_FPA),
26298  ARM_ARCH_OPT ("armv4t",	ARM_ARCH_V4T,	 FPU_ARCH_FPA),
26299  ARM_ARCH_OPT ("armv4txm",	ARM_ARCH_V4TxM,	 FPU_ARCH_FPA),
26300  ARM_ARCH_OPT ("armv5",	ARM_ARCH_V5,	 FPU_ARCH_VFP),
26301  ARM_ARCH_OPT ("armv5t",	ARM_ARCH_V5T,	 FPU_ARCH_VFP),
26302  ARM_ARCH_OPT ("armv5txm",	ARM_ARCH_V5TxM,	 FPU_ARCH_VFP),
26303  ARM_ARCH_OPT ("armv5te",	ARM_ARCH_V5TE,	 FPU_ARCH_VFP),
26304  ARM_ARCH_OPT ("armv5texp",	ARM_ARCH_V5TExP, FPU_ARCH_VFP),
26305  ARM_ARCH_OPT ("armv5tej",	ARM_ARCH_V5TEJ,	 FPU_ARCH_VFP),
26306  ARM_ARCH_OPT ("armv6",	ARM_ARCH_V6,	 FPU_ARCH_VFP),
26307  ARM_ARCH_OPT ("armv6j",	ARM_ARCH_V6,	 FPU_ARCH_VFP),
26308  ARM_ARCH_OPT ("armv6k",	ARM_ARCH_V6K,	 FPU_ARCH_VFP),
26309  ARM_ARCH_OPT ("armv6z",	ARM_ARCH_V6Z,	 FPU_ARCH_VFP),
26310  /* The official spelling of this variant is ARMv6KZ, the name "armv6zk" is
26311     kept to preserve existing behaviour.  */
26312  ARM_ARCH_OPT ("armv6kz",	ARM_ARCH_V6KZ,	 FPU_ARCH_VFP),
26313  ARM_ARCH_OPT ("armv6zk",	ARM_ARCH_V6KZ,	 FPU_ARCH_VFP),
26314  ARM_ARCH_OPT ("armv6t2",	ARM_ARCH_V6T2,	 FPU_ARCH_VFP),
26315  ARM_ARCH_OPT ("armv6kt2",	ARM_ARCH_V6KT2,	 FPU_ARCH_VFP),
26316  ARM_ARCH_OPT ("armv6zt2",	ARM_ARCH_V6ZT2,	 FPU_ARCH_VFP),
26317  /* The official spelling of this variant is ARMv6KZ, the name "armv6zkt2" is
26318     kept to preserve existing behaviour.  */
26319  ARM_ARCH_OPT ("armv6kzt2",	ARM_ARCH_V6KZT2, FPU_ARCH_VFP),
26320  ARM_ARCH_OPT ("armv6zkt2",	ARM_ARCH_V6KZT2, FPU_ARCH_VFP),
26321  ARM_ARCH_OPT ("armv6-m",	ARM_ARCH_V6M,	 FPU_ARCH_VFP),
26322  ARM_ARCH_OPT ("armv6s-m",	ARM_ARCH_V6SM,	 FPU_ARCH_VFP),
26323  ARM_ARCH_OPT ("armv7",	ARM_ARCH_V7,	 FPU_ARCH_VFP),
26324  /* The official spelling of the ARMv7 profile variants is the dashed form.
26325     Accept the non-dashed form for compatibility with old toolchains.  */
26326  ARM_ARCH_OPT ("armv7a",	ARM_ARCH_V7A,	 FPU_ARCH_VFP),
26327  ARM_ARCH_OPT ("armv7ve",	ARM_ARCH_V7VE,	 FPU_ARCH_VFP),
26328  ARM_ARCH_OPT ("armv7r",	ARM_ARCH_V7R,	 FPU_ARCH_VFP),
26329  ARM_ARCH_OPT ("armv7m",	ARM_ARCH_V7M,	 FPU_ARCH_VFP),
26330  ARM_ARCH_OPT ("armv7-a",	ARM_ARCH_V7A,	 FPU_ARCH_VFP),
26331  ARM_ARCH_OPT ("armv7-r",	ARM_ARCH_V7R,	 FPU_ARCH_VFP),
26332  ARM_ARCH_OPT ("armv7-m",	ARM_ARCH_V7M,	 FPU_ARCH_VFP),
26333  ARM_ARCH_OPT ("armv7e-m",	ARM_ARCH_V7EM,	 FPU_ARCH_VFP),
26334  ARM_ARCH_OPT ("armv8-m.base",	ARM_ARCH_V8M_BASE, FPU_ARCH_VFP),
26335  ARM_ARCH_OPT ("armv8-m.main",	ARM_ARCH_V8M_MAIN, FPU_ARCH_VFP),
26336  ARM_ARCH_OPT ("armv8-a",	ARM_ARCH_V8A,	 FPU_ARCH_VFP),
26337  ARM_ARCH_OPT ("armv8.1-a",	ARM_ARCH_V8_1A,	 FPU_ARCH_VFP),
26338  ARM_ARCH_OPT ("armv8.2-a",	ARM_ARCH_V8_2A,	 FPU_ARCH_VFP),
26339  ARM_ARCH_OPT ("armv8.3-a",	ARM_ARCH_V8_3A,	 FPU_ARCH_VFP),
26340  ARM_ARCH_OPT ("armv8-r",	ARM_ARCH_V8R,	 FPU_ARCH_VFP),
26341  ARM_ARCH_OPT ("armv8.4-a",	ARM_ARCH_V8_4A,	 FPU_ARCH_VFP),
26342  ARM_ARCH_OPT ("xscale",	ARM_ARCH_XSCALE, FPU_ARCH_VFP),
26343  ARM_ARCH_OPT ("iwmmxt",	ARM_ARCH_IWMMXT, FPU_ARCH_VFP),
26344  ARM_ARCH_OPT ("iwmmxt2",	ARM_ARCH_IWMMXT2,FPU_ARCH_VFP),
26345  { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
26346};
26347#undef ARM_ARCH_OPT
26348
26349/* ISA extensions in the co-processor and main instruction set space.  */
26350
26351struct arm_option_extension_value_table
26352{
26353  const char *           name;
26354  size_t                 name_len;
26355  const arm_feature_set  merge_value;
26356  const arm_feature_set  clear_value;
26357  /* List of architectures for which an extension is available.  ARM_ARCH_NONE
26358     indicates that an extension is available for all architectures while
26359     ARM_ANY marks an empty entry.  */
26360  const arm_feature_set  allowed_archs[2];
26361};
26362
26363/* The following table must be in alphabetical order with a NULL last entry.  */
26364
26365#define ARM_EXT_OPT(N, M, C, AA) { N, sizeof (N) - 1, M, C, { AA, ARM_ANY } }
26366#define ARM_EXT_OPT2(N, M, C, AA1, AA2) { N, sizeof (N) - 1, M, C, {AA1, AA2} }
26367
26368static const struct arm_option_extension_value_table arm_extensions[] =
26369{
26370  ARM_EXT_OPT ("crc",  ARCH_CRC_ARMV8, ARM_FEATURE_COPROC (CRC_EXT_ARMV8),
26371			 ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
26372  ARM_EXT_OPT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
26373			 ARM_FEATURE_COPROC (FPU_CRYPTO_ARMV8),
26374				   ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
26375  ARM_EXT_OPT ("dotprod", FPU_ARCH_DOTPROD_NEON_VFP_ARMV8,
26376			  ARM_FEATURE_COPROC (FPU_NEON_EXT_DOTPROD),
26377			  ARM_ARCH_V8_2A),
26378  ARM_EXT_OPT ("dsp",	ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP),
26379			ARM_FEATURE_CORE_LOW (ARM_EXT_V5ExP | ARM_EXT_V6_DSP),
26380			ARM_FEATURE_CORE (ARM_EXT_V7M, ARM_EXT2_V8M)),
26381  ARM_EXT_OPT ("fp",     FPU_ARCH_VFP_ARMV8, ARM_FEATURE_COPROC (FPU_VFP_ARMV8),
26382				   ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
26383  ARM_EXT_OPT ("fp16",  ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
26384			ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST),
26385			ARM_ARCH_V8_2A),
26386  ARM_EXT_OPT ("fp16fml",  ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
26387						  | ARM_EXT2_FP16_FML),
26388			   ARM_FEATURE_CORE_HIGH (ARM_EXT2_FP16_INST
26389						  | ARM_EXT2_FP16_FML),
26390			   ARM_ARCH_V8_2A),
26391  ARM_EXT_OPT2 ("idiv",	ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV | ARM_EXT_DIV),
26392			ARM_FEATURE_CORE_LOW (ARM_EXT_ADIV | ARM_EXT_DIV),
26393			ARM_FEATURE_CORE_LOW (ARM_EXT_V7A),
26394			ARM_FEATURE_CORE_LOW (ARM_EXT_V7R)),
26395  /* Duplicate entry for the purpose of allowing ARMv7 to match in presence of
26396     Thumb divide instruction.  Due to this having the same name as the
26397     previous entry, this will be ignored when doing command-line parsing and
26398     only considered by build attribute selection code.  */
26399  ARM_EXT_OPT ("idiv",	ARM_FEATURE_CORE_LOW (ARM_EXT_DIV),
26400			ARM_FEATURE_CORE_LOW (ARM_EXT_DIV),
26401			ARM_FEATURE_CORE_LOW (ARM_EXT_V7)),
26402  ARM_EXT_OPT ("iwmmxt",ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT),
26403			ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT), ARM_ARCH_NONE),
26404  ARM_EXT_OPT ("iwmmxt2", ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT2),
26405			ARM_FEATURE_COPROC (ARM_CEXT_IWMMXT2), ARM_ARCH_NONE),
26406  ARM_EXT_OPT ("maverick", ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK),
26407			ARM_FEATURE_COPROC (ARM_CEXT_MAVERICK), ARM_ARCH_NONE),
26408  ARM_EXT_OPT2 ("mp",	ARM_FEATURE_CORE_LOW (ARM_EXT_MP),
26409			ARM_FEATURE_CORE_LOW (ARM_EXT_MP),
26410			ARM_FEATURE_CORE_LOW (ARM_EXT_V7A),
26411			ARM_FEATURE_CORE_LOW (ARM_EXT_V7R)),
26412  ARM_EXT_OPT ("os",	ARM_FEATURE_CORE_LOW (ARM_EXT_OS),
26413			ARM_FEATURE_CORE_LOW (ARM_EXT_OS),
26414				   ARM_FEATURE_CORE_LOW (ARM_EXT_V6M)),
26415  ARM_EXT_OPT ("pan",	ARM_FEATURE_CORE_HIGH (ARM_EXT2_PAN),
26416			ARM_FEATURE (ARM_EXT_V8, ARM_EXT2_PAN, 0),
26417			ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8A)),
26418  ARM_EXT_OPT ("ras",	ARM_FEATURE_CORE_HIGH (ARM_EXT2_RAS),
26419			ARM_FEATURE (ARM_EXT_V8, ARM_EXT2_RAS, 0),
26420			ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8A)),
26421  ARM_EXT_OPT ("rdma",  FPU_ARCH_NEON_VFP_ARMV8_1,
26422			ARM_FEATURE_COPROC (FPU_NEON_ARMV8 | FPU_NEON_EXT_RDMA),
26423			ARM_FEATURE_CORE_HIGH (ARM_EXT2_V8A)),
26424  ARM_EXT_OPT2 ("sec",	ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
26425			ARM_FEATURE_CORE_LOW (ARM_EXT_SEC),
26426			ARM_FEATURE_CORE_LOW (ARM_EXT_V6K),
26427			ARM_FEATURE_CORE_LOW (ARM_EXT_V7A)),
26428  ARM_EXT_OPT ("simd",  FPU_ARCH_NEON_VFP_ARMV8,
26429			ARM_FEATURE_COPROC (FPU_NEON_ARMV8),
26430			ARM_FEATURE_CORE_LOW (ARM_EXT_V8)),
26431  ARM_EXT_OPT ("virt",	ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT | ARM_EXT_ADIV
26432				     | ARM_EXT_DIV),
26433			ARM_FEATURE_CORE_LOW (ARM_EXT_VIRT),
26434				   ARM_FEATURE_CORE_LOW (ARM_EXT_V7A)),
26435  ARM_EXT_OPT ("xscale",ARM_FEATURE_COPROC (ARM_CEXT_XSCALE),
26436			ARM_FEATURE_COPROC (ARM_CEXT_XSCALE), ARM_ARCH_NONE),
26437  { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, { ARM_ARCH_NONE, ARM_ARCH_NONE } }
26438};
26439#undef ARM_EXT_OPT
26440
26441/* ISA floating-point and Advanced SIMD extensions.  */
26442struct arm_option_fpu_value_table
26443{
26444  const char *           name;
26445  const arm_feature_set  value;
26446};
26447
26448/* This list should, at a minimum, contain all the fpu names
26449   recognized by GCC.  */
26450static const struct arm_option_fpu_value_table arm_fpus[] =
26451{
26452  {"softfpa",		FPU_NONE},
26453  {"fpe",		FPU_ARCH_FPE},
26454  {"fpe2",		FPU_ARCH_FPE},
26455  {"fpe3",		FPU_ARCH_FPA},	/* Third release supports LFM/SFM.  */
26456  {"fpa",		FPU_ARCH_FPA},
26457  {"fpa10",		FPU_ARCH_FPA},
26458  {"fpa11",		FPU_ARCH_FPA},
26459  {"arm7500fe",		FPU_ARCH_FPA},
26460  {"softvfp",		FPU_ARCH_VFP},
26461  {"softvfp+vfp",	FPU_ARCH_VFP_V2},
26462  {"vfp",		FPU_ARCH_VFP_V2},
26463  {"vfp9",		FPU_ARCH_VFP_V2},
26464  {"vfp3",		FPU_ARCH_VFP_V3}, /* Undocumented, use vfpv3.  */
26465  {"vfp10",		FPU_ARCH_VFP_V2},
26466  {"vfp10-r0",		FPU_ARCH_VFP_V1},
26467  {"vfpxd",		FPU_ARCH_VFP_V1xD},
26468  {"vfpv2",		FPU_ARCH_VFP_V2},
26469  {"vfpv3",		FPU_ARCH_VFP_V3},
26470  {"vfpv3-fp16",	FPU_ARCH_VFP_V3_FP16},
26471  {"vfpv3-d16",		FPU_ARCH_VFP_V3D16},
26472  {"vfpv3-d16-fp16",	FPU_ARCH_VFP_V3D16_FP16},
26473  {"vfpv3xd",		FPU_ARCH_VFP_V3xD},
26474  {"vfpv3xd-fp16",	FPU_ARCH_VFP_V3xD_FP16},
26475  {"arm1020t",		FPU_ARCH_VFP_V1},
26476  {"arm1020e",		FPU_ARCH_VFP_V2},
26477  {"arm1136jfs",	FPU_ARCH_VFP_V2}, /* Undocumented, use arm1136jf-s.  */
26478  {"arm1136jf-s",	FPU_ARCH_VFP_V2},
26479  {"maverick",		FPU_ARCH_MAVERICK},
26480  {"neon",		FPU_ARCH_VFP_V3_PLUS_NEON_V1},
26481  {"neon-vfpv3",	FPU_ARCH_VFP_V3_PLUS_NEON_V1},
26482  {"neon-fp16",		FPU_ARCH_NEON_FP16},
26483  {"vfpv4",		FPU_ARCH_VFP_V4},
26484  {"vfpv4-d16",		FPU_ARCH_VFP_V4D16},
26485  {"fpv4-sp-d16",	FPU_ARCH_VFP_V4_SP_D16},
26486  {"fpv5-d16",		FPU_ARCH_VFP_V5D16},
26487  {"fpv5-sp-d16",	FPU_ARCH_VFP_V5_SP_D16},
26488  {"neon-vfpv4",	FPU_ARCH_NEON_VFP_V4},
26489  {"fp-armv8",		FPU_ARCH_VFP_ARMV8},
26490  {"neon-fp-armv8",	FPU_ARCH_NEON_VFP_ARMV8},
26491  {"crypto-neon-fp-armv8",
26492			FPU_ARCH_CRYPTO_NEON_VFP_ARMV8},
26493  {"neon-fp-armv8.1",	FPU_ARCH_NEON_VFP_ARMV8_1},
26494  {"crypto-neon-fp-armv8.1",
26495			FPU_ARCH_CRYPTO_NEON_VFP_ARMV8_1},
26496  {NULL,		ARM_ARCH_NONE}
26497};
26498
26499struct arm_option_value_table
26500{
26501  const char *name;
26502  long value;
26503};
26504
26505static const struct arm_option_value_table arm_float_abis[] =
26506{
26507  {"hard",	ARM_FLOAT_ABI_HARD},
26508  {"softfp",	ARM_FLOAT_ABI_SOFTFP},
26509  {"soft",	ARM_FLOAT_ABI_SOFT},
26510  {NULL,	0}
26511};
26512
26513#ifdef OBJ_ELF
26514/* We only know how to output GNU and ver 4/5 (AAELF) formats.  */
26515static const struct arm_option_value_table arm_eabis[] =
26516{
26517  {"gnu",	EF_ARM_EABI_UNKNOWN},
26518  {"4",		EF_ARM_EABI_VER4},
26519  {"5",		EF_ARM_EABI_VER5},
26520  {NULL,	0}
26521};
26522#endif
26523
26524struct arm_long_option_table
26525{
26526  const char * option;			/* Substring to match.	*/
26527  const char * help;			/* Help information.  */
26528  int (* func) (const char * subopt);	/* Function to decode sub-option.  */
26529  const char * deprecated;		/* If non-null, print this message.  */
26530};
26531
26532static bfd_boolean
26533arm_parse_extension (const char *str, const arm_feature_set *opt_set,
26534		     arm_feature_set *ext_set)
26535{
26536  /* We insist on extensions being specified in alphabetical order, and with
26537     extensions being added before being removed.  We achieve this by having
26538     the global ARM_EXTENSIONS table in alphabetical order, and using the
26539     ADDING_VALUE variable to indicate whether we are adding an extension (1)
26540     or removing it (0) and only allowing it to change in the order
26541     -1 -> 1 -> 0.  */
26542  const struct arm_option_extension_value_table * opt = NULL;
26543  const arm_feature_set arm_any = ARM_ANY;
26544  int adding_value = -1;
26545
26546  while (str != NULL && *str != 0)
26547    {
26548      const char *ext;
26549      size_t len;
26550
26551      if (*str != '+')
26552	{
26553	  as_bad (_("invalid architectural extension"));
26554	  return FALSE;
26555	}
26556
26557      str++;
26558      ext = strchr (str, '+');
26559
26560      if (ext != NULL)
26561	len = ext - str;
26562      else
26563	len = strlen (str);
26564
26565      if (len >= 2 && strncmp (str, "no", 2) == 0)
26566	{
26567	  if (adding_value != 0)
26568	    {
26569	      adding_value = 0;
26570	      opt = arm_extensions;
26571	    }
26572
26573	  len -= 2;
26574	  str += 2;
26575	}
26576      else if (len > 0)
26577	{
26578	  if (adding_value == -1)
26579	    {
26580	      adding_value = 1;
26581	      opt = arm_extensions;
26582	    }
26583	  else if (adding_value != 1)
26584	    {
26585	      as_bad (_("must specify extensions to add before specifying "
26586			"those to remove"));
26587	      return FALSE;
26588	    }
26589	}
26590
26591      if (len == 0)
26592	{
26593	  as_bad (_("missing architectural extension"));
26594	  return FALSE;
26595	}
26596
26597      gas_assert (adding_value != -1);
26598      gas_assert (opt != NULL);
26599
26600      /* Scan over the options table trying to find an exact match. */
26601      for (; opt->name != NULL; opt++)
26602	if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
26603	  {
26604	    int i, nb_allowed_archs =
26605	      sizeof (opt->allowed_archs) / sizeof (opt->allowed_archs[0]);
26606	    /* Check we can apply the extension to this architecture.  */
26607	    for (i = 0; i < nb_allowed_archs; i++)
26608	      {
26609		/* Empty entry.  */
26610		if (ARM_FEATURE_EQUAL (opt->allowed_archs[i], arm_any))
26611		  continue;
26612		if (ARM_FSET_CPU_SUBSET (opt->allowed_archs[i], *opt_set))
26613		  break;
26614	      }
26615	    if (i == nb_allowed_archs)
26616	      {
26617		as_bad (_("extension does not apply to the base architecture"));
26618		return FALSE;
26619	      }
26620
26621	    /* Add or remove the extension.  */
26622	    if (adding_value)
26623	      ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->merge_value);
26624	    else
26625	      ARM_CLEAR_FEATURE (*ext_set, *ext_set, opt->clear_value);
26626
26627	    /* Allowing Thumb division instructions for ARMv7 in autodetection
26628	       rely on this break so that duplicate extensions (extensions
26629	       with the same name as a previous extension in the list) are not
26630	       considered for command-line parsing.  */
26631	    break;
26632	  }
26633
26634      if (opt->name == NULL)
26635	{
26636	  /* Did we fail to find an extension because it wasn't specified in
26637	     alphabetical order, or because it does not exist?  */
26638
26639	  for (opt = arm_extensions; opt->name != NULL; opt++)
26640	    if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
26641	      break;
26642
26643	  if (opt->name == NULL)
26644	    as_bad (_("unknown architectural extension `%s'"), str);
26645	  else
26646	    as_bad (_("architectural extensions must be specified in "
26647		      "alphabetical order"));
26648
26649	  return FALSE;
26650	}
26651      else
26652	{
26653	  /* We should skip the extension we've just matched the next time
26654	     round.  */
26655	  opt++;
26656	}
26657
26658      str = ext;
26659    };
26660
26661  return TRUE;
26662}
26663
26664static bfd_boolean
26665arm_parse_cpu (const char *str)
26666{
26667  const struct arm_cpu_option_table *opt;
26668  const char *ext = strchr (str, '+');
26669  size_t len;
26670
26671  if (ext != NULL)
26672    len = ext - str;
26673  else
26674    len = strlen (str);
26675
26676  if (len == 0)
26677    {
26678      as_bad (_("missing cpu name `%s'"), str);
26679      return FALSE;
26680    }
26681
26682  for (opt = arm_cpus; opt->name != NULL; opt++)
26683    if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
26684      {
26685	mcpu_cpu_opt = &opt->value;
26686	if (mcpu_ext_opt == NULL)
26687	  mcpu_ext_opt = XNEW (arm_feature_set);
26688	*mcpu_ext_opt = opt->ext;
26689	mcpu_fpu_opt = &opt->default_fpu;
26690	if (opt->canonical_name)
26691	  {
26692	    gas_assert (sizeof selected_cpu_name > strlen (opt->canonical_name));
26693	    strcpy (selected_cpu_name, opt->canonical_name);
26694	  }
26695	else
26696	  {
26697	    size_t i;
26698
26699	    if (len >= sizeof selected_cpu_name)
26700	      len = (sizeof selected_cpu_name) - 1;
26701
26702	    for (i = 0; i < len; i++)
26703	      selected_cpu_name[i] = TOUPPER (opt->name[i]);
26704	    selected_cpu_name[i] = 0;
26705	  }
26706
26707	if (ext != NULL)
26708	  return arm_parse_extension (ext, mcpu_cpu_opt, mcpu_ext_opt);
26709
26710	return TRUE;
26711      }
26712
26713  as_bad (_("unknown cpu `%s'"), str);
26714  return FALSE;
26715}
26716
26717static bfd_boolean
26718arm_parse_arch (const char *str)
26719{
26720  const struct arm_arch_option_table *opt;
26721  const char *ext = strchr (str, '+');
26722  size_t len;
26723
26724  if (ext != NULL)
26725    len = ext - str;
26726  else
26727    len = strlen (str);
26728
26729  if (len == 0)
26730    {
26731      as_bad (_("missing architecture name `%s'"), str);
26732      return FALSE;
26733    }
26734
26735  for (opt = arm_archs; opt->name != NULL; opt++)
26736    if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
26737      {
26738	march_cpu_opt = &opt->value;
26739	if (march_ext_opt == NULL)
26740	  march_ext_opt = XNEW (arm_feature_set);
26741	*march_ext_opt = arm_arch_none;
26742	march_fpu_opt = &opt->default_fpu;
26743	strcpy (selected_cpu_name, opt->name);
26744
26745	if (ext != NULL)
26746	  return arm_parse_extension (ext, march_cpu_opt, march_ext_opt);
26747
26748	return TRUE;
26749      }
26750
26751  as_bad (_("unknown architecture `%s'\n"), str);
26752  return FALSE;
26753}
26754
26755static bfd_boolean
26756arm_parse_fpu (const char * str)
26757{
26758  const struct arm_option_fpu_value_table * opt;
26759
26760  for (opt = arm_fpus; opt->name != NULL; opt++)
26761    if (streq (opt->name, str))
26762      {
26763	mfpu_opt = &opt->value;
26764	return TRUE;
26765      }
26766
26767  as_bad (_("unknown floating point format `%s'\n"), str);
26768  return FALSE;
26769}
26770
26771static bfd_boolean
26772arm_parse_float_abi (const char * str)
26773{
26774  const struct arm_option_value_table * opt;
26775
26776  for (opt = arm_float_abis; opt->name != NULL; opt++)
26777    if (streq (opt->name, str))
26778      {
26779	mfloat_abi_opt = opt->value;
26780	return TRUE;
26781      }
26782
26783  as_bad (_("unknown floating point abi `%s'\n"), str);
26784  return FALSE;
26785}
26786
26787#ifdef OBJ_ELF
26788static bfd_boolean
26789arm_parse_eabi (const char * str)
26790{
26791  const struct arm_option_value_table *opt;
26792
26793  for (opt = arm_eabis; opt->name != NULL; opt++)
26794    if (streq (opt->name, str))
26795      {
26796	meabi_flags = opt->value;
26797	return TRUE;
26798      }
26799  as_bad (_("unknown EABI `%s'\n"), str);
26800  return FALSE;
26801}
26802#endif
26803
26804static bfd_boolean
26805arm_parse_it_mode (const char * str)
26806{
26807  bfd_boolean ret = TRUE;
26808
26809  if (streq ("arm", str))
26810    implicit_it_mode = IMPLICIT_IT_MODE_ARM;
26811  else if (streq ("thumb", str))
26812    implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
26813  else if (streq ("always", str))
26814    implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
26815  else if (streq ("never", str))
26816    implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
26817  else
26818    {
26819      as_bad (_("unknown implicit IT mode `%s', should be "\
26820		"arm, thumb, always, or never."), str);
26821      ret = FALSE;
26822    }
26823
26824  return ret;
26825}
26826
26827static bfd_boolean
26828arm_ccs_mode (const char * unused ATTRIBUTE_UNUSED)
26829{
26830  codecomposer_syntax = TRUE;
26831  arm_comment_chars[0] = ';';
26832  arm_line_separator_chars[0] = 0;
26833  return TRUE;
26834}
26835
26836struct arm_long_option_table arm_long_opts[] =
26837{
26838  {"mcpu=", N_("<cpu name>\t  assemble for CPU <cpu name>"),
26839   arm_parse_cpu, NULL},
26840  {"march=", N_("<arch name>\t  assemble for architecture <arch name>"),
26841   arm_parse_arch, NULL},
26842  {"mfpu=", N_("<fpu name>\t  assemble for FPU architecture <fpu name>"),
26843   arm_parse_fpu, NULL},
26844  {"mfloat-abi=", N_("<abi>\t  assemble for floating point ABI <abi>"),
26845   arm_parse_float_abi, NULL},
26846#ifdef OBJ_ELF
26847  {"meabi=", N_("<ver>\t\t  assemble for eabi version <ver>"),
26848   arm_parse_eabi, NULL},
26849#endif
26850  {"mimplicit-it=", N_("<mode>\t  controls implicit insertion of IT instructions"),
26851   arm_parse_it_mode, NULL},
26852  {"mccs", N_("\t\t\t  TI CodeComposer Studio syntax compatibility mode"),
26853   arm_ccs_mode, NULL},
26854  {NULL, NULL, 0, NULL}
26855};
26856
26857int
26858md_parse_option (int c, const char * arg)
26859{
26860  struct arm_option_table *opt;
26861  const struct arm_legacy_option_table *fopt;
26862  struct arm_long_option_table *lopt;
26863
26864  switch (c)
26865    {
26866#ifdef OPTION_EB
26867    case OPTION_EB:
26868      target_big_endian = 1;
26869      break;
26870#endif
26871
26872#ifdef OPTION_EL
26873    case OPTION_EL:
26874      target_big_endian = 0;
26875      break;
26876#endif
26877
26878    case OPTION_FIX_V4BX:
26879      fix_v4bx = TRUE;
26880      break;
26881
26882#ifdef OBJ_ELF
26883    case OPTION_FDPIC:
26884      arm_fdpic = TRUE;
26885      break;
26886#endif /* OBJ_ELF */
26887
26888    case 'a':
26889      /* Listing option.  Just ignore these, we don't support additional
26890	 ones.	*/
26891      return 0;
26892
26893    default:
26894      for (opt = arm_opts; opt->option != NULL; opt++)
26895	{
26896	  if (c == opt->option[0]
26897	      && ((arg == NULL && opt->option[1] == 0)
26898		  || streq (arg, opt->option + 1)))
26899	    {
26900	      /* If the option is deprecated, tell the user.  */
26901	      if (warn_on_deprecated && opt->deprecated != NULL)
26902		as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
26903			   arg ? arg : "", _(opt->deprecated));
26904
26905	      if (opt->var != NULL)
26906		*opt->var = opt->value;
26907
26908	      return 1;
26909	    }
26910	}
26911
26912      for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
26913	{
26914	  if (c == fopt->option[0]
26915	      && ((arg == NULL && fopt->option[1] == 0)
26916		  || streq (arg, fopt->option + 1)))
26917	    {
26918	      /* If the option is deprecated, tell the user.  */
26919	      if (warn_on_deprecated && fopt->deprecated != NULL)
26920		as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
26921			   arg ? arg : "", _(fopt->deprecated));
26922
26923	      if (fopt->var != NULL)
26924		*fopt->var = &fopt->value;
26925
26926	      return 1;
26927	    }
26928	}
26929
26930      for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
26931	{
26932	  /* These options are expected to have an argument.  */
26933	  if (c == lopt->option[0]
26934	      && arg != NULL
26935	      && strncmp (arg, lopt->option + 1,
26936			  strlen (lopt->option + 1)) == 0)
26937	    {
26938	      /* If the option is deprecated, tell the user.  */
26939	      if (warn_on_deprecated && lopt->deprecated != NULL)
26940		as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
26941			   _(lopt->deprecated));
26942
26943	      /* Call the sup-option parser.  */
26944	      return lopt->func (arg + strlen (lopt->option) - 1);
26945	    }
26946	}
26947
26948      return 0;
26949    }
26950
26951  return 1;
26952}
26953
26954void
26955md_show_usage (FILE * fp)
26956{
26957  struct arm_option_table *opt;
26958  struct arm_long_option_table *lopt;
26959
26960  fprintf (fp, _(" ARM-specific assembler options:\n"));
26961
26962  for (opt = arm_opts; opt->option != NULL; opt++)
26963    if (opt->help != NULL)
26964      fprintf (fp, "  -%-23s%s\n", opt->option, _(opt->help));
26965
26966  for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
26967    if (lopt->help != NULL)
26968      fprintf (fp, "  -%s%s\n", lopt->option, _(lopt->help));
26969
26970#ifdef OPTION_EB
26971  fprintf (fp, _("\
26972  -EB                     assemble code for a big-endian cpu\n"));
26973#endif
26974
26975#ifdef OPTION_EL
26976  fprintf (fp, _("\
26977  -EL                     assemble code for a little-endian cpu\n"));
26978#endif
26979
26980  fprintf (fp, _("\
26981  --fix-v4bx              Allow BX in ARMv4 code\n"));
26982
26983#ifdef OBJ_ELF
26984  fprintf (fp, _("\
26985  --fdpic                 generate an FDPIC object file\n"));
26986#endif /* OBJ_ELF */
26987}
26988
26989#ifdef OBJ_ELF
26990
26991typedef struct
26992{
26993  int val;
26994  arm_feature_set flags;
26995} cpu_arch_ver_table;
26996
26997/* Mapping from CPU features to EABI CPU arch values.  Table must be sorted
26998   chronologically for architectures, with an exception for ARMv6-M and
26999   ARMv6S-M due to legacy reasons.  No new architecture should have a
27000   special case.  This allows for build attribute selection results to be
27001   stable when new architectures are added.  */
27002static const cpu_arch_ver_table cpu_arch_ver[] =
27003{
27004    {0, ARM_ARCH_V1},
27005    {0, ARM_ARCH_V2},
27006    {0, ARM_ARCH_V2S},
27007    {0, ARM_ARCH_V3},
27008    {0, ARM_ARCH_V3M},
27009    {1, ARM_ARCH_V4xM},
27010    {1, ARM_ARCH_V4},
27011    {2, ARM_ARCH_V4TxM},
27012    {2, ARM_ARCH_V4T},
27013    {3, ARM_ARCH_V5xM},
27014    {3, ARM_ARCH_V5},
27015    {3, ARM_ARCH_V5TxM},
27016    {3, ARM_ARCH_V5T},
27017    {4, ARM_ARCH_V5TExP},
27018    {4, ARM_ARCH_V5TE},
27019    {5, ARM_ARCH_V5TEJ},
27020    {6, ARM_ARCH_V6},
27021    {7, ARM_ARCH_V6Z},
27022    {7, ARM_ARCH_V6KZ},
27023    {9, ARM_ARCH_V6K},
27024    {8, ARM_ARCH_V6T2},
27025    {8, ARM_ARCH_V6KT2},
27026    {8, ARM_ARCH_V6ZT2},
27027    {8, ARM_ARCH_V6KZT2},
27028
27029    /* When assembling a file with only ARMv6-M or ARMv6S-M instruction, GNU as
27030       always selected build attributes to match those of ARMv6-M
27031       (resp. ARMv6S-M).  However, due to these architectures being a strict
27032       subset of ARMv7-M in terms of instructions available, ARMv7-M attributes
27033       would be selected when fully respecting chronology of architectures.
27034       It is thus necessary to make a special case of ARMv6-M and ARMv6S-M and
27035       move them before ARMv7 architectures.  */
27036    {11, ARM_ARCH_V6M},
27037    {12, ARM_ARCH_V6SM},
27038
27039    {10, ARM_ARCH_V7},
27040    {10, ARM_ARCH_V7A},
27041    {10, ARM_ARCH_V7R},
27042    {10, ARM_ARCH_V7M},
27043    {10, ARM_ARCH_V7VE},
27044    {13, ARM_ARCH_V7EM},
27045    {14, ARM_ARCH_V8A},
27046    {14, ARM_ARCH_V8_1A},
27047    {14, ARM_ARCH_V8_2A},
27048    {14, ARM_ARCH_V8_3A},
27049    {16, ARM_ARCH_V8M_BASE},
27050    {17, ARM_ARCH_V8M_MAIN},
27051    {15, ARM_ARCH_V8R},
27052    {14, ARM_ARCH_V8_4A},
27053    {-1, ARM_ARCH_NONE}
27054};
27055
27056/* Set an attribute if it has not already been set by the user.  */
27057
27058static void
27059aeabi_set_attribute_int (int tag, int value)
27060{
27061  if (tag < 1
27062      || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
27063      || !attributes_set_explicitly[tag])
27064    bfd_elf_add_proc_attr_int (stdoutput, tag, value);
27065}
27066
27067static void
27068aeabi_set_attribute_string (int tag, const char *value)
27069{
27070  if (tag < 1
27071      || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
27072      || !attributes_set_explicitly[tag])
27073    bfd_elf_add_proc_attr_string (stdoutput, tag, value);
27074}
27075
27076/* Return whether features in the *NEEDED feature set are available via
27077   extensions for the architecture whose feature set is *ARCH_FSET.  */
27078
27079static bfd_boolean
27080have_ext_for_needed_feat_p (const arm_feature_set *arch_fset,
27081			    const arm_feature_set *needed)
27082{
27083  int i, nb_allowed_archs;
27084  arm_feature_set ext_fset;
27085  const struct arm_option_extension_value_table *opt;
27086
27087  ext_fset = arm_arch_none;
27088  for (opt = arm_extensions; opt->name != NULL; opt++)
27089    {
27090      /* Extension does not provide any feature we need.  */
27091      if (!ARM_CPU_HAS_FEATURE (*needed, opt->merge_value))
27092	continue;
27093
27094      nb_allowed_archs =
27095	sizeof (opt->allowed_archs) / sizeof (opt->allowed_archs[0]);
27096      for (i = 0; i < nb_allowed_archs; i++)
27097	{
27098	  /* Empty entry.  */
27099	  if (ARM_FEATURE_EQUAL (opt->allowed_archs[i], arm_arch_any))
27100	    break;
27101
27102	  /* Extension is available, add it.  */
27103	  if (ARM_FSET_CPU_SUBSET (opt->allowed_archs[i], *arch_fset))
27104	    ARM_MERGE_FEATURE_SETS (ext_fset, ext_fset, opt->merge_value);
27105	}
27106    }
27107
27108  /* Can we enable all features in *needed?  */
27109  return ARM_FSET_CPU_SUBSET (*needed, ext_fset);
27110}
27111
27112/* Select value for Tag_CPU_arch and Tag_CPU_arch_profile build attributes for
27113   a given architecture feature set *ARCH_EXT_FSET including extension feature
27114   set *EXT_FSET.  Selection logic used depend on EXACT_MATCH:
27115   - if true, check for an exact match of the architecture modulo extensions;
27116   - otherwise, select build attribute value of the first superset
27117     architecture released so that results remains stable when new architectures
27118     are added.
27119   For -march/-mcpu=all the build attribute value of the most featureful
27120   architecture is returned.  Tag_CPU_arch_profile result is returned in
27121   PROFILE.  */
27122
27123static int
27124get_aeabi_cpu_arch_from_fset (const arm_feature_set *arch_ext_fset,
27125			      const arm_feature_set *ext_fset,
27126			      char *profile, int exact_match)
27127{
27128  arm_feature_set arch_fset;
27129  const cpu_arch_ver_table *p_ver, *p_ver_ret = NULL;
27130
27131  /* Select most featureful architecture with all its extensions if building
27132     for -march=all as the feature sets used to set build attributes.  */
27133  if (ARM_FEATURE_EQUAL (*arch_ext_fset, arm_arch_any))
27134    {
27135      /* Force revisiting of decision for each new architecture.  */
27136      gas_assert (MAX_TAG_CPU_ARCH <= TAG_CPU_ARCH_V8M_MAIN);
27137      *profile = 'A';
27138      return TAG_CPU_ARCH_V8;
27139    }
27140
27141  ARM_CLEAR_FEATURE (arch_fset, *arch_ext_fset, *ext_fset);
27142
27143  for (p_ver = cpu_arch_ver; p_ver->val != -1; p_ver++)
27144    {
27145      arm_feature_set known_arch_fset;
27146
27147      ARM_CLEAR_FEATURE (known_arch_fset, p_ver->flags, fpu_any);
27148      if (exact_match)
27149	{
27150	  /* Base architecture match user-specified architecture and
27151	     extensions, eg. ARMv6S-M matching -march=armv6-m+os.  */
27152	  if (ARM_FEATURE_EQUAL (*arch_ext_fset, known_arch_fset))
27153	    {
27154	      p_ver_ret = p_ver;
27155	      goto found;
27156	    }
27157	  /* Base architecture match user-specified architecture only
27158	     (eg. ARMv6-M in the same case as above).  Record it in case we
27159	     find a match with above condition.  */
27160	  else if (p_ver_ret == NULL
27161		   && ARM_FEATURE_EQUAL (arch_fset, known_arch_fset))
27162	    p_ver_ret = p_ver;
27163	}
27164      else
27165	{
27166
27167	  /* Architecture has all features wanted.  */
27168	  if (ARM_FSET_CPU_SUBSET (arch_fset, known_arch_fset))
27169	    {
27170	      arm_feature_set added_fset;
27171
27172	      /* Compute features added by this architecture over the one
27173		 recorded in p_ver_ret.  */
27174	      if (p_ver_ret != NULL)
27175		ARM_CLEAR_FEATURE (added_fset, known_arch_fset,
27176				   p_ver_ret->flags);
27177	      /* First architecture that match incl. with extensions, or the
27178		 only difference in features over the recorded match is
27179		 features that were optional and are now mandatory.  */
27180	      if (p_ver_ret == NULL
27181		  || ARM_FSET_CPU_SUBSET (added_fset, arch_fset))
27182		{
27183		  p_ver_ret = p_ver;
27184		  goto found;
27185		}
27186	    }
27187	  else if (p_ver_ret == NULL)
27188	    {
27189	      arm_feature_set needed_ext_fset;
27190
27191	      ARM_CLEAR_FEATURE (needed_ext_fset, arch_fset, known_arch_fset);
27192
27193	      /* Architecture has all features needed when using some
27194		 extensions.  Record it and continue searching in case there
27195		 exist an architecture providing all needed features without
27196		 the need for extensions (eg. ARMv6S-M Vs ARMv6-M with
27197		 OS extension).  */
27198	      if (have_ext_for_needed_feat_p (&known_arch_fset,
27199					      &needed_ext_fset))
27200		p_ver_ret = p_ver;
27201	    }
27202	}
27203    }
27204
27205  if (p_ver_ret == NULL)
27206    return -1;
27207
27208found:
27209  /* Tag_CPU_arch_profile.  */
27210  if (ARM_CPU_HAS_FEATURE (p_ver_ret->flags, arm_ext_v7a)
27211      || ARM_CPU_HAS_FEATURE (p_ver_ret->flags, arm_ext_v8)
27212      || (ARM_CPU_HAS_FEATURE (p_ver_ret->flags, arm_ext_atomics)
27213	  && !ARM_CPU_HAS_FEATURE (p_ver_ret->flags, arm_ext_v8m_m_only)))
27214    *profile = 'A';
27215  else if (ARM_CPU_HAS_FEATURE (p_ver_ret->flags, arm_ext_v7r))
27216    *profile = 'R';
27217  else if (ARM_CPU_HAS_FEATURE (p_ver_ret->flags, arm_ext_m))
27218    *profile = 'M';
27219  else
27220    *profile = '\0';
27221  return p_ver_ret->val;
27222}
27223
27224/* Set the public EABI object attributes.  */
27225
27226static void
27227aeabi_set_public_attributes (void)
27228{
27229  char profile = '\0';
27230  int arch = -1;
27231  int virt_sec = 0;
27232  int fp16_optional = 0;
27233  int skip_exact_match = 0;
27234  arm_feature_set flags, flags_arch, flags_ext;
27235
27236  /* Autodetection mode, choose the architecture based the instructions
27237     actually used.  */
27238  if (no_cpu_selected ())
27239    {
27240      ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
27241
27242      if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any))
27243	ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v1);
27244
27245      if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_any))
27246	ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v4t);
27247
27248      /* Code run during relaxation relies on selected_cpu being set.  */
27249      ARM_CLEAR_FEATURE (flags_arch, flags, fpu_any);
27250      flags_ext = arm_arch_none;
27251      ARM_CLEAR_FEATURE (selected_arch, flags_arch, flags_ext);
27252      selected_ext = flags_ext;
27253      selected_cpu = flags;
27254    }
27255  /* Otherwise, choose the architecture based on the capabilities of the
27256     requested cpu.  */
27257  else
27258    {
27259      ARM_MERGE_FEATURE_SETS (flags_arch, selected_arch, selected_ext);
27260      ARM_CLEAR_FEATURE (flags_arch, flags_arch, fpu_any);
27261      flags_ext = selected_ext;
27262      flags = selected_cpu;
27263    }
27264  ARM_MERGE_FEATURE_SETS (flags, flags, selected_fpu);
27265
27266  /* Allow the user to override the reported architecture.  */
27267  if (!ARM_FEATURE_ZERO (selected_object_arch))
27268    {
27269      ARM_CLEAR_FEATURE (flags_arch, selected_object_arch, fpu_any);
27270      flags_ext = arm_arch_none;
27271    }
27272  else
27273    skip_exact_match = ARM_FEATURE_EQUAL (selected_cpu, arm_arch_any);
27274
27275  /* When this function is run again after relaxation has happened there is no
27276     way to determine whether an architecture or CPU was specified by the user:
27277     - selected_cpu is set above for relaxation to work;
27278     - march_cpu_opt is not set if only -mcpu or .cpu is used;
27279     - mcpu_cpu_opt is set to arm_arch_any for autodetection.
27280     Therefore, if not in -march=all case we first try an exact match and fall
27281     back to autodetection.  */
27282  if (!skip_exact_match)
27283    arch = get_aeabi_cpu_arch_from_fset (&flags_arch, &flags_ext, &profile, 1);
27284  if (arch == -1)
27285    arch = get_aeabi_cpu_arch_from_fset (&flags_arch, &flags_ext, &profile, 0);
27286  if (arch == -1)
27287    as_bad (_("no architecture contains all the instructions used\n"));
27288
27289  /* Tag_CPU_name.  */
27290  if (selected_cpu_name[0])
27291    {
27292      char *q;
27293
27294      q = selected_cpu_name;
27295      if (strncmp (q, "armv", 4) == 0)
27296	{
27297	  int i;
27298
27299	  q += 4;
27300	  for (i = 0; q[i]; i++)
27301	    q[i] = TOUPPER (q[i]);
27302	}
27303      aeabi_set_attribute_string (Tag_CPU_name, q);
27304    }
27305
27306  /* Tag_CPU_arch.  */
27307  aeabi_set_attribute_int (Tag_CPU_arch, arch);
27308
27309  /* Tag_CPU_arch_profile.  */
27310  if (profile != '\0')
27311    aeabi_set_attribute_int (Tag_CPU_arch_profile, profile);
27312
27313  /* Tag_DSP_extension.  */
27314  if (ARM_CPU_HAS_FEATURE (selected_ext, arm_ext_dsp))
27315    aeabi_set_attribute_int (Tag_DSP_extension, 1);
27316
27317  ARM_CLEAR_FEATURE (flags_arch, flags, fpu_any);
27318  /* Tag_ARM_ISA_use.  */
27319  if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
27320      || ARM_FEATURE_ZERO (flags_arch))
27321    aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
27322
27323  /* Tag_THUMB_ISA_use.  */
27324  if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
27325      || ARM_FEATURE_ZERO (flags_arch))
27326    {
27327      int thumb_isa_use;
27328
27329      if (!ARM_CPU_HAS_FEATURE (flags, arm_ext_v8)
27330	  && ARM_CPU_HAS_FEATURE (flags, arm_ext_v8m_m_only))
27331	thumb_isa_use = 3;
27332      else if (ARM_CPU_HAS_FEATURE (flags, arm_arch_t2))
27333	thumb_isa_use = 2;
27334      else
27335	thumb_isa_use = 1;
27336      aeabi_set_attribute_int (Tag_THUMB_ISA_use, thumb_isa_use);
27337    }
27338
27339  /* Tag_VFP_arch.  */
27340  if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_armv8xd))
27341    aeabi_set_attribute_int (Tag_VFP_arch,
27342			     ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
27343			     ? 7 : 8);
27344  else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
27345    aeabi_set_attribute_int (Tag_VFP_arch,
27346			     ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
27347			     ? 5 : 6);
27348  else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
27349    {
27350      fp16_optional = 1;
27351      aeabi_set_attribute_int (Tag_VFP_arch, 3);
27352    }
27353  else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
27354    {
27355      aeabi_set_attribute_int (Tag_VFP_arch, 4);
27356      fp16_optional = 1;
27357    }
27358  else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
27359    aeabi_set_attribute_int (Tag_VFP_arch, 2);
27360  else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
27361	   || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
27362    aeabi_set_attribute_int (Tag_VFP_arch, 1);
27363
27364  /* Tag_ABI_HardFP_use.  */
27365  if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd)
27366      && !ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1))
27367    aeabi_set_attribute_int (Tag_ABI_HardFP_use, 1);
27368
27369  /* Tag_WMMX_arch.  */
27370  if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
27371    aeabi_set_attribute_int (Tag_WMMX_arch, 2);
27372  else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
27373    aeabi_set_attribute_int (Tag_WMMX_arch, 1);
27374
27375  /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch).  */
27376  if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v8_1))
27377    aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 4);
27378  else if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_armv8))
27379    aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 3);
27380  else if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
27381    {
27382      if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma))
27383	{
27384	  aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 2);
27385	}
27386      else
27387	{
27388	  aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 1);
27389	  fp16_optional = 1;
27390	}
27391    }
27392
27393  /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch).  */
27394  if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16) && fp16_optional)
27395    aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
27396
27397  /* Tag_DIV_use.
27398
27399     We set Tag_DIV_use to two when integer divide instructions have been used
27400     in ARM state, or when Thumb integer divide instructions have been used,
27401     but we have no architecture profile set, nor have we any ARM instructions.
27402
27403     For ARMv8-A and ARMv8-M we set the tag to 0 as integer divide is implied
27404     by the base architecture.
27405
27406     For new architectures we will have to check these tests.  */
27407  gas_assert (arch <= TAG_CPU_ARCH_V8M_MAIN);
27408  if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v8)
27409      || ARM_CPU_HAS_FEATURE (flags, arm_ext_v8m))
27410    aeabi_set_attribute_int (Tag_DIV_use, 0);
27411  else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_adiv)
27412	   || (profile == '\0'
27413	       && ARM_CPU_HAS_FEATURE (flags, arm_ext_div)
27414	       && !ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any)))
27415    aeabi_set_attribute_int (Tag_DIV_use, 2);
27416
27417  /* Tag_MP_extension_use.  */
27418  if (ARM_CPU_HAS_FEATURE (flags, arm_ext_mp))
27419    aeabi_set_attribute_int (Tag_MPextension_use, 1);
27420
27421  /* Tag Virtualization_use.  */
27422  if (ARM_CPU_HAS_FEATURE (flags, arm_ext_sec))
27423    virt_sec |= 1;
27424  if (ARM_CPU_HAS_FEATURE (flags, arm_ext_virt))
27425    virt_sec |= 2;
27426  if (virt_sec != 0)
27427    aeabi_set_attribute_int (Tag_Virtualization_use, virt_sec);
27428}
27429
27430/* Post relaxation hook.  Recompute ARM attributes now that relaxation is
27431   finished and free extension feature bits which will not be used anymore.  */
27432
27433void
27434arm_md_post_relax (void)
27435{
27436  aeabi_set_public_attributes ();
27437  XDELETE (mcpu_ext_opt);
27438  mcpu_ext_opt = NULL;
27439  XDELETE (march_ext_opt);
27440  march_ext_opt = NULL;
27441}
27442
27443/* Add the default contents for the .ARM.attributes section.  */
27444
27445void
27446arm_md_end (void)
27447{
27448  if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
27449    return;
27450
27451  aeabi_set_public_attributes ();
27452}
27453#endif /* OBJ_ELF */
27454
27455/* Parse a .cpu directive.  */
27456
27457static void
27458s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
27459{
27460  const struct arm_cpu_option_table *opt;
27461  char *name;
27462  char saved_char;
27463
27464  name = input_line_pointer;
27465  while (*input_line_pointer && !ISSPACE (*input_line_pointer))
27466    input_line_pointer++;
27467  saved_char = *input_line_pointer;
27468  *input_line_pointer = 0;
27469
27470  /* Skip the first "all" entry.  */
27471  for (opt = arm_cpus + 1; opt->name != NULL; opt++)
27472    if (streq (opt->name, name))
27473      {
27474	selected_arch = opt->value;
27475	selected_ext = opt->ext;
27476	ARM_MERGE_FEATURE_SETS (selected_cpu, selected_arch, selected_ext);
27477	if (opt->canonical_name)
27478	  strcpy (selected_cpu_name, opt->canonical_name);
27479	else
27480	  {
27481	    int i;
27482	    for (i = 0; opt->name[i]; i++)
27483	      selected_cpu_name[i] = TOUPPER (opt->name[i]);
27484
27485	    selected_cpu_name[i] = 0;
27486	  }
27487	ARM_MERGE_FEATURE_SETS (cpu_variant, selected_cpu, selected_fpu);
27488
27489	*input_line_pointer = saved_char;
27490	demand_empty_rest_of_line ();
27491	return;
27492      }
27493  as_bad (_("unknown cpu `%s'"), name);
27494  *input_line_pointer = saved_char;
27495  ignore_rest_of_line ();
27496}
27497
27498/* Parse a .arch directive.  */
27499
27500static void
27501s_arm_arch (int ignored ATTRIBUTE_UNUSED)
27502{
27503  const struct arm_arch_option_table *opt;
27504  char saved_char;
27505  char *name;
27506
27507  name = input_line_pointer;
27508  while (*input_line_pointer && !ISSPACE (*input_line_pointer))
27509    input_line_pointer++;
27510  saved_char = *input_line_pointer;
27511  *input_line_pointer = 0;
27512
27513  /* Skip the first "all" entry.  */
27514  for (opt = arm_archs + 1; opt->name != NULL; opt++)
27515    if (streq (opt->name, name))
27516      {
27517	selected_arch = opt->value;
27518	selected_ext = arm_arch_none;
27519	selected_cpu = selected_arch;
27520	strcpy (selected_cpu_name, opt->name);
27521	ARM_MERGE_FEATURE_SETS (cpu_variant, selected_cpu, selected_fpu);
27522	*input_line_pointer = saved_char;
27523	demand_empty_rest_of_line ();
27524	return;
27525      }
27526
27527  as_bad (_("unknown architecture `%s'\n"), name);
27528  *input_line_pointer = saved_char;
27529  ignore_rest_of_line ();
27530}
27531
27532/* Parse a .object_arch directive.  */
27533
27534static void
27535s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
27536{
27537  const struct arm_arch_option_table *opt;
27538  char saved_char;
27539  char *name;
27540
27541  name = input_line_pointer;
27542  while (*input_line_pointer && !ISSPACE (*input_line_pointer))
27543    input_line_pointer++;
27544  saved_char = *input_line_pointer;
27545  *input_line_pointer = 0;
27546
27547  /* Skip the first "all" entry.  */
27548  for (opt = arm_archs + 1; opt->name != NULL; opt++)
27549    if (streq (opt->name, name))
27550      {
27551	selected_object_arch = opt->value;
27552	*input_line_pointer = saved_char;
27553	demand_empty_rest_of_line ();
27554	return;
27555      }
27556
27557  as_bad (_("unknown architecture `%s'\n"), name);
27558  *input_line_pointer = saved_char;
27559  ignore_rest_of_line ();
27560}
27561
27562/* Parse a .arch_extension directive.  */
27563
27564static void
27565s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
27566{
27567  const struct arm_option_extension_value_table *opt;
27568  char saved_char;
27569  char *name;
27570  int adding_value = 1;
27571
27572  name = input_line_pointer;
27573  while (*input_line_pointer && !ISSPACE (*input_line_pointer))
27574    input_line_pointer++;
27575  saved_char = *input_line_pointer;
27576  *input_line_pointer = 0;
27577
27578  if (strlen (name) >= 2
27579      && strncmp (name, "no", 2) == 0)
27580    {
27581      adding_value = 0;
27582      name += 2;
27583    }
27584
27585  for (opt = arm_extensions; opt->name != NULL; opt++)
27586    if (streq (opt->name, name))
27587      {
27588	int i, nb_allowed_archs =
27589	  sizeof (opt->allowed_archs) / sizeof (opt->allowed_archs[i]);
27590	for (i = 0; i < nb_allowed_archs; i++)
27591	  {
27592	    /* Empty entry.  */
27593	    if (ARM_CPU_IS_ANY (opt->allowed_archs[i]))
27594	      continue;
27595	    if (ARM_FSET_CPU_SUBSET (opt->allowed_archs[i], selected_arch))
27596	      break;
27597	  }
27598
27599	if (i == nb_allowed_archs)
27600	  {
27601	    as_bad (_("architectural extension `%s' is not allowed for the "
27602		      "current base architecture"), name);
27603	    break;
27604	  }
27605
27606	if (adding_value)
27607	  ARM_MERGE_FEATURE_SETS (selected_ext, selected_ext,
27608				  opt->merge_value);
27609	else
27610	  ARM_CLEAR_FEATURE (selected_ext, selected_ext, opt->clear_value);
27611
27612	ARM_MERGE_FEATURE_SETS (selected_cpu, selected_arch, selected_ext);
27613	ARM_MERGE_FEATURE_SETS (cpu_variant, selected_cpu, selected_fpu);
27614	*input_line_pointer = saved_char;
27615	demand_empty_rest_of_line ();
27616	/* Allowing Thumb division instructions for ARMv7 in autodetection rely
27617	   on this return so that duplicate extensions (extensions with the
27618	   same name as a previous extension in the list) are not considered
27619	   for command-line parsing.  */
27620	return;
27621      }
27622
27623  if (opt->name == NULL)
27624    as_bad (_("unknown architecture extension `%s'\n"), name);
27625
27626  *input_line_pointer = saved_char;
27627  ignore_rest_of_line ();
27628}
27629
27630/* Parse a .fpu directive.  */
27631
27632static void
27633s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
27634{
27635  const struct arm_option_fpu_value_table *opt;
27636  char saved_char;
27637  char *name;
27638
27639  name = input_line_pointer;
27640  while (*input_line_pointer && !ISSPACE (*input_line_pointer))
27641    input_line_pointer++;
27642  saved_char = *input_line_pointer;
27643  *input_line_pointer = 0;
27644
27645  for (opt = arm_fpus; opt->name != NULL; opt++)
27646    if (streq (opt->name, name))
27647      {
27648	selected_fpu = opt->value;
27649#ifndef CPU_DEFAULT
27650	if (no_cpu_selected ())
27651	  ARM_MERGE_FEATURE_SETS (cpu_variant, arm_arch_any, selected_fpu);
27652	else
27653#endif
27654	  ARM_MERGE_FEATURE_SETS (cpu_variant, selected_cpu, selected_fpu);
27655	*input_line_pointer = saved_char;
27656	demand_empty_rest_of_line ();
27657	return;
27658      }
27659
27660  as_bad (_("unknown floating point format `%s'\n"), name);
27661  *input_line_pointer = saved_char;
27662  ignore_rest_of_line ();
27663}
27664
27665/* Copy symbol information.  */
27666
27667void
27668arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
27669{
27670  ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
27671}
27672
27673#ifdef OBJ_ELF
27674/* Given a symbolic attribute NAME, return the proper integer value.
27675   Returns -1 if the attribute is not known.  */
27676
27677int
27678arm_convert_symbolic_attribute (const char *name)
27679{
27680  static const struct
27681  {
27682    const char * name;
27683    const int    tag;
27684  }
27685  attribute_table[] =
27686    {
27687      /* When you modify this table you should
27688	 also modify the list in doc/c-arm.texi.  */
27689#define T(tag) {#tag, tag}
27690      T (Tag_CPU_raw_name),
27691      T (Tag_CPU_name),
27692      T (Tag_CPU_arch),
27693      T (Tag_CPU_arch_profile),
27694      T (Tag_ARM_ISA_use),
27695      T (Tag_THUMB_ISA_use),
27696      T (Tag_FP_arch),
27697      T (Tag_VFP_arch),
27698      T (Tag_WMMX_arch),
27699      T (Tag_Advanced_SIMD_arch),
27700      T (Tag_PCS_config),
27701      T (Tag_ABI_PCS_R9_use),
27702      T (Tag_ABI_PCS_RW_data),
27703      T (Tag_ABI_PCS_RO_data),
27704      T (Tag_ABI_PCS_GOT_use),
27705      T (Tag_ABI_PCS_wchar_t),
27706      T (Tag_ABI_FP_rounding),
27707      T (Tag_ABI_FP_denormal),
27708      T (Tag_ABI_FP_exceptions),
27709      T (Tag_ABI_FP_user_exceptions),
27710      T (Tag_ABI_FP_number_model),
27711      T (Tag_ABI_align_needed),
27712      T (Tag_ABI_align8_needed),
27713      T (Tag_ABI_align_preserved),
27714      T (Tag_ABI_align8_preserved),
27715      T (Tag_ABI_enum_size),
27716      T (Tag_ABI_HardFP_use),
27717      T (Tag_ABI_VFP_args),
27718      T (Tag_ABI_WMMX_args),
27719      T (Tag_ABI_optimization_goals),
27720      T (Tag_ABI_FP_optimization_goals),
27721      T (Tag_compatibility),
27722      T (Tag_CPU_unaligned_access),
27723      T (Tag_FP_HP_extension),
27724      T (Tag_VFP_HP_extension),
27725      T (Tag_ABI_FP_16bit_format),
27726      T (Tag_MPextension_use),
27727      T (Tag_DIV_use),
27728      T (Tag_nodefaults),
27729      T (Tag_also_compatible_with),
27730      T (Tag_conformance),
27731      T (Tag_T2EE_use),
27732      T (Tag_Virtualization_use),
27733      T (Tag_DSP_extension),
27734      /* We deliberately do not include Tag_MPextension_use_legacy.  */
27735#undef T
27736    };
27737  unsigned int i;
27738
27739  if (name == NULL)
27740    return -1;
27741
27742  for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
27743    if (streq (name, attribute_table[i].name))
27744      return attribute_table[i].tag;
27745
27746  return -1;
27747}
27748
27749/* Apply sym value for relocations only in the case that they are for
27750   local symbols in the same segment as the fixup and you have the
27751   respective architectural feature for blx and simple switches.  */
27752
27753int
27754arm_apply_sym_value (struct fix * fixP, segT this_seg)
27755{
27756  if (fixP->fx_addsy
27757      && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
27758      /* PR 17444: If the local symbol is in a different section then a reloc
27759	 will always be generated for it, so applying the symbol value now
27760	 will result in a double offset being stored in the relocation.  */
27761      && (S_GET_SEGMENT (fixP->fx_addsy) == this_seg)
27762      && !S_FORCE_RELOC (fixP->fx_addsy, TRUE))
27763    {
27764      switch (fixP->fx_r_type)
27765	{
27766	case BFD_RELOC_ARM_PCREL_BLX:
27767	case BFD_RELOC_THUMB_PCREL_BRANCH23:
27768	  if (ARM_IS_FUNC (fixP->fx_addsy))
27769	    return 1;
27770	  break;
27771
27772	case BFD_RELOC_ARM_PCREL_CALL:
27773	case BFD_RELOC_THUMB_PCREL_BLX:
27774	  if (THUMB_IS_FUNC (fixP->fx_addsy))
27775	    return 1;
27776	  break;
27777
27778	default:
27779	  break;
27780	}
27781
27782    }
27783  return 0;
27784}
27785#endif /* OBJ_ELF */
27786