]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-arm.c
* config.bfd: Move previously obsoleted targets to the REMOVED list.
[thirdparty/binutils-gdb.git] / gas / config / tc-arm.c
CommitLineData
b99bd4ef 1/* tc-arm.c -- Assemble for the ARM
f17c130b 2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
ebd1c875 3 2004, 2005, 2006
b99bd4ef
NC
4 Free Software Foundation, Inc.
5 Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
6 Modified by David Taylor (dtaylor@armltd.co.uk)
22d9c8c5 7 Cirrus coprocessor mods by Aldy Hernandez (aldyh@redhat.com)
34920d91
NC
8 Cirrus coprocessor fixes by Petko Manolov (petkan@nucleusys.com)
9 Cirrus coprocessor fixes by Vladimir Ivanov (vladitx@nucleusys.com)
b99bd4ef
NC
10
11 This file is part of GAS, the GNU Assembler.
12
13 GAS is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 2, or (at your option)
16 any later version.
17
18 GAS is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
c19d1205 20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b99bd4ef
NC
21 GNU General Public License for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with GAS; see the file COPYING. If not, write to the Free
699d2810
NC
25 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
26 02110-1301, USA. */
b99bd4ef 27
5287ad62 28#include <limits.h>
037e8744 29#include <stdarg.h>
c19d1205 30#define NO_RELOC 0
b99bd4ef 31#include "as.h"
3882b010 32#include "safe-ctype.h"
b99bd4ef
NC
33#include "subsegs.h"
34#include "obstack.h"
b99bd4ef 35
f263249b
RE
36#include "opcode/arm.h"
37
b99bd4ef
NC
38#ifdef OBJ_ELF
39#include "elf/arm.h"
a394c00f 40#include "dw2gencfi.h"
b99bd4ef
NC
41#endif
42
f0927246
NC
43#include "dwarf2dbg.h"
44
720abc60 45#define WARN_DEPRECATED 1
03b1477f 46
7ed4c4c5
NC
47#ifdef OBJ_ELF
48/* Must be at least the size of the largest unwind opcode (currently two). */
49#define ARM_OPCODE_CHUNK_SIZE 8
50
51/* This structure holds the unwinding state. */
52
53static struct
54{
c19d1205
ZW
55 symbolS * proc_start;
56 symbolS * table_entry;
57 symbolS * personality_routine;
58 int personality_index;
7ed4c4c5 59 /* The segment containing the function. */
c19d1205
ZW
60 segT saved_seg;
61 subsegT saved_subseg;
7ed4c4c5
NC
62 /* Opcodes generated from this function. */
63 unsigned char * opcodes;
c19d1205
ZW
64 int opcode_count;
65 int opcode_alloc;
7ed4c4c5 66 /* The number of bytes pushed to the stack. */
c19d1205 67 offsetT frame_size;
7ed4c4c5
NC
68 /* We don't add stack adjustment opcodes immediately so that we can merge
69 multiple adjustments. We can also omit the final adjustment
70 when using a frame pointer. */
c19d1205 71 offsetT pending_offset;
7ed4c4c5 72 /* These two fields are set by both unwind_movsp and unwind_setfp. They
c19d1205
ZW
73 hold the reg+offset to use when restoring sp from a frame pointer. */
74 offsetT fp_offset;
75 int fp_reg;
7ed4c4c5 76 /* Nonzero if an unwind_setfp directive has been seen. */
c19d1205 77 unsigned fp_used:1;
7ed4c4c5 78 /* Nonzero if the last opcode restores sp from fp_reg. */
c19d1205 79 unsigned sp_restored:1;
7ed4c4c5
NC
80} unwind;
81
8b1ad454
NC
82/* Bit N indicates that an R_ARM_NONE relocation has been output for
83 __aeabi_unwind_cpp_prN already if set. This enables dependencies to be
84 emitted only once per section, to save unnecessary bloat. */
85static unsigned int marked_pr_dependency = 0;
86
87#endif /* OBJ_ELF */
88
4962c51a
MS
89/* Results from operand parsing worker functions. */
90
91typedef enum
92{
93 PARSE_OPERAND_SUCCESS,
94 PARSE_OPERAND_FAIL,
95 PARSE_OPERAND_FAIL_NO_BACKTRACK
96} parse_operand_result;
97
33a392fb
PB
98enum arm_float_abi
99{
100 ARM_FLOAT_ABI_HARD,
101 ARM_FLOAT_ABI_SOFTFP,
102 ARM_FLOAT_ABI_SOFT
103};
104
c19d1205 105/* Types of processor to assemble for. */
b99bd4ef
NC
106#ifndef CPU_DEFAULT
107#if defined __XSCALE__
e74cfd16 108#define CPU_DEFAULT ARM_ARCH_XSCALE
b99bd4ef
NC
109#else
110#if defined __thumb__
e74cfd16 111#define CPU_DEFAULT ARM_ARCH_V5T
b99bd4ef
NC
112#endif
113#endif
114#endif
115
116#ifndef FPU_DEFAULT
c820d418
MM
117# ifdef TE_LINUX
118# define FPU_DEFAULT FPU_ARCH_FPA
119# elif defined (TE_NetBSD)
120# ifdef OBJ_ELF
121# define FPU_DEFAULT FPU_ARCH_VFP /* Soft-float, but VFP order. */
122# else
123 /* Legacy a.out format. */
124# define FPU_DEFAULT FPU_ARCH_FPA /* Soft-float, but FPA order. */
125# endif
4e7fd91e
PB
126# elif defined (TE_VXWORKS)
127# define FPU_DEFAULT FPU_ARCH_VFP /* Soft-float, VFP order. */
c820d418
MM
128# else
129 /* For backwards compatibility, default to FPA. */
130# define FPU_DEFAULT FPU_ARCH_FPA
131# endif
132#endif /* ifndef FPU_DEFAULT */
b99bd4ef 133
c19d1205 134#define streq(a, b) (strcmp (a, b) == 0)
b99bd4ef 135
e74cfd16
PB
136static arm_feature_set cpu_variant;
137static arm_feature_set arm_arch_used;
138static arm_feature_set thumb_arch_used;
b99bd4ef 139
b99bd4ef 140/* Flags stored in private area of BFD structure. */
c19d1205
ZW
141static int uses_apcs_26 = FALSE;
142static int atpcs = FALSE;
b34976b6
AM
143static int support_interwork = FALSE;
144static int uses_apcs_float = FALSE;
c19d1205 145static int pic_code = FALSE;
03b1477f
RE
146
147/* Variables that we set while parsing command-line options. Once all
148 options have been read we re-process these values to set the real
149 assembly flags. */
e74cfd16
PB
150static const arm_feature_set *legacy_cpu = NULL;
151static const arm_feature_set *legacy_fpu = NULL;
152
153static const arm_feature_set *mcpu_cpu_opt = NULL;
154static const arm_feature_set *mcpu_fpu_opt = NULL;
155static const arm_feature_set *march_cpu_opt = NULL;
156static const arm_feature_set *march_fpu_opt = NULL;
157static const arm_feature_set *mfpu_opt = NULL;
7a1d4c38 158static const arm_feature_set *object_arch = NULL;
e74cfd16
PB
159
160/* Constants for known architecture features. */
161static const arm_feature_set fpu_default = FPU_DEFAULT;
162static const arm_feature_set fpu_arch_vfp_v1 = FPU_ARCH_VFP_V1;
163static const arm_feature_set fpu_arch_vfp_v2 = FPU_ARCH_VFP_V2;
5287ad62
JB
164static const arm_feature_set fpu_arch_vfp_v3 = FPU_ARCH_VFP_V3;
165static const arm_feature_set fpu_arch_neon_v1 = FPU_ARCH_NEON_V1;
e74cfd16
PB
166static const arm_feature_set fpu_arch_fpa = FPU_ARCH_FPA;
167static const arm_feature_set fpu_any_hard = FPU_ANY_HARD;
168static const arm_feature_set fpu_arch_maverick = FPU_ARCH_MAVERICK;
169static const arm_feature_set fpu_endian_pure = FPU_ARCH_ENDIAN_PURE;
170
171#ifdef CPU_DEFAULT
172static const arm_feature_set cpu_default = CPU_DEFAULT;
173#endif
174
175static const arm_feature_set arm_ext_v1 = ARM_FEATURE (ARM_EXT_V1, 0);
176static const arm_feature_set arm_ext_v2 = ARM_FEATURE (ARM_EXT_V1, 0);
177static const arm_feature_set arm_ext_v2s = ARM_FEATURE (ARM_EXT_V2S, 0);
178static const arm_feature_set arm_ext_v3 = ARM_FEATURE (ARM_EXT_V3, 0);
179static const arm_feature_set arm_ext_v3m = ARM_FEATURE (ARM_EXT_V3M, 0);
180static const arm_feature_set arm_ext_v4 = ARM_FEATURE (ARM_EXT_V4, 0);
181static const arm_feature_set arm_ext_v4t = ARM_FEATURE (ARM_EXT_V4T, 0);
182static const arm_feature_set arm_ext_v5 = ARM_FEATURE (ARM_EXT_V5, 0);
183static const arm_feature_set arm_ext_v4t_5 =
184 ARM_FEATURE (ARM_EXT_V4T | ARM_EXT_V5, 0);
185static const arm_feature_set arm_ext_v5t = ARM_FEATURE (ARM_EXT_V5T, 0);
186static const arm_feature_set arm_ext_v5e = ARM_FEATURE (ARM_EXT_V5E, 0);
187static const arm_feature_set arm_ext_v5exp = ARM_FEATURE (ARM_EXT_V5ExP, 0);
188static const arm_feature_set arm_ext_v5j = ARM_FEATURE (ARM_EXT_V5J, 0);
189static const arm_feature_set arm_ext_v6 = ARM_FEATURE (ARM_EXT_V6, 0);
190static const arm_feature_set arm_ext_v6k = ARM_FEATURE (ARM_EXT_V6K, 0);
191static const arm_feature_set arm_ext_v6z = ARM_FEATURE (ARM_EXT_V6Z, 0);
192static const arm_feature_set arm_ext_v6t2 = ARM_FEATURE (ARM_EXT_V6T2, 0);
62b3e311
PB
193static const arm_feature_set arm_ext_v6_notm = ARM_FEATURE (ARM_EXT_V6_NOTM, 0);
194static const arm_feature_set arm_ext_div = ARM_FEATURE (ARM_EXT_DIV, 0);
195static const arm_feature_set arm_ext_v7 = ARM_FEATURE (ARM_EXT_V7, 0);
196static const arm_feature_set arm_ext_v7a = ARM_FEATURE (ARM_EXT_V7A, 0);
197static const arm_feature_set arm_ext_v7r = ARM_FEATURE (ARM_EXT_V7R, 0);
198static const arm_feature_set arm_ext_v7m = ARM_FEATURE (ARM_EXT_V7M, 0);
e74cfd16
PB
199
200static const arm_feature_set arm_arch_any = ARM_ANY;
201static const arm_feature_set arm_arch_full = ARM_FEATURE (-1, -1);
202static const arm_feature_set arm_arch_t2 = ARM_ARCH_THUMB2;
203static const arm_feature_set arm_arch_none = ARM_ARCH_NONE;
204
2d447fca
JM
205static const arm_feature_set arm_cext_iwmmxt2 =
206 ARM_FEATURE (0, ARM_CEXT_IWMMXT2);
e74cfd16
PB
207static const arm_feature_set arm_cext_iwmmxt =
208 ARM_FEATURE (0, ARM_CEXT_IWMMXT);
209static const arm_feature_set arm_cext_xscale =
210 ARM_FEATURE (0, ARM_CEXT_XSCALE);
211static const arm_feature_set arm_cext_maverick =
212 ARM_FEATURE (0, ARM_CEXT_MAVERICK);
213static const arm_feature_set fpu_fpa_ext_v1 = ARM_FEATURE (0, FPU_FPA_EXT_V1);
214static const arm_feature_set fpu_fpa_ext_v2 = ARM_FEATURE (0, FPU_FPA_EXT_V2);
215static const arm_feature_set fpu_vfp_ext_v1xd =
216 ARM_FEATURE (0, FPU_VFP_EXT_V1xD);
217static const arm_feature_set fpu_vfp_ext_v1 = ARM_FEATURE (0, FPU_VFP_EXT_V1);
218static const arm_feature_set fpu_vfp_ext_v2 = ARM_FEATURE (0, FPU_VFP_EXT_V2);
5287ad62
JB
219static const arm_feature_set fpu_vfp_ext_v3 = ARM_FEATURE (0, FPU_VFP_EXT_V3);
220static const arm_feature_set fpu_neon_ext_v1 = ARM_FEATURE (0, FPU_NEON_EXT_V1);
221static const arm_feature_set fpu_vfp_v3_or_neon_ext =
222 ARM_FEATURE (0, FPU_NEON_EXT_V1 | FPU_VFP_EXT_V3);
e74cfd16 223
33a392fb 224static int mfloat_abi_opt = -1;
e74cfd16
PB
225/* Record user cpu selection for object attributes. */
226static arm_feature_set selected_cpu = ARM_ARCH_NONE;
ee065d83
PB
227/* Must be long enough to hold any of the names in arm_cpus. */
228static char selected_cpu_name[16];
7cc69913 229#ifdef OBJ_ELF
deeaaff8
DJ
230# ifdef EABI_DEFAULT
231static int meabi_flags = EABI_DEFAULT;
232# else
d507cf36 233static int meabi_flags = EF_ARM_EABI_UNKNOWN;
deeaaff8 234# endif
7cc69913 235#endif
b99bd4ef 236
b99bd4ef 237#ifdef OBJ_ELF
c19d1205 238/* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
b99bd4ef
NC
239symbolS * GOT_symbol;
240#endif
241
b99bd4ef
NC
242/* 0: assemble for ARM,
243 1: assemble for Thumb,
244 2: assemble for Thumb even though target CPU does not support thumb
245 instructions. */
246static int thumb_mode = 0;
247
c19d1205
ZW
248/* If unified_syntax is true, we are processing the new unified
249 ARM/Thumb syntax. Important differences from the old ARM mode:
250
251 - Immediate operands do not require a # prefix.
252 - Conditional affixes always appear at the end of the
253 instruction. (For backward compatibility, those instructions
254 that formerly had them in the middle, continue to accept them
255 there.)
256 - The IT instruction may appear, and if it does is validated
257 against subsequent conditional affixes. It does not generate
258 machine code.
259
260 Important differences from the old Thumb mode:
261
262 - Immediate operands do not require a # prefix.
263 - Most of the V6T2 instructions are only available in unified mode.
264 - The .N and .W suffixes are recognized and honored (it is an error
265 if they cannot be honored).
266 - All instructions set the flags if and only if they have an 's' affix.
267 - Conditional affixes may be used. They are validated against
268 preceding IT instructions. Unlike ARM mode, you cannot use a
269 conditional affix except in the scope of an IT instruction. */
270
271static bfd_boolean unified_syntax = FALSE;
b99bd4ef 272
5287ad62
JB
273enum neon_el_type
274{
dcbf9037 275 NT_invtype,
5287ad62
JB
276 NT_untyped,
277 NT_integer,
278 NT_float,
279 NT_poly,
280 NT_signed,
dcbf9037 281 NT_unsigned
5287ad62
JB
282};
283
284struct neon_type_el
285{
286 enum neon_el_type type;
287 unsigned size;
288};
289
290#define NEON_MAX_TYPE_ELS 4
291
292struct neon_type
293{
294 struct neon_type_el el[NEON_MAX_TYPE_ELS];
295 unsigned elems;
296};
297
b99bd4ef
NC
298struct arm_it
299{
c19d1205 300 const char * error;
b99bd4ef 301 unsigned long instruction;
c19d1205
ZW
302 int size;
303 int size_req;
304 int cond;
037e8744
JB
305 /* "uncond_value" is set to the value in place of the conditional field in
306 unconditional versions of the instruction, or -1 if nothing is
307 appropriate. */
308 int uncond_value;
5287ad62 309 struct neon_type vectype;
0110f2b8
PB
310 /* Set to the opcode if the instruction needs relaxation.
311 Zero if the instruction is not relaxed. */
312 unsigned long relax;
b99bd4ef
NC
313 struct
314 {
315 bfd_reloc_code_real_type type;
c19d1205
ZW
316 expressionS exp;
317 int pc_rel;
b99bd4ef 318 } reloc;
b99bd4ef 319
c19d1205
ZW
320 struct
321 {
322 unsigned reg;
ca3f61f7 323 signed int imm;
dcbf9037 324 struct neon_type_el vectype;
ca3f61f7
NC
325 unsigned present : 1; /* Operand present. */
326 unsigned isreg : 1; /* Operand was a register. */
327 unsigned immisreg : 1; /* .imm field is a second register. */
5287ad62
JB
328 unsigned isscalar : 1; /* Operand is a (Neon) scalar. */
329 unsigned immisalign : 1; /* Immediate is an alignment specifier. */
330 /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
331 instructions. This allows us to disambiguate ARM <-> vector insns. */
332 unsigned regisimm : 1; /* 64-bit immediate, reg forms high 32 bits. */
037e8744 333 unsigned isvec : 1; /* Is a single, double or quad VFP/Neon reg. */
5287ad62 334 unsigned isquad : 1; /* Operand is Neon quad-precision register. */
037e8744 335 unsigned issingle : 1; /* Operand is VFP single-precision register. */
ca3f61f7
NC
336 unsigned hasreloc : 1; /* Operand has relocation suffix. */
337 unsigned writeback : 1; /* Operand has trailing ! */
338 unsigned preind : 1; /* Preindexed address. */
339 unsigned postind : 1; /* Postindexed address. */
340 unsigned negative : 1; /* Index register was negated. */
341 unsigned shifted : 1; /* Shift applied to operation. */
342 unsigned shift_kind : 3; /* Shift operation (enum shift_kind). */
c19d1205 343 } operands[6];
b99bd4ef
NC
344};
345
c19d1205 346static struct arm_it inst;
b99bd4ef
NC
347
348#define NUM_FLOAT_VALS 8
349
05d2d07e 350const char * fp_const[] =
b99bd4ef
NC
351{
352 "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
353};
354
c19d1205 355/* Number of littlenums required to hold an extended precision number. */
b99bd4ef
NC
356#define MAX_LITTLENUMS 6
357
358LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
359
360#define FAIL (-1)
361#define SUCCESS (0)
362
363#define SUFF_S 1
364#define SUFF_D 2
365#define SUFF_E 3
366#define SUFF_P 4
367
c19d1205
ZW
368#define CP_T_X 0x00008000
369#define CP_T_Y 0x00400000
b99bd4ef 370
c19d1205
ZW
371#define CONDS_BIT 0x00100000
372#define LOAD_BIT 0x00100000
b99bd4ef
NC
373
374#define DOUBLE_LOAD_FLAG 0x00000001
375
376struct asm_cond
377{
c19d1205 378 const char * template;
b99bd4ef
NC
379 unsigned long value;
380};
381
c19d1205 382#define COND_ALWAYS 0xE
b99bd4ef 383
b99bd4ef
NC
384struct asm_psr
385{
b34976b6 386 const char *template;
b99bd4ef
NC
387 unsigned long field;
388};
389
62b3e311
PB
390struct asm_barrier_opt
391{
392 const char *template;
393 unsigned long value;
394};
395
2d2255b5 396/* The bit that distinguishes CPSR and SPSR. */
b99bd4ef
NC
397#define SPSR_BIT (1 << 22)
398
c19d1205
ZW
399/* The individual PSR flag bits. */
400#define PSR_c (1 << 16)
401#define PSR_x (1 << 17)
402#define PSR_s (1 << 18)
403#define PSR_f (1 << 19)
b99bd4ef 404
c19d1205 405struct reloc_entry
bfae80f2 406{
c19d1205
ZW
407 char *name;
408 bfd_reloc_code_real_type reloc;
bfae80f2
RE
409};
410
5287ad62 411enum vfp_reg_pos
bfae80f2 412{
5287ad62
JB
413 VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
414 VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
bfae80f2
RE
415};
416
417enum vfp_ldstm_type
418{
419 VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
420};
421
dcbf9037
JB
422/* Bits for DEFINED field in neon_typed_alias. */
423#define NTA_HASTYPE 1
424#define NTA_HASINDEX 2
425
426struct neon_typed_alias
427{
428 unsigned char defined;
429 unsigned char index;
430 struct neon_type_el eltype;
431};
432
c19d1205
ZW
433/* ARM register categories. This includes coprocessor numbers and various
434 architecture extensions' registers. */
435enum arm_reg_type
bfae80f2 436{
c19d1205
ZW
437 REG_TYPE_RN,
438 REG_TYPE_CP,
439 REG_TYPE_CN,
440 REG_TYPE_FN,
441 REG_TYPE_VFS,
442 REG_TYPE_VFD,
5287ad62 443 REG_TYPE_NQ,
037e8744 444 REG_TYPE_VFSD,
5287ad62 445 REG_TYPE_NDQ,
037e8744 446 REG_TYPE_NSDQ,
c19d1205
ZW
447 REG_TYPE_VFC,
448 REG_TYPE_MVF,
449 REG_TYPE_MVD,
450 REG_TYPE_MVFX,
451 REG_TYPE_MVDX,
452 REG_TYPE_MVAX,
453 REG_TYPE_DSPSC,
454 REG_TYPE_MMXWR,
455 REG_TYPE_MMXWC,
456 REG_TYPE_MMXWCG,
457 REG_TYPE_XSCALE,
bfae80f2
RE
458};
459
dcbf9037
JB
460/* Structure for a hash table entry for a register.
461 If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
462 information which states whether a vector type or index is specified (for a
463 register alias created with .dn or .qn). Otherwise NEON should be NULL. */
6c43fab6
RE
464struct reg_entry
465{
dcbf9037
JB
466 const char *name;
467 unsigned char number;
468 unsigned char type;
469 unsigned char builtin;
470 struct neon_typed_alias *neon;
6c43fab6
RE
471};
472
c19d1205
ZW
473/* Diagnostics used when we don't get a register of the expected type. */
474const char *const reg_expected_msgs[] =
475{
476 N_("ARM register expected"),
477 N_("bad or missing co-processor number"),
478 N_("co-processor register expected"),
479 N_("FPA register expected"),
480 N_("VFP single precision register expected"),
5287ad62
JB
481 N_("VFP/Neon double precision register expected"),
482 N_("Neon quad precision register expected"),
037e8744 483 N_("VFP single or double precision register expected"),
5287ad62 484 N_("Neon double or quad precision register expected"),
037e8744 485 N_("VFP single, double or Neon quad precision register expected"),
c19d1205
ZW
486 N_("VFP system register expected"),
487 N_("Maverick MVF register expected"),
488 N_("Maverick MVD register expected"),
489 N_("Maverick MVFX register expected"),
490 N_("Maverick MVDX register expected"),
491 N_("Maverick MVAX register expected"),
492 N_("Maverick DSPSC register expected"),
493 N_("iWMMXt data register expected"),
494 N_("iWMMXt control register expected"),
495 N_("iWMMXt scalar register expected"),
496 N_("XScale accumulator register expected"),
6c43fab6
RE
497};
498
c19d1205
ZW
499/* Some well known registers that we refer to directly elsewhere. */
500#define REG_SP 13
501#define REG_LR 14
502#define REG_PC 15
404ff6b5 503
b99bd4ef
NC
504/* ARM instructions take 4bytes in the object file, Thumb instructions
505 take 2: */
c19d1205 506#define INSN_SIZE 4
b99bd4ef
NC
507
508struct asm_opcode
509{
510 /* Basic string to match. */
c19d1205
ZW
511 const char *template;
512
513 /* Parameters to instruction. */
514 unsigned char operands[8];
515
516 /* Conditional tag - see opcode_lookup. */
517 unsigned int tag : 4;
b99bd4ef
NC
518
519 /* Basic instruction code. */
c19d1205 520 unsigned int avalue : 28;
b99bd4ef 521
c19d1205
ZW
522 /* Thumb-format instruction code. */
523 unsigned int tvalue;
b99bd4ef 524
90e4755a 525 /* Which architecture variant provides this instruction. */
e74cfd16
PB
526 const arm_feature_set *avariant;
527 const arm_feature_set *tvariant;
c19d1205
ZW
528
529 /* Function to call to encode instruction in ARM format. */
530 void (* aencode) (void);
b99bd4ef 531
c19d1205
ZW
532 /* Function to call to encode instruction in Thumb format. */
533 void (* tencode) (void);
b99bd4ef
NC
534};
535
a737bd4d
NC
536/* Defines for various bits that we will want to toggle. */
537#define INST_IMMEDIATE 0x02000000
538#define OFFSET_REG 0x02000000
c19d1205 539#define HWOFFSET_IMM 0x00400000
a737bd4d
NC
540#define SHIFT_BY_REG 0x00000010
541#define PRE_INDEX 0x01000000
542#define INDEX_UP 0x00800000
543#define WRITE_BACK 0x00200000
544#define LDM_TYPE_2_OR_3 0x00400000
90e4755a 545
a737bd4d
NC
546#define LITERAL_MASK 0xf000f000
547#define OPCODE_MASK 0xfe1fffff
548#define V4_STR_BIT 0x00000020
90e4755a 549
a737bd4d 550#define DATA_OP_SHIFT 21
90e4755a 551
ef8d22e6
PB
552#define T2_OPCODE_MASK 0xfe1fffff
553#define T2_DATA_OP_SHIFT 21
554
a737bd4d
NC
555/* Codes to distinguish the arithmetic instructions. */
556#define OPCODE_AND 0
557#define OPCODE_EOR 1
558#define OPCODE_SUB 2
559#define OPCODE_RSB 3
560#define OPCODE_ADD 4
561#define OPCODE_ADC 5
562#define OPCODE_SBC 6
563#define OPCODE_RSC 7
564#define OPCODE_TST 8
565#define OPCODE_TEQ 9
566#define OPCODE_CMP 10
567#define OPCODE_CMN 11
568#define OPCODE_ORR 12
569#define OPCODE_MOV 13
570#define OPCODE_BIC 14
571#define OPCODE_MVN 15
90e4755a 572
ef8d22e6
PB
573#define T2_OPCODE_AND 0
574#define T2_OPCODE_BIC 1
575#define T2_OPCODE_ORR 2
576#define T2_OPCODE_ORN 3
577#define T2_OPCODE_EOR 4
578#define T2_OPCODE_ADD 8
579#define T2_OPCODE_ADC 10
580#define T2_OPCODE_SBC 11
581#define T2_OPCODE_SUB 13
582#define T2_OPCODE_RSB 14
583
a737bd4d
NC
584#define T_OPCODE_MUL 0x4340
585#define T_OPCODE_TST 0x4200
586#define T_OPCODE_CMN 0x42c0
587#define T_OPCODE_NEG 0x4240
588#define T_OPCODE_MVN 0x43c0
90e4755a 589
a737bd4d
NC
590#define T_OPCODE_ADD_R3 0x1800
591#define T_OPCODE_SUB_R3 0x1a00
592#define T_OPCODE_ADD_HI 0x4400
593#define T_OPCODE_ADD_ST 0xb000
594#define T_OPCODE_SUB_ST 0xb080
595#define T_OPCODE_ADD_SP 0xa800
596#define T_OPCODE_ADD_PC 0xa000
597#define T_OPCODE_ADD_I8 0x3000
598#define T_OPCODE_SUB_I8 0x3800
599#define T_OPCODE_ADD_I3 0x1c00
600#define T_OPCODE_SUB_I3 0x1e00
b99bd4ef 601
a737bd4d
NC
602#define T_OPCODE_ASR_R 0x4100
603#define T_OPCODE_LSL_R 0x4080
c19d1205
ZW
604#define T_OPCODE_LSR_R 0x40c0
605#define T_OPCODE_ROR_R 0x41c0
a737bd4d
NC
606#define T_OPCODE_ASR_I 0x1000
607#define T_OPCODE_LSL_I 0x0000
608#define T_OPCODE_LSR_I 0x0800
b99bd4ef 609
a737bd4d
NC
610#define T_OPCODE_MOV_I8 0x2000
611#define T_OPCODE_CMP_I8 0x2800
612#define T_OPCODE_CMP_LR 0x4280
613#define T_OPCODE_MOV_HR 0x4600
614#define T_OPCODE_CMP_HR 0x4500
b99bd4ef 615
a737bd4d
NC
616#define T_OPCODE_LDR_PC 0x4800
617#define T_OPCODE_LDR_SP 0x9800
618#define T_OPCODE_STR_SP 0x9000
619#define T_OPCODE_LDR_IW 0x6800
620#define T_OPCODE_STR_IW 0x6000
621#define T_OPCODE_LDR_IH 0x8800
622#define T_OPCODE_STR_IH 0x8000
623#define T_OPCODE_LDR_IB 0x7800
624#define T_OPCODE_STR_IB 0x7000
625#define T_OPCODE_LDR_RW 0x5800
626#define T_OPCODE_STR_RW 0x5000
627#define T_OPCODE_LDR_RH 0x5a00
628#define T_OPCODE_STR_RH 0x5200
629#define T_OPCODE_LDR_RB 0x5c00
630#define T_OPCODE_STR_RB 0x5400
c9b604bd 631
a737bd4d
NC
632#define T_OPCODE_PUSH 0xb400
633#define T_OPCODE_POP 0xbc00
b99bd4ef 634
2fc8bdac 635#define T_OPCODE_BRANCH 0xe000
b99bd4ef 636
a737bd4d 637#define THUMB_SIZE 2 /* Size of thumb instruction. */
a737bd4d 638#define THUMB_PP_PC_LR 0x0100
c19d1205 639#define THUMB_LOAD_BIT 0x0800
53365c0d 640#define THUMB2_LOAD_BIT 0x00100000
c19d1205
ZW
641
642#define BAD_ARGS _("bad arguments to instruction")
643#define BAD_PC _("r15 not allowed here")
644#define BAD_COND _("instruction cannot be conditional")
645#define BAD_OVERLAP _("registers may not be the same")
646#define BAD_HIREG _("lo register required")
647#define BAD_THUMB32 _("instruction not supported in Thumb16 mode")
01cfc07f 648#define BAD_ADDR_MODE _("instruction does not accept this addressing mode");
dfa9f0d5
PB
649#define BAD_BRANCH _("branch must be last instruction in IT block")
650#define BAD_NOT_IT _("instruction not allowed in IT block")
037e8744 651#define BAD_FPU _("selected FPU does not support instruction")
c19d1205
ZW
652
653static struct hash_control *arm_ops_hsh;
654static struct hash_control *arm_cond_hsh;
655static struct hash_control *arm_shift_hsh;
656static struct hash_control *arm_psr_hsh;
62b3e311 657static struct hash_control *arm_v7m_psr_hsh;
c19d1205
ZW
658static struct hash_control *arm_reg_hsh;
659static struct hash_control *arm_reloc_hsh;
62b3e311 660static struct hash_control *arm_barrier_opt_hsh;
b99bd4ef 661
b99bd4ef
NC
662/* Stuff needed to resolve the label ambiguity
663 As:
664 ...
665 label: <insn>
666 may differ from:
667 ...
668 label:
c19d1205 669 <insn>
b99bd4ef
NC
670*/
671
672symbolS * last_label_seen;
b34976b6 673static int label_is_thumb_function_name = FALSE;
a737bd4d 674\f
3d0c9500
NC
675/* Literal pool structure. Held on a per-section
676 and per-sub-section basis. */
a737bd4d 677
c19d1205 678#define MAX_LITERAL_POOL_SIZE 1024
3d0c9500 679typedef struct literal_pool
b99bd4ef 680{
c19d1205
ZW
681 expressionS literals [MAX_LITERAL_POOL_SIZE];
682 unsigned int next_free_entry;
683 unsigned int id;
684 symbolS * symbol;
685 segT section;
686 subsegT sub_section;
61b5f74b 687 struct literal_pool * next;
3d0c9500 688} literal_pool;
b99bd4ef 689
3d0c9500
NC
690/* Pointer to a linked list of literal pools. */
691literal_pool * list_of_pools = NULL;
e27ec89e
PB
692
693/* State variables for IT block handling. */
694static bfd_boolean current_it_mask = 0;
695static int current_cc;
696
c19d1205
ZW
697\f
698/* Pure syntax. */
b99bd4ef 699
c19d1205
ZW
700/* This array holds the chars that always start a comment. If the
701 pre-processor is disabled, these aren't very useful. */
702const char comment_chars[] = "@";
3d0c9500 703
c19d1205
ZW
704/* This array holds the chars that only start a comment at the beginning of
705 a line. If the line seems to have the form '# 123 filename'
706 .line and .file directives will appear in the pre-processed output. */
707/* Note that input_file.c hand checks for '#' at the beginning of the
708 first line of the input file. This is because the compiler outputs
709 #NO_APP at the beginning of its output. */
710/* Also note that comments like this one will always work. */
711const char line_comment_chars[] = "#";
3d0c9500 712
c19d1205 713const char line_separator_chars[] = ";";
b99bd4ef 714
c19d1205
ZW
715/* Chars that can be used to separate mant
716 from exp in floating point numbers. */
717const char EXP_CHARS[] = "eE";
3d0c9500 718
c19d1205
ZW
719/* Chars that mean this number is a floating point constant. */
720/* As in 0f12.456 */
721/* or 0d1.2345e12 */
b99bd4ef 722
c19d1205 723const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
3d0c9500 724
c19d1205
ZW
725/* Prefix characters that indicate the start of an immediate
726 value. */
727#define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
3d0c9500 728
c19d1205
ZW
729/* Separator character handling. */
730
731#define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
732
733static inline int
734skip_past_char (char ** str, char c)
735{
736 if (**str == c)
737 {
738 (*str)++;
739 return SUCCESS;
3d0c9500 740 }
c19d1205
ZW
741 else
742 return FAIL;
743}
744#define skip_past_comma(str) skip_past_char (str, ',')
3d0c9500 745
c19d1205
ZW
746/* Arithmetic expressions (possibly involving symbols). */
747
748/* Return TRUE if anything in the expression is a bignum. */
749
750static int
751walk_no_bignums (symbolS * sp)
752{
753 if (symbol_get_value_expression (sp)->X_op == O_big)
754 return 1;
755
756 if (symbol_get_value_expression (sp)->X_add_symbol)
3d0c9500 757 {
c19d1205
ZW
758 return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
759 || (symbol_get_value_expression (sp)->X_op_symbol
760 && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
3d0c9500
NC
761 }
762
c19d1205 763 return 0;
3d0c9500
NC
764}
765
c19d1205
ZW
766static int in_my_get_expression = 0;
767
768/* Third argument to my_get_expression. */
769#define GE_NO_PREFIX 0
770#define GE_IMM_PREFIX 1
771#define GE_OPT_PREFIX 2
5287ad62
JB
772/* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
773 immediates, as can be used in Neon VMVN and VMOV immediate instructions. */
774#define GE_OPT_PREFIX_BIG 3
a737bd4d 775
b99bd4ef 776static int
c19d1205 777my_get_expression (expressionS * ep, char ** str, int prefix_mode)
b99bd4ef 778{
c19d1205
ZW
779 char * save_in;
780 segT seg;
b99bd4ef 781
c19d1205
ZW
782 /* In unified syntax, all prefixes are optional. */
783 if (unified_syntax)
5287ad62
JB
784 prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
785 : GE_OPT_PREFIX;
b99bd4ef 786
c19d1205 787 switch (prefix_mode)
b99bd4ef 788 {
c19d1205
ZW
789 case GE_NO_PREFIX: break;
790 case GE_IMM_PREFIX:
791 if (!is_immediate_prefix (**str))
792 {
793 inst.error = _("immediate expression requires a # prefix");
794 return FAIL;
795 }
796 (*str)++;
797 break;
798 case GE_OPT_PREFIX:
5287ad62 799 case GE_OPT_PREFIX_BIG:
c19d1205
ZW
800 if (is_immediate_prefix (**str))
801 (*str)++;
802 break;
803 default: abort ();
804 }
b99bd4ef 805
c19d1205 806 memset (ep, 0, sizeof (expressionS));
b99bd4ef 807
c19d1205
ZW
808 save_in = input_line_pointer;
809 input_line_pointer = *str;
810 in_my_get_expression = 1;
811 seg = expression (ep);
812 in_my_get_expression = 0;
813
814 if (ep->X_op == O_illegal)
b99bd4ef 815 {
c19d1205
ZW
816 /* We found a bad expression in md_operand(). */
817 *str = input_line_pointer;
818 input_line_pointer = save_in;
819 if (inst.error == NULL)
820 inst.error = _("bad expression");
821 return 1;
822 }
b99bd4ef 823
c19d1205
ZW
824#ifdef OBJ_AOUT
825 if (seg != absolute_section
826 && seg != text_section
827 && seg != data_section
828 && seg != bss_section
829 && seg != undefined_section)
830 {
831 inst.error = _("bad segment");
832 *str = input_line_pointer;
833 input_line_pointer = save_in;
834 return 1;
b99bd4ef 835 }
c19d1205 836#endif
b99bd4ef 837
c19d1205
ZW
838 /* Get rid of any bignums now, so that we don't generate an error for which
839 we can't establish a line number later on. Big numbers are never valid
840 in instructions, which is where this routine is always called. */
5287ad62
JB
841 if (prefix_mode != GE_OPT_PREFIX_BIG
842 && (ep->X_op == O_big
843 || (ep->X_add_symbol
844 && (walk_no_bignums (ep->X_add_symbol)
845 || (ep->X_op_symbol
846 && walk_no_bignums (ep->X_op_symbol))))))
c19d1205
ZW
847 {
848 inst.error = _("invalid constant");
849 *str = input_line_pointer;
850 input_line_pointer = save_in;
851 return 1;
852 }
b99bd4ef 853
c19d1205
ZW
854 *str = input_line_pointer;
855 input_line_pointer = save_in;
856 return 0;
b99bd4ef
NC
857}
858
c19d1205
ZW
859/* Turn a string in input_line_pointer into a floating point constant
860 of type TYPE, and store the appropriate bytes in *LITP. The number
861 of LITTLENUMS emitted is stored in *SIZEP. An error message is
862 returned, or NULL on OK.
b99bd4ef 863
c19d1205
ZW
864 Note that fp constants aren't represent in the normal way on the ARM.
865 In big endian mode, things are as expected. However, in little endian
866 mode fp constants are big-endian word-wise, and little-endian byte-wise
867 within the words. For example, (double) 1.1 in big endian mode is
868 the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
869 the byte sequence 99 99 f1 3f 9a 99 99 99.
b99bd4ef 870
c19d1205 871 ??? The format of 12 byte floats is uncertain according to gcc's arm.h. */
b99bd4ef 872
c19d1205
ZW
873char *
874md_atof (int type, char * litP, int * sizeP)
875{
876 int prec;
877 LITTLENUM_TYPE words[MAX_LITTLENUMS];
878 char *t;
879 int i;
b99bd4ef 880
c19d1205
ZW
881 switch (type)
882 {
883 case 'f':
884 case 'F':
885 case 's':
886 case 'S':
887 prec = 2;
888 break;
b99bd4ef 889
c19d1205
ZW
890 case 'd':
891 case 'D':
892 case 'r':
893 case 'R':
894 prec = 4;
895 break;
b99bd4ef 896
c19d1205
ZW
897 case 'x':
898 case 'X':
899 prec = 6;
900 break;
b99bd4ef 901
c19d1205
ZW
902 case 'p':
903 case 'P':
904 prec = 6;
905 break;
a737bd4d 906
c19d1205
ZW
907 default:
908 *sizeP = 0;
909 return _("bad call to MD_ATOF()");
910 }
b99bd4ef 911
c19d1205
ZW
912 t = atof_ieee (input_line_pointer, type, words);
913 if (t)
914 input_line_pointer = t;
915 *sizeP = prec * 2;
b99bd4ef 916
c19d1205
ZW
917 if (target_big_endian)
918 {
919 for (i = 0; i < prec; i++)
920 {
921 md_number_to_chars (litP, (valueT) words[i], 2);
922 litP += 2;
923 }
924 }
925 else
926 {
e74cfd16 927 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
c19d1205
ZW
928 for (i = prec - 1; i >= 0; i--)
929 {
930 md_number_to_chars (litP, (valueT) words[i], 2);
931 litP += 2;
932 }
933 else
934 /* For a 4 byte float the order of elements in `words' is 1 0.
935 For an 8 byte float the order is 1 0 3 2. */
936 for (i = 0; i < prec; i += 2)
937 {
938 md_number_to_chars (litP, (valueT) words[i + 1], 2);
939 md_number_to_chars (litP + 2, (valueT) words[i], 2);
940 litP += 4;
941 }
942 }
b99bd4ef 943
c19d1205
ZW
944 return 0;
945}
b99bd4ef 946
c19d1205
ZW
947/* We handle all bad expressions here, so that we can report the faulty
948 instruction in the error message. */
949void
950md_operand (expressionS * expr)
951{
952 if (in_my_get_expression)
953 expr->X_op = O_illegal;
b99bd4ef
NC
954}
955
c19d1205 956/* Immediate values. */
b99bd4ef 957
c19d1205
ZW
958/* Generic immediate-value read function for use in directives.
959 Accepts anything that 'expression' can fold to a constant.
960 *val receives the number. */
961#ifdef OBJ_ELF
962static int
963immediate_for_directive (int *val)
b99bd4ef 964{
c19d1205
ZW
965 expressionS exp;
966 exp.X_op = O_illegal;
b99bd4ef 967
c19d1205
ZW
968 if (is_immediate_prefix (*input_line_pointer))
969 {
970 input_line_pointer++;
971 expression (&exp);
972 }
b99bd4ef 973
c19d1205
ZW
974 if (exp.X_op != O_constant)
975 {
976 as_bad (_("expected #constant"));
977 ignore_rest_of_line ();
978 return FAIL;
979 }
980 *val = exp.X_add_number;
981 return SUCCESS;
b99bd4ef 982}
c19d1205 983#endif
b99bd4ef 984
c19d1205 985/* Register parsing. */
b99bd4ef 986
c19d1205
ZW
987/* Generic register parser. CCP points to what should be the
988 beginning of a register name. If it is indeed a valid register
989 name, advance CCP over it and return the reg_entry structure;
990 otherwise return NULL. Does not issue diagnostics. */
991
992static struct reg_entry *
993arm_reg_parse_multi (char **ccp)
b99bd4ef 994{
c19d1205
ZW
995 char *start = *ccp;
996 char *p;
997 struct reg_entry *reg;
b99bd4ef 998
c19d1205
ZW
999#ifdef REGISTER_PREFIX
1000 if (*start != REGISTER_PREFIX)
01cfc07f 1001 return NULL;
c19d1205
ZW
1002 start++;
1003#endif
1004#ifdef OPTIONAL_REGISTER_PREFIX
1005 if (*start == OPTIONAL_REGISTER_PREFIX)
1006 start++;
1007#endif
b99bd4ef 1008
c19d1205
ZW
1009 p = start;
1010 if (!ISALPHA (*p) || !is_name_beginner (*p))
1011 return NULL;
b99bd4ef 1012
c19d1205
ZW
1013 do
1014 p++;
1015 while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1016
1017 reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1018
1019 if (!reg)
1020 return NULL;
1021
1022 *ccp = p;
1023 return reg;
b99bd4ef
NC
1024}
1025
1026static int
dcbf9037
JB
1027arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
1028 enum arm_reg_type type)
b99bd4ef 1029{
c19d1205
ZW
1030 /* Alternative syntaxes are accepted for a few register classes. */
1031 switch (type)
1032 {
1033 case REG_TYPE_MVF:
1034 case REG_TYPE_MVD:
1035 case REG_TYPE_MVFX:
1036 case REG_TYPE_MVDX:
1037 /* Generic coprocessor register names are allowed for these. */
79134647 1038 if (reg && reg->type == REG_TYPE_CN)
c19d1205
ZW
1039 return reg->number;
1040 break;
69b97547 1041
c19d1205
ZW
1042 case REG_TYPE_CP:
1043 /* For backward compatibility, a bare number is valid here. */
1044 {
1045 unsigned long processor = strtoul (start, ccp, 10);
1046 if (*ccp != start && processor <= 15)
1047 return processor;
1048 }
6057a28f 1049
c19d1205
ZW
1050 case REG_TYPE_MMXWC:
1051 /* WC includes WCG. ??? I'm not sure this is true for all
1052 instructions that take WC registers. */
79134647 1053 if (reg && reg->type == REG_TYPE_MMXWCG)
c19d1205 1054 return reg->number;
6057a28f 1055 break;
c19d1205 1056
6057a28f 1057 default:
c19d1205 1058 break;
6057a28f
NC
1059 }
1060
dcbf9037
JB
1061 return FAIL;
1062}
1063
1064/* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1065 return value is the register number or FAIL. */
1066
1067static int
1068arm_reg_parse (char **ccp, enum arm_reg_type type)
1069{
1070 char *start = *ccp;
1071 struct reg_entry *reg = arm_reg_parse_multi (ccp);
1072 int ret;
1073
1074 /* Do not allow a scalar (reg+index) to parse as a register. */
1075 if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1076 return FAIL;
1077
1078 if (reg && reg->type == type)
1079 return reg->number;
1080
1081 if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1082 return ret;
1083
c19d1205
ZW
1084 *ccp = start;
1085 return FAIL;
1086}
69b97547 1087
dcbf9037
JB
1088/* Parse a Neon type specifier. *STR should point at the leading '.'
1089 character. Does no verification at this stage that the type fits the opcode
1090 properly. E.g.,
1091
1092 .i32.i32.s16
1093 .s32.f32
1094 .u16
1095
1096 Can all be legally parsed by this function.
1097
1098 Fills in neon_type struct pointer with parsed information, and updates STR
1099 to point after the parsed type specifier. Returns SUCCESS if this was a legal
1100 type, FAIL if not. */
1101
1102static int
1103parse_neon_type (struct neon_type *type, char **str)
1104{
1105 char *ptr = *str;
1106
1107 if (type)
1108 type->elems = 0;
1109
1110 while (type->elems < NEON_MAX_TYPE_ELS)
1111 {
1112 enum neon_el_type thistype = NT_untyped;
1113 unsigned thissize = -1u;
1114
1115 if (*ptr != '.')
1116 break;
1117
1118 ptr++;
1119
1120 /* Just a size without an explicit type. */
1121 if (ISDIGIT (*ptr))
1122 goto parsesize;
1123
1124 switch (TOLOWER (*ptr))
1125 {
1126 case 'i': thistype = NT_integer; break;
1127 case 'f': thistype = NT_float; break;
1128 case 'p': thistype = NT_poly; break;
1129 case 's': thistype = NT_signed; break;
1130 case 'u': thistype = NT_unsigned; break;
037e8744
JB
1131 case 'd':
1132 thistype = NT_float;
1133 thissize = 64;
1134 ptr++;
1135 goto done;
dcbf9037
JB
1136 default:
1137 as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1138 return FAIL;
1139 }
1140
1141 ptr++;
1142
1143 /* .f is an abbreviation for .f32. */
1144 if (thistype == NT_float && !ISDIGIT (*ptr))
1145 thissize = 32;
1146 else
1147 {
1148 parsesize:
1149 thissize = strtoul (ptr, &ptr, 10);
1150
1151 if (thissize != 8 && thissize != 16 && thissize != 32
1152 && thissize != 64)
1153 {
1154 as_bad (_("bad size %d in type specifier"), thissize);
1155 return FAIL;
1156 }
1157 }
1158
037e8744 1159 done:
dcbf9037
JB
1160 if (type)
1161 {
1162 type->el[type->elems].type = thistype;
1163 type->el[type->elems].size = thissize;
1164 type->elems++;
1165 }
1166 }
1167
1168 /* Empty/missing type is not a successful parse. */
1169 if (type->elems == 0)
1170 return FAIL;
1171
1172 *str = ptr;
1173
1174 return SUCCESS;
1175}
1176
1177/* Errors may be set multiple times during parsing or bit encoding
1178 (particularly in the Neon bits), but usually the earliest error which is set
1179 will be the most meaningful. Avoid overwriting it with later (cascading)
1180 errors by calling this function. */
1181
1182static void
1183first_error (const char *err)
1184{
1185 if (!inst.error)
1186 inst.error = err;
1187}
1188
1189/* Parse a single type, e.g. ".s32", leading period included. */
1190static int
1191parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1192{
1193 char *str = *ccp;
1194 struct neon_type optype;
1195
1196 if (*str == '.')
1197 {
1198 if (parse_neon_type (&optype, &str) == SUCCESS)
1199 {
1200 if (optype.elems == 1)
1201 *vectype = optype.el[0];
1202 else
1203 {
1204 first_error (_("only one type should be specified for operand"));
1205 return FAIL;
1206 }
1207 }
1208 else
1209 {
1210 first_error (_("vector type expected"));
1211 return FAIL;
1212 }
1213 }
1214 else
1215 return FAIL;
1216
1217 *ccp = str;
1218
1219 return SUCCESS;
1220}
1221
1222/* Special meanings for indices (which have a range of 0-7), which will fit into
1223 a 4-bit integer. */
1224
1225#define NEON_ALL_LANES 15
1226#define NEON_INTERLEAVE_LANES 14
1227
1228/* Parse either a register or a scalar, with an optional type. Return the
1229 register number, and optionally fill in the actual type of the register
1230 when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1231 type/index information in *TYPEINFO. */
1232
1233static int
1234parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
1235 enum arm_reg_type *rtype,
1236 struct neon_typed_alias *typeinfo)
1237{
1238 char *str = *ccp;
1239 struct reg_entry *reg = arm_reg_parse_multi (&str);
1240 struct neon_typed_alias atype;
1241 struct neon_type_el parsetype;
1242
1243 atype.defined = 0;
1244 atype.index = -1;
1245 atype.eltype.type = NT_invtype;
1246 atype.eltype.size = -1;
1247
1248 /* Try alternate syntax for some types of register. Note these are mutually
1249 exclusive with the Neon syntax extensions. */
1250 if (reg == NULL)
1251 {
1252 int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1253 if (altreg != FAIL)
1254 *ccp = str;
1255 if (typeinfo)
1256 *typeinfo = atype;
1257 return altreg;
1258 }
1259
037e8744
JB
1260 /* Undo polymorphism when a set of register types may be accepted. */
1261 if ((type == REG_TYPE_NDQ
1262 && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1263 || (type == REG_TYPE_VFSD
1264 && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1265 || (type == REG_TYPE_NSDQ
1266 && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
f512f76f
NC
1267 || reg->type == REG_TYPE_NQ))
1268 || (type == REG_TYPE_MMXWC
1269 && (reg->type == REG_TYPE_MMXWCG)))
dcbf9037
JB
1270 type = reg->type;
1271
1272 if (type != reg->type)
1273 return FAIL;
1274
1275 if (reg->neon)
1276 atype = *reg->neon;
1277
1278 if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1279 {
1280 if ((atype.defined & NTA_HASTYPE) != 0)
1281 {
1282 first_error (_("can't redefine type for operand"));
1283 return FAIL;
1284 }
1285 atype.defined |= NTA_HASTYPE;
1286 atype.eltype = parsetype;
1287 }
1288
1289 if (skip_past_char (&str, '[') == SUCCESS)
1290 {
1291 if (type != REG_TYPE_VFD)
1292 {
1293 first_error (_("only D registers may be indexed"));
1294 return FAIL;
1295 }
1296
1297 if ((atype.defined & NTA_HASINDEX) != 0)
1298 {
1299 first_error (_("can't change index for operand"));
1300 return FAIL;
1301 }
1302
1303 atype.defined |= NTA_HASINDEX;
1304
1305 if (skip_past_char (&str, ']') == SUCCESS)
1306 atype.index = NEON_ALL_LANES;
1307 else
1308 {
1309 expressionS exp;
1310
1311 my_get_expression (&exp, &str, GE_NO_PREFIX);
1312
1313 if (exp.X_op != O_constant)
1314 {
1315 first_error (_("constant expression required"));
1316 return FAIL;
1317 }
1318
1319 if (skip_past_char (&str, ']') == FAIL)
1320 return FAIL;
1321
1322 atype.index = exp.X_add_number;
1323 }
1324 }
1325
1326 if (typeinfo)
1327 *typeinfo = atype;
1328
1329 if (rtype)
1330 *rtype = type;
1331
1332 *ccp = str;
1333
1334 return reg->number;
1335}
1336
1337/* Like arm_reg_parse, but allow allow the following extra features:
1338 - If RTYPE is non-zero, return the (possibly restricted) type of the
1339 register (e.g. Neon double or quad reg when either has been requested).
1340 - If this is a Neon vector type with additional type information, fill
1341 in the struct pointed to by VECTYPE (if non-NULL).
1342 This function will fault on encountering a scalar.
1343*/
1344
1345static int
1346arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
1347 enum arm_reg_type *rtype, struct neon_type_el *vectype)
1348{
1349 struct neon_typed_alias atype;
1350 char *str = *ccp;
1351 int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1352
1353 if (reg == FAIL)
1354 return FAIL;
1355
1356 /* Do not allow a scalar (reg+index) to parse as a register. */
1357 if ((atype.defined & NTA_HASINDEX) != 0)
1358 {
1359 first_error (_("register operand expected, but got scalar"));
1360 return FAIL;
1361 }
1362
1363 if (vectype)
1364 *vectype = atype.eltype;
1365
1366 *ccp = str;
1367
1368 return reg;
1369}
1370
1371#define NEON_SCALAR_REG(X) ((X) >> 4)
1372#define NEON_SCALAR_INDEX(X) ((X) & 15)
1373
5287ad62
JB
1374/* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1375 have enough information to be able to do a good job bounds-checking. So, we
1376 just do easy checks here, and do further checks later. */
1377
1378static int
dcbf9037 1379parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
5287ad62 1380{
dcbf9037 1381 int reg;
5287ad62 1382 char *str = *ccp;
dcbf9037 1383 struct neon_typed_alias atype;
5287ad62 1384
dcbf9037 1385 reg = parse_typed_reg_or_scalar (&str, REG_TYPE_VFD, NULL, &atype);
5287ad62 1386
dcbf9037 1387 if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
5287ad62
JB
1388 return FAIL;
1389
dcbf9037 1390 if (atype.index == NEON_ALL_LANES)
5287ad62 1391 {
dcbf9037 1392 first_error (_("scalar must have an index"));
5287ad62
JB
1393 return FAIL;
1394 }
dcbf9037 1395 else if (atype.index >= 64 / elsize)
5287ad62 1396 {
dcbf9037 1397 first_error (_("scalar index out of range"));
5287ad62
JB
1398 return FAIL;
1399 }
1400
dcbf9037
JB
1401 if (type)
1402 *type = atype.eltype;
5287ad62 1403
5287ad62
JB
1404 *ccp = str;
1405
dcbf9037 1406 return reg * 16 + atype.index;
5287ad62
JB
1407}
1408
c19d1205
ZW
1409/* Parse an ARM register list. Returns the bitmask, or FAIL. */
1410static long
1411parse_reg_list (char ** strp)
1412{
1413 char * str = * strp;
1414 long range = 0;
1415 int another_range;
a737bd4d 1416
c19d1205
ZW
1417 /* We come back here if we get ranges concatenated by '+' or '|'. */
1418 do
6057a28f 1419 {
c19d1205 1420 another_range = 0;
a737bd4d 1421
c19d1205
ZW
1422 if (*str == '{')
1423 {
1424 int in_range = 0;
1425 int cur_reg = -1;
a737bd4d 1426
c19d1205
ZW
1427 str++;
1428 do
1429 {
1430 int reg;
6057a28f 1431
dcbf9037 1432 if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
c19d1205 1433 {
dcbf9037 1434 first_error (_(reg_expected_msgs[REG_TYPE_RN]));
c19d1205
ZW
1435 return FAIL;
1436 }
a737bd4d 1437
c19d1205
ZW
1438 if (in_range)
1439 {
1440 int i;
a737bd4d 1441
c19d1205
ZW
1442 if (reg <= cur_reg)
1443 {
dcbf9037 1444 first_error (_("bad range in register list"));
c19d1205
ZW
1445 return FAIL;
1446 }
40a18ebd 1447
c19d1205
ZW
1448 for (i = cur_reg + 1; i < reg; i++)
1449 {
1450 if (range & (1 << i))
1451 as_tsktsk
1452 (_("Warning: duplicated register (r%d) in register list"),
1453 i);
1454 else
1455 range |= 1 << i;
1456 }
1457 in_range = 0;
1458 }
a737bd4d 1459
c19d1205
ZW
1460 if (range & (1 << reg))
1461 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1462 reg);
1463 else if (reg <= cur_reg)
1464 as_tsktsk (_("Warning: register range not in ascending order"));
a737bd4d 1465
c19d1205
ZW
1466 range |= 1 << reg;
1467 cur_reg = reg;
1468 }
1469 while (skip_past_comma (&str) != FAIL
1470 || (in_range = 1, *str++ == '-'));
1471 str--;
a737bd4d 1472
c19d1205
ZW
1473 if (*str++ != '}')
1474 {
dcbf9037 1475 first_error (_("missing `}'"));
c19d1205
ZW
1476 return FAIL;
1477 }
1478 }
1479 else
1480 {
1481 expressionS expr;
40a18ebd 1482
c19d1205
ZW
1483 if (my_get_expression (&expr, &str, GE_NO_PREFIX))
1484 return FAIL;
40a18ebd 1485
c19d1205
ZW
1486 if (expr.X_op == O_constant)
1487 {
1488 if (expr.X_add_number
1489 != (expr.X_add_number & 0x0000ffff))
1490 {
1491 inst.error = _("invalid register mask");
1492 return FAIL;
1493 }
a737bd4d 1494
c19d1205
ZW
1495 if ((range & expr.X_add_number) != 0)
1496 {
1497 int regno = range & expr.X_add_number;
a737bd4d 1498
c19d1205
ZW
1499 regno &= -regno;
1500 regno = (1 << regno) - 1;
1501 as_tsktsk
1502 (_("Warning: duplicated register (r%d) in register list"),
1503 regno);
1504 }
a737bd4d 1505
c19d1205
ZW
1506 range |= expr.X_add_number;
1507 }
1508 else
1509 {
1510 if (inst.reloc.type != 0)
1511 {
1512 inst.error = _("expression too complex");
1513 return FAIL;
1514 }
a737bd4d 1515
c19d1205
ZW
1516 memcpy (&inst.reloc.exp, &expr, sizeof (expressionS));
1517 inst.reloc.type = BFD_RELOC_ARM_MULTI;
1518 inst.reloc.pc_rel = 0;
1519 }
1520 }
a737bd4d 1521
c19d1205
ZW
1522 if (*str == '|' || *str == '+')
1523 {
1524 str++;
1525 another_range = 1;
1526 }
a737bd4d 1527 }
c19d1205 1528 while (another_range);
a737bd4d 1529
c19d1205
ZW
1530 *strp = str;
1531 return range;
a737bd4d
NC
1532}
1533
5287ad62
JB
1534/* Types of registers in a list. */
1535
1536enum reg_list_els
1537{
1538 REGLIST_VFP_S,
1539 REGLIST_VFP_D,
1540 REGLIST_NEON_D
1541};
1542
c19d1205
ZW
1543/* Parse a VFP register list. If the string is invalid return FAIL.
1544 Otherwise return the number of registers, and set PBASE to the first
5287ad62
JB
1545 register. Parses registers of type ETYPE.
1546 If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1547 - Q registers can be used to specify pairs of D registers
1548 - { } can be omitted from around a singleton register list
1549 FIXME: This is not implemented, as it would require backtracking in
1550 some cases, e.g.:
1551 vtbl.8 d3,d4,d5
1552 This could be done (the meaning isn't really ambiguous), but doesn't
1553 fit in well with the current parsing framework.
dcbf9037
JB
1554 - 32 D registers may be used (also true for VFPv3).
1555 FIXME: Types are ignored in these register lists, which is probably a
1556 bug. */
6057a28f 1557
c19d1205 1558static int
037e8744 1559parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype)
6057a28f 1560{
037e8744 1561 char *str = *ccp;
c19d1205
ZW
1562 int base_reg;
1563 int new_base;
5287ad62
JB
1564 enum arm_reg_type regtype = 0;
1565 int max_regs = 0;
c19d1205
ZW
1566 int count = 0;
1567 int warned = 0;
1568 unsigned long mask = 0;
a737bd4d 1569 int i;
6057a28f 1570
037e8744 1571 if (*str != '{')
5287ad62
JB
1572 {
1573 inst.error = _("expecting {");
1574 return FAIL;
1575 }
6057a28f 1576
037e8744 1577 str++;
6057a28f 1578
5287ad62 1579 switch (etype)
c19d1205 1580 {
5287ad62 1581 case REGLIST_VFP_S:
c19d1205
ZW
1582 regtype = REG_TYPE_VFS;
1583 max_regs = 32;
5287ad62
JB
1584 break;
1585
1586 case REGLIST_VFP_D:
1587 regtype = REG_TYPE_VFD;
b7fc2769
JB
1588 break;
1589
1590 case REGLIST_NEON_D:
1591 regtype = REG_TYPE_NDQ;
1592 break;
1593 }
1594
1595 if (etype != REGLIST_VFP_S)
1596 {
5287ad62
JB
1597 /* VFPv3 allows 32 D registers. */
1598 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v3))
1599 {
1600 max_regs = 32;
1601 if (thumb_mode)
1602 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
1603 fpu_vfp_ext_v3);
1604 else
1605 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
1606 fpu_vfp_ext_v3);
1607 }
1608 else
1609 max_regs = 16;
c19d1205 1610 }
6057a28f 1611
c19d1205 1612 base_reg = max_regs;
a737bd4d 1613
c19d1205
ZW
1614 do
1615 {
5287ad62 1616 int setmask = 1, addregs = 1;
dcbf9037 1617
037e8744 1618 new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
dcbf9037 1619
c19d1205 1620 if (new_base == FAIL)
a737bd4d 1621 {
dcbf9037 1622 first_error (_(reg_expected_msgs[regtype]));
c19d1205
ZW
1623 return FAIL;
1624 }
dcbf9037 1625
b7fc2769
JB
1626 if (new_base >= max_regs)
1627 {
1628 first_error (_("register out of range in list"));
1629 return FAIL;
1630 }
1631
5287ad62
JB
1632 /* Note: a value of 2 * n is returned for the register Q<n>. */
1633 if (regtype == REG_TYPE_NQ)
1634 {
1635 setmask = 3;
1636 addregs = 2;
1637 }
1638
c19d1205
ZW
1639 if (new_base < base_reg)
1640 base_reg = new_base;
a737bd4d 1641
5287ad62 1642 if (mask & (setmask << new_base))
c19d1205 1643 {
dcbf9037 1644 first_error (_("invalid register list"));
c19d1205 1645 return FAIL;
a737bd4d 1646 }
a737bd4d 1647
c19d1205
ZW
1648 if ((mask >> new_base) != 0 && ! warned)
1649 {
1650 as_tsktsk (_("register list not in ascending order"));
1651 warned = 1;
1652 }
0bbf2aa4 1653
5287ad62
JB
1654 mask |= setmask << new_base;
1655 count += addregs;
0bbf2aa4 1656
037e8744 1657 if (*str == '-') /* We have the start of a range expression */
c19d1205
ZW
1658 {
1659 int high_range;
0bbf2aa4 1660
037e8744 1661 str++;
0bbf2aa4 1662
037e8744 1663 if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
dcbf9037 1664 == FAIL)
c19d1205
ZW
1665 {
1666 inst.error = gettext (reg_expected_msgs[regtype]);
1667 return FAIL;
1668 }
0bbf2aa4 1669
b7fc2769
JB
1670 if (high_range >= max_regs)
1671 {
1672 first_error (_("register out of range in list"));
1673 return FAIL;
1674 }
1675
5287ad62
JB
1676 if (regtype == REG_TYPE_NQ)
1677 high_range = high_range + 1;
1678
c19d1205
ZW
1679 if (high_range <= new_base)
1680 {
1681 inst.error = _("register range not in ascending order");
1682 return FAIL;
1683 }
0bbf2aa4 1684
5287ad62 1685 for (new_base += addregs; new_base <= high_range; new_base += addregs)
0bbf2aa4 1686 {
5287ad62 1687 if (mask & (setmask << new_base))
0bbf2aa4 1688 {
c19d1205
ZW
1689 inst.error = _("invalid register list");
1690 return FAIL;
0bbf2aa4 1691 }
c19d1205 1692
5287ad62
JB
1693 mask |= setmask << new_base;
1694 count += addregs;
0bbf2aa4 1695 }
0bbf2aa4 1696 }
0bbf2aa4 1697 }
037e8744 1698 while (skip_past_comma (&str) != FAIL);
0bbf2aa4 1699
037e8744 1700 str++;
0bbf2aa4 1701
c19d1205
ZW
1702 /* Sanity check -- should have raised a parse error above. */
1703 if (count == 0 || count > max_regs)
1704 abort ();
1705
1706 *pbase = base_reg;
1707
1708 /* Final test -- the registers must be consecutive. */
1709 mask >>= base_reg;
1710 for (i = 0; i < count; i++)
1711 {
1712 if ((mask & (1u << i)) == 0)
1713 {
1714 inst.error = _("non-contiguous register range");
1715 return FAIL;
1716 }
1717 }
1718
037e8744
JB
1719 *ccp = str;
1720
c19d1205 1721 return count;
b99bd4ef
NC
1722}
1723
dcbf9037
JB
1724/* True if two alias types are the same. */
1725
1726static int
1727neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
1728{
1729 if (!a && !b)
1730 return 1;
1731
1732 if (!a || !b)
1733 return 0;
1734
1735 if (a->defined != b->defined)
1736 return 0;
1737
1738 if ((a->defined & NTA_HASTYPE) != 0
1739 && (a->eltype.type != b->eltype.type
1740 || a->eltype.size != b->eltype.size))
1741 return 0;
1742
1743 if ((a->defined & NTA_HASINDEX) != 0
1744 && (a->index != b->index))
1745 return 0;
1746
1747 return 1;
1748}
1749
5287ad62
JB
1750/* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
1751 The base register is put in *PBASE.
dcbf9037 1752 The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
5287ad62
JB
1753 the return value.
1754 The register stride (minus one) is put in bit 4 of the return value.
dcbf9037
JB
1755 Bits [6:5] encode the list length (minus one).
1756 The type of the list elements is put in *ELTYPE, if non-NULL. */
5287ad62 1757
5287ad62 1758#define NEON_LANE(X) ((X) & 0xf)
dcbf9037 1759#define NEON_REG_STRIDE(X) ((((X) >> 4) & 1) + 1)
5287ad62
JB
1760#define NEON_REGLIST_LENGTH(X) ((((X) >> 5) & 3) + 1)
1761
1762static int
dcbf9037
JB
1763parse_neon_el_struct_list (char **str, unsigned *pbase,
1764 struct neon_type_el *eltype)
5287ad62
JB
1765{
1766 char *ptr = *str;
1767 int base_reg = -1;
1768 int reg_incr = -1;
1769 int count = 0;
1770 int lane = -1;
1771 int leading_brace = 0;
1772 enum arm_reg_type rtype = REG_TYPE_NDQ;
1773 int addregs = 1;
1774 const char *const incr_error = "register stride must be 1 or 2";
1775 const char *const type_error = "mismatched element/structure types in list";
dcbf9037 1776 struct neon_typed_alias firsttype;
5287ad62
JB
1777
1778 if (skip_past_char (&ptr, '{') == SUCCESS)
1779 leading_brace = 1;
1780
1781 do
1782 {
dcbf9037
JB
1783 struct neon_typed_alias atype;
1784 int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
1785
5287ad62
JB
1786 if (getreg == FAIL)
1787 {
dcbf9037 1788 first_error (_(reg_expected_msgs[rtype]));
5287ad62
JB
1789 return FAIL;
1790 }
1791
1792 if (base_reg == -1)
1793 {
1794 base_reg = getreg;
1795 if (rtype == REG_TYPE_NQ)
1796 {
1797 reg_incr = 1;
1798 addregs = 2;
1799 }
dcbf9037 1800 firsttype = atype;
5287ad62
JB
1801 }
1802 else if (reg_incr == -1)
1803 {
1804 reg_incr = getreg - base_reg;
1805 if (reg_incr < 1 || reg_incr > 2)
1806 {
dcbf9037 1807 first_error (_(incr_error));
5287ad62
JB
1808 return FAIL;
1809 }
1810 }
1811 else if (getreg != base_reg + reg_incr * count)
1812 {
dcbf9037
JB
1813 first_error (_(incr_error));
1814 return FAIL;
1815 }
1816
1817 if (!neon_alias_types_same (&atype, &firsttype))
1818 {
1819 first_error (_(type_error));
5287ad62
JB
1820 return FAIL;
1821 }
1822
1823 /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
1824 modes. */
1825 if (ptr[0] == '-')
1826 {
dcbf9037 1827 struct neon_typed_alias htype;
5287ad62
JB
1828 int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
1829 if (lane == -1)
1830 lane = NEON_INTERLEAVE_LANES;
1831 else if (lane != NEON_INTERLEAVE_LANES)
1832 {
dcbf9037 1833 first_error (_(type_error));
5287ad62
JB
1834 return FAIL;
1835 }
1836 if (reg_incr == -1)
1837 reg_incr = 1;
1838 else if (reg_incr != 1)
1839 {
dcbf9037 1840 first_error (_("don't use Rn-Rm syntax with non-unit stride"));
5287ad62
JB
1841 return FAIL;
1842 }
1843 ptr++;
dcbf9037 1844 hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
5287ad62
JB
1845 if (hireg == FAIL)
1846 {
dcbf9037
JB
1847 first_error (_(reg_expected_msgs[rtype]));
1848 return FAIL;
1849 }
1850 if (!neon_alias_types_same (&htype, &firsttype))
1851 {
1852 first_error (_(type_error));
5287ad62
JB
1853 return FAIL;
1854 }
1855 count += hireg + dregs - getreg;
1856 continue;
1857 }
1858
1859 /* If we're using Q registers, we can't use [] or [n] syntax. */
1860 if (rtype == REG_TYPE_NQ)
1861 {
1862 count += 2;
1863 continue;
1864 }
1865
dcbf9037 1866 if ((atype.defined & NTA_HASINDEX) != 0)
5287ad62 1867 {
dcbf9037
JB
1868 if (lane == -1)
1869 lane = atype.index;
1870 else if (lane != atype.index)
5287ad62 1871 {
dcbf9037
JB
1872 first_error (_(type_error));
1873 return FAIL;
5287ad62
JB
1874 }
1875 }
1876 else if (lane == -1)
1877 lane = NEON_INTERLEAVE_LANES;
1878 else if (lane != NEON_INTERLEAVE_LANES)
1879 {
dcbf9037 1880 first_error (_(type_error));
5287ad62
JB
1881 return FAIL;
1882 }
1883 count++;
1884 }
1885 while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
1886
1887 /* No lane set by [x]. We must be interleaving structures. */
1888 if (lane == -1)
1889 lane = NEON_INTERLEAVE_LANES;
1890
1891 /* Sanity check. */
1892 if (lane == -1 || base_reg == -1 || count < 1 || count > 4
1893 || (count > 1 && reg_incr == -1))
1894 {
dcbf9037 1895 first_error (_("error parsing element/structure list"));
5287ad62
JB
1896 return FAIL;
1897 }
1898
1899 if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
1900 {
dcbf9037 1901 first_error (_("expected }"));
5287ad62
JB
1902 return FAIL;
1903 }
1904
1905 if (reg_incr == -1)
1906 reg_incr = 1;
1907
dcbf9037
JB
1908 if (eltype)
1909 *eltype = firsttype.eltype;
1910
5287ad62
JB
1911 *pbase = base_reg;
1912 *str = ptr;
1913
1914 return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
1915}
1916
c19d1205
ZW
1917/* Parse an explicit relocation suffix on an expression. This is
1918 either nothing, or a word in parentheses. Note that if !OBJ_ELF,
1919 arm_reloc_hsh contains no entries, so this function can only
1920 succeed if there is no () after the word. Returns -1 on error,
1921 BFD_RELOC_UNUSED if there wasn't any suffix. */
1922static int
1923parse_reloc (char **str)
b99bd4ef 1924{
c19d1205
ZW
1925 struct reloc_entry *r;
1926 char *p, *q;
b99bd4ef 1927
c19d1205
ZW
1928 if (**str != '(')
1929 return BFD_RELOC_UNUSED;
b99bd4ef 1930
c19d1205
ZW
1931 p = *str + 1;
1932 q = p;
1933
1934 while (*q && *q != ')' && *q != ',')
1935 q++;
1936 if (*q != ')')
1937 return -1;
1938
1939 if ((r = hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
1940 return -1;
1941
1942 *str = q + 1;
1943 return r->reloc;
b99bd4ef
NC
1944}
1945
c19d1205
ZW
1946/* Directives: register aliases. */
1947
dcbf9037 1948static struct reg_entry *
c19d1205 1949insert_reg_alias (char *str, int number, int type)
b99bd4ef 1950{
c19d1205
ZW
1951 struct reg_entry *new;
1952 const char *name;
b99bd4ef 1953
c19d1205
ZW
1954 if ((new = hash_find (arm_reg_hsh, str)) != 0)
1955 {
1956 if (new->builtin)
1957 as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
b99bd4ef 1958
c19d1205
ZW
1959 /* Only warn about a redefinition if it's not defined as the
1960 same register. */
1961 else if (new->number != number || new->type != type)
1962 as_warn (_("ignoring redefinition of register alias '%s'"), str);
69b97547 1963
dcbf9037 1964 return 0;
c19d1205 1965 }
b99bd4ef 1966
c19d1205
ZW
1967 name = xstrdup (str);
1968 new = xmalloc (sizeof (struct reg_entry));
b99bd4ef 1969
c19d1205
ZW
1970 new->name = name;
1971 new->number = number;
1972 new->type = type;
1973 new->builtin = FALSE;
dcbf9037 1974 new->neon = NULL;
b99bd4ef 1975
c19d1205
ZW
1976 if (hash_insert (arm_reg_hsh, name, (PTR) new))
1977 abort ();
dcbf9037
JB
1978
1979 return new;
1980}
1981
1982static void
1983insert_neon_reg_alias (char *str, int number, int type,
1984 struct neon_typed_alias *atype)
1985{
1986 struct reg_entry *reg = insert_reg_alias (str, number, type);
1987
1988 if (!reg)
1989 {
1990 first_error (_("attempt to redefine typed alias"));
1991 return;
1992 }
1993
1994 if (atype)
1995 {
1996 reg->neon = xmalloc (sizeof (struct neon_typed_alias));
1997 *reg->neon = *atype;
1998 }
c19d1205 1999}
b99bd4ef 2000
c19d1205 2001/* Look for the .req directive. This is of the form:
b99bd4ef 2002
c19d1205 2003 new_register_name .req existing_register_name
b99bd4ef 2004
c19d1205
ZW
2005 If we find one, or if it looks sufficiently like one that we want to
2006 handle any error here, return non-zero. Otherwise return zero. */
b99bd4ef 2007
c19d1205
ZW
2008static int
2009create_register_alias (char * newname, char *p)
2010{
2011 struct reg_entry *old;
2012 char *oldname, *nbuf;
2013 size_t nlen;
b99bd4ef 2014
c19d1205
ZW
2015 /* The input scrubber ensures that whitespace after the mnemonic is
2016 collapsed to single spaces. */
2017 oldname = p;
2018 if (strncmp (oldname, " .req ", 6) != 0)
2019 return 0;
b99bd4ef 2020
c19d1205
ZW
2021 oldname += 6;
2022 if (*oldname == '\0')
2023 return 0;
b99bd4ef 2024
c19d1205
ZW
2025 old = hash_find (arm_reg_hsh, oldname);
2026 if (!old)
b99bd4ef 2027 {
c19d1205
ZW
2028 as_warn (_("unknown register '%s' -- .req ignored"), oldname);
2029 return 1;
b99bd4ef
NC
2030 }
2031
c19d1205
ZW
2032 /* If TC_CASE_SENSITIVE is defined, then newname already points to
2033 the desired alias name, and p points to its end. If not, then
2034 the desired alias name is in the global original_case_string. */
2035#ifdef TC_CASE_SENSITIVE
2036 nlen = p - newname;
2037#else
2038 newname = original_case_string;
2039 nlen = strlen (newname);
2040#endif
b99bd4ef 2041
c19d1205
ZW
2042 nbuf = alloca (nlen + 1);
2043 memcpy (nbuf, newname, nlen);
2044 nbuf[nlen] = '\0';
b99bd4ef 2045
c19d1205
ZW
2046 /* Create aliases under the new name as stated; an all-lowercase
2047 version of the new name; and an all-uppercase version of the new
2048 name. */
2049 insert_reg_alias (nbuf, old->number, old->type);
b99bd4ef 2050
c19d1205
ZW
2051 for (p = nbuf; *p; p++)
2052 *p = TOUPPER (*p);
2053
2054 if (strncmp (nbuf, newname, nlen))
2055 insert_reg_alias (nbuf, old->number, old->type);
2056
2057 for (p = nbuf; *p; p++)
2058 *p = TOLOWER (*p);
2059
2060 if (strncmp (nbuf, newname, nlen))
2061 insert_reg_alias (nbuf, old->number, old->type);
2062
2063 return 1;
b99bd4ef
NC
2064}
2065
dcbf9037
JB
2066/* Create a Neon typed/indexed register alias using directives, e.g.:
2067 X .dn d5.s32[1]
2068 Y .qn 6.s16
2069 Z .dn d7
2070 T .dn Z[0]
2071 These typed registers can be used instead of the types specified after the
2072 Neon mnemonic, so long as all operands given have types. Types can also be
2073 specified directly, e.g.:
2074 vadd d0.s32, d1.s32, d2.s32
2075*/
2076
2077static int
2078create_neon_reg_alias (char *newname, char *p)
2079{
2080 enum arm_reg_type basetype;
2081 struct reg_entry *basereg;
2082 struct reg_entry mybasereg;
2083 struct neon_type ntype;
2084 struct neon_typed_alias typeinfo;
2085 char *namebuf, *nameend;
2086 int namelen;
2087
2088 typeinfo.defined = 0;
2089 typeinfo.eltype.type = NT_invtype;
2090 typeinfo.eltype.size = -1;
2091 typeinfo.index = -1;
2092
2093 nameend = p;
2094
2095 if (strncmp (p, " .dn ", 5) == 0)
2096 basetype = REG_TYPE_VFD;
2097 else if (strncmp (p, " .qn ", 5) == 0)
2098 basetype = REG_TYPE_NQ;
2099 else
2100 return 0;
2101
2102 p += 5;
2103
2104 if (*p == '\0')
2105 return 0;
2106
2107 basereg = arm_reg_parse_multi (&p);
2108
2109 if (basereg && basereg->type != basetype)
2110 {
2111 as_bad (_("bad type for register"));
2112 return 0;
2113 }
2114
2115 if (basereg == NULL)
2116 {
2117 expressionS exp;
2118 /* Try parsing as an integer. */
2119 my_get_expression (&exp, &p, GE_NO_PREFIX);
2120 if (exp.X_op != O_constant)
2121 {
2122 as_bad (_("expression must be constant"));
2123 return 0;
2124 }
2125 basereg = &mybasereg;
2126 basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
2127 : exp.X_add_number;
2128 basereg->neon = 0;
2129 }
2130
2131 if (basereg->neon)
2132 typeinfo = *basereg->neon;
2133
2134 if (parse_neon_type (&ntype, &p) == SUCCESS)
2135 {
2136 /* We got a type. */
2137 if (typeinfo.defined & NTA_HASTYPE)
2138 {
2139 as_bad (_("can't redefine the type of a register alias"));
2140 return 0;
2141 }
2142
2143 typeinfo.defined |= NTA_HASTYPE;
2144 if (ntype.elems != 1)
2145 {
2146 as_bad (_("you must specify a single type only"));
2147 return 0;
2148 }
2149 typeinfo.eltype = ntype.el[0];
2150 }
2151
2152 if (skip_past_char (&p, '[') == SUCCESS)
2153 {
2154 expressionS exp;
2155 /* We got a scalar index. */
2156
2157 if (typeinfo.defined & NTA_HASINDEX)
2158 {
2159 as_bad (_("can't redefine the index of a scalar alias"));
2160 return 0;
2161 }
2162
2163 my_get_expression (&exp, &p, GE_NO_PREFIX);
2164
2165 if (exp.X_op != O_constant)
2166 {
2167 as_bad (_("scalar index must be constant"));
2168 return 0;
2169 }
2170
2171 typeinfo.defined |= NTA_HASINDEX;
2172 typeinfo.index = exp.X_add_number;
2173
2174 if (skip_past_char (&p, ']') == FAIL)
2175 {
2176 as_bad (_("expecting ]"));
2177 return 0;
2178 }
2179 }
2180
2181 namelen = nameend - newname;
2182 namebuf = alloca (namelen + 1);
2183 strncpy (namebuf, newname, namelen);
2184 namebuf[namelen] = '\0';
2185
2186 insert_neon_reg_alias (namebuf, basereg->number, basetype,
2187 typeinfo.defined != 0 ? &typeinfo : NULL);
2188
2189 /* Insert name in all uppercase. */
2190 for (p = namebuf; *p; p++)
2191 *p = TOUPPER (*p);
2192
2193 if (strncmp (namebuf, newname, namelen))
2194 insert_neon_reg_alias (namebuf, basereg->number, basetype,
2195 typeinfo.defined != 0 ? &typeinfo : NULL);
2196
2197 /* Insert name in all lowercase. */
2198 for (p = namebuf; *p; p++)
2199 *p = TOLOWER (*p);
2200
2201 if (strncmp (namebuf, newname, namelen))
2202 insert_neon_reg_alias (namebuf, basereg->number, basetype,
2203 typeinfo.defined != 0 ? &typeinfo : NULL);
2204
2205 return 1;
2206}
2207
c19d1205
ZW
2208/* Should never be called, as .req goes between the alias and the
2209 register name, not at the beginning of the line. */
b99bd4ef 2210static void
c19d1205 2211s_req (int a ATTRIBUTE_UNUSED)
b99bd4ef 2212{
c19d1205
ZW
2213 as_bad (_("invalid syntax for .req directive"));
2214}
b99bd4ef 2215
dcbf9037
JB
2216static void
2217s_dn (int a ATTRIBUTE_UNUSED)
2218{
2219 as_bad (_("invalid syntax for .dn directive"));
2220}
2221
2222static void
2223s_qn (int a ATTRIBUTE_UNUSED)
2224{
2225 as_bad (_("invalid syntax for .qn directive"));
2226}
2227
c19d1205
ZW
2228/* The .unreq directive deletes an alias which was previously defined
2229 by .req. For example:
b99bd4ef 2230
c19d1205
ZW
2231 my_alias .req r11
2232 .unreq my_alias */
b99bd4ef
NC
2233
2234static void
c19d1205 2235s_unreq (int a ATTRIBUTE_UNUSED)
b99bd4ef 2236{
c19d1205
ZW
2237 char * name;
2238 char saved_char;
b99bd4ef 2239
c19d1205
ZW
2240 name = input_line_pointer;
2241
2242 while (*input_line_pointer != 0
2243 && *input_line_pointer != ' '
2244 && *input_line_pointer != '\n')
2245 ++input_line_pointer;
2246
2247 saved_char = *input_line_pointer;
2248 *input_line_pointer = 0;
2249
2250 if (!*name)
2251 as_bad (_("invalid syntax for .unreq directive"));
2252 else
2253 {
2254 struct reg_entry *reg = hash_find (arm_reg_hsh, name);
2255
2256 if (!reg)
2257 as_bad (_("unknown register alias '%s'"), name);
2258 else if (reg->builtin)
2259 as_warn (_("ignoring attempt to undefine built-in register '%s'"),
2260 name);
2261 else
2262 {
2263 hash_delete (arm_reg_hsh, name);
2264 free ((char *) reg->name);
dcbf9037
JB
2265 if (reg->neon)
2266 free (reg->neon);
c19d1205
ZW
2267 free (reg);
2268 }
2269 }
b99bd4ef 2270
c19d1205 2271 *input_line_pointer = saved_char;
b99bd4ef
NC
2272 demand_empty_rest_of_line ();
2273}
2274
c19d1205
ZW
2275/* Directives: Instruction set selection. */
2276
2277#ifdef OBJ_ELF
2278/* This code is to handle mapping symbols as defined in the ARM ELF spec.
2279 (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2280 Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2281 and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped. */
2282
2283static enum mstate mapstate = MAP_UNDEFINED;
b99bd4ef
NC
2284
2285static void
c19d1205 2286mapping_state (enum mstate state)
b99bd4ef 2287{
a737bd4d 2288 symbolS * symbolP;
c19d1205
ZW
2289 const char * symname;
2290 int type;
b99bd4ef 2291
c19d1205
ZW
2292 if (mapstate == state)
2293 /* The mapping symbol has already been emitted.
2294 There is nothing else to do. */
2295 return;
b99bd4ef 2296
c19d1205 2297 mapstate = state;
b99bd4ef 2298
c19d1205 2299 switch (state)
b99bd4ef 2300 {
c19d1205
ZW
2301 case MAP_DATA:
2302 symname = "$d";
2303 type = BSF_NO_FLAGS;
2304 break;
2305 case MAP_ARM:
2306 symname = "$a";
2307 type = BSF_NO_FLAGS;
2308 break;
2309 case MAP_THUMB:
2310 symname = "$t";
2311 type = BSF_NO_FLAGS;
2312 break;
2313 case MAP_UNDEFINED:
2314 return;
2315 default:
2316 abort ();
2317 }
2318
2319 seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2320
2321 symbolP = symbol_new (symname, now_seg, (valueT) frag_now_fix (), frag_now);
2322 symbol_table_insert (symbolP);
2323 symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2324
2325 switch (state)
2326 {
2327 case MAP_ARM:
2328 THUMB_SET_FUNC (symbolP, 0);
2329 ARM_SET_THUMB (symbolP, 0);
2330 ARM_SET_INTERWORK (symbolP, support_interwork);
2331 break;
2332
2333 case MAP_THUMB:
2334 THUMB_SET_FUNC (symbolP, 1);
2335 ARM_SET_THUMB (symbolP, 1);
2336 ARM_SET_INTERWORK (symbolP, support_interwork);
2337 break;
2338
2339 case MAP_DATA:
2340 default:
2341 return;
2342 }
2343}
2344#else
2345#define mapping_state(x) /* nothing */
2346#endif
2347
2348/* Find the real, Thumb encoded start of a Thumb function. */
2349
2350static symbolS *
2351find_real_start (symbolS * symbolP)
2352{
2353 char * real_start;
2354 const char * name = S_GET_NAME (symbolP);
2355 symbolS * new_target;
2356
2357 /* This definition must agree with the one in gcc/config/arm/thumb.c. */
2358#define STUB_NAME ".real_start_of"
2359
2360 if (name == NULL)
2361 abort ();
2362
37f6032b
ZW
2363 /* The compiler may generate BL instructions to local labels because
2364 it needs to perform a branch to a far away location. These labels
2365 do not have a corresponding ".real_start_of" label. We check
2366 both for S_IS_LOCAL and for a leading dot, to give a way to bypass
2367 the ".real_start_of" convention for nonlocal branches. */
2368 if (S_IS_LOCAL (symbolP) || name[0] == '.')
c19d1205
ZW
2369 return symbolP;
2370
37f6032b 2371 real_start = ACONCAT ((STUB_NAME, name, NULL));
c19d1205
ZW
2372 new_target = symbol_find (real_start);
2373
2374 if (new_target == NULL)
2375 {
2376 as_warn ("Failed to find real start of function: %s\n", name);
2377 new_target = symbolP;
2378 }
2379
c19d1205
ZW
2380 return new_target;
2381}
2382
2383static void
2384opcode_select (int width)
2385{
2386 switch (width)
2387 {
2388 case 16:
2389 if (! thumb_mode)
2390 {
e74cfd16 2391 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
c19d1205
ZW
2392 as_bad (_("selected processor does not support THUMB opcodes"));
2393
2394 thumb_mode = 1;
2395 /* No need to force the alignment, since we will have been
2396 coming from ARM mode, which is word-aligned. */
2397 record_alignment (now_seg, 1);
2398 }
2399 mapping_state (MAP_THUMB);
2400 break;
2401
2402 case 32:
2403 if (thumb_mode)
2404 {
e74cfd16 2405 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
c19d1205
ZW
2406 as_bad (_("selected processor does not support ARM opcodes"));
2407
2408 thumb_mode = 0;
2409
2410 if (!need_pass_2)
2411 frag_align (2, 0, 0);
2412
2413 record_alignment (now_seg, 1);
2414 }
2415 mapping_state (MAP_ARM);
2416 break;
2417
2418 default:
2419 as_bad (_("invalid instruction size selected (%d)"), width);
2420 }
2421}
2422
2423static void
2424s_arm (int ignore ATTRIBUTE_UNUSED)
2425{
2426 opcode_select (32);
2427 demand_empty_rest_of_line ();
2428}
2429
2430static void
2431s_thumb (int ignore ATTRIBUTE_UNUSED)
2432{
2433 opcode_select (16);
2434 demand_empty_rest_of_line ();
2435}
2436
2437static void
2438s_code (int unused ATTRIBUTE_UNUSED)
2439{
2440 int temp;
2441
2442 temp = get_absolute_expression ();
2443 switch (temp)
2444 {
2445 case 16:
2446 case 32:
2447 opcode_select (temp);
2448 break;
2449
2450 default:
2451 as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
2452 }
2453}
2454
2455static void
2456s_force_thumb (int ignore ATTRIBUTE_UNUSED)
2457{
2458 /* If we are not already in thumb mode go into it, EVEN if
2459 the target processor does not support thumb instructions.
2460 This is used by gcc/config/arm/lib1funcs.asm for example
2461 to compile interworking support functions even if the
2462 target processor should not support interworking. */
2463 if (! thumb_mode)
2464 {
2465 thumb_mode = 2;
2466 record_alignment (now_seg, 1);
2467 }
2468
2469 demand_empty_rest_of_line ();
2470}
2471
2472static void
2473s_thumb_func (int ignore ATTRIBUTE_UNUSED)
2474{
2475 s_thumb (0);
2476
2477 /* The following label is the name/address of the start of a Thumb function.
2478 We need to know this for the interworking support. */
2479 label_is_thumb_function_name = TRUE;
2480}
2481
2482/* Perform a .set directive, but also mark the alias as
2483 being a thumb function. */
2484
2485static void
2486s_thumb_set (int equiv)
2487{
2488 /* XXX the following is a duplicate of the code for s_set() in read.c
2489 We cannot just call that code as we need to get at the symbol that
2490 is created. */
2491 char * name;
2492 char delim;
2493 char * end_name;
2494 symbolS * symbolP;
2495
2496 /* Especial apologies for the random logic:
2497 This just grew, and could be parsed much more simply!
2498 Dean - in haste. */
2499 name = input_line_pointer;
2500 delim = get_symbol_end ();
2501 end_name = input_line_pointer;
2502 *end_name = delim;
2503
2504 if (*input_line_pointer != ',')
2505 {
2506 *end_name = 0;
2507 as_bad (_("expected comma after name \"%s\""), name);
b99bd4ef
NC
2508 *end_name = delim;
2509 ignore_rest_of_line ();
2510 return;
2511 }
2512
2513 input_line_pointer++;
2514 *end_name = 0;
2515
2516 if (name[0] == '.' && name[1] == '\0')
2517 {
2518 /* XXX - this should not happen to .thumb_set. */
2519 abort ();
2520 }
2521
2522 if ((symbolP = symbol_find (name)) == NULL
2523 && (symbolP = md_undefined_symbol (name)) == NULL)
2524 {
2525#ifndef NO_LISTING
2526 /* When doing symbol listings, play games with dummy fragments living
2527 outside the normal fragment chain to record the file and line info
c19d1205 2528 for this symbol. */
b99bd4ef
NC
2529 if (listing & LISTING_SYMBOLS)
2530 {
2531 extern struct list_info_struct * listing_tail;
a737bd4d 2532 fragS * dummy_frag = xmalloc (sizeof (fragS));
b99bd4ef
NC
2533
2534 memset (dummy_frag, 0, sizeof (fragS));
2535 dummy_frag->fr_type = rs_fill;
2536 dummy_frag->line = listing_tail;
2537 symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2538 dummy_frag->fr_symbol = symbolP;
2539 }
2540 else
2541#endif
2542 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2543
2544#ifdef OBJ_COFF
2545 /* "set" symbols are local unless otherwise specified. */
2546 SF_SET_LOCAL (symbolP);
2547#endif /* OBJ_COFF */
2548 } /* Make a new symbol. */
2549
2550 symbol_table_insert (symbolP);
2551
2552 * end_name = delim;
2553
2554 if (equiv
2555 && S_IS_DEFINED (symbolP)
2556 && S_GET_SEGMENT (symbolP) != reg_section)
2557 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2558
2559 pseudo_set (symbolP);
2560
2561 demand_empty_rest_of_line ();
2562
c19d1205 2563 /* XXX Now we come to the Thumb specific bit of code. */
b99bd4ef
NC
2564
2565 THUMB_SET_FUNC (symbolP, 1);
2566 ARM_SET_THUMB (symbolP, 1);
2567#if defined OBJ_ELF || defined OBJ_COFF
2568 ARM_SET_INTERWORK (symbolP, support_interwork);
2569#endif
2570}
2571
c19d1205 2572/* Directives: Mode selection. */
b99bd4ef 2573
c19d1205
ZW
2574/* .syntax [unified|divided] - choose the new unified syntax
2575 (same for Arm and Thumb encoding, modulo slight differences in what
2576 can be represented) or the old divergent syntax for each mode. */
b99bd4ef 2577static void
c19d1205 2578s_syntax (int unused ATTRIBUTE_UNUSED)
b99bd4ef 2579{
c19d1205
ZW
2580 char *name, delim;
2581
2582 name = input_line_pointer;
2583 delim = get_symbol_end ();
2584
2585 if (!strcasecmp (name, "unified"))
2586 unified_syntax = TRUE;
2587 else if (!strcasecmp (name, "divided"))
2588 unified_syntax = FALSE;
2589 else
2590 {
2591 as_bad (_("unrecognized syntax mode \"%s\""), name);
2592 return;
2593 }
2594 *input_line_pointer = delim;
b99bd4ef
NC
2595 demand_empty_rest_of_line ();
2596}
2597
c19d1205
ZW
2598/* Directives: sectioning and alignment. */
2599
2600/* Same as s_align_ptwo but align 0 => align 2. */
2601
b99bd4ef 2602static void
c19d1205 2603s_align (int unused ATTRIBUTE_UNUSED)
b99bd4ef 2604{
a737bd4d 2605 int temp;
c19d1205
ZW
2606 long temp_fill;
2607 long max_alignment = 15;
b99bd4ef
NC
2608
2609 temp = get_absolute_expression ();
c19d1205
ZW
2610 if (temp > max_alignment)
2611 as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
2612 else if (temp < 0)
b99bd4ef 2613 {
c19d1205
ZW
2614 as_bad (_("alignment negative. 0 assumed."));
2615 temp = 0;
2616 }
b99bd4ef 2617
c19d1205
ZW
2618 if (*input_line_pointer == ',')
2619 {
2620 input_line_pointer++;
2621 temp_fill = get_absolute_expression ();
b99bd4ef 2622 }
c19d1205
ZW
2623 else
2624 temp_fill = 0;
b99bd4ef 2625
c19d1205
ZW
2626 if (!temp)
2627 temp = 2;
b99bd4ef 2628
c19d1205
ZW
2629 /* Only make a frag if we HAVE to. */
2630 if (temp && !need_pass_2)
2631 frag_align (temp, (int) temp_fill, 0);
2632 demand_empty_rest_of_line ();
2633
2634 record_alignment (now_seg, temp);
b99bd4ef
NC
2635}
2636
c19d1205
ZW
2637static void
2638s_bss (int ignore ATTRIBUTE_UNUSED)
b99bd4ef 2639{
c19d1205
ZW
2640 /* We don't support putting frags in the BSS segment, we fake it by
2641 marking in_bss, then looking at s_skip for clues. */
2642 subseg_set (bss_section, 0);
2643 demand_empty_rest_of_line ();
2644 mapping_state (MAP_DATA);
2645}
b99bd4ef 2646
c19d1205
ZW
2647static void
2648s_even (int ignore ATTRIBUTE_UNUSED)
2649{
2650 /* Never make frag if expect extra pass. */
2651 if (!need_pass_2)
2652 frag_align (1, 0, 0);
b99bd4ef 2653
c19d1205 2654 record_alignment (now_seg, 1);
b99bd4ef 2655
c19d1205 2656 demand_empty_rest_of_line ();
b99bd4ef
NC
2657}
2658
c19d1205 2659/* Directives: Literal pools. */
a737bd4d 2660
c19d1205
ZW
2661static literal_pool *
2662find_literal_pool (void)
a737bd4d 2663{
c19d1205 2664 literal_pool * pool;
a737bd4d 2665
c19d1205 2666 for (pool = list_of_pools; pool != NULL; pool = pool->next)
a737bd4d 2667 {
c19d1205
ZW
2668 if (pool->section == now_seg
2669 && pool->sub_section == now_subseg)
2670 break;
a737bd4d
NC
2671 }
2672
c19d1205 2673 return pool;
a737bd4d
NC
2674}
2675
c19d1205
ZW
2676static literal_pool *
2677find_or_make_literal_pool (void)
a737bd4d 2678{
c19d1205
ZW
2679 /* Next literal pool ID number. */
2680 static unsigned int latest_pool_num = 1;
2681 literal_pool * pool;
a737bd4d 2682
c19d1205 2683 pool = find_literal_pool ();
a737bd4d 2684
c19d1205 2685 if (pool == NULL)
a737bd4d 2686 {
c19d1205
ZW
2687 /* Create a new pool. */
2688 pool = xmalloc (sizeof (* pool));
2689 if (! pool)
2690 return NULL;
a737bd4d 2691
c19d1205
ZW
2692 pool->next_free_entry = 0;
2693 pool->section = now_seg;
2694 pool->sub_section = now_subseg;
2695 pool->next = list_of_pools;
2696 pool->symbol = NULL;
2697
2698 /* Add it to the list. */
2699 list_of_pools = pool;
a737bd4d 2700 }
a737bd4d 2701
c19d1205
ZW
2702 /* New pools, and emptied pools, will have a NULL symbol. */
2703 if (pool->symbol == NULL)
a737bd4d 2704 {
c19d1205
ZW
2705 pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
2706 (valueT) 0, &zero_address_frag);
2707 pool->id = latest_pool_num ++;
a737bd4d
NC
2708 }
2709
c19d1205
ZW
2710 /* Done. */
2711 return pool;
a737bd4d
NC
2712}
2713
c19d1205
ZW
2714/* Add the literal in the global 'inst'
2715 structure to the relevent literal pool. */
b99bd4ef
NC
2716
2717static int
c19d1205 2718add_to_lit_pool (void)
b99bd4ef 2719{
c19d1205
ZW
2720 literal_pool * pool;
2721 unsigned int entry;
b99bd4ef 2722
c19d1205
ZW
2723 pool = find_or_make_literal_pool ();
2724
2725 /* Check if this literal value is already in the pool. */
2726 for (entry = 0; entry < pool->next_free_entry; entry ++)
b99bd4ef 2727 {
c19d1205
ZW
2728 if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
2729 && (inst.reloc.exp.X_op == O_constant)
2730 && (pool->literals[entry].X_add_number
2731 == inst.reloc.exp.X_add_number)
2732 && (pool->literals[entry].X_unsigned
2733 == inst.reloc.exp.X_unsigned))
2734 break;
2735
2736 if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
2737 && (inst.reloc.exp.X_op == O_symbol)
2738 && (pool->literals[entry].X_add_number
2739 == inst.reloc.exp.X_add_number)
2740 && (pool->literals[entry].X_add_symbol
2741 == inst.reloc.exp.X_add_symbol)
2742 && (pool->literals[entry].X_op_symbol
2743 == inst.reloc.exp.X_op_symbol))
2744 break;
b99bd4ef
NC
2745 }
2746
c19d1205
ZW
2747 /* Do we need to create a new entry? */
2748 if (entry == pool->next_free_entry)
2749 {
2750 if (entry >= MAX_LITERAL_POOL_SIZE)
2751 {
2752 inst.error = _("literal pool overflow");
2753 return FAIL;
2754 }
2755
2756 pool->literals[entry] = inst.reloc.exp;
2757 pool->next_free_entry += 1;
2758 }
b99bd4ef 2759
c19d1205
ZW
2760 inst.reloc.exp.X_op = O_symbol;
2761 inst.reloc.exp.X_add_number = ((int) entry) * 4;
2762 inst.reloc.exp.X_add_symbol = pool->symbol;
b99bd4ef 2763
c19d1205 2764 return SUCCESS;
b99bd4ef
NC
2765}
2766
c19d1205
ZW
2767/* Can't use symbol_new here, so have to create a symbol and then at
2768 a later date assign it a value. Thats what these functions do. */
e16bb312 2769
c19d1205
ZW
2770static void
2771symbol_locate (symbolS * symbolP,
2772 const char * name, /* It is copied, the caller can modify. */
2773 segT segment, /* Segment identifier (SEG_<something>). */
2774 valueT valu, /* Symbol value. */
2775 fragS * frag) /* Associated fragment. */
2776{
2777 unsigned int name_length;
2778 char * preserved_copy_of_name;
e16bb312 2779
c19d1205
ZW
2780 name_length = strlen (name) + 1; /* +1 for \0. */
2781 obstack_grow (&notes, name, name_length);
2782 preserved_copy_of_name = obstack_finish (&notes);
e16bb312 2783
c19d1205
ZW
2784#ifdef tc_canonicalize_symbol_name
2785 preserved_copy_of_name =
2786 tc_canonicalize_symbol_name (preserved_copy_of_name);
2787#endif
b99bd4ef 2788
c19d1205 2789 S_SET_NAME (symbolP, preserved_copy_of_name);
b99bd4ef 2790
c19d1205
ZW
2791 S_SET_SEGMENT (symbolP, segment);
2792 S_SET_VALUE (symbolP, valu);
2793 symbol_clear_list_pointers (symbolP);
b99bd4ef 2794
c19d1205 2795 symbol_set_frag (symbolP, frag);
b99bd4ef 2796
c19d1205
ZW
2797 /* Link to end of symbol chain. */
2798 {
2799 extern int symbol_table_frozen;
b99bd4ef 2800
c19d1205
ZW
2801 if (symbol_table_frozen)
2802 abort ();
2803 }
b99bd4ef 2804
c19d1205 2805 symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
b99bd4ef 2806
c19d1205 2807 obj_symbol_new_hook (symbolP);
b99bd4ef 2808
c19d1205
ZW
2809#ifdef tc_symbol_new_hook
2810 tc_symbol_new_hook (symbolP);
2811#endif
2812
2813#ifdef DEBUG_SYMS
2814 verify_symbol_chain (symbol_rootP, symbol_lastP);
2815#endif /* DEBUG_SYMS */
b99bd4ef
NC
2816}
2817
b99bd4ef 2818
c19d1205
ZW
2819static void
2820s_ltorg (int ignored ATTRIBUTE_UNUSED)
b99bd4ef 2821{
c19d1205
ZW
2822 unsigned int entry;
2823 literal_pool * pool;
2824 char sym_name[20];
b99bd4ef 2825
c19d1205
ZW
2826 pool = find_literal_pool ();
2827 if (pool == NULL
2828 || pool->symbol == NULL
2829 || pool->next_free_entry == 0)
2830 return;
b99bd4ef 2831
c19d1205 2832 mapping_state (MAP_DATA);
b99bd4ef 2833
c19d1205
ZW
2834 /* Align pool as you have word accesses.
2835 Only make a frag if we have to. */
2836 if (!need_pass_2)
2837 frag_align (2, 0, 0);
b99bd4ef 2838
c19d1205 2839 record_alignment (now_seg, 2);
b99bd4ef 2840
c19d1205 2841 sprintf (sym_name, "$$lit_\002%x", pool->id);
b99bd4ef 2842
c19d1205
ZW
2843 symbol_locate (pool->symbol, sym_name, now_seg,
2844 (valueT) frag_now_fix (), frag_now);
2845 symbol_table_insert (pool->symbol);
b99bd4ef 2846
c19d1205 2847 ARM_SET_THUMB (pool->symbol, thumb_mode);
b99bd4ef 2848
c19d1205
ZW
2849#if defined OBJ_COFF || defined OBJ_ELF
2850 ARM_SET_INTERWORK (pool->symbol, support_interwork);
2851#endif
6c43fab6 2852
c19d1205
ZW
2853 for (entry = 0; entry < pool->next_free_entry; entry ++)
2854 /* First output the expression in the instruction to the pool. */
2855 emit_expr (&(pool->literals[entry]), 4); /* .word */
b99bd4ef 2856
c19d1205
ZW
2857 /* Mark the pool as empty. */
2858 pool->next_free_entry = 0;
2859 pool->symbol = NULL;
b99bd4ef
NC
2860}
2861
c19d1205
ZW
2862#ifdef OBJ_ELF
2863/* Forward declarations for functions below, in the MD interface
2864 section. */
2865static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
2866static valueT create_unwind_entry (int);
2867static void start_unwind_section (const segT, int);
2868static void add_unwind_opcode (valueT, int);
2869static void flush_pending_unwind (void);
b99bd4ef 2870
c19d1205 2871/* Directives: Data. */
b99bd4ef 2872
c19d1205
ZW
2873static void
2874s_arm_elf_cons (int nbytes)
2875{
2876 expressionS exp;
b99bd4ef 2877
c19d1205
ZW
2878#ifdef md_flush_pending_output
2879 md_flush_pending_output ();
2880#endif
b99bd4ef 2881
c19d1205 2882 if (is_it_end_of_statement ())
b99bd4ef 2883 {
c19d1205
ZW
2884 demand_empty_rest_of_line ();
2885 return;
b99bd4ef
NC
2886 }
2887
c19d1205
ZW
2888#ifdef md_cons_align
2889 md_cons_align (nbytes);
2890#endif
b99bd4ef 2891
c19d1205
ZW
2892 mapping_state (MAP_DATA);
2893 do
b99bd4ef 2894 {
c19d1205
ZW
2895 int reloc;
2896 char *base = input_line_pointer;
b99bd4ef 2897
c19d1205 2898 expression (& exp);
b99bd4ef 2899
c19d1205
ZW
2900 if (exp.X_op != O_symbol)
2901 emit_expr (&exp, (unsigned int) nbytes);
2902 else
2903 {
2904 char *before_reloc = input_line_pointer;
2905 reloc = parse_reloc (&input_line_pointer);
2906 if (reloc == -1)
2907 {
2908 as_bad (_("unrecognized relocation suffix"));
2909 ignore_rest_of_line ();
2910 return;
2911 }
2912 else if (reloc == BFD_RELOC_UNUSED)
2913 emit_expr (&exp, (unsigned int) nbytes);
2914 else
2915 {
2916 reloc_howto_type *howto = bfd_reloc_type_lookup (stdoutput, reloc);
2917 int size = bfd_get_reloc_size (howto);
b99bd4ef 2918
2fc8bdac
ZW
2919 if (reloc == BFD_RELOC_ARM_PLT32)
2920 {
2921 as_bad (_("(plt) is only valid on branch targets"));
2922 reloc = BFD_RELOC_UNUSED;
2923 size = 0;
2924 }
2925
c19d1205 2926 if (size > nbytes)
2fc8bdac 2927 as_bad (_("%s relocations do not fit in %d bytes"),
c19d1205
ZW
2928 howto->name, nbytes);
2929 else
2930 {
2931 /* We've parsed an expression stopping at O_symbol.
2932 But there may be more expression left now that we
2933 have parsed the relocation marker. Parse it again.
2934 XXX Surely there is a cleaner way to do this. */
2935 char *p = input_line_pointer;
2936 int offset;
2937 char *save_buf = alloca (input_line_pointer - base);
2938 memcpy (save_buf, base, input_line_pointer - base);
2939 memmove (base + (input_line_pointer - before_reloc),
2940 base, before_reloc - base);
2941
2942 input_line_pointer = base + (input_line_pointer-before_reloc);
2943 expression (&exp);
2944 memcpy (base, save_buf, p - base);
2945
2946 offset = nbytes - size;
2947 p = frag_more ((int) nbytes);
2948 fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
2949 size, &exp, 0, reloc);
2950 }
2951 }
2952 }
b99bd4ef 2953 }
c19d1205 2954 while (*input_line_pointer++ == ',');
b99bd4ef 2955
c19d1205
ZW
2956 /* Put terminator back into stream. */
2957 input_line_pointer --;
2958 demand_empty_rest_of_line ();
b99bd4ef
NC
2959}
2960
b99bd4ef 2961
c19d1205 2962/* Parse a .rel31 directive. */
b99bd4ef 2963
c19d1205
ZW
2964static void
2965s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
2966{
2967 expressionS exp;
2968 char *p;
2969 valueT highbit;
b99bd4ef 2970
c19d1205
ZW
2971 highbit = 0;
2972 if (*input_line_pointer == '1')
2973 highbit = 0x80000000;
2974 else if (*input_line_pointer != '0')
2975 as_bad (_("expected 0 or 1"));
b99bd4ef 2976
c19d1205
ZW
2977 input_line_pointer++;
2978 if (*input_line_pointer != ',')
2979 as_bad (_("missing comma"));
2980 input_line_pointer++;
b99bd4ef 2981
c19d1205
ZW
2982#ifdef md_flush_pending_output
2983 md_flush_pending_output ();
2984#endif
b99bd4ef 2985
c19d1205
ZW
2986#ifdef md_cons_align
2987 md_cons_align (4);
2988#endif
b99bd4ef 2989
c19d1205 2990 mapping_state (MAP_DATA);
b99bd4ef 2991
c19d1205 2992 expression (&exp);
b99bd4ef 2993
c19d1205
ZW
2994 p = frag_more (4);
2995 md_number_to_chars (p, highbit, 4);
2996 fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
2997 BFD_RELOC_ARM_PREL31);
b99bd4ef 2998
c19d1205 2999 demand_empty_rest_of_line ();
b99bd4ef
NC
3000}
3001
c19d1205 3002/* Directives: AEABI stack-unwind tables. */
b99bd4ef 3003
c19d1205 3004/* Parse an unwind_fnstart directive. Simply records the current location. */
b99bd4ef 3005
c19d1205
ZW
3006static void
3007s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3008{
3009 demand_empty_rest_of_line ();
3010 /* Mark the start of the function. */
3011 unwind.proc_start = expr_build_dot ();
b99bd4ef 3012
c19d1205
ZW
3013 /* Reset the rest of the unwind info. */
3014 unwind.opcode_count = 0;
3015 unwind.table_entry = NULL;
3016 unwind.personality_routine = NULL;
3017 unwind.personality_index = -1;
3018 unwind.frame_size = 0;
3019 unwind.fp_offset = 0;
3020 unwind.fp_reg = 13;
3021 unwind.fp_used = 0;
3022 unwind.sp_restored = 0;
3023}
b99bd4ef 3024
b99bd4ef 3025
c19d1205
ZW
3026/* Parse a handlerdata directive. Creates the exception handling table entry
3027 for the function. */
b99bd4ef 3028
c19d1205
ZW
3029static void
3030s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3031{
3032 demand_empty_rest_of_line ();
3033 if (unwind.table_entry)
3034 as_bad (_("dupicate .handlerdata directive"));
f02232aa 3035
c19d1205
ZW
3036 create_unwind_entry (1);
3037}
a737bd4d 3038
c19d1205 3039/* Parse an unwind_fnend directive. Generates the index table entry. */
b99bd4ef 3040
c19d1205
ZW
3041static void
3042s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3043{
3044 long where;
3045 char *ptr;
3046 valueT val;
f02232aa 3047
c19d1205 3048 demand_empty_rest_of_line ();
f02232aa 3049
c19d1205
ZW
3050 /* Add eh table entry. */
3051 if (unwind.table_entry == NULL)
3052 val = create_unwind_entry (0);
3053 else
3054 val = 0;
f02232aa 3055
c19d1205
ZW
3056 /* Add index table entry. This is two words. */
3057 start_unwind_section (unwind.saved_seg, 1);
3058 frag_align (2, 0, 0);
3059 record_alignment (now_seg, 2);
b99bd4ef 3060
c19d1205
ZW
3061 ptr = frag_more (8);
3062 where = frag_now_fix () - 8;
f02232aa 3063
c19d1205
ZW
3064 /* Self relative offset of the function start. */
3065 fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3066 BFD_RELOC_ARM_PREL31);
f02232aa 3067
c19d1205
ZW
3068 /* Indicate dependency on EHABI-defined personality routines to the
3069 linker, if it hasn't been done already. */
3070 if (unwind.personality_index >= 0 && unwind.personality_index < 3
3071 && !(marked_pr_dependency & (1 << unwind.personality_index)))
3072 {
3073 static const char *const name[] = {
3074 "__aeabi_unwind_cpp_pr0",
3075 "__aeabi_unwind_cpp_pr1",
3076 "__aeabi_unwind_cpp_pr2"
3077 };
3078 symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3079 fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
3080 marked_pr_dependency |= 1 << unwind.personality_index;
3081 seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
3082 = marked_pr_dependency;
3083 }
f02232aa 3084
c19d1205
ZW
3085 if (val)
3086 /* Inline exception table entry. */
3087 md_number_to_chars (ptr + 4, val, 4);
3088 else
3089 /* Self relative offset of the table entry. */
3090 fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3091 BFD_RELOC_ARM_PREL31);
f02232aa 3092
c19d1205
ZW
3093 /* Restore the original section. */
3094 subseg_set (unwind.saved_seg, unwind.saved_subseg);
3095}
f02232aa 3096
f02232aa 3097
c19d1205 3098/* Parse an unwind_cantunwind directive. */
b99bd4ef 3099
c19d1205
ZW
3100static void
3101s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3102{
3103 demand_empty_rest_of_line ();
3104 if (unwind.personality_routine || unwind.personality_index != -1)
3105 as_bad (_("personality routine specified for cantunwind frame"));
b99bd4ef 3106
c19d1205
ZW
3107 unwind.personality_index = -2;
3108}
b99bd4ef 3109
b99bd4ef 3110
c19d1205 3111/* Parse a personalityindex directive. */
b99bd4ef 3112
c19d1205
ZW
3113static void
3114s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3115{
3116 expressionS exp;
b99bd4ef 3117
c19d1205
ZW
3118 if (unwind.personality_routine || unwind.personality_index != -1)
3119 as_bad (_("duplicate .personalityindex directive"));
b99bd4ef 3120
c19d1205 3121 expression (&exp);
b99bd4ef 3122
c19d1205
ZW
3123 if (exp.X_op != O_constant
3124 || exp.X_add_number < 0 || exp.X_add_number > 15)
b99bd4ef 3125 {
c19d1205
ZW
3126 as_bad (_("bad personality routine number"));
3127 ignore_rest_of_line ();
3128 return;
b99bd4ef
NC
3129 }
3130
c19d1205 3131 unwind.personality_index = exp.X_add_number;
b99bd4ef 3132
c19d1205
ZW
3133 demand_empty_rest_of_line ();
3134}
e16bb312 3135
e16bb312 3136
c19d1205 3137/* Parse a personality directive. */
e16bb312 3138
c19d1205
ZW
3139static void
3140s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3141{
3142 char *name, *p, c;
a737bd4d 3143
c19d1205
ZW
3144 if (unwind.personality_routine || unwind.personality_index != -1)
3145 as_bad (_("duplicate .personality directive"));
a737bd4d 3146
c19d1205
ZW
3147 name = input_line_pointer;
3148 c = get_symbol_end ();
3149 p = input_line_pointer;
3150 unwind.personality_routine = symbol_find_or_make (name);
3151 *p = c;
3152 demand_empty_rest_of_line ();
3153}
e16bb312 3154
e16bb312 3155
c19d1205 3156/* Parse a directive saving core registers. */
e16bb312 3157
c19d1205
ZW
3158static void
3159s_arm_unwind_save_core (void)
e16bb312 3160{
c19d1205
ZW
3161 valueT op;
3162 long range;
3163 int n;
e16bb312 3164
c19d1205
ZW
3165 range = parse_reg_list (&input_line_pointer);
3166 if (range == FAIL)
e16bb312 3167 {
c19d1205
ZW
3168 as_bad (_("expected register list"));
3169 ignore_rest_of_line ();
3170 return;
3171 }
e16bb312 3172
c19d1205 3173 demand_empty_rest_of_line ();
e16bb312 3174
c19d1205
ZW
3175 /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3176 into .unwind_save {..., sp...}. We aren't bothered about the value of
3177 ip because it is clobbered by calls. */
3178 if (unwind.sp_restored && unwind.fp_reg == 12
3179 && (range & 0x3000) == 0x1000)
3180 {
3181 unwind.opcode_count--;
3182 unwind.sp_restored = 0;
3183 range = (range | 0x2000) & ~0x1000;
3184 unwind.pending_offset = 0;
3185 }
e16bb312 3186
01ae4198
DJ
3187 /* Pop r4-r15. */
3188 if (range & 0xfff0)
c19d1205 3189 {
01ae4198
DJ
3190 /* See if we can use the short opcodes. These pop a block of up to 8
3191 registers starting with r4, plus maybe r14. */
3192 for (n = 0; n < 8; n++)
3193 {
3194 /* Break at the first non-saved register. */
3195 if ((range & (1 << (n + 4))) == 0)
3196 break;
3197 }
3198 /* See if there are any other bits set. */
3199 if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
3200 {
3201 /* Use the long form. */
3202 op = 0x8000 | ((range >> 4) & 0xfff);
3203 add_unwind_opcode (op, 2);
3204 }
0dd132b6 3205 else
01ae4198
DJ
3206 {
3207 /* Use the short form. */
3208 if (range & 0x4000)
3209 op = 0xa8; /* Pop r14. */
3210 else
3211 op = 0xa0; /* Do not pop r14. */
3212 op |= (n - 1);
3213 add_unwind_opcode (op, 1);
3214 }
c19d1205 3215 }
0dd132b6 3216
c19d1205
ZW
3217 /* Pop r0-r3. */
3218 if (range & 0xf)
3219 {
3220 op = 0xb100 | (range & 0xf);
3221 add_unwind_opcode (op, 2);
0dd132b6
NC
3222 }
3223
c19d1205
ZW
3224 /* Record the number of bytes pushed. */
3225 for (n = 0; n < 16; n++)
3226 {
3227 if (range & (1 << n))
3228 unwind.frame_size += 4;
3229 }
0dd132b6
NC
3230}
3231
c19d1205
ZW
3232
3233/* Parse a directive saving FPA registers. */
b99bd4ef
NC
3234
3235static void
c19d1205 3236s_arm_unwind_save_fpa (int reg)
b99bd4ef 3237{
c19d1205
ZW
3238 expressionS exp;
3239 int num_regs;
3240 valueT op;
b99bd4ef 3241
c19d1205
ZW
3242 /* Get Number of registers to transfer. */
3243 if (skip_past_comma (&input_line_pointer) != FAIL)
3244 expression (&exp);
3245 else
3246 exp.X_op = O_illegal;
b99bd4ef 3247
c19d1205 3248 if (exp.X_op != O_constant)
b99bd4ef 3249 {
c19d1205
ZW
3250 as_bad (_("expected , <constant>"));
3251 ignore_rest_of_line ();
b99bd4ef
NC
3252 return;
3253 }
3254
c19d1205
ZW
3255 num_regs = exp.X_add_number;
3256
3257 if (num_regs < 1 || num_regs > 4)
b99bd4ef 3258 {
c19d1205
ZW
3259 as_bad (_("number of registers must be in the range [1:4]"));
3260 ignore_rest_of_line ();
b99bd4ef
NC
3261 return;
3262 }
3263
c19d1205 3264 demand_empty_rest_of_line ();
b99bd4ef 3265
c19d1205
ZW
3266 if (reg == 4)
3267 {
3268 /* Short form. */
3269 op = 0xb4 | (num_regs - 1);
3270 add_unwind_opcode (op, 1);
3271 }
b99bd4ef
NC
3272 else
3273 {
c19d1205
ZW
3274 /* Long form. */
3275 op = 0xc800 | (reg << 4) | (num_regs - 1);
3276 add_unwind_opcode (op, 2);
b99bd4ef 3277 }
c19d1205 3278 unwind.frame_size += num_regs * 12;
b99bd4ef
NC
3279}
3280
c19d1205 3281
fa073d69
MS
3282/* Parse a directive saving VFP registers for ARMv6 and above. */
3283
3284static void
3285s_arm_unwind_save_vfp_armv6 (void)
3286{
3287 int count;
3288 unsigned int start;
3289 valueT op;
3290 int num_vfpv3_regs = 0;
3291 int num_regs_below_16;
3292
3293 count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
3294 if (count == FAIL)
3295 {
3296 as_bad (_("expected register list"));
3297 ignore_rest_of_line ();
3298 return;
3299 }
3300
3301 demand_empty_rest_of_line ();
3302
3303 /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
3304 than FSTMX/FLDMX-style ones). */
3305
3306 /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31. */
3307 if (start >= 16)
3308 num_vfpv3_regs = count;
3309 else if (start + count > 16)
3310 num_vfpv3_regs = start + count - 16;
3311
3312 if (num_vfpv3_regs > 0)
3313 {
3314 int start_offset = start > 16 ? start - 16 : 0;
3315 op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
3316 add_unwind_opcode (op, 2);
3317 }
3318
3319 /* Generate opcode for registers numbered in the range 0 .. 15. */
3320 num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
3321 assert (num_regs_below_16 + num_vfpv3_regs == count);
3322 if (num_regs_below_16 > 0)
3323 {
3324 op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
3325 add_unwind_opcode (op, 2);
3326 }
3327
3328 unwind.frame_size += count * 8;
3329}
3330
3331
3332/* Parse a directive saving VFP registers for pre-ARMv6. */
b99bd4ef
NC
3333
3334static void
c19d1205 3335s_arm_unwind_save_vfp (void)
b99bd4ef 3336{
c19d1205 3337 int count;
ca3f61f7 3338 unsigned int reg;
c19d1205 3339 valueT op;
b99bd4ef 3340
5287ad62 3341 count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
c19d1205 3342 if (count == FAIL)
b99bd4ef 3343 {
c19d1205
ZW
3344 as_bad (_("expected register list"));
3345 ignore_rest_of_line ();
b99bd4ef
NC
3346 return;
3347 }
3348
c19d1205 3349 demand_empty_rest_of_line ();
b99bd4ef 3350
c19d1205 3351 if (reg == 8)
b99bd4ef 3352 {
c19d1205
ZW
3353 /* Short form. */
3354 op = 0xb8 | (count - 1);
3355 add_unwind_opcode (op, 1);
b99bd4ef 3356 }
c19d1205 3357 else
b99bd4ef 3358 {
c19d1205
ZW
3359 /* Long form. */
3360 op = 0xb300 | (reg << 4) | (count - 1);
3361 add_unwind_opcode (op, 2);
b99bd4ef 3362 }
c19d1205
ZW
3363 unwind.frame_size += count * 8 + 4;
3364}
b99bd4ef 3365
b99bd4ef 3366
c19d1205
ZW
3367/* Parse a directive saving iWMMXt data registers. */
3368
3369static void
3370s_arm_unwind_save_mmxwr (void)
3371{
3372 int reg;
3373 int hi_reg;
3374 int i;
3375 unsigned mask = 0;
3376 valueT op;
b99bd4ef 3377
c19d1205
ZW
3378 if (*input_line_pointer == '{')
3379 input_line_pointer++;
b99bd4ef 3380
c19d1205 3381 do
b99bd4ef 3382 {
dcbf9037 3383 reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
b99bd4ef 3384
c19d1205 3385 if (reg == FAIL)
b99bd4ef 3386 {
c19d1205
ZW
3387 as_bad (_(reg_expected_msgs[REG_TYPE_MMXWR]));
3388 goto error;
b99bd4ef
NC
3389 }
3390
c19d1205
ZW
3391 if (mask >> reg)
3392 as_tsktsk (_("register list not in ascending order"));
3393 mask |= 1 << reg;
b99bd4ef 3394
c19d1205
ZW
3395 if (*input_line_pointer == '-')
3396 {
3397 input_line_pointer++;
dcbf9037 3398 hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
c19d1205
ZW
3399 if (hi_reg == FAIL)
3400 {
3401 as_bad (_(reg_expected_msgs[REG_TYPE_MMXWR]));
3402 goto error;
3403 }
3404 else if (reg >= hi_reg)
3405 {
3406 as_bad (_("bad register range"));
3407 goto error;
3408 }
3409 for (; reg < hi_reg; reg++)
3410 mask |= 1 << reg;
3411 }
3412 }
3413 while (skip_past_comma (&input_line_pointer) != FAIL);
b99bd4ef 3414
c19d1205
ZW
3415 if (*input_line_pointer == '}')
3416 input_line_pointer++;
b99bd4ef 3417
c19d1205 3418 demand_empty_rest_of_line ();
b99bd4ef 3419
708587a4 3420 /* Generate any deferred opcodes because we're going to be looking at
c19d1205
ZW
3421 the list. */
3422 flush_pending_unwind ();
b99bd4ef 3423
c19d1205 3424 for (i = 0; i < 16; i++)
b99bd4ef 3425 {
c19d1205
ZW
3426 if (mask & (1 << i))
3427 unwind.frame_size += 8;
b99bd4ef
NC
3428 }
3429
c19d1205
ZW
3430 /* Attempt to combine with a previous opcode. We do this because gcc
3431 likes to output separate unwind directives for a single block of
3432 registers. */
3433 if (unwind.opcode_count > 0)
b99bd4ef 3434 {
c19d1205
ZW
3435 i = unwind.opcodes[unwind.opcode_count - 1];
3436 if ((i & 0xf8) == 0xc0)
3437 {
3438 i &= 7;
3439 /* Only merge if the blocks are contiguous. */
3440 if (i < 6)
3441 {
3442 if ((mask & 0xfe00) == (1 << 9))
3443 {
3444 mask |= ((1 << (i + 11)) - 1) & 0xfc00;
3445 unwind.opcode_count--;
3446 }
3447 }
3448 else if (i == 6 && unwind.opcode_count >= 2)
3449 {
3450 i = unwind.opcodes[unwind.opcode_count - 2];
3451 reg = i >> 4;
3452 i &= 0xf;
b99bd4ef 3453
c19d1205
ZW
3454 op = 0xffff << (reg - 1);
3455 if (reg > 0
87a1fd79 3456 && ((mask & op) == (1u << (reg - 1))))
c19d1205
ZW
3457 {
3458 op = (1 << (reg + i + 1)) - 1;
3459 op &= ~((1 << reg) - 1);
3460 mask |= op;
3461 unwind.opcode_count -= 2;
3462 }
3463 }
3464 }
b99bd4ef
NC
3465 }
3466
c19d1205
ZW
3467 hi_reg = 15;
3468 /* We want to generate opcodes in the order the registers have been
3469 saved, ie. descending order. */
3470 for (reg = 15; reg >= -1; reg--)
b99bd4ef 3471 {
c19d1205
ZW
3472 /* Save registers in blocks. */
3473 if (reg < 0
3474 || !(mask & (1 << reg)))
3475 {
3476 /* We found an unsaved reg. Generate opcodes to save the
3477 preceeding block. */
3478 if (reg != hi_reg)
3479 {
3480 if (reg == 9)
3481 {
3482 /* Short form. */
3483 op = 0xc0 | (hi_reg - 10);
3484 add_unwind_opcode (op, 1);
3485 }
3486 else
3487 {
3488 /* Long form. */
3489 op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
3490 add_unwind_opcode (op, 2);
3491 }
3492 }
3493 hi_reg = reg - 1;
3494 }
b99bd4ef
NC
3495 }
3496
c19d1205
ZW
3497 return;
3498error:
3499 ignore_rest_of_line ();
b99bd4ef
NC
3500}
3501
3502static void
c19d1205 3503s_arm_unwind_save_mmxwcg (void)
b99bd4ef 3504{
c19d1205
ZW
3505 int reg;
3506 int hi_reg;
3507 unsigned mask = 0;
3508 valueT op;
b99bd4ef 3509
c19d1205
ZW
3510 if (*input_line_pointer == '{')
3511 input_line_pointer++;
b99bd4ef 3512
c19d1205 3513 do
b99bd4ef 3514 {
dcbf9037 3515 reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
b99bd4ef 3516
c19d1205
ZW
3517 if (reg == FAIL)
3518 {
3519 as_bad (_(reg_expected_msgs[REG_TYPE_MMXWCG]));
3520 goto error;
3521 }
b99bd4ef 3522
c19d1205
ZW
3523 reg -= 8;
3524 if (mask >> reg)
3525 as_tsktsk (_("register list not in ascending order"));
3526 mask |= 1 << reg;
b99bd4ef 3527
c19d1205
ZW
3528 if (*input_line_pointer == '-')
3529 {
3530 input_line_pointer++;
dcbf9037 3531 hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
c19d1205
ZW
3532 if (hi_reg == FAIL)
3533 {
3534 as_bad (_(reg_expected_msgs[REG_TYPE_MMXWCG]));
3535 goto error;
3536 }
3537 else if (reg >= hi_reg)
3538 {
3539 as_bad (_("bad register range"));
3540 goto error;
3541 }
3542 for (; reg < hi_reg; reg++)
3543 mask |= 1 << reg;
3544 }
b99bd4ef 3545 }
c19d1205 3546 while (skip_past_comma (&input_line_pointer) != FAIL);
b99bd4ef 3547
c19d1205
ZW
3548 if (*input_line_pointer == '}')
3549 input_line_pointer++;
b99bd4ef 3550
c19d1205
ZW
3551 demand_empty_rest_of_line ();
3552
708587a4 3553 /* Generate any deferred opcodes because we're going to be looking at
c19d1205
ZW
3554 the list. */
3555 flush_pending_unwind ();
b99bd4ef 3556
c19d1205 3557 for (reg = 0; reg < 16; reg++)
b99bd4ef 3558 {
c19d1205
ZW
3559 if (mask & (1 << reg))
3560 unwind.frame_size += 4;
b99bd4ef 3561 }
c19d1205
ZW
3562 op = 0xc700 | mask;
3563 add_unwind_opcode (op, 2);
3564 return;
3565error:
3566 ignore_rest_of_line ();
b99bd4ef
NC
3567}
3568
c19d1205 3569
fa073d69
MS
3570/* Parse an unwind_save directive.
3571 If the argument is non-zero, this is a .vsave directive. */
c19d1205 3572
b99bd4ef 3573static void
fa073d69 3574s_arm_unwind_save (int arch_v6)
b99bd4ef 3575{
c19d1205
ZW
3576 char *peek;
3577 struct reg_entry *reg;
3578 bfd_boolean had_brace = FALSE;
b99bd4ef 3579
c19d1205
ZW
3580 /* Figure out what sort of save we have. */
3581 peek = input_line_pointer;
b99bd4ef 3582
c19d1205 3583 if (*peek == '{')
b99bd4ef 3584 {
c19d1205
ZW
3585 had_brace = TRUE;
3586 peek++;
b99bd4ef
NC
3587 }
3588
c19d1205 3589 reg = arm_reg_parse_multi (&peek);
b99bd4ef 3590
c19d1205 3591 if (!reg)
b99bd4ef 3592 {
c19d1205
ZW
3593 as_bad (_("register expected"));
3594 ignore_rest_of_line ();
b99bd4ef
NC
3595 return;
3596 }
3597
c19d1205 3598 switch (reg->type)
b99bd4ef 3599 {
c19d1205
ZW
3600 case REG_TYPE_FN:
3601 if (had_brace)
3602 {
3603 as_bad (_("FPA .unwind_save does not take a register list"));
3604 ignore_rest_of_line ();
3605 return;
3606 }
3607 s_arm_unwind_save_fpa (reg->number);
b99bd4ef 3608 return;
c19d1205
ZW
3609
3610 case REG_TYPE_RN: s_arm_unwind_save_core (); return;
fa073d69
MS
3611 case REG_TYPE_VFD:
3612 if (arch_v6)
3613 s_arm_unwind_save_vfp_armv6 ();
3614 else
3615 s_arm_unwind_save_vfp ();
3616 return;
c19d1205
ZW
3617 case REG_TYPE_MMXWR: s_arm_unwind_save_mmxwr (); return;
3618 case REG_TYPE_MMXWCG: s_arm_unwind_save_mmxwcg (); return;
3619
3620 default:
3621 as_bad (_(".unwind_save does not support this kind of register"));
3622 ignore_rest_of_line ();
b99bd4ef 3623 }
c19d1205 3624}
b99bd4ef 3625
b99bd4ef 3626
c19d1205
ZW
3627/* Parse an unwind_movsp directive. */
3628
3629static void
3630s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
3631{
3632 int reg;
3633 valueT op;
4fa3602b 3634 int offset;
c19d1205 3635
dcbf9037 3636 reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
c19d1205 3637 if (reg == FAIL)
b99bd4ef 3638 {
c19d1205
ZW
3639 as_bad (_(reg_expected_msgs[REG_TYPE_RN]));
3640 ignore_rest_of_line ();
b99bd4ef
NC
3641 return;
3642 }
4fa3602b
PB
3643
3644 /* Optional constant. */
3645 if (skip_past_comma (&input_line_pointer) != FAIL)
3646 {
3647 if (immediate_for_directive (&offset) == FAIL)
3648 return;
3649 }
3650 else
3651 offset = 0;
3652
c19d1205 3653 demand_empty_rest_of_line ();
b99bd4ef 3654
c19d1205 3655 if (reg == REG_SP || reg == REG_PC)
b99bd4ef 3656 {
c19d1205 3657 as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
b99bd4ef
NC
3658 return;
3659 }
3660
c19d1205
ZW
3661 if (unwind.fp_reg != REG_SP)
3662 as_bad (_("unexpected .unwind_movsp directive"));
b99bd4ef 3663
c19d1205
ZW
3664 /* Generate opcode to restore the value. */
3665 op = 0x90 | reg;
3666 add_unwind_opcode (op, 1);
3667
3668 /* Record the information for later. */
3669 unwind.fp_reg = reg;
4fa3602b 3670 unwind.fp_offset = unwind.frame_size - offset;
c19d1205 3671 unwind.sp_restored = 1;
b05fe5cf
ZW
3672}
3673
c19d1205
ZW
3674/* Parse an unwind_pad directive. */
3675
b05fe5cf 3676static void
c19d1205 3677s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
b05fe5cf 3678{
c19d1205 3679 int offset;
b05fe5cf 3680
c19d1205
ZW
3681 if (immediate_for_directive (&offset) == FAIL)
3682 return;
b99bd4ef 3683
c19d1205
ZW
3684 if (offset & 3)
3685 {
3686 as_bad (_("stack increment must be multiple of 4"));
3687 ignore_rest_of_line ();
3688 return;
3689 }
b99bd4ef 3690
c19d1205
ZW
3691 /* Don't generate any opcodes, just record the details for later. */
3692 unwind.frame_size += offset;
3693 unwind.pending_offset += offset;
3694
3695 demand_empty_rest_of_line ();
3696}
3697
3698/* Parse an unwind_setfp directive. */
3699
3700static void
3701s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
b99bd4ef 3702{
c19d1205
ZW
3703 int sp_reg;
3704 int fp_reg;
3705 int offset;
3706
dcbf9037 3707 fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
c19d1205
ZW
3708 if (skip_past_comma (&input_line_pointer) == FAIL)
3709 sp_reg = FAIL;
3710 else
dcbf9037 3711 sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
b99bd4ef 3712
c19d1205
ZW
3713 if (fp_reg == FAIL || sp_reg == FAIL)
3714 {
3715 as_bad (_("expected <reg>, <reg>"));
3716 ignore_rest_of_line ();
3717 return;
3718 }
b99bd4ef 3719
c19d1205
ZW
3720 /* Optional constant. */
3721 if (skip_past_comma (&input_line_pointer) != FAIL)
3722 {
3723 if (immediate_for_directive (&offset) == FAIL)
3724 return;
3725 }
3726 else
3727 offset = 0;
a737bd4d 3728
c19d1205 3729 demand_empty_rest_of_line ();
a737bd4d 3730
c19d1205 3731 if (sp_reg != 13 && sp_reg != unwind.fp_reg)
a737bd4d 3732 {
c19d1205
ZW
3733 as_bad (_("register must be either sp or set by a previous"
3734 "unwind_movsp directive"));
3735 return;
a737bd4d
NC
3736 }
3737
c19d1205
ZW
3738 /* Don't generate any opcodes, just record the information for later. */
3739 unwind.fp_reg = fp_reg;
3740 unwind.fp_used = 1;
3741 if (sp_reg == 13)
3742 unwind.fp_offset = unwind.frame_size - offset;
3743 else
3744 unwind.fp_offset -= offset;
a737bd4d
NC
3745}
3746
c19d1205
ZW
3747/* Parse an unwind_raw directive. */
3748
3749static void
3750s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
a737bd4d 3751{
c19d1205 3752 expressionS exp;
708587a4 3753 /* This is an arbitrary limit. */
c19d1205
ZW
3754 unsigned char op[16];
3755 int count;
a737bd4d 3756
c19d1205
ZW
3757 expression (&exp);
3758 if (exp.X_op == O_constant
3759 && skip_past_comma (&input_line_pointer) != FAIL)
a737bd4d 3760 {
c19d1205
ZW
3761 unwind.frame_size += exp.X_add_number;
3762 expression (&exp);
3763 }
3764 else
3765 exp.X_op = O_illegal;
a737bd4d 3766
c19d1205
ZW
3767 if (exp.X_op != O_constant)
3768 {
3769 as_bad (_("expected <offset>, <opcode>"));
3770 ignore_rest_of_line ();
3771 return;
3772 }
a737bd4d 3773
c19d1205 3774 count = 0;
a737bd4d 3775
c19d1205
ZW
3776 /* Parse the opcode. */
3777 for (;;)
3778 {
3779 if (count >= 16)
3780 {
3781 as_bad (_("unwind opcode too long"));
3782 ignore_rest_of_line ();
a737bd4d 3783 }
c19d1205 3784 if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
a737bd4d 3785 {
c19d1205
ZW
3786 as_bad (_("invalid unwind opcode"));
3787 ignore_rest_of_line ();
3788 return;
a737bd4d 3789 }
c19d1205 3790 op[count++] = exp.X_add_number;
a737bd4d 3791
c19d1205
ZW
3792 /* Parse the next byte. */
3793 if (skip_past_comma (&input_line_pointer) == FAIL)
3794 break;
a737bd4d 3795
c19d1205
ZW
3796 expression (&exp);
3797 }
b99bd4ef 3798
c19d1205
ZW
3799 /* Add the opcode bytes in reverse order. */
3800 while (count--)
3801 add_unwind_opcode (op[count], 1);
b99bd4ef 3802
c19d1205 3803 demand_empty_rest_of_line ();
b99bd4ef 3804}
ee065d83
PB
3805
3806
3807/* Parse a .eabi_attribute directive. */
3808
3809static void
3810s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
3811{
3812 expressionS exp;
3813 bfd_boolean is_string;
3814 int tag;
3815 unsigned int i = 0;
3816 char *s = NULL;
3817 char saved_char;
3818
3819 expression (& exp);
3820 if (exp.X_op != O_constant)
3821 goto bad;
3822
3823 tag = exp.X_add_number;
3824 if (tag == 4 || tag == 5 || tag == 32 || (tag > 32 && (tag & 1) != 0))
3825 is_string = 1;
3826 else
3827 is_string = 0;
3828
3829 if (skip_past_comma (&input_line_pointer) == FAIL)
3830 goto bad;
3831 if (tag == 32 || !is_string)
3832 {
3833 expression (& exp);
3834 if (exp.X_op != O_constant)
3835 {
3836 as_bad (_("expected numeric constant"));
3837 ignore_rest_of_line ();
3838 return;
3839 }
3840 i = exp.X_add_number;
3841 }
3842 if (tag == Tag_compatibility
3843 && skip_past_comma (&input_line_pointer) == FAIL)
3844 {
3845 as_bad (_("expected comma"));
3846 ignore_rest_of_line ();
3847 return;
3848 }
3849 if (is_string)
3850 {
3851 skip_whitespace(input_line_pointer);
3852 if (*input_line_pointer != '"')
3853 goto bad_string;
3854 input_line_pointer++;
3855 s = input_line_pointer;
3856 while (*input_line_pointer && *input_line_pointer != '"')
3857 input_line_pointer++;
3858 if (*input_line_pointer != '"')
3859 goto bad_string;
3860 saved_char = *input_line_pointer;
3861 *input_line_pointer = 0;
3862 }
3863 else
3864 {
3865 s = NULL;
3866 saved_char = 0;
3867 }
3868
3869 if (tag == Tag_compatibility)
3870 elf32_arm_add_eabi_attr_compat (stdoutput, i, s);
3871 else if (is_string)
3872 elf32_arm_add_eabi_attr_string (stdoutput, tag, s);
3873 else
3874 elf32_arm_add_eabi_attr_int (stdoutput, tag, i);
3875
3876 if (s)
3877 {
3878 *input_line_pointer = saved_char;
3879 input_line_pointer++;
3880 }
3881 demand_empty_rest_of_line ();
3882 return;
3883bad_string:
3884 as_bad (_("bad string constant"));
3885 ignore_rest_of_line ();
3886 return;
3887bad:
3888 as_bad (_("expected <tag> , <value>"));
3889 ignore_rest_of_line ();
3890}
8463be01 3891#endif /* OBJ_ELF */
ee065d83
PB
3892
3893static void s_arm_arch (int);
7a1d4c38 3894static void s_arm_object_arch (int);
ee065d83
PB
3895static void s_arm_cpu (int);
3896static void s_arm_fpu (int);
b99bd4ef 3897
f0927246
NC
3898#ifdef TE_PE
3899
3900static void
3901pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
3902{
3903 expressionS exp;
3904
3905 do
3906 {
3907 expression (&exp);
3908 if (exp.X_op == O_symbol)
3909 exp.X_op = O_secrel;
3910
3911 emit_expr (&exp, 4);
3912 }
3913 while (*input_line_pointer++ == ',');
3914
3915 input_line_pointer--;
3916 demand_empty_rest_of_line ();
3917}
3918#endif /* TE_PE */
3919
c19d1205
ZW
3920/* This table describes all the machine specific pseudo-ops the assembler
3921 has to support. The fields are:
3922 pseudo-op name without dot
3923 function to call to execute this pseudo-op
3924 Integer arg to pass to the function. */
b99bd4ef 3925
c19d1205 3926const pseudo_typeS md_pseudo_table[] =
b99bd4ef 3927{
c19d1205
ZW
3928 /* Never called because '.req' does not start a line. */
3929 { "req", s_req, 0 },
dcbf9037
JB
3930 /* Following two are likewise never called. */
3931 { "dn", s_dn, 0 },
3932 { "qn", s_qn, 0 },
c19d1205
ZW
3933 { "unreq", s_unreq, 0 },
3934 { "bss", s_bss, 0 },
3935 { "align", s_align, 0 },
3936 { "arm", s_arm, 0 },
3937 { "thumb", s_thumb, 0 },
3938 { "code", s_code, 0 },
3939 { "force_thumb", s_force_thumb, 0 },
3940 { "thumb_func", s_thumb_func, 0 },
3941 { "thumb_set", s_thumb_set, 0 },
3942 { "even", s_even, 0 },
3943 { "ltorg", s_ltorg, 0 },
3944 { "pool", s_ltorg, 0 },
3945 { "syntax", s_syntax, 0 },
8463be01
PB
3946 { "cpu", s_arm_cpu, 0 },
3947 { "arch", s_arm_arch, 0 },
7a1d4c38 3948 { "object_arch", s_arm_object_arch, 0 },
8463be01 3949 { "fpu", s_arm_fpu, 0 },
c19d1205
ZW
3950#ifdef OBJ_ELF
3951 { "word", s_arm_elf_cons, 4 },
3952 { "long", s_arm_elf_cons, 4 },
3953 { "rel31", s_arm_rel31, 0 },
3954 { "fnstart", s_arm_unwind_fnstart, 0 },
3955 { "fnend", s_arm_unwind_fnend, 0 },
3956 { "cantunwind", s_arm_unwind_cantunwind, 0 },
3957 { "personality", s_arm_unwind_personality, 0 },
3958 { "personalityindex", s_arm_unwind_personalityindex, 0 },
3959 { "handlerdata", s_arm_unwind_handlerdata, 0 },
3960 { "save", s_arm_unwind_save, 0 },
fa073d69 3961 { "vsave", s_arm_unwind_save, 1 },
c19d1205
ZW
3962 { "movsp", s_arm_unwind_movsp, 0 },
3963 { "pad", s_arm_unwind_pad, 0 },
3964 { "setfp", s_arm_unwind_setfp, 0 },
3965 { "unwind_raw", s_arm_unwind_raw, 0 },
ee065d83 3966 { "eabi_attribute", s_arm_eabi_attribute, 0 },
c19d1205
ZW
3967#else
3968 { "word", cons, 4},
f0927246
NC
3969
3970 /* These are used for dwarf. */
3971 {"2byte", cons, 2},
3972 {"4byte", cons, 4},
3973 {"8byte", cons, 8},
3974 /* These are used for dwarf2. */
3975 { "file", (void (*) (int)) dwarf2_directive_file, 0 },
3976 { "loc", dwarf2_directive_loc, 0 },
3977 { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
c19d1205
ZW
3978#endif
3979 { "extend", float_cons, 'x' },
3980 { "ldouble", float_cons, 'x' },
3981 { "packed", float_cons, 'p' },
f0927246
NC
3982#ifdef TE_PE
3983 {"secrel32", pe_directive_secrel, 0},
3984#endif
c19d1205
ZW
3985 { 0, 0, 0 }
3986};
3987\f
3988/* Parser functions used exclusively in instruction operands. */
b99bd4ef 3989
c19d1205
ZW
3990/* Generic immediate-value read function for use in insn parsing.
3991 STR points to the beginning of the immediate (the leading #);
3992 VAL receives the value; if the value is outside [MIN, MAX]
3993 issue an error. PREFIX_OPT is true if the immediate prefix is
3994 optional. */
b99bd4ef 3995
c19d1205
ZW
3996static int
3997parse_immediate (char **str, int *val, int min, int max,
3998 bfd_boolean prefix_opt)
3999{
4000 expressionS exp;
4001 my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
4002 if (exp.X_op != O_constant)
b99bd4ef 4003 {
c19d1205
ZW
4004 inst.error = _("constant expression required");
4005 return FAIL;
4006 }
b99bd4ef 4007
c19d1205
ZW
4008 if (exp.X_add_number < min || exp.X_add_number > max)
4009 {
4010 inst.error = _("immediate value out of range");
4011 return FAIL;
4012 }
b99bd4ef 4013
c19d1205
ZW
4014 *val = exp.X_add_number;
4015 return SUCCESS;
4016}
b99bd4ef 4017
5287ad62 4018/* Less-generic immediate-value read function with the possibility of loading a
036dc3f7 4019 big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
5287ad62
JB
4020 instructions. Puts the result directly in inst.operands[i]. */
4021
4022static int
4023parse_big_immediate (char **str, int i)
4024{
4025 expressionS exp;
4026 char *ptr = *str;
4027
4028 my_get_expression (&exp, &ptr, GE_OPT_PREFIX_BIG);
4029
4030 if (exp.X_op == O_constant)
036dc3f7
PB
4031 {
4032 inst.operands[i].imm = exp.X_add_number & 0xffffffff;
4033 /* If we're on a 64-bit host, then a 64-bit number can be returned using
4034 O_constant. We have to be careful not to break compilation for
4035 32-bit X_add_number, though. */
4036 if ((exp.X_add_number & ~0xffffffffl) != 0)
4037 {
4038 /* X >> 32 is illegal if sizeof (exp.X_add_number) == 4. */
4039 inst.operands[i].reg = ((exp.X_add_number >> 16) >> 16) & 0xffffffff;
4040 inst.operands[i].regisimm = 1;
4041 }
4042 }
5287ad62
JB
4043 else if (exp.X_op == O_big
4044 && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32
4045 && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number <= 64)
4046 {
4047 unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
4048 /* Bignums have their least significant bits in
4049 generic_bignum[0]. Make sure we put 32 bits in imm and
4050 32 bits in reg, in a (hopefully) portable way. */
4051 assert (parts != 0);
4052 inst.operands[i].imm = 0;
4053 for (j = 0; j < parts; j++, idx++)
4054 inst.operands[i].imm |= generic_bignum[idx]
4055 << (LITTLENUM_NUMBER_OF_BITS * j);
4056 inst.operands[i].reg = 0;
4057 for (j = 0; j < parts; j++, idx++)
4058 inst.operands[i].reg |= generic_bignum[idx]
4059 << (LITTLENUM_NUMBER_OF_BITS * j);
4060 inst.operands[i].regisimm = 1;
4061 }
4062 else
4063 return FAIL;
4064
4065 *str = ptr;
4066
4067 return SUCCESS;
4068}
4069
c19d1205
ZW
4070/* Returns the pseudo-register number of an FPA immediate constant,
4071 or FAIL if there isn't a valid constant here. */
b99bd4ef 4072
c19d1205
ZW
4073static int
4074parse_fpa_immediate (char ** str)
4075{
4076 LITTLENUM_TYPE words[MAX_LITTLENUMS];
4077 char * save_in;
4078 expressionS exp;
4079 int i;
4080 int j;
b99bd4ef 4081
c19d1205
ZW
4082 /* First try and match exact strings, this is to guarantee
4083 that some formats will work even for cross assembly. */
b99bd4ef 4084
c19d1205
ZW
4085 for (i = 0; fp_const[i]; i++)
4086 {
4087 if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
b99bd4ef 4088 {
c19d1205 4089 char *start = *str;
b99bd4ef 4090
c19d1205
ZW
4091 *str += strlen (fp_const[i]);
4092 if (is_end_of_line[(unsigned char) **str])
4093 return i + 8;
4094 *str = start;
4095 }
4096 }
b99bd4ef 4097
c19d1205
ZW
4098 /* Just because we didn't get a match doesn't mean that the constant
4099 isn't valid, just that it is in a format that we don't
4100 automatically recognize. Try parsing it with the standard
4101 expression routines. */
b99bd4ef 4102
c19d1205 4103 memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
b99bd4ef 4104
c19d1205
ZW
4105 /* Look for a raw floating point number. */
4106 if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4107 && is_end_of_line[(unsigned char) *save_in])
4108 {
4109 for (i = 0; i < NUM_FLOAT_VALS; i++)
4110 {
4111 for (j = 0; j < MAX_LITTLENUMS; j++)
b99bd4ef 4112 {
c19d1205
ZW
4113 if (words[j] != fp_values[i][j])
4114 break;
b99bd4ef
NC
4115 }
4116
c19d1205 4117 if (j == MAX_LITTLENUMS)
b99bd4ef 4118 {
c19d1205
ZW
4119 *str = save_in;
4120 return i + 8;
b99bd4ef
NC
4121 }
4122 }
4123 }
b99bd4ef 4124
c19d1205
ZW
4125 /* Try and parse a more complex expression, this will probably fail
4126 unless the code uses a floating point prefix (eg "0f"). */
4127 save_in = input_line_pointer;
4128 input_line_pointer = *str;
4129 if (expression (&exp) == absolute_section
4130 && exp.X_op == O_big
4131 && exp.X_add_number < 0)
4132 {
4133 /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4134 Ditto for 15. */
4135 if (gen_to_words (words, 5, (long) 15) == 0)
4136 {
4137 for (i = 0; i < NUM_FLOAT_VALS; i++)
4138 {
4139 for (j = 0; j < MAX_LITTLENUMS; j++)
4140 {
4141 if (words[j] != fp_values[i][j])
4142 break;
4143 }
b99bd4ef 4144
c19d1205
ZW
4145 if (j == MAX_LITTLENUMS)
4146 {
4147 *str = input_line_pointer;
4148 input_line_pointer = save_in;
4149 return i + 8;
4150 }
4151 }
4152 }
b99bd4ef
NC
4153 }
4154
c19d1205
ZW
4155 *str = input_line_pointer;
4156 input_line_pointer = save_in;
4157 inst.error = _("invalid FPA immediate expression");
4158 return FAIL;
b99bd4ef
NC
4159}
4160
136da414
JB
4161/* Returns 1 if a number has "quarter-precision" float format
4162 0baBbbbbbc defgh000 00000000 00000000. */
4163
4164static int
4165is_quarter_float (unsigned imm)
4166{
4167 int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4168 return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4169}
4170
4171/* Parse an 8-bit "quarter-precision" floating point number of the form:
4172 0baBbbbbbc defgh000 00000000 00000000.
4173 The minus-zero case needs special handling, since it can't be encoded in the
4174 "quarter-precision" float format, but can nonetheless be loaded as an integer
4175 constant. */
4176
4177static unsigned
4178parse_qfloat_immediate (char **ccp, int *immed)
4179{
4180 char *str = *ccp;
4181 LITTLENUM_TYPE words[MAX_LITTLENUMS];
4182
4183 skip_past_char (&str, '#');
4184
4185 if ((str = atof_ieee (str, 's', words)) != NULL)
4186 {
4187 unsigned fpword = 0;
4188 int i;
4189
4190 /* Our FP word must be 32 bits (single-precision FP). */
4191 for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
4192 {
4193 fpword <<= LITTLENUM_NUMBER_OF_BITS;
4194 fpword |= words[i];
4195 }
4196
4197 if (is_quarter_float (fpword) || fpword == 0x80000000)
4198 *immed = fpword;
4199 else
4200 return FAIL;
4201
4202 *ccp = str;
4203
4204 return SUCCESS;
4205 }
4206
4207 return FAIL;
4208}
4209
c19d1205
ZW
4210/* Shift operands. */
4211enum shift_kind
b99bd4ef 4212{
c19d1205
ZW
4213 SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
4214};
b99bd4ef 4215
c19d1205
ZW
4216struct asm_shift_name
4217{
4218 const char *name;
4219 enum shift_kind kind;
4220};
b99bd4ef 4221
c19d1205
ZW
4222/* Third argument to parse_shift. */
4223enum parse_shift_mode
4224{
4225 NO_SHIFT_RESTRICT, /* Any kind of shift is accepted. */
4226 SHIFT_IMMEDIATE, /* Shift operand must be an immediate. */
4227 SHIFT_LSL_OR_ASR_IMMEDIATE, /* Shift must be LSL or ASR immediate. */
4228 SHIFT_ASR_IMMEDIATE, /* Shift must be ASR immediate. */
4229 SHIFT_LSL_IMMEDIATE, /* Shift must be LSL immediate. */
4230};
b99bd4ef 4231
c19d1205
ZW
4232/* Parse a <shift> specifier on an ARM data processing instruction.
4233 This has three forms:
b99bd4ef 4234
c19d1205
ZW
4235 (LSL|LSR|ASL|ASR|ROR) Rs
4236 (LSL|LSR|ASL|ASR|ROR) #imm
4237 RRX
b99bd4ef 4238
c19d1205
ZW
4239 Note that ASL is assimilated to LSL in the instruction encoding, and
4240 RRX to ROR #0 (which cannot be written as such). */
b99bd4ef 4241
c19d1205
ZW
4242static int
4243parse_shift (char **str, int i, enum parse_shift_mode mode)
b99bd4ef 4244{
c19d1205
ZW
4245 const struct asm_shift_name *shift_name;
4246 enum shift_kind shift;
4247 char *s = *str;
4248 char *p = s;
4249 int reg;
b99bd4ef 4250
c19d1205
ZW
4251 for (p = *str; ISALPHA (*p); p++)
4252 ;
b99bd4ef 4253
c19d1205 4254 if (p == *str)
b99bd4ef 4255 {
c19d1205
ZW
4256 inst.error = _("shift expression expected");
4257 return FAIL;
b99bd4ef
NC
4258 }
4259
c19d1205
ZW
4260 shift_name = hash_find_n (arm_shift_hsh, *str, p - *str);
4261
4262 if (shift_name == NULL)
b99bd4ef 4263 {
c19d1205
ZW
4264 inst.error = _("shift expression expected");
4265 return FAIL;
b99bd4ef
NC
4266 }
4267
c19d1205 4268 shift = shift_name->kind;
b99bd4ef 4269
c19d1205
ZW
4270 switch (mode)
4271 {
4272 case NO_SHIFT_RESTRICT:
4273 case SHIFT_IMMEDIATE: break;
b99bd4ef 4274
c19d1205
ZW
4275 case SHIFT_LSL_OR_ASR_IMMEDIATE:
4276 if (shift != SHIFT_LSL && shift != SHIFT_ASR)
4277 {
4278 inst.error = _("'LSL' or 'ASR' required");
4279 return FAIL;
4280 }
4281 break;
b99bd4ef 4282
c19d1205
ZW
4283 case SHIFT_LSL_IMMEDIATE:
4284 if (shift != SHIFT_LSL)
4285 {
4286 inst.error = _("'LSL' required");
4287 return FAIL;
4288 }
4289 break;
b99bd4ef 4290
c19d1205
ZW
4291 case SHIFT_ASR_IMMEDIATE:
4292 if (shift != SHIFT_ASR)
4293 {
4294 inst.error = _("'ASR' required");
4295 return FAIL;
4296 }
4297 break;
b99bd4ef 4298
c19d1205
ZW
4299 default: abort ();
4300 }
b99bd4ef 4301
c19d1205
ZW
4302 if (shift != SHIFT_RRX)
4303 {
4304 /* Whitespace can appear here if the next thing is a bare digit. */
4305 skip_whitespace (p);
b99bd4ef 4306
c19d1205 4307 if (mode == NO_SHIFT_RESTRICT
dcbf9037 4308 && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
c19d1205
ZW
4309 {
4310 inst.operands[i].imm = reg;
4311 inst.operands[i].immisreg = 1;
4312 }
4313 else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4314 return FAIL;
4315 }
4316 inst.operands[i].shift_kind = shift;
4317 inst.operands[i].shifted = 1;
4318 *str = p;
4319 return SUCCESS;
b99bd4ef
NC
4320}
4321
c19d1205 4322/* Parse a <shifter_operand> for an ARM data processing instruction:
b99bd4ef 4323
c19d1205
ZW
4324 #<immediate>
4325 #<immediate>, <rotate>
4326 <Rm>
4327 <Rm>, <shift>
b99bd4ef 4328
c19d1205
ZW
4329 where <shift> is defined by parse_shift above, and <rotate> is a
4330 multiple of 2 between 0 and 30. Validation of immediate operands
55cf6793 4331 is deferred to md_apply_fix. */
b99bd4ef 4332
c19d1205
ZW
4333static int
4334parse_shifter_operand (char **str, int i)
4335{
4336 int value;
4337 expressionS expr;
b99bd4ef 4338
dcbf9037 4339 if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
c19d1205
ZW
4340 {
4341 inst.operands[i].reg = value;
4342 inst.operands[i].isreg = 1;
b99bd4ef 4343
c19d1205
ZW
4344 /* parse_shift will override this if appropriate */
4345 inst.reloc.exp.X_op = O_constant;
4346 inst.reloc.exp.X_add_number = 0;
b99bd4ef 4347
c19d1205
ZW
4348 if (skip_past_comma (str) == FAIL)
4349 return SUCCESS;
b99bd4ef 4350
c19d1205
ZW
4351 /* Shift operation on register. */
4352 return parse_shift (str, i, NO_SHIFT_RESTRICT);
b99bd4ef
NC
4353 }
4354
c19d1205
ZW
4355 if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
4356 return FAIL;
b99bd4ef 4357
c19d1205 4358 if (skip_past_comma (str) == SUCCESS)
b99bd4ef 4359 {
c19d1205
ZW
4360 /* #x, y -- ie explicit rotation by Y. */
4361 if (my_get_expression (&expr, str, GE_NO_PREFIX))
4362 return FAIL;
b99bd4ef 4363
c19d1205
ZW
4364 if (expr.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
4365 {
4366 inst.error = _("constant expression expected");
4367 return FAIL;
4368 }
b99bd4ef 4369
c19d1205
ZW
4370 value = expr.X_add_number;
4371 if (value < 0 || value > 30 || value % 2 != 0)
4372 {
4373 inst.error = _("invalid rotation");
4374 return FAIL;
4375 }
4376 if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
4377 {
4378 inst.error = _("invalid constant");
4379 return FAIL;
4380 }
09d92015 4381
55cf6793 4382 /* Convert to decoded value. md_apply_fix will put it back. */
c19d1205
ZW
4383 inst.reloc.exp.X_add_number
4384 = (((inst.reloc.exp.X_add_number << (32 - value))
4385 | (inst.reloc.exp.X_add_number >> value)) & 0xffffffff);
09d92015
MM
4386 }
4387
c19d1205
ZW
4388 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4389 inst.reloc.pc_rel = 0;
4390 return SUCCESS;
09d92015
MM
4391}
4392
4962c51a
MS
4393/* Group relocation information. Each entry in the table contains the
4394 textual name of the relocation as may appear in assembler source
4395 and must end with a colon.
4396 Along with this textual name are the relocation codes to be used if
4397 the corresponding instruction is an ALU instruction (ADD or SUB only),
4398 an LDR, an LDRS, or an LDC. */
4399
4400struct group_reloc_table_entry
4401{
4402 const char *name;
4403 int alu_code;
4404 int ldr_code;
4405 int ldrs_code;
4406 int ldc_code;
4407};
4408
4409typedef enum
4410{
4411 /* Varieties of non-ALU group relocation. */
4412
4413 GROUP_LDR,
4414 GROUP_LDRS,
4415 GROUP_LDC
4416} group_reloc_type;
4417
4418static struct group_reloc_table_entry group_reloc_table[] =
4419 { /* Program counter relative: */
4420 { "pc_g0_nc",
4421 BFD_RELOC_ARM_ALU_PC_G0_NC, /* ALU */
4422 0, /* LDR */
4423 0, /* LDRS */
4424 0 }, /* LDC */
4425 { "pc_g0",
4426 BFD_RELOC_ARM_ALU_PC_G0, /* ALU */
4427 BFD_RELOC_ARM_LDR_PC_G0, /* LDR */
4428 BFD_RELOC_ARM_LDRS_PC_G0, /* LDRS */
4429 BFD_RELOC_ARM_LDC_PC_G0 }, /* LDC */
4430 { "pc_g1_nc",
4431 BFD_RELOC_ARM_ALU_PC_G1_NC, /* ALU */
4432 0, /* LDR */
4433 0, /* LDRS */
4434 0 }, /* LDC */
4435 { "pc_g1",
4436 BFD_RELOC_ARM_ALU_PC_G1, /* ALU */
4437 BFD_RELOC_ARM_LDR_PC_G1, /* LDR */
4438 BFD_RELOC_ARM_LDRS_PC_G1, /* LDRS */
4439 BFD_RELOC_ARM_LDC_PC_G1 }, /* LDC */
4440 { "pc_g2",
4441 BFD_RELOC_ARM_ALU_PC_G2, /* ALU */
4442 BFD_RELOC_ARM_LDR_PC_G2, /* LDR */
4443 BFD_RELOC_ARM_LDRS_PC_G2, /* LDRS */
4444 BFD_RELOC_ARM_LDC_PC_G2 }, /* LDC */
4445 /* Section base relative */
4446 { "sb_g0_nc",
4447 BFD_RELOC_ARM_ALU_SB_G0_NC, /* ALU */
4448 0, /* LDR */
4449 0, /* LDRS */
4450 0 }, /* LDC */
4451 { "sb_g0",
4452 BFD_RELOC_ARM_ALU_SB_G0, /* ALU */
4453 BFD_RELOC_ARM_LDR_SB_G0, /* LDR */
4454 BFD_RELOC_ARM_LDRS_SB_G0, /* LDRS */
4455 BFD_RELOC_ARM_LDC_SB_G0 }, /* LDC */
4456 { "sb_g1_nc",
4457 BFD_RELOC_ARM_ALU_SB_G1_NC, /* ALU */
4458 0, /* LDR */
4459 0, /* LDRS */
4460 0 }, /* LDC */
4461 { "sb_g1",
4462 BFD_RELOC_ARM_ALU_SB_G1, /* ALU */
4463 BFD_RELOC_ARM_LDR_SB_G1, /* LDR */
4464 BFD_RELOC_ARM_LDRS_SB_G1, /* LDRS */
4465 BFD_RELOC_ARM_LDC_SB_G1 }, /* LDC */
4466 { "sb_g2",
4467 BFD_RELOC_ARM_ALU_SB_G2, /* ALU */
4468 BFD_RELOC_ARM_LDR_SB_G2, /* LDR */
4469 BFD_RELOC_ARM_LDRS_SB_G2, /* LDRS */
4470 BFD_RELOC_ARM_LDC_SB_G2 } }; /* LDC */
4471
4472/* Given the address of a pointer pointing to the textual name of a group
4473 relocation as may appear in assembler source, attempt to find its details
4474 in group_reloc_table. The pointer will be updated to the character after
4475 the trailing colon. On failure, FAIL will be returned; SUCCESS
4476 otherwise. On success, *entry will be updated to point at the relevant
4477 group_reloc_table entry. */
4478
4479static int
4480find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
4481{
4482 unsigned int i;
4483 for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
4484 {
4485 int length = strlen (group_reloc_table[i].name);
4486
4487 if (strncasecmp (group_reloc_table[i].name, *str, length) == 0 &&
4488 (*str)[length] == ':')
4489 {
4490 *out = &group_reloc_table[i];
4491 *str += (length + 1);
4492 return SUCCESS;
4493 }
4494 }
4495
4496 return FAIL;
4497}
4498
4499/* Parse a <shifter_operand> for an ARM data processing instruction
4500 (as for parse_shifter_operand) where group relocations are allowed:
4501
4502 #<immediate>
4503 #<immediate>, <rotate>
4504 #:<group_reloc>:<expression>
4505 <Rm>
4506 <Rm>, <shift>
4507
4508 where <group_reloc> is one of the strings defined in group_reloc_table.
4509 The hashes are optional.
4510
4511 Everything else is as for parse_shifter_operand. */
4512
4513static parse_operand_result
4514parse_shifter_operand_group_reloc (char **str, int i)
4515{
4516 /* Determine if we have the sequence of characters #: or just :
4517 coming next. If we do, then we check for a group relocation.
4518 If we don't, punt the whole lot to parse_shifter_operand. */
4519
4520 if (((*str)[0] == '#' && (*str)[1] == ':')
4521 || (*str)[0] == ':')
4522 {
4523 struct group_reloc_table_entry *entry;
4524
4525 if ((*str)[0] == '#')
4526 (*str) += 2;
4527 else
4528 (*str)++;
4529
4530 /* Try to parse a group relocation. Anything else is an error. */
4531 if (find_group_reloc_table_entry (str, &entry) == FAIL)
4532 {
4533 inst.error = _("unknown group relocation");
4534 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4535 }
4536
4537 /* We now have the group relocation table entry corresponding to
4538 the name in the assembler source. Next, we parse the expression. */
4539 if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
4540 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4541
4542 /* Record the relocation type (always the ALU variant here). */
4543 inst.reloc.type = entry->alu_code;
4544 assert (inst.reloc.type != 0);
4545
4546 return PARSE_OPERAND_SUCCESS;
4547 }
4548 else
4549 return parse_shifter_operand (str, i) == SUCCESS
4550 ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
4551
4552 /* Never reached. */
4553}
4554
c19d1205
ZW
4555/* Parse all forms of an ARM address expression. Information is written
4556 to inst.operands[i] and/or inst.reloc.
09d92015 4557
c19d1205 4558 Preindexed addressing (.preind=1):
09d92015 4559
c19d1205
ZW
4560 [Rn, #offset] .reg=Rn .reloc.exp=offset
4561 [Rn, +/-Rm] .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
4562 [Rn, +/-Rm, shift] .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
4563 .shift_kind=shift .reloc.exp=shift_imm
09d92015 4564
c19d1205 4565 These three may have a trailing ! which causes .writeback to be set also.
09d92015 4566
c19d1205 4567 Postindexed addressing (.postind=1, .writeback=1):
09d92015 4568
c19d1205
ZW
4569 [Rn], #offset .reg=Rn .reloc.exp=offset
4570 [Rn], +/-Rm .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
4571 [Rn], +/-Rm, shift .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
4572 .shift_kind=shift .reloc.exp=shift_imm
09d92015 4573
c19d1205 4574 Unindexed addressing (.preind=0, .postind=0):
09d92015 4575
c19d1205 4576 [Rn], {option} .reg=Rn .imm=option .immisreg=0
09d92015 4577
c19d1205 4578 Other:
09d92015 4579
c19d1205
ZW
4580 [Rn]{!} shorthand for [Rn,#0]{!}
4581 =immediate .isreg=0 .reloc.exp=immediate
4582 label .reg=PC .reloc.pc_rel=1 .reloc.exp=label
09d92015 4583
c19d1205
ZW
4584 It is the caller's responsibility to check for addressing modes not
4585 supported by the instruction, and to set inst.reloc.type. */
4586
4962c51a
MS
4587static parse_operand_result
4588parse_address_main (char **str, int i, int group_relocations,
4589 group_reloc_type group_type)
09d92015 4590{
c19d1205
ZW
4591 char *p = *str;
4592 int reg;
09d92015 4593
c19d1205 4594 if (skip_past_char (&p, '[') == FAIL)
09d92015 4595 {
c19d1205
ZW
4596 if (skip_past_char (&p, '=') == FAIL)
4597 {
4598 /* bare address - translate to PC-relative offset */
4599 inst.reloc.pc_rel = 1;
4600 inst.operands[i].reg = REG_PC;
4601 inst.operands[i].isreg = 1;
4602 inst.operands[i].preind = 1;
4603 }
4604 /* else a load-constant pseudo op, no special treatment needed here */
09d92015 4605
c19d1205 4606 if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
4962c51a 4607 return PARSE_OPERAND_FAIL;
09d92015 4608
c19d1205 4609 *str = p;
4962c51a 4610 return PARSE_OPERAND_SUCCESS;
09d92015
MM
4611 }
4612
dcbf9037 4613 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
09d92015 4614 {
c19d1205 4615 inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
4962c51a 4616 return PARSE_OPERAND_FAIL;
09d92015 4617 }
c19d1205
ZW
4618 inst.operands[i].reg = reg;
4619 inst.operands[i].isreg = 1;
09d92015 4620
c19d1205 4621 if (skip_past_comma (&p) == SUCCESS)
09d92015 4622 {
c19d1205 4623 inst.operands[i].preind = 1;
09d92015 4624
c19d1205
ZW
4625 if (*p == '+') p++;
4626 else if (*p == '-') p++, inst.operands[i].negative = 1;
4627
dcbf9037 4628 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
09d92015 4629 {
c19d1205
ZW
4630 inst.operands[i].imm = reg;
4631 inst.operands[i].immisreg = 1;
4632
4633 if (skip_past_comma (&p) == SUCCESS)
4634 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
4962c51a 4635 return PARSE_OPERAND_FAIL;
c19d1205 4636 }
5287ad62
JB
4637 else if (skip_past_char (&p, ':') == SUCCESS)
4638 {
4639 /* FIXME: '@' should be used here, but it's filtered out by generic
4640 code before we get to see it here. This may be subject to
4641 change. */
4642 expressionS exp;
4643 my_get_expression (&exp, &p, GE_NO_PREFIX);
4644 if (exp.X_op != O_constant)
4645 {
4646 inst.error = _("alignment must be constant");
4962c51a 4647 return PARSE_OPERAND_FAIL;
5287ad62
JB
4648 }
4649 inst.operands[i].imm = exp.X_add_number << 8;
4650 inst.operands[i].immisalign = 1;
4651 /* Alignments are not pre-indexes. */
4652 inst.operands[i].preind = 0;
4653 }
c19d1205
ZW
4654 else
4655 {
4656 if (inst.operands[i].negative)
4657 {
4658 inst.operands[i].negative = 0;
4659 p--;
4660 }
4962c51a
MS
4661
4662 if (group_relocations &&
4663 ((*p == '#' && *(p + 1) == ':') || *p == ':'))
4664
4665 {
4666 struct group_reloc_table_entry *entry;
4667
4668 /* Skip over the #: or : sequence. */
4669 if (*p == '#')
4670 p += 2;
4671 else
4672 p++;
4673
4674 /* Try to parse a group relocation. Anything else is an
4675 error. */
4676 if (find_group_reloc_table_entry (&p, &entry) == FAIL)
4677 {
4678 inst.error = _("unknown group relocation");
4679 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4680 }
4681
4682 /* We now have the group relocation table entry corresponding to
4683 the name in the assembler source. Next, we parse the
4684 expression. */
4685 if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
4686 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4687
4688 /* Record the relocation type. */
4689 switch (group_type)
4690 {
4691 case GROUP_LDR:
4692 inst.reloc.type = entry->ldr_code;
4693 break;
4694
4695 case GROUP_LDRS:
4696 inst.reloc.type = entry->ldrs_code;
4697 break;
4698
4699 case GROUP_LDC:
4700 inst.reloc.type = entry->ldc_code;
4701 break;
4702
4703 default:
4704 assert (0);
4705 }
4706
4707 if (inst.reloc.type == 0)
4708 {
4709 inst.error = _("this group relocation is not allowed on this instruction");
4710 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
4711 }
4712 }
4713 else
4714 if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4715 return PARSE_OPERAND_FAIL;
09d92015
MM
4716 }
4717 }
4718
c19d1205 4719 if (skip_past_char (&p, ']') == FAIL)
09d92015 4720 {
c19d1205 4721 inst.error = _("']' expected");
4962c51a 4722 return PARSE_OPERAND_FAIL;
09d92015
MM
4723 }
4724
c19d1205
ZW
4725 if (skip_past_char (&p, '!') == SUCCESS)
4726 inst.operands[i].writeback = 1;
09d92015 4727
c19d1205 4728 else if (skip_past_comma (&p) == SUCCESS)
09d92015 4729 {
c19d1205
ZW
4730 if (skip_past_char (&p, '{') == SUCCESS)
4731 {
4732 /* [Rn], {expr} - unindexed, with option */
4733 if (parse_immediate (&p, &inst.operands[i].imm,
ca3f61f7 4734 0, 255, TRUE) == FAIL)
4962c51a 4735 return PARSE_OPERAND_FAIL;
09d92015 4736
c19d1205
ZW
4737 if (skip_past_char (&p, '}') == FAIL)
4738 {
4739 inst.error = _("'}' expected at end of 'option' field");
4962c51a 4740 return PARSE_OPERAND_FAIL;
c19d1205
ZW
4741 }
4742 if (inst.operands[i].preind)
4743 {
4744 inst.error = _("cannot combine index with option");
4962c51a 4745 return PARSE_OPERAND_FAIL;
c19d1205
ZW
4746 }
4747 *str = p;
4962c51a 4748 return PARSE_OPERAND_SUCCESS;
09d92015 4749 }
c19d1205
ZW
4750 else
4751 {
4752 inst.operands[i].postind = 1;
4753 inst.operands[i].writeback = 1;
09d92015 4754
c19d1205
ZW
4755 if (inst.operands[i].preind)
4756 {
4757 inst.error = _("cannot combine pre- and post-indexing");
4962c51a 4758 return PARSE_OPERAND_FAIL;
c19d1205 4759 }
09d92015 4760
c19d1205
ZW
4761 if (*p == '+') p++;
4762 else if (*p == '-') p++, inst.operands[i].negative = 1;
a737bd4d 4763
dcbf9037 4764 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
c19d1205 4765 {
5287ad62
JB
4766 /* We might be using the immediate for alignment already. If we
4767 are, OR the register number into the low-order bits. */
4768 if (inst.operands[i].immisalign)
4769 inst.operands[i].imm |= reg;
4770 else
4771 inst.operands[i].imm = reg;
c19d1205 4772 inst.operands[i].immisreg = 1;
a737bd4d 4773
c19d1205
ZW
4774 if (skip_past_comma (&p) == SUCCESS)
4775 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
4962c51a 4776 return PARSE_OPERAND_FAIL;
c19d1205
ZW
4777 }
4778 else
4779 {
4780 if (inst.operands[i].negative)
4781 {
4782 inst.operands[i].negative = 0;
4783 p--;
4784 }
4785 if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4962c51a 4786 return PARSE_OPERAND_FAIL;
c19d1205
ZW
4787 }
4788 }
a737bd4d
NC
4789 }
4790
c19d1205
ZW
4791 /* If at this point neither .preind nor .postind is set, we have a
4792 bare [Rn]{!}, which is shorthand for [Rn,#0]{!}. */
4793 if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
4794 {
4795 inst.operands[i].preind = 1;
4796 inst.reloc.exp.X_op = O_constant;
4797 inst.reloc.exp.X_add_number = 0;
4798 }
4799 *str = p;
4962c51a
MS
4800 return PARSE_OPERAND_SUCCESS;
4801}
4802
4803static int
4804parse_address (char **str, int i)
4805{
4806 return parse_address_main (str, i, 0, 0) == PARSE_OPERAND_SUCCESS
4807 ? SUCCESS : FAIL;
4808}
4809
4810static parse_operand_result
4811parse_address_group_reloc (char **str, int i, group_reloc_type type)
4812{
4813 return parse_address_main (str, i, 1, type);
a737bd4d
NC
4814}
4815
b6895b4f
PB
4816/* Parse an operand for a MOVW or MOVT instruction. */
4817static int
4818parse_half (char **str)
4819{
4820 char * p;
4821
4822 p = *str;
4823 skip_past_char (&p, '#');
4824 if (strncasecmp (p, ":lower16:", 9) == 0)
4825 inst.reloc.type = BFD_RELOC_ARM_MOVW;
4826 else if (strncasecmp (p, ":upper16:", 9) == 0)
4827 inst.reloc.type = BFD_RELOC_ARM_MOVT;
4828
4829 if (inst.reloc.type != BFD_RELOC_UNUSED)
4830 {
4831 p += 9;
4832 skip_whitespace(p);
4833 }
4834
4835 if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
4836 return FAIL;
4837
4838 if (inst.reloc.type == BFD_RELOC_UNUSED)
4839 {
4840 if (inst.reloc.exp.X_op != O_constant)
4841 {
4842 inst.error = _("constant expression expected");
4843 return FAIL;
4844 }
4845 if (inst.reloc.exp.X_add_number < 0
4846 || inst.reloc.exp.X_add_number > 0xffff)
4847 {
4848 inst.error = _("immediate value out of range");
4849 return FAIL;
4850 }
4851 }
4852 *str = p;
4853 return SUCCESS;
4854}
4855
c19d1205 4856/* Miscellaneous. */
a737bd4d 4857
c19d1205
ZW
4858/* Parse a PSR flag operand. The value returned is FAIL on syntax error,
4859 or a bitmask suitable to be or-ed into the ARM msr instruction. */
4860static int
4861parse_psr (char **str)
09d92015 4862{
c19d1205
ZW
4863 char *p;
4864 unsigned long psr_field;
62b3e311
PB
4865 const struct asm_psr *psr;
4866 char *start;
09d92015 4867
c19d1205
ZW
4868 /* CPSR's and SPSR's can now be lowercase. This is just a convenience
4869 feature for ease of use and backwards compatibility. */
4870 p = *str;
62b3e311 4871 if (strncasecmp (p, "SPSR", 4) == 0)
c19d1205 4872 psr_field = SPSR_BIT;
62b3e311 4873 else if (strncasecmp (p, "CPSR", 4) == 0)
c19d1205
ZW
4874 psr_field = 0;
4875 else
62b3e311
PB
4876 {
4877 start = p;
4878 do
4879 p++;
4880 while (ISALNUM (*p) || *p == '_');
4881
4882 psr = hash_find_n (arm_v7m_psr_hsh, start, p - start);
4883 if (!psr)
4884 return FAIL;
09d92015 4885
62b3e311
PB
4886 *str = p;
4887 return psr->field;
4888 }
09d92015 4889
62b3e311 4890 p += 4;
c19d1205
ZW
4891 if (*p == '_')
4892 {
4893 /* A suffix follows. */
c19d1205
ZW
4894 p++;
4895 start = p;
a737bd4d 4896
c19d1205
ZW
4897 do
4898 p++;
4899 while (ISALNUM (*p) || *p == '_');
a737bd4d 4900
c19d1205
ZW
4901 psr = hash_find_n (arm_psr_hsh, start, p - start);
4902 if (!psr)
4903 goto error;
a737bd4d 4904
c19d1205 4905 psr_field |= psr->field;
a737bd4d 4906 }
c19d1205 4907 else
a737bd4d 4908 {
c19d1205
ZW
4909 if (ISALNUM (*p))
4910 goto error; /* Garbage after "[CS]PSR". */
4911
4912 psr_field |= (PSR_c | PSR_f);
a737bd4d 4913 }
c19d1205
ZW
4914 *str = p;
4915 return psr_field;
a737bd4d 4916
c19d1205
ZW
4917 error:
4918 inst.error = _("flag for {c}psr instruction expected");
4919 return FAIL;
a737bd4d
NC
4920}
4921
c19d1205
ZW
4922/* Parse the flags argument to CPSI[ED]. Returns FAIL on error, or a
4923 value suitable for splatting into the AIF field of the instruction. */
a737bd4d 4924
c19d1205
ZW
4925static int
4926parse_cps_flags (char **str)
a737bd4d 4927{
c19d1205
ZW
4928 int val = 0;
4929 int saw_a_flag = 0;
4930 char *s = *str;
a737bd4d 4931
c19d1205
ZW
4932 for (;;)
4933 switch (*s++)
4934 {
4935 case '\0': case ',':
4936 goto done;
a737bd4d 4937
c19d1205
ZW
4938 case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
4939 case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
4940 case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
a737bd4d 4941
c19d1205
ZW
4942 default:
4943 inst.error = _("unrecognized CPS flag");
4944 return FAIL;
4945 }
a737bd4d 4946
c19d1205
ZW
4947 done:
4948 if (saw_a_flag == 0)
a737bd4d 4949 {
c19d1205
ZW
4950 inst.error = _("missing CPS flags");
4951 return FAIL;
a737bd4d 4952 }
a737bd4d 4953
c19d1205
ZW
4954 *str = s - 1;
4955 return val;
a737bd4d
NC
4956}
4957
c19d1205
ZW
4958/* Parse an endian specifier ("BE" or "LE", case insensitive);
4959 returns 0 for big-endian, 1 for little-endian, FAIL for an error. */
a737bd4d
NC
4960
4961static int
c19d1205 4962parse_endian_specifier (char **str)
a737bd4d 4963{
c19d1205
ZW
4964 int little_endian;
4965 char *s = *str;
a737bd4d 4966
c19d1205
ZW
4967 if (strncasecmp (s, "BE", 2))
4968 little_endian = 0;
4969 else if (strncasecmp (s, "LE", 2))
4970 little_endian = 1;
4971 else
a737bd4d 4972 {
c19d1205 4973 inst.error = _("valid endian specifiers are be or le");
a737bd4d
NC
4974 return FAIL;
4975 }
4976
c19d1205 4977 if (ISALNUM (s[2]) || s[2] == '_')
a737bd4d 4978 {
c19d1205 4979 inst.error = _("valid endian specifiers are be or le");
a737bd4d
NC
4980 return FAIL;
4981 }
4982
c19d1205
ZW
4983 *str = s + 2;
4984 return little_endian;
4985}
a737bd4d 4986
c19d1205
ZW
4987/* Parse a rotation specifier: ROR #0, #8, #16, #24. *val receives a
4988 value suitable for poking into the rotate field of an sxt or sxta
4989 instruction, or FAIL on error. */
4990
4991static int
4992parse_ror (char **str)
4993{
4994 int rot;
4995 char *s = *str;
4996
4997 if (strncasecmp (s, "ROR", 3) == 0)
4998 s += 3;
4999 else
a737bd4d 5000 {
c19d1205 5001 inst.error = _("missing rotation field after comma");
a737bd4d
NC
5002 return FAIL;
5003 }
c19d1205
ZW
5004
5005 if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
5006 return FAIL;
5007
5008 switch (rot)
a737bd4d 5009 {
c19d1205
ZW
5010 case 0: *str = s; return 0x0;
5011 case 8: *str = s; return 0x1;
5012 case 16: *str = s; return 0x2;
5013 case 24: *str = s; return 0x3;
5014
5015 default:
5016 inst.error = _("rotation can only be 0, 8, 16, or 24");
a737bd4d
NC
5017 return FAIL;
5018 }
c19d1205 5019}
a737bd4d 5020
c19d1205
ZW
5021/* Parse a conditional code (from conds[] below). The value returned is in the
5022 range 0 .. 14, or FAIL. */
5023static int
5024parse_cond (char **str)
5025{
5026 char *p, *q;
5027 const struct asm_cond *c;
a737bd4d 5028
c19d1205
ZW
5029 p = q = *str;
5030 while (ISALPHA (*q))
5031 q++;
a737bd4d 5032
c19d1205
ZW
5033 c = hash_find_n (arm_cond_hsh, p, q - p);
5034 if (!c)
a737bd4d 5035 {
c19d1205 5036 inst.error = _("condition required");
a737bd4d
NC
5037 return FAIL;
5038 }
5039
c19d1205
ZW
5040 *str = q;
5041 return c->value;
5042}
5043
62b3e311
PB
5044/* Parse an option for a barrier instruction. Returns the encoding for the
5045 option, or FAIL. */
5046static int
5047parse_barrier (char **str)
5048{
5049 char *p, *q;
5050 const struct asm_barrier_opt *o;
5051
5052 p = q = *str;
5053 while (ISALPHA (*q))
5054 q++;
5055
5056 o = hash_find_n (arm_barrier_opt_hsh, p, q - p);
5057 if (!o)
5058 return FAIL;
5059
5060 *str = q;
5061 return o->value;
5062}
5063
92e90b6e
PB
5064/* Parse the operands of a table branch instruction. Similar to a memory
5065 operand. */
5066static int
5067parse_tb (char **str)
5068{
5069 char * p = *str;
5070 int reg;
5071
5072 if (skip_past_char (&p, '[') == FAIL)
ab1eb5fe
PB
5073 {
5074 inst.error = _("'[' expected");
5075 return FAIL;
5076 }
92e90b6e 5077
dcbf9037 5078 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
92e90b6e
PB
5079 {
5080 inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5081 return FAIL;
5082 }
5083 inst.operands[0].reg = reg;
5084
5085 if (skip_past_comma (&p) == FAIL)
ab1eb5fe
PB
5086 {
5087 inst.error = _("',' expected");
5088 return FAIL;
5089 }
92e90b6e 5090
dcbf9037 5091 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
92e90b6e
PB
5092 {
5093 inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5094 return FAIL;
5095 }
5096 inst.operands[0].imm = reg;
5097
5098 if (skip_past_comma (&p) == SUCCESS)
5099 {
5100 if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
5101 return FAIL;
5102 if (inst.reloc.exp.X_add_number != 1)
5103 {
5104 inst.error = _("invalid shift");
5105 return FAIL;
5106 }
5107 inst.operands[0].shifted = 1;
5108 }
5109
5110 if (skip_past_char (&p, ']') == FAIL)
5111 {
5112 inst.error = _("']' expected");
5113 return FAIL;
5114 }
5115 *str = p;
5116 return SUCCESS;
5117}
5118
5287ad62
JB
5119/* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
5120 information on the types the operands can take and how they are encoded.
037e8744
JB
5121 Up to four operands may be read; this function handles setting the
5122 ".present" field for each read operand itself.
5287ad62
JB
5123 Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
5124 else returns FAIL. */
5125
5126static int
5127parse_neon_mov (char **str, int *which_operand)
5128{
5129 int i = *which_operand, val;
5130 enum arm_reg_type rtype;
5131 char *ptr = *str;
dcbf9037 5132 struct neon_type_el optype;
5287ad62 5133
dcbf9037 5134 if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5287ad62
JB
5135 {
5136 /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>. */
5137 inst.operands[i].reg = val;
5138 inst.operands[i].isscalar = 1;
dcbf9037 5139 inst.operands[i].vectype = optype;
5287ad62
JB
5140 inst.operands[i++].present = 1;
5141
5142 if (skip_past_comma (&ptr) == FAIL)
5143 goto wanted_comma;
5144
dcbf9037 5145 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5287ad62
JB
5146 goto wanted_arm;
5147
5148 inst.operands[i].reg = val;
5149 inst.operands[i].isreg = 1;
5150 inst.operands[i].present = 1;
5151 }
037e8744 5152 else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
dcbf9037 5153 != FAIL)
5287ad62
JB
5154 {
5155 /* Cases 0, 1, 2, 3, 5 (D only). */
5156 if (skip_past_comma (&ptr) == FAIL)
5157 goto wanted_comma;
5158
5159 inst.operands[i].reg = val;
5160 inst.operands[i].isreg = 1;
5161 inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
037e8744
JB
5162 inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5163 inst.operands[i].isvec = 1;
dcbf9037 5164 inst.operands[i].vectype = optype;
5287ad62
JB
5165 inst.operands[i++].present = 1;
5166
dcbf9037 5167 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5287ad62 5168 {
037e8744
JB
5169 /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
5170 Case 13: VMOV <Sd>, <Rm> */
5287ad62
JB
5171 inst.operands[i].reg = val;
5172 inst.operands[i].isreg = 1;
037e8744 5173 inst.operands[i].present = 1;
5287ad62
JB
5174
5175 if (rtype == REG_TYPE_NQ)
5176 {
dcbf9037 5177 first_error (_("can't use Neon quad register here"));
5287ad62
JB
5178 return FAIL;
5179 }
037e8744
JB
5180 else if (rtype != REG_TYPE_VFS)
5181 {
5182 i++;
5183 if (skip_past_comma (&ptr) == FAIL)
5184 goto wanted_comma;
5185 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5186 goto wanted_arm;
5187 inst.operands[i].reg = val;
5188 inst.operands[i].isreg = 1;
5189 inst.operands[i].present = 1;
5190 }
5287ad62 5191 }
136da414 5192 else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
136da414 5193 /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
037e8744
JB
5194 Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
5195 Case 10: VMOV.F32 <Sd>, #<imm>
5196 Case 11: VMOV.F64 <Dd>, #<imm> */
5197 ;
5287ad62 5198 else if (parse_big_immediate (&ptr, i) == SUCCESS)
5287ad62
JB
5199 /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
5200 Case 3: VMOV<c><q>.<dt> <Dd>, #<imm> */
037e8744
JB
5201 ;
5202 else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
5203 &optype)) != FAIL)
5287ad62
JB
5204 {
5205 /* Case 0: VMOV<c><q> <Qd>, <Qm>
037e8744
JB
5206 Case 1: VMOV<c><q> <Dd>, <Dm>
5207 Case 8: VMOV.F32 <Sd>, <Sm>
5208 Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm> */
5287ad62
JB
5209
5210 inst.operands[i].reg = val;
5211 inst.operands[i].isreg = 1;
5212 inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
037e8744
JB
5213 inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5214 inst.operands[i].isvec = 1;
dcbf9037 5215 inst.operands[i].vectype = optype;
5287ad62 5216 inst.operands[i].present = 1;
037e8744
JB
5217
5218 if (skip_past_comma (&ptr) == SUCCESS)
5219 {
5220 /* Case 15. */
5221 i++;
5222
5223 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5224 goto wanted_arm;
5225
5226 inst.operands[i].reg = val;
5227 inst.operands[i].isreg = 1;
5228 inst.operands[i++].present = 1;
5229
5230 if (skip_past_comma (&ptr) == FAIL)
5231 goto wanted_comma;
5232
5233 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5234 goto wanted_arm;
5235
5236 inst.operands[i].reg = val;
5237 inst.operands[i].isreg = 1;
5238 inst.operands[i++].present = 1;
5239 }
5287ad62
JB
5240 }
5241 else
5242 {
dcbf9037 5243 first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
5287ad62
JB
5244 return FAIL;
5245 }
5246 }
dcbf9037 5247 else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5287ad62
JB
5248 {
5249 /* Cases 6, 7. */
5250 inst.operands[i].reg = val;
5251 inst.operands[i].isreg = 1;
5252 inst.operands[i++].present = 1;
5253
5254 if (skip_past_comma (&ptr) == FAIL)
5255 goto wanted_comma;
5256
dcbf9037 5257 if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5287ad62
JB
5258 {
5259 /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]> */
5260 inst.operands[i].reg = val;
5261 inst.operands[i].isscalar = 1;
5262 inst.operands[i].present = 1;
dcbf9037 5263 inst.operands[i].vectype = optype;
5287ad62 5264 }
dcbf9037 5265 else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5287ad62
JB
5266 {
5267 /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm> */
5268 inst.operands[i].reg = val;
5269 inst.operands[i].isreg = 1;
5270 inst.operands[i++].present = 1;
5271
5272 if (skip_past_comma (&ptr) == FAIL)
5273 goto wanted_comma;
5274
037e8744 5275 if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
dcbf9037 5276 == FAIL)
5287ad62 5277 {
037e8744 5278 first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
5287ad62
JB
5279 return FAIL;
5280 }
5281
5282 inst.operands[i].reg = val;
5283 inst.operands[i].isreg = 1;
037e8744
JB
5284 inst.operands[i].isvec = 1;
5285 inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
dcbf9037 5286 inst.operands[i].vectype = optype;
5287ad62 5287 inst.operands[i].present = 1;
037e8744
JB
5288
5289 if (rtype == REG_TYPE_VFS)
5290 {
5291 /* Case 14. */
5292 i++;
5293 if (skip_past_comma (&ptr) == FAIL)
5294 goto wanted_comma;
5295 if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
5296 &optype)) == FAIL)
5297 {
5298 first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
5299 return FAIL;
5300 }
5301 inst.operands[i].reg = val;
5302 inst.operands[i].isreg = 1;
5303 inst.operands[i].isvec = 1;
5304 inst.operands[i].issingle = 1;
5305 inst.operands[i].vectype = optype;
5306 inst.operands[i].present = 1;
5307 }
5308 }
5309 else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
5310 != FAIL)
5311 {
5312 /* Case 13. */
5313 inst.operands[i].reg = val;
5314 inst.operands[i].isreg = 1;
5315 inst.operands[i].isvec = 1;
5316 inst.operands[i].issingle = 1;
5317 inst.operands[i].vectype = optype;
5318 inst.operands[i++].present = 1;
5287ad62
JB
5319 }
5320 }
5321 else
5322 {
dcbf9037 5323 first_error (_("parse error"));
5287ad62
JB
5324 return FAIL;
5325 }
5326
5327 /* Successfully parsed the operands. Update args. */
5328 *which_operand = i;
5329 *str = ptr;
5330 return SUCCESS;
5331
5332 wanted_comma:
dcbf9037 5333 first_error (_("expected comma"));
5287ad62
JB
5334 return FAIL;
5335
5336 wanted_arm:
dcbf9037 5337 first_error (_(reg_expected_msgs[REG_TYPE_RN]));
5287ad62 5338 return FAIL;
5287ad62
JB
5339}
5340
c19d1205
ZW
5341/* Matcher codes for parse_operands. */
5342enum operand_parse_code
5343{
5344 OP_stop, /* end of line */
5345
5346 OP_RR, /* ARM register */
5347 OP_RRnpc, /* ARM register, not r15 */
5348 OP_RRnpcb, /* ARM register, not r15, in square brackets */
5349 OP_RRw, /* ARM register, not r15, optional trailing ! */
5350 OP_RCP, /* Coprocessor number */
5351 OP_RCN, /* Coprocessor register */
5352 OP_RF, /* FPA register */
5353 OP_RVS, /* VFP single precision register */
5287ad62
JB
5354 OP_RVD, /* VFP double precision register (0..15) */
5355 OP_RND, /* Neon double precision register (0..31) */
5356 OP_RNQ, /* Neon quad precision register */
037e8744 5357 OP_RVSD, /* VFP single or double precision register */
5287ad62 5358 OP_RNDQ, /* Neon double or quad precision register */
037e8744 5359 OP_RNSDQ, /* Neon single, double or quad precision register */
5287ad62 5360 OP_RNSC, /* Neon scalar D[X] */
c19d1205
ZW
5361 OP_RVC, /* VFP control register */
5362 OP_RMF, /* Maverick F register */
5363 OP_RMD, /* Maverick D register */
5364 OP_RMFX, /* Maverick FX register */
5365 OP_RMDX, /* Maverick DX register */
5366 OP_RMAX, /* Maverick AX register */
5367 OP_RMDS, /* Maverick DSPSC register */
5368 OP_RIWR, /* iWMMXt wR register */
5369 OP_RIWC, /* iWMMXt wC register */
5370 OP_RIWG, /* iWMMXt wCG register */
5371 OP_RXA, /* XScale accumulator register */
5372
5373 OP_REGLST, /* ARM register list */
5374 OP_VRSLST, /* VFP single-precision register list */
5375 OP_VRDLST, /* VFP double-precision register list */
037e8744 5376 OP_VRSDLST, /* VFP single or double-precision register list (& quad) */
5287ad62
JB
5377 OP_NRDLST, /* Neon double-precision register list (d0-d31, qN aliases) */
5378 OP_NSTRLST, /* Neon element/structure list */
5379
5380 OP_NILO, /* Neon immediate/logic operands 2 or 2+3. (VBIC, VORR...) */
5381 OP_RNDQ_I0, /* Neon D or Q reg, or immediate zero. */
037e8744 5382 OP_RVSD_I0, /* VFP S or D reg, or immediate zero. */
5287ad62 5383 OP_RR_RNSC, /* ARM reg or Neon scalar. */
037e8744 5384 OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar. */
5287ad62
JB
5385 OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar. */
5386 OP_RND_RNSC, /* Neon D reg, or Neon scalar. */
5387 OP_VMOV, /* Neon VMOV operands. */
5388 OP_RNDQ_IMVNb,/* Neon D or Q reg, or immediate good for VMVN. */
5389 OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift. */
2d447fca 5390 OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2. */
5287ad62
JB
5391
5392 OP_I0, /* immediate zero */
c19d1205
ZW
5393 OP_I7, /* immediate value 0 .. 7 */
5394 OP_I15, /* 0 .. 15 */
5395 OP_I16, /* 1 .. 16 */
5287ad62 5396 OP_I16z, /* 0 .. 16 */
c19d1205
ZW
5397 OP_I31, /* 0 .. 31 */
5398 OP_I31w, /* 0 .. 31, optional trailing ! */
5399 OP_I32, /* 1 .. 32 */
5287ad62
JB
5400 OP_I32z, /* 0 .. 32 */
5401 OP_I63, /* 0 .. 63 */
c19d1205 5402 OP_I63s, /* -64 .. 63 */
5287ad62
JB
5403 OP_I64, /* 1 .. 64 */
5404 OP_I64z, /* 0 .. 64 */
c19d1205 5405 OP_I255, /* 0 .. 255 */
c19d1205
ZW
5406
5407 OP_I4b, /* immediate, prefix optional, 1 .. 4 */
5408 OP_I7b, /* 0 .. 7 */
5409 OP_I15b, /* 0 .. 15 */
5410 OP_I31b, /* 0 .. 31 */
5411
5412 OP_SH, /* shifter operand */
4962c51a 5413 OP_SHG, /* shifter operand with possible group relocation */
c19d1205 5414 OP_ADDR, /* Memory address expression (any mode) */
4962c51a
MS
5415 OP_ADDRGLDR, /* Mem addr expr (any mode) with possible LDR group reloc */
5416 OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
5417 OP_ADDRGLDC, /* Mem addr expr (any mode) with possible LDC group reloc */
c19d1205
ZW
5418 OP_EXP, /* arbitrary expression */
5419 OP_EXPi, /* same, with optional immediate prefix */
5420 OP_EXPr, /* same, with optional relocation suffix */
b6895b4f 5421 OP_HALF, /* 0 .. 65535 or low/high reloc. */
c19d1205
ZW
5422
5423 OP_CPSF, /* CPS flags */
5424 OP_ENDI, /* Endianness specifier */
5425 OP_PSR, /* CPSR/SPSR mask for msr */
5426 OP_COND, /* conditional code */
92e90b6e 5427 OP_TB, /* Table branch. */
c19d1205 5428
037e8744
JB
5429 OP_RVC_PSR, /* CPSR/SPSR mask for msr, or VFP control register. */
5430 OP_APSR_RR, /* ARM register or "APSR_nzcv". */
5431
c19d1205
ZW
5432 OP_RRnpc_I0, /* ARM register or literal 0 */
5433 OP_RR_EXr, /* ARM register or expression with opt. reloc suff. */
5434 OP_RR_EXi, /* ARM register or expression with imm prefix */
5435 OP_RF_IF, /* FPA register or immediate */
5436 OP_RIWR_RIWC, /* iWMMXt R or C reg */
41adaa5c 5437 OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
c19d1205
ZW
5438
5439 /* Optional operands. */
5440 OP_oI7b, /* immediate, prefix optional, 0 .. 7 */
5441 OP_oI31b, /* 0 .. 31 */
5287ad62 5442 OP_oI32b, /* 1 .. 32 */
c19d1205
ZW
5443 OP_oIffffb, /* 0 .. 65535 */
5444 OP_oI255c, /* curly-brace enclosed, 0 .. 255 */
5445
5446 OP_oRR, /* ARM register */
5447 OP_oRRnpc, /* ARM register, not the PC */
5287ad62
JB
5448 OP_oRND, /* Optional Neon double precision register */
5449 OP_oRNQ, /* Optional Neon quad precision register */
5450 OP_oRNDQ, /* Optional Neon double or quad precision register */
037e8744 5451 OP_oRNSDQ, /* Optional single, double or quad precision vector register */
c19d1205
ZW
5452 OP_oSHll, /* LSL immediate */
5453 OP_oSHar, /* ASR immediate */
5454 OP_oSHllar, /* LSL or ASR immediate */
5455 OP_oROR, /* ROR 0/8/16/24 */
62b3e311 5456 OP_oBARRIER, /* Option argument for a barrier instruction. */
c19d1205
ZW
5457
5458 OP_FIRST_OPTIONAL = OP_oI7b
5459};
a737bd4d 5460
c19d1205
ZW
5461/* Generic instruction operand parser. This does no encoding and no
5462 semantic validation; it merely squirrels values away in the inst
5463 structure. Returns SUCCESS or FAIL depending on whether the
5464 specified grammar matched. */
5465static int
ca3f61f7 5466parse_operands (char *str, const unsigned char *pattern)
c19d1205
ZW
5467{
5468 unsigned const char *upat = pattern;
5469 char *backtrack_pos = 0;
5470 const char *backtrack_error = 0;
5471 int i, val, backtrack_index = 0;
5287ad62 5472 enum arm_reg_type rtype;
4962c51a 5473 parse_operand_result result;
c19d1205
ZW
5474
5475#define po_char_or_fail(chr) do { \
5476 if (skip_past_char (&str, chr) == FAIL) \
5477 goto bad_args; \
5478} while (0)
5479
dcbf9037
JB
5480#define po_reg_or_fail(regtype) do { \
5481 val = arm_typed_reg_parse (&str, regtype, &rtype, \
5482 &inst.operands[i].vectype); \
5483 if (val == FAIL) \
5484 { \
5485 first_error (_(reg_expected_msgs[regtype])); \
5486 goto failure; \
5487 } \
5488 inst.operands[i].reg = val; \
5489 inst.operands[i].isreg = 1; \
5490 inst.operands[i].isquad = (rtype == REG_TYPE_NQ); \
037e8744
JB
5491 inst.operands[i].issingle = (rtype == REG_TYPE_VFS); \
5492 inst.operands[i].isvec = (rtype == REG_TYPE_VFS \
5493 || rtype == REG_TYPE_VFD \
5494 || rtype == REG_TYPE_NQ); \
c19d1205
ZW
5495} while (0)
5496
dcbf9037
JB
5497#define po_reg_or_goto(regtype, label) do { \
5498 val = arm_typed_reg_parse (&str, regtype, &rtype, \
5499 &inst.operands[i].vectype); \
5500 if (val == FAIL) \
5501 goto label; \
5502 \
5503 inst.operands[i].reg = val; \
5504 inst.operands[i].isreg = 1; \
5505 inst.operands[i].isquad = (rtype == REG_TYPE_NQ); \
037e8744
JB
5506 inst.operands[i].issingle = (rtype == REG_TYPE_VFS); \
5507 inst.operands[i].isvec = (rtype == REG_TYPE_VFS \
5508 || rtype == REG_TYPE_VFD \
5509 || rtype == REG_TYPE_NQ); \
c19d1205
ZW
5510} while (0)
5511
5512#define po_imm_or_fail(min, max, popt) do { \
5513 if (parse_immediate (&str, &val, min, max, popt) == FAIL) \
5514 goto failure; \
5515 inst.operands[i].imm = val; \
5516} while (0)
5517
dcbf9037
JB
5518#define po_scalar_or_goto(elsz, label) do { \
5519 val = parse_scalar (&str, elsz, &inst.operands[i].vectype); \
5520 if (val == FAIL) \
5521 goto label; \
5522 inst.operands[i].reg = val; \
5523 inst.operands[i].isscalar = 1; \
5287ad62
JB
5524} while (0)
5525
c19d1205
ZW
5526#define po_misc_or_fail(expr) do { \
5527 if (expr) \
5528 goto failure; \
5529} while (0)
5530
4962c51a
MS
5531#define po_misc_or_fail_no_backtrack(expr) do { \
5532 result = expr; \
5533 if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK)\
5534 backtrack_pos = 0; \
5535 if (result != PARSE_OPERAND_SUCCESS) \
5536 goto failure; \
5537} while (0)
5538
c19d1205
ZW
5539 skip_whitespace (str);
5540
5541 for (i = 0; upat[i] != OP_stop; i++)
5542 {
5543 if (upat[i] >= OP_FIRST_OPTIONAL)
5544 {
5545 /* Remember where we are in case we need to backtrack. */
5546 assert (!backtrack_pos);
5547 backtrack_pos = str;
5548 backtrack_error = inst.error;
5549 backtrack_index = i;
5550 }
5551
5552 if (i > 0)
5553 po_char_or_fail (',');
5554
5555 switch (upat[i])
5556 {
5557 /* Registers */
5558 case OP_oRRnpc:
5559 case OP_RRnpc:
5560 case OP_oRR:
5561 case OP_RR: po_reg_or_fail (REG_TYPE_RN); break;
5562 case OP_RCP: po_reg_or_fail (REG_TYPE_CP); break;
5563 case OP_RCN: po_reg_or_fail (REG_TYPE_CN); break;
5564 case OP_RF: po_reg_or_fail (REG_TYPE_FN); break;
5565 case OP_RVS: po_reg_or_fail (REG_TYPE_VFS); break;
5566 case OP_RVD: po_reg_or_fail (REG_TYPE_VFD); break;
5287ad62
JB
5567 case OP_oRND:
5568 case OP_RND: po_reg_or_fail (REG_TYPE_VFD); break;
c19d1205
ZW
5569 case OP_RVC: po_reg_or_fail (REG_TYPE_VFC); break;
5570 case OP_RMF: po_reg_or_fail (REG_TYPE_MVF); break;
5571 case OP_RMD: po_reg_or_fail (REG_TYPE_MVD); break;
5572 case OP_RMFX: po_reg_or_fail (REG_TYPE_MVFX); break;
5573 case OP_RMDX: po_reg_or_fail (REG_TYPE_MVDX); break;
5574 case OP_RMAX: po_reg_or_fail (REG_TYPE_MVAX); break;
5575 case OP_RMDS: po_reg_or_fail (REG_TYPE_DSPSC); break;
5576 case OP_RIWR: po_reg_or_fail (REG_TYPE_MMXWR); break;
5577 case OP_RIWC: po_reg_or_fail (REG_TYPE_MMXWC); break;
5578 case OP_RIWG: po_reg_or_fail (REG_TYPE_MMXWCG); break;
5579 case OP_RXA: po_reg_or_fail (REG_TYPE_XSCALE); break;
5287ad62
JB
5580 case OP_oRNQ:
5581 case OP_RNQ: po_reg_or_fail (REG_TYPE_NQ); break;
5582 case OP_oRNDQ:
5583 case OP_RNDQ: po_reg_or_fail (REG_TYPE_NDQ); break;
037e8744
JB
5584 case OP_RVSD: po_reg_or_fail (REG_TYPE_VFSD); break;
5585 case OP_oRNSDQ:
5586 case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ); break;
5287ad62
JB
5587
5588 /* Neon scalar. Using an element size of 8 means that some invalid
5589 scalars are accepted here, so deal with those in later code. */
5590 case OP_RNSC: po_scalar_or_goto (8, failure); break;
5591
5592 /* WARNING: We can expand to two operands here. This has the potential
5593 to totally confuse the backtracking mechanism! It will be OK at
5594 least as long as we don't try to use optional args as well,
5595 though. */
5596 case OP_NILO:
5597 {
5598 po_reg_or_goto (REG_TYPE_NDQ, try_imm);
466bbf93 5599 inst.operands[i].present = 1;
5287ad62
JB
5600 i++;
5601 skip_past_comma (&str);
5602 po_reg_or_goto (REG_TYPE_NDQ, one_reg_only);
5603 break;
5604 one_reg_only:
5605 /* Optional register operand was omitted. Unfortunately, it's in
5606 operands[i-1] and we need it to be in inst.operands[i]. Fix that
5607 here (this is a bit grotty). */
5608 inst.operands[i] = inst.operands[i-1];
5609 inst.operands[i-1].present = 0;
5610 break;
5611 try_imm:
036dc3f7
PB
5612 /* There's a possibility of getting a 64-bit immediate here, so
5613 we need special handling. */
5614 if (parse_big_immediate (&str, i) == FAIL)
5615 {
5616 inst.error = _("immediate value is out of range");
5617 goto failure;
5618 }
5287ad62
JB
5619 }
5620 break;
5621
5622 case OP_RNDQ_I0:
5623 {
5624 po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
5625 break;
5626 try_imm0:
5627 po_imm_or_fail (0, 0, TRUE);
5628 }
5629 break;
5630
037e8744
JB
5631 case OP_RVSD_I0:
5632 po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
5633 break;
5634
5287ad62
JB
5635 case OP_RR_RNSC:
5636 {
5637 po_scalar_or_goto (8, try_rr);
5638 break;
5639 try_rr:
5640 po_reg_or_fail (REG_TYPE_RN);
5641 }
5642 break;
5643
037e8744
JB
5644 case OP_RNSDQ_RNSC:
5645 {
5646 po_scalar_or_goto (8, try_nsdq);
5647 break;
5648 try_nsdq:
5649 po_reg_or_fail (REG_TYPE_NSDQ);
5650 }
5651 break;
5652
5287ad62
JB
5653 case OP_RNDQ_RNSC:
5654 {
5655 po_scalar_or_goto (8, try_ndq);
5656 break;
5657 try_ndq:
5658 po_reg_or_fail (REG_TYPE_NDQ);
5659 }
5660 break;
5661
5662 case OP_RND_RNSC:
5663 {
5664 po_scalar_or_goto (8, try_vfd);
5665 break;
5666 try_vfd:
5667 po_reg_or_fail (REG_TYPE_VFD);
5668 }
5669 break;
5670
5671 case OP_VMOV:
5672 /* WARNING: parse_neon_mov can move the operand counter, i. If we're
5673 not careful then bad things might happen. */
5674 po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
5675 break;
5676
5677 case OP_RNDQ_IMVNb:
5678 {
5679 po_reg_or_goto (REG_TYPE_NDQ, try_mvnimm);
5680 break;
5681 try_mvnimm:
5682 /* There's a possibility of getting a 64-bit immediate here, so
5683 we need special handling. */
5684 if (parse_big_immediate (&str, i) == FAIL)
5685 {
5686 inst.error = _("immediate value is out of range");
5687 goto failure;
5688 }
5689 }
5690 break;
5691
5692 case OP_RNDQ_I63b:
5693 {
5694 po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
5695 break;
5696 try_shimm:
5697 po_imm_or_fail (0, 63, TRUE);
5698 }
5699 break;
c19d1205
ZW
5700
5701 case OP_RRnpcb:
5702 po_char_or_fail ('[');
5703 po_reg_or_fail (REG_TYPE_RN);
5704 po_char_or_fail (']');
5705 break;
a737bd4d 5706
c19d1205
ZW
5707 case OP_RRw:
5708 po_reg_or_fail (REG_TYPE_RN);
5709 if (skip_past_char (&str, '!') == SUCCESS)
5710 inst.operands[i].writeback = 1;
5711 break;
5712
5713 /* Immediates */
5714 case OP_I7: po_imm_or_fail ( 0, 7, FALSE); break;
5715 case OP_I15: po_imm_or_fail ( 0, 15, FALSE); break;
5716 case OP_I16: po_imm_or_fail ( 1, 16, FALSE); break;
5287ad62 5717 case OP_I16z: po_imm_or_fail ( 0, 16, FALSE); break;
c19d1205
ZW
5718 case OP_I31: po_imm_or_fail ( 0, 31, FALSE); break;
5719 case OP_I32: po_imm_or_fail ( 1, 32, FALSE); break;
5287ad62 5720 case OP_I32z: po_imm_or_fail ( 0, 32, FALSE); break;
c19d1205 5721 case OP_I63s: po_imm_or_fail (-64, 63, FALSE); break;
5287ad62
JB
5722 case OP_I63: po_imm_or_fail ( 0, 63, FALSE); break;
5723 case OP_I64: po_imm_or_fail ( 1, 64, FALSE); break;
5724 case OP_I64z: po_imm_or_fail ( 0, 64, FALSE); break;
c19d1205 5725 case OP_I255: po_imm_or_fail ( 0, 255, FALSE); break;
c19d1205
ZW
5726
5727 case OP_I4b: po_imm_or_fail ( 1, 4, TRUE); break;
5728 case OP_oI7b:
5729 case OP_I7b: po_imm_or_fail ( 0, 7, TRUE); break;
5730 case OP_I15b: po_imm_or_fail ( 0, 15, TRUE); break;
5731 case OP_oI31b:
5732 case OP_I31b: po_imm_or_fail ( 0, 31, TRUE); break;
5287ad62 5733 case OP_oI32b: po_imm_or_fail ( 1, 32, TRUE); break;
c19d1205
ZW
5734 case OP_oIffffb: po_imm_or_fail ( 0, 0xffff, TRUE); break;
5735
5736 /* Immediate variants */
5737 case OP_oI255c:
5738 po_char_or_fail ('{');
5739 po_imm_or_fail (0, 255, TRUE);
5740 po_char_or_fail ('}');
5741 break;
5742
5743 case OP_I31w:
5744 /* The expression parser chokes on a trailing !, so we have
5745 to find it first and zap it. */
5746 {
5747 char *s = str;
5748 while (*s && *s != ',')
5749 s++;
5750 if (s[-1] == '!')
5751 {
5752 s[-1] = '\0';
5753 inst.operands[i].writeback = 1;
5754 }
5755 po_imm_or_fail (0, 31, TRUE);
5756 if (str == s - 1)
5757 str = s;
5758 }
5759 break;
5760
5761 /* Expressions */
5762 case OP_EXPi: EXPi:
5763 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
5764 GE_OPT_PREFIX));
5765 break;
5766
5767 case OP_EXP:
5768 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
5769 GE_NO_PREFIX));
5770 break;
5771
5772 case OP_EXPr: EXPr:
5773 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
5774 GE_NO_PREFIX));
5775 if (inst.reloc.exp.X_op == O_symbol)
a737bd4d 5776 {
c19d1205
ZW
5777 val = parse_reloc (&str);
5778 if (val == -1)
5779 {
5780 inst.error = _("unrecognized relocation suffix");
5781 goto failure;
5782 }
5783 else if (val != BFD_RELOC_UNUSED)
5784 {
5785 inst.operands[i].imm = val;
5786 inst.operands[i].hasreloc = 1;
5787 }
a737bd4d 5788 }
c19d1205 5789 break;
a737bd4d 5790
b6895b4f
PB
5791 /* Operand for MOVW or MOVT. */
5792 case OP_HALF:
5793 po_misc_or_fail (parse_half (&str));
5794 break;
5795
c19d1205
ZW
5796 /* Register or expression */
5797 case OP_RR_EXr: po_reg_or_goto (REG_TYPE_RN, EXPr); break;
5798 case OP_RR_EXi: po_reg_or_goto (REG_TYPE_RN, EXPi); break;
a737bd4d 5799
c19d1205
ZW
5800 /* Register or immediate */
5801 case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0); break;
5802 I0: po_imm_or_fail (0, 0, FALSE); break;
a737bd4d 5803
c19d1205
ZW
5804 case OP_RF_IF: po_reg_or_goto (REG_TYPE_FN, IF); break;
5805 IF:
5806 if (!is_immediate_prefix (*str))
5807 goto bad_args;
5808 str++;
5809 val = parse_fpa_immediate (&str);
5810 if (val == FAIL)
5811 goto failure;
5812 /* FPA immediates are encoded as registers 8-15.
5813 parse_fpa_immediate has already applied the offset. */
5814 inst.operands[i].reg = val;
5815 inst.operands[i].isreg = 1;
5816 break;
09d92015 5817
2d447fca
JM
5818 case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
5819 I32z: po_imm_or_fail (0, 32, FALSE); break;
5820
c19d1205
ZW
5821 /* Two kinds of register */
5822 case OP_RIWR_RIWC:
5823 {
5824 struct reg_entry *rege = arm_reg_parse_multi (&str);
97f87066
JM
5825 if (!rege
5826 || (rege->type != REG_TYPE_MMXWR
5827 && rege->type != REG_TYPE_MMXWC
5828 && rege->type != REG_TYPE_MMXWCG))
c19d1205
ZW
5829 {
5830 inst.error = _("iWMMXt data or control register expected");
5831 goto failure;
5832 }
5833 inst.operands[i].reg = rege->number;
5834 inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
5835 }
5836 break;
09d92015 5837
41adaa5c
JM
5838 case OP_RIWC_RIWG:
5839 {
5840 struct reg_entry *rege = arm_reg_parse_multi (&str);
5841 if (!rege
5842 || (rege->type != REG_TYPE_MMXWC
5843 && rege->type != REG_TYPE_MMXWCG))
5844 {
5845 inst.error = _("iWMMXt control register expected");
5846 goto failure;
5847 }
5848 inst.operands[i].reg = rege->number;
5849 inst.operands[i].isreg = 1;
5850 }
5851 break;
5852
c19d1205
ZW
5853 /* Misc */
5854 case OP_CPSF: val = parse_cps_flags (&str); break;
5855 case OP_ENDI: val = parse_endian_specifier (&str); break;
5856 case OP_oROR: val = parse_ror (&str); break;
5857 case OP_PSR: val = parse_psr (&str); break;
5858 case OP_COND: val = parse_cond (&str); break;
62b3e311 5859 case OP_oBARRIER:val = parse_barrier (&str); break;
c19d1205 5860
037e8744
JB
5861 case OP_RVC_PSR:
5862 po_reg_or_goto (REG_TYPE_VFC, try_psr);
5863 inst.operands[i].isvec = 1; /* Mark VFP control reg as vector. */
5864 break;
5865 try_psr:
5866 val = parse_psr (&str);
5867 break;
5868
5869 case OP_APSR_RR:
5870 po_reg_or_goto (REG_TYPE_RN, try_apsr);
5871 break;
5872 try_apsr:
5873 /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
5874 instruction). */
5875 if (strncasecmp (str, "APSR_", 5) == 0)
5876 {
5877 unsigned found = 0;
5878 str += 5;
5879 while (found < 15)
5880 switch (*str++)
5881 {
5882 case 'c': found = (found & 1) ? 16 : found | 1; break;
5883 case 'n': found = (found & 2) ? 16 : found | 2; break;
5884 case 'z': found = (found & 4) ? 16 : found | 4; break;
5885 case 'v': found = (found & 8) ? 16 : found | 8; break;
5886 default: found = 16;
5887 }
5888 if (found != 15)
5889 goto failure;
5890 inst.operands[i].isvec = 1;
5891 }
5892 else
5893 goto failure;
5894 break;
5895
92e90b6e
PB
5896 case OP_TB:
5897 po_misc_or_fail (parse_tb (&str));
5898 break;
5899
c19d1205
ZW
5900 /* Register lists */
5901 case OP_REGLST:
5902 val = parse_reg_list (&str);
5903 if (*str == '^')
5904 {
5905 inst.operands[1].writeback = 1;
5906 str++;
5907 }
5908 break;
09d92015 5909
c19d1205 5910 case OP_VRSLST:
5287ad62 5911 val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
c19d1205 5912 break;
09d92015 5913
c19d1205 5914 case OP_VRDLST:
5287ad62 5915 val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
c19d1205 5916 break;
a737bd4d 5917
037e8744
JB
5918 case OP_VRSDLST:
5919 /* Allow Q registers too. */
5920 val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
5921 REGLIST_NEON_D);
5922 if (val == FAIL)
5923 {
5924 inst.error = NULL;
5925 val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
5926 REGLIST_VFP_S);
5927 inst.operands[i].issingle = 1;
5928 }
5929 break;
5930
5287ad62
JB
5931 case OP_NRDLST:
5932 val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
5933 REGLIST_NEON_D);
5934 break;
5935
5936 case OP_NSTRLST:
dcbf9037
JB
5937 val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
5938 &inst.operands[i].vectype);
5287ad62
JB
5939 break;
5940
c19d1205
ZW
5941 /* Addressing modes */
5942 case OP_ADDR:
5943 po_misc_or_fail (parse_address (&str, i));
5944 break;
09d92015 5945
4962c51a
MS
5946 case OP_ADDRGLDR:
5947 po_misc_or_fail_no_backtrack (
5948 parse_address_group_reloc (&str, i, GROUP_LDR));
5949 break;
5950
5951 case OP_ADDRGLDRS:
5952 po_misc_or_fail_no_backtrack (
5953 parse_address_group_reloc (&str, i, GROUP_LDRS));
5954 break;
5955
5956 case OP_ADDRGLDC:
5957 po_misc_or_fail_no_backtrack (
5958 parse_address_group_reloc (&str, i, GROUP_LDC));
5959 break;
5960
c19d1205
ZW
5961 case OP_SH:
5962 po_misc_or_fail (parse_shifter_operand (&str, i));
5963 break;
09d92015 5964
4962c51a
MS
5965 case OP_SHG:
5966 po_misc_or_fail_no_backtrack (
5967 parse_shifter_operand_group_reloc (&str, i));
5968 break;
5969
c19d1205
ZW
5970 case OP_oSHll:
5971 po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
5972 break;
09d92015 5973
c19d1205
ZW
5974 case OP_oSHar:
5975 po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
5976 break;
09d92015 5977
c19d1205
ZW
5978 case OP_oSHllar:
5979 po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
5980 break;
09d92015 5981
c19d1205
ZW
5982 default:
5983 as_fatal ("unhandled operand code %d", upat[i]);
5984 }
09d92015 5985
c19d1205
ZW
5986 /* Various value-based sanity checks and shared operations. We
5987 do not signal immediate failures for the register constraints;
5988 this allows a syntax error to take precedence. */
5989 switch (upat[i])
5990 {
5991 case OP_oRRnpc:
5992 case OP_RRnpc:
5993 case OP_RRnpcb:
5994 case OP_RRw:
5995 case OP_RRnpc_I0:
5996 if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
5997 inst.error = BAD_PC;
5998 break;
09d92015 5999
c19d1205
ZW
6000 case OP_CPSF:
6001 case OP_ENDI:
6002 case OP_oROR:
6003 case OP_PSR:
037e8744 6004 case OP_RVC_PSR:
c19d1205 6005 case OP_COND:
62b3e311 6006 case OP_oBARRIER:
c19d1205
ZW
6007 case OP_REGLST:
6008 case OP_VRSLST:
6009 case OP_VRDLST:
037e8744 6010 case OP_VRSDLST:
5287ad62
JB
6011 case OP_NRDLST:
6012 case OP_NSTRLST:
c19d1205
ZW
6013 if (val == FAIL)
6014 goto failure;
6015 inst.operands[i].imm = val;
6016 break;
a737bd4d 6017
c19d1205
ZW
6018 default:
6019 break;
6020 }
09d92015 6021
c19d1205
ZW
6022 /* If we get here, this operand was successfully parsed. */
6023 inst.operands[i].present = 1;
6024 continue;
09d92015 6025
c19d1205 6026 bad_args:
09d92015 6027 inst.error = BAD_ARGS;
c19d1205
ZW
6028
6029 failure:
6030 if (!backtrack_pos)
d252fdde
PB
6031 {
6032 /* The parse routine should already have set inst.error, but set a
6033 defaut here just in case. */
6034 if (!inst.error)
6035 inst.error = _("syntax error");
6036 return FAIL;
6037 }
c19d1205
ZW
6038
6039 /* Do not backtrack over a trailing optional argument that
6040 absorbed some text. We will only fail again, with the
6041 'garbage following instruction' error message, which is
6042 probably less helpful than the current one. */
6043 if (backtrack_index == i && backtrack_pos != str
6044 && upat[i+1] == OP_stop)
d252fdde
PB
6045 {
6046 if (!inst.error)
6047 inst.error = _("syntax error");
6048 return FAIL;
6049 }
c19d1205
ZW
6050
6051 /* Try again, skipping the optional argument at backtrack_pos. */
6052 str = backtrack_pos;
6053 inst.error = backtrack_error;
6054 inst.operands[backtrack_index].present = 0;
6055 i = backtrack_index;
6056 backtrack_pos = 0;
09d92015 6057 }
09d92015 6058
c19d1205
ZW
6059 /* Check that we have parsed all the arguments. */
6060 if (*str != '\0' && !inst.error)
6061 inst.error = _("garbage following instruction");
09d92015 6062
c19d1205 6063 return inst.error ? FAIL : SUCCESS;
09d92015
MM
6064}
6065
c19d1205
ZW
6066#undef po_char_or_fail
6067#undef po_reg_or_fail
6068#undef po_reg_or_goto
6069#undef po_imm_or_fail
5287ad62 6070#undef po_scalar_or_fail
c19d1205
ZW
6071\f
6072/* Shorthand macro for instruction encoding functions issuing errors. */
6073#define constraint(expr, err) do { \
6074 if (expr) \
6075 { \
6076 inst.error = err; \
6077 return; \
6078 } \
6079} while (0)
6080
6081/* Functions for operand encoding. ARM, then Thumb. */
6082
6083#define rotate_left(v, n) (v << n | v >> (32 - n))
6084
6085/* If VAL can be encoded in the immediate field of an ARM instruction,
6086 return the encoded form. Otherwise, return FAIL. */
6087
6088static unsigned int
6089encode_arm_immediate (unsigned int val)
09d92015 6090{
c19d1205
ZW
6091 unsigned int a, i;
6092
6093 for (i = 0; i < 32; i += 2)
6094 if ((a = rotate_left (val, i)) <= 0xff)
6095 return a | (i << 7); /* 12-bit pack: [shift-cnt,const]. */
6096
6097 return FAIL;
09d92015
MM
6098}
6099
c19d1205
ZW
6100/* If VAL can be encoded in the immediate field of a Thumb32 instruction,
6101 return the encoded form. Otherwise, return FAIL. */
6102static unsigned int
6103encode_thumb32_immediate (unsigned int val)
09d92015 6104{
c19d1205 6105 unsigned int a, i;
09d92015 6106
9c3c69f2 6107 if (val <= 0xff)
c19d1205 6108 return val;
a737bd4d 6109
9c3c69f2 6110 for (i = 1; i <= 24; i++)
09d92015 6111 {
9c3c69f2
PB
6112 a = val >> i;
6113 if ((val & ~(0xff << i)) == 0)
6114 return ((val >> i) & 0x7f) | ((32 - i) << 7);
09d92015 6115 }
a737bd4d 6116
c19d1205
ZW
6117 a = val & 0xff;
6118 if (val == ((a << 16) | a))
6119 return 0x100 | a;
6120 if (val == ((a << 24) | (a << 16) | (a << 8) | a))
6121 return 0x300 | a;
09d92015 6122
c19d1205
ZW
6123 a = val & 0xff00;
6124 if (val == ((a << 16) | a))
6125 return 0x200 | (a >> 8);
a737bd4d 6126
c19d1205 6127 return FAIL;
09d92015 6128}
5287ad62 6129/* Encode a VFP SP or DP register number into inst.instruction. */
09d92015
MM
6130
6131static void
5287ad62
JB
6132encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
6133{
6134 if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
6135 && reg > 15)
6136 {
6137 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v3))
6138 {
6139 if (thumb_mode)
6140 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
6141 fpu_vfp_ext_v3);
6142 else
6143 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
6144 fpu_vfp_ext_v3);
6145 }
6146 else
6147 {
dcbf9037 6148 first_error (_("D register out of range for selected VFP version"));
5287ad62
JB
6149 return;
6150 }
6151 }
6152
c19d1205 6153 switch (pos)
09d92015 6154 {
c19d1205
ZW
6155 case VFP_REG_Sd:
6156 inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
6157 break;
6158
6159 case VFP_REG_Sn:
6160 inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
6161 break;
6162
6163 case VFP_REG_Sm:
6164 inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
6165 break;
6166
5287ad62
JB
6167 case VFP_REG_Dd:
6168 inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
6169 break;
6170
6171 case VFP_REG_Dn:
6172 inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
6173 break;
6174
6175 case VFP_REG_Dm:
6176 inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
6177 break;
6178
c19d1205
ZW
6179 default:
6180 abort ();
09d92015 6181 }
09d92015
MM
6182}
6183
c19d1205 6184/* Encode a <shift> in an ARM-format instruction. The immediate,
55cf6793 6185 if any, is handled by md_apply_fix. */
09d92015 6186static void
c19d1205 6187encode_arm_shift (int i)
09d92015 6188{
c19d1205
ZW
6189 if (inst.operands[i].shift_kind == SHIFT_RRX)
6190 inst.instruction |= SHIFT_ROR << 5;
6191 else
09d92015 6192 {
c19d1205
ZW
6193 inst.instruction |= inst.operands[i].shift_kind << 5;
6194 if (inst.operands[i].immisreg)
6195 {
6196 inst.instruction |= SHIFT_BY_REG;
6197 inst.instruction |= inst.operands[i].imm << 8;
6198 }
6199 else
6200 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
09d92015 6201 }
c19d1205 6202}
09d92015 6203
c19d1205
ZW
6204static void
6205encode_arm_shifter_operand (int i)
6206{
6207 if (inst.operands[i].isreg)
09d92015 6208 {
c19d1205
ZW
6209 inst.instruction |= inst.operands[i].reg;
6210 encode_arm_shift (i);
09d92015 6211 }
c19d1205
ZW
6212 else
6213 inst.instruction |= INST_IMMEDIATE;
09d92015
MM
6214}
6215
c19d1205 6216/* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3. */
09d92015 6217static void
c19d1205 6218encode_arm_addr_mode_common (int i, bfd_boolean is_t)
09d92015 6219{
c19d1205
ZW
6220 assert (inst.operands[i].isreg);
6221 inst.instruction |= inst.operands[i].reg << 16;
a737bd4d 6222
c19d1205 6223 if (inst.operands[i].preind)
09d92015 6224 {
c19d1205
ZW
6225 if (is_t)
6226 {
6227 inst.error = _("instruction does not accept preindexed addressing");
6228 return;
6229 }
6230 inst.instruction |= PRE_INDEX;
6231 if (inst.operands[i].writeback)
6232 inst.instruction |= WRITE_BACK;
09d92015 6233
c19d1205
ZW
6234 }
6235 else if (inst.operands[i].postind)
6236 {
6237 assert (inst.operands[i].writeback);
6238 if (is_t)
6239 inst.instruction |= WRITE_BACK;
6240 }
6241 else /* unindexed - only for coprocessor */
09d92015 6242 {
c19d1205 6243 inst.error = _("instruction does not accept unindexed addressing");
09d92015
MM
6244 return;
6245 }
6246
c19d1205
ZW
6247 if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
6248 && (((inst.instruction & 0x000f0000) >> 16)
6249 == ((inst.instruction & 0x0000f000) >> 12)))
6250 as_warn ((inst.instruction & LOAD_BIT)
6251 ? _("destination register same as write-back base")
6252 : _("source register same as write-back base"));
09d92015
MM
6253}
6254
c19d1205
ZW
6255/* inst.operands[i] was set up by parse_address. Encode it into an
6256 ARM-format mode 2 load or store instruction. If is_t is true,
6257 reject forms that cannot be used with a T instruction (i.e. not
6258 post-indexed). */
a737bd4d 6259static void
c19d1205 6260encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
09d92015 6261{
c19d1205 6262 encode_arm_addr_mode_common (i, is_t);
a737bd4d 6263
c19d1205 6264 if (inst.operands[i].immisreg)
09d92015 6265 {
c19d1205
ZW
6266 inst.instruction |= INST_IMMEDIATE; /* yes, this is backwards */
6267 inst.instruction |= inst.operands[i].imm;
6268 if (!inst.operands[i].negative)
6269 inst.instruction |= INDEX_UP;
6270 if (inst.operands[i].shifted)
6271 {
6272 if (inst.operands[i].shift_kind == SHIFT_RRX)
6273 inst.instruction |= SHIFT_ROR << 5;
6274 else
6275 {
6276 inst.instruction |= inst.operands[i].shift_kind << 5;
6277 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
6278 }
6279 }
09d92015 6280 }
c19d1205 6281 else /* immediate offset in inst.reloc */
09d92015 6282 {
c19d1205
ZW
6283 if (inst.reloc.type == BFD_RELOC_UNUSED)
6284 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
09d92015 6285 }
09d92015
MM
6286}
6287
c19d1205
ZW
6288/* inst.operands[i] was set up by parse_address. Encode it into an
6289 ARM-format mode 3 load or store instruction. Reject forms that
6290 cannot be used with such instructions. If is_t is true, reject
6291 forms that cannot be used with a T instruction (i.e. not
6292 post-indexed). */
6293static void
6294encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
09d92015 6295{
c19d1205 6296 if (inst.operands[i].immisreg && inst.operands[i].shifted)
09d92015 6297 {
c19d1205
ZW
6298 inst.error = _("instruction does not accept scaled register index");
6299 return;
09d92015 6300 }
a737bd4d 6301
c19d1205 6302 encode_arm_addr_mode_common (i, is_t);
a737bd4d 6303
c19d1205
ZW
6304 if (inst.operands[i].immisreg)
6305 {
6306 inst.instruction |= inst.operands[i].imm;
6307 if (!inst.operands[i].negative)
6308 inst.instruction |= INDEX_UP;
6309 }
6310 else /* immediate offset in inst.reloc */
6311 {
6312 inst.instruction |= HWOFFSET_IMM;
6313 if (inst.reloc.type == BFD_RELOC_UNUSED)
6314 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
c19d1205 6315 }
a737bd4d
NC
6316}
6317
c19d1205
ZW
6318/* inst.operands[i] was set up by parse_address. Encode it into an
6319 ARM-format instruction. Reject all forms which cannot be encoded
6320 into a coprocessor load/store instruction. If wb_ok is false,
6321 reject use of writeback; if unind_ok is false, reject use of
6322 unindexed addressing. If reloc_override is not 0, use it instead
4962c51a
MS
6323 of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
6324 (in which case it is preserved). */
09d92015 6325
c19d1205
ZW
6326static int
6327encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
09d92015 6328{
c19d1205 6329 inst.instruction |= inst.operands[i].reg << 16;
a737bd4d 6330
c19d1205 6331 assert (!(inst.operands[i].preind && inst.operands[i].postind));
09d92015 6332
c19d1205 6333 if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
09d92015 6334 {
c19d1205
ZW
6335 assert (!inst.operands[i].writeback);
6336 if (!unind_ok)
6337 {
6338 inst.error = _("instruction does not support unindexed addressing");
6339 return FAIL;
6340 }
6341 inst.instruction |= inst.operands[i].imm;
6342 inst.instruction |= INDEX_UP;
6343 return SUCCESS;
09d92015 6344 }
a737bd4d 6345
c19d1205
ZW
6346 if (inst.operands[i].preind)
6347 inst.instruction |= PRE_INDEX;
a737bd4d 6348
c19d1205 6349 if (inst.operands[i].writeback)
09d92015 6350 {
c19d1205
ZW
6351 if (inst.operands[i].reg == REG_PC)
6352 {
6353 inst.error = _("pc may not be used with write-back");
6354 return FAIL;
6355 }
6356 if (!wb_ok)
6357 {
6358 inst.error = _("instruction does not support writeback");
6359 return FAIL;
6360 }
6361 inst.instruction |= WRITE_BACK;
09d92015 6362 }
a737bd4d 6363
c19d1205
ZW
6364 if (reloc_override)
6365 inst.reloc.type = reloc_override;
4962c51a
MS
6366 else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
6367 || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
6368 && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
6369 {
6370 if (thumb_mode)
6371 inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
6372 else
6373 inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
6374 }
6375
c19d1205
ZW
6376 return SUCCESS;
6377}
a737bd4d 6378
c19d1205
ZW
6379/* inst.reloc.exp describes an "=expr" load pseudo-operation.
6380 Determine whether it can be performed with a move instruction; if
6381 it can, convert inst.instruction to that move instruction and
6382 return 1; if it can't, convert inst.instruction to a literal-pool
6383 load and return 0. If this is not a valid thing to do in the
6384 current context, set inst.error and return 1.
a737bd4d 6385
c19d1205
ZW
6386 inst.operands[i] describes the destination register. */
6387
6388static int
6389move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
6390{
53365c0d
PB
6391 unsigned long tbit;
6392
6393 if (thumb_p)
6394 tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
6395 else
6396 tbit = LOAD_BIT;
6397
6398 if ((inst.instruction & tbit) == 0)
09d92015 6399 {
c19d1205
ZW
6400 inst.error = _("invalid pseudo operation");
6401 return 1;
09d92015 6402 }
c19d1205 6403 if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
09d92015
MM
6404 {
6405 inst.error = _("constant expression expected");
c19d1205 6406 return 1;
09d92015 6407 }
c19d1205 6408 if (inst.reloc.exp.X_op == O_constant)
09d92015 6409 {
c19d1205
ZW
6410 if (thumb_p)
6411 {
53365c0d 6412 if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
c19d1205
ZW
6413 {
6414 /* This can be done with a mov(1) instruction. */
6415 inst.instruction = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
6416 inst.instruction |= inst.reloc.exp.X_add_number;
6417 return 1;
6418 }
6419 }
6420 else
6421 {
6422 int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
6423 if (value != FAIL)
6424 {
6425 /* This can be done with a mov instruction. */
6426 inst.instruction &= LITERAL_MASK;
6427 inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
6428 inst.instruction |= value & 0xfff;
6429 return 1;
6430 }
09d92015 6431
c19d1205
ZW
6432 value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
6433 if (value != FAIL)
6434 {
6435 /* This can be done with a mvn instruction. */
6436 inst.instruction &= LITERAL_MASK;
6437 inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
6438 inst.instruction |= value & 0xfff;
6439 return 1;
6440 }
6441 }
09d92015
MM
6442 }
6443
c19d1205
ZW
6444 if (add_to_lit_pool () == FAIL)
6445 {
6446 inst.error = _("literal pool insertion failed");
6447 return 1;
6448 }
6449 inst.operands[1].reg = REG_PC;
6450 inst.operands[1].isreg = 1;
6451 inst.operands[1].preind = 1;
6452 inst.reloc.pc_rel = 1;
6453 inst.reloc.type = (thumb_p
6454 ? BFD_RELOC_ARM_THUMB_OFFSET
6455 : (mode_3
6456 ? BFD_RELOC_ARM_HWLITERAL
6457 : BFD_RELOC_ARM_LITERAL));
6458 return 0;
09d92015
MM
6459}
6460
c19d1205
ZW
6461/* Functions for instruction encoding, sorted by subarchitecture.
6462 First some generics; their names are taken from the conventional
6463 bit positions for register arguments in ARM format instructions. */
09d92015 6464
a737bd4d 6465static void
c19d1205 6466do_noargs (void)
09d92015 6467{
c19d1205 6468}
a737bd4d 6469
c19d1205
ZW
6470static void
6471do_rd (void)
6472{
6473 inst.instruction |= inst.operands[0].reg << 12;
6474}
a737bd4d 6475
c19d1205
ZW
6476static void
6477do_rd_rm (void)
6478{
6479 inst.instruction |= inst.operands[0].reg << 12;
6480 inst.instruction |= inst.operands[1].reg;
6481}
09d92015 6482
c19d1205
ZW
6483static void
6484do_rd_rn (void)
6485{
6486 inst.instruction |= inst.operands[0].reg << 12;
6487 inst.instruction |= inst.operands[1].reg << 16;
6488}
a737bd4d 6489
c19d1205
ZW
6490static void
6491do_rn_rd (void)
6492{
6493 inst.instruction |= inst.operands[0].reg << 16;
6494 inst.instruction |= inst.operands[1].reg << 12;
6495}
09d92015 6496
c19d1205
ZW
6497static void
6498do_rd_rm_rn (void)
6499{
9a64e435 6500 unsigned Rn = inst.operands[2].reg;
708587a4 6501 /* Enforce restrictions on SWP instruction. */
9a64e435
PB
6502 if ((inst.instruction & 0x0fbfffff) == 0x01000090)
6503 constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
6504 _("Rn must not overlap other operands"));
c19d1205
ZW
6505 inst.instruction |= inst.operands[0].reg << 12;
6506 inst.instruction |= inst.operands[1].reg;
9a64e435 6507 inst.instruction |= Rn << 16;
c19d1205 6508}
09d92015 6509
c19d1205
ZW
6510static void
6511do_rd_rn_rm (void)
6512{
6513 inst.instruction |= inst.operands[0].reg << 12;
6514 inst.instruction |= inst.operands[1].reg << 16;
6515 inst.instruction |= inst.operands[2].reg;
6516}
a737bd4d 6517
c19d1205
ZW
6518static void
6519do_rm_rd_rn (void)
6520{
6521 inst.instruction |= inst.operands[0].reg;
6522 inst.instruction |= inst.operands[1].reg << 12;
6523 inst.instruction |= inst.operands[2].reg << 16;
6524}
09d92015 6525
c19d1205
ZW
6526static void
6527do_imm0 (void)
6528{
6529 inst.instruction |= inst.operands[0].imm;
6530}
09d92015 6531
c19d1205
ZW
6532static void
6533do_rd_cpaddr (void)
6534{
6535 inst.instruction |= inst.operands[0].reg << 12;
6536 encode_arm_cp_address (1, TRUE, TRUE, 0);
09d92015 6537}
a737bd4d 6538
c19d1205
ZW
6539/* ARM instructions, in alphabetical order by function name (except
6540 that wrapper functions appear immediately after the function they
6541 wrap). */
09d92015 6542
c19d1205
ZW
6543/* This is a pseudo-op of the form "adr rd, label" to be converted
6544 into a relative address of the form "add rd, pc, #label-.-8". */
09d92015
MM
6545
6546static void
c19d1205 6547do_adr (void)
09d92015 6548{
c19d1205 6549 inst.instruction |= (inst.operands[0].reg << 12); /* Rd */
a737bd4d 6550
c19d1205
ZW
6551 /* Frag hacking will turn this into a sub instruction if the offset turns
6552 out to be negative. */
6553 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
c19d1205 6554 inst.reloc.pc_rel = 1;
2fc8bdac 6555 inst.reloc.exp.X_add_number -= 8;
c19d1205 6556}
b99bd4ef 6557
c19d1205
ZW
6558/* This is a pseudo-op of the form "adrl rd, label" to be converted
6559 into a relative address of the form:
6560 add rd, pc, #low(label-.-8)"
6561 add rd, rd, #high(label-.-8)" */
b99bd4ef 6562
c19d1205
ZW
6563static void
6564do_adrl (void)
6565{
6566 inst.instruction |= (inst.operands[0].reg << 12); /* Rd */
a737bd4d 6567
c19d1205
ZW
6568 /* Frag hacking will turn this into a sub instruction if the offset turns
6569 out to be negative. */
6570 inst.reloc.type = BFD_RELOC_ARM_ADRL_IMMEDIATE;
c19d1205
ZW
6571 inst.reloc.pc_rel = 1;
6572 inst.size = INSN_SIZE * 2;
2fc8bdac 6573 inst.reloc.exp.X_add_number -= 8;
b99bd4ef
NC
6574}
6575
b99bd4ef 6576static void
c19d1205 6577do_arit (void)
b99bd4ef 6578{
c19d1205
ZW
6579 if (!inst.operands[1].present)
6580 inst.operands[1].reg = inst.operands[0].reg;
6581 inst.instruction |= inst.operands[0].reg << 12;
6582 inst.instruction |= inst.operands[1].reg << 16;
6583 encode_arm_shifter_operand (2);
6584}
b99bd4ef 6585
62b3e311
PB
6586static void
6587do_barrier (void)
6588{
6589 if (inst.operands[0].present)
6590 {
6591 constraint ((inst.instruction & 0xf0) != 0x40
6592 && inst.operands[0].imm != 0xf,
6593 "bad barrier type");
6594 inst.instruction |= inst.operands[0].imm;
6595 }
6596 else
6597 inst.instruction |= 0xf;
6598}
6599
c19d1205
ZW
6600static void
6601do_bfc (void)
6602{
6603 unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
6604 constraint (msb > 32, _("bit-field extends past end of register"));
6605 /* The instruction encoding stores the LSB and MSB,
6606 not the LSB and width. */
6607 inst.instruction |= inst.operands[0].reg << 12;
6608 inst.instruction |= inst.operands[1].imm << 7;
6609 inst.instruction |= (msb - 1) << 16;
6610}
b99bd4ef 6611
c19d1205
ZW
6612static void
6613do_bfi (void)
6614{
6615 unsigned int msb;
b99bd4ef 6616
c19d1205
ZW
6617 /* #0 in second position is alternative syntax for bfc, which is
6618 the same instruction but with REG_PC in the Rm field. */
6619 if (!inst.operands[1].isreg)
6620 inst.operands[1].reg = REG_PC;
b99bd4ef 6621
c19d1205
ZW
6622 msb = inst.operands[2].imm + inst.operands[3].imm;
6623 constraint (msb > 32, _("bit-field extends past end of register"));
6624 /* The instruction encoding stores the LSB and MSB,
6625 not the LSB and width. */
6626 inst.instruction |= inst.operands[0].reg << 12;
6627 inst.instruction |= inst.operands[1].reg;
6628 inst.instruction |= inst.operands[2].imm << 7;
6629 inst.instruction |= (msb - 1) << 16;
b99bd4ef
NC
6630}
6631
b99bd4ef 6632static void
c19d1205 6633do_bfx (void)
b99bd4ef 6634{
c19d1205
ZW
6635 constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
6636 _("bit-field extends past end of register"));
6637 inst.instruction |= inst.operands[0].reg << 12;
6638 inst.instruction |= inst.operands[1].reg;
6639 inst.instruction |= inst.operands[2].imm << 7;
6640 inst.instruction |= (inst.operands[3].imm - 1) << 16;
6641}
09d92015 6642
c19d1205
ZW
6643/* ARM V5 breakpoint instruction (argument parse)
6644 BKPT <16 bit unsigned immediate>
6645 Instruction is not conditional.
6646 The bit pattern given in insns[] has the COND_ALWAYS condition,
6647 and it is an error if the caller tried to override that. */
b99bd4ef 6648
c19d1205
ZW
6649static void
6650do_bkpt (void)
6651{
6652 /* Top 12 of 16 bits to bits 19:8. */
6653 inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
09d92015 6654
c19d1205
ZW
6655 /* Bottom 4 of 16 bits to bits 3:0. */
6656 inst.instruction |= inst.operands[0].imm & 0xf;
6657}
09d92015 6658
c19d1205
ZW
6659static void
6660encode_branch (int default_reloc)
6661{
6662 if (inst.operands[0].hasreloc)
6663 {
6664 constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32,
6665 _("the only suffix valid here is '(plt)'"));
6666 inst.reloc.type = BFD_RELOC_ARM_PLT32;
c19d1205 6667 }
b99bd4ef 6668 else
c19d1205
ZW
6669 {
6670 inst.reloc.type = default_reloc;
c19d1205 6671 }
2fc8bdac 6672 inst.reloc.pc_rel = 1;
b99bd4ef
NC
6673}
6674
b99bd4ef 6675static void
c19d1205 6676do_branch (void)
b99bd4ef 6677{
39b41c9c
PB
6678#ifdef OBJ_ELF
6679 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
6680 encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
6681 else
6682#endif
6683 encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
6684}
6685
6686static void
6687do_bl (void)
6688{
6689#ifdef OBJ_ELF
6690 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
6691 {
6692 if (inst.cond == COND_ALWAYS)
6693 encode_branch (BFD_RELOC_ARM_PCREL_CALL);
6694 else
6695 encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
6696 }
6697 else
6698#endif
6699 encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
c19d1205 6700}
b99bd4ef 6701
c19d1205
ZW
6702/* ARM V5 branch-link-exchange instruction (argument parse)
6703 BLX <target_addr> ie BLX(1)
6704 BLX{<condition>} <Rm> ie BLX(2)
6705 Unfortunately, there are two different opcodes for this mnemonic.
6706 So, the insns[].value is not used, and the code here zaps values
6707 into inst.instruction.
6708 Also, the <target_addr> can be 25 bits, hence has its own reloc. */
b99bd4ef 6709
c19d1205
ZW
6710static void
6711do_blx (void)
6712{
6713 if (inst.operands[0].isreg)
b99bd4ef 6714 {
c19d1205
ZW
6715 /* Arg is a register; the opcode provided by insns[] is correct.
6716 It is not illegal to do "blx pc", just useless. */
6717 if (inst.operands[0].reg == REG_PC)
6718 as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
b99bd4ef 6719
c19d1205
ZW
6720 inst.instruction |= inst.operands[0].reg;
6721 }
6722 else
b99bd4ef 6723 {
c19d1205
ZW
6724 /* Arg is an address; this instruction cannot be executed
6725 conditionally, and the opcode must be adjusted. */
6726 constraint (inst.cond != COND_ALWAYS, BAD_COND);
2fc8bdac 6727 inst.instruction = 0xfa000000;
39b41c9c
PB
6728#ifdef OBJ_ELF
6729 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
6730 encode_branch (BFD_RELOC_ARM_PCREL_CALL);
6731 else
6732#endif
6733 encode_branch (BFD_RELOC_ARM_PCREL_BLX);
b99bd4ef 6734 }
c19d1205
ZW
6735}
6736
6737static void
6738do_bx (void)
6739{
6740 if (inst.operands[0].reg == REG_PC)
6741 as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
b99bd4ef 6742
c19d1205 6743 inst.instruction |= inst.operands[0].reg;
09d92015
MM
6744}
6745
c19d1205
ZW
6746
6747/* ARM v5TEJ. Jump to Jazelle code. */
a737bd4d
NC
6748
6749static void
c19d1205 6750do_bxj (void)
a737bd4d 6751{
c19d1205
ZW
6752 if (inst.operands[0].reg == REG_PC)
6753 as_tsktsk (_("use of r15 in bxj is not really useful"));
6754
6755 inst.instruction |= inst.operands[0].reg;
a737bd4d
NC
6756}
6757
c19d1205
ZW
6758/* Co-processor data operation:
6759 CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
6760 CDP2 <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>} */
6761static void
6762do_cdp (void)
6763{
6764 inst.instruction |= inst.operands[0].reg << 8;
6765 inst.instruction |= inst.operands[1].imm << 20;
6766 inst.instruction |= inst.operands[2].reg << 12;
6767 inst.instruction |= inst.operands[3].reg << 16;
6768 inst.instruction |= inst.operands[4].reg;
6769 inst.instruction |= inst.operands[5].imm << 5;
6770}
a737bd4d
NC
6771
6772static void
c19d1205 6773do_cmp (void)
a737bd4d 6774{
c19d1205
ZW
6775 inst.instruction |= inst.operands[0].reg << 16;
6776 encode_arm_shifter_operand (1);
a737bd4d
NC
6777}
6778
c19d1205
ZW
6779/* Transfer between coprocessor and ARM registers.
6780 MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
6781 MRC2
6782 MCR{cond}
6783 MCR2
6784
6785 No special properties. */
09d92015
MM
6786
6787static void
c19d1205 6788do_co_reg (void)
09d92015 6789{
c19d1205
ZW
6790 inst.instruction |= inst.operands[0].reg << 8;
6791 inst.instruction |= inst.operands[1].imm << 21;
6792 inst.instruction |= inst.operands[2].reg << 12;
6793 inst.instruction |= inst.operands[3].reg << 16;
6794 inst.instruction |= inst.operands[4].reg;
6795 inst.instruction |= inst.operands[5].imm << 5;
6796}
09d92015 6797
c19d1205
ZW
6798/* Transfer between coprocessor register and pair of ARM registers.
6799 MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
6800 MCRR2
6801 MRRC{cond}
6802 MRRC2
b99bd4ef 6803
c19d1205 6804 Two XScale instructions are special cases of these:
09d92015 6805
c19d1205
ZW
6806 MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
6807 MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
b99bd4ef 6808
c19d1205 6809 Result unpredicatable if Rd or Rn is R15. */
a737bd4d 6810
c19d1205
ZW
6811static void
6812do_co_reg2c (void)
6813{
6814 inst.instruction |= inst.operands[0].reg << 8;
6815 inst.instruction |= inst.operands[1].imm << 4;
6816 inst.instruction |= inst.operands[2].reg << 12;
6817 inst.instruction |= inst.operands[3].reg << 16;
6818 inst.instruction |= inst.operands[4].reg;
b99bd4ef
NC
6819}
6820
c19d1205
ZW
6821static void
6822do_cpsi (void)
6823{
6824 inst.instruction |= inst.operands[0].imm << 6;
6825 inst.instruction |= inst.operands[1].imm;
6826}
b99bd4ef 6827
62b3e311
PB
6828static void
6829do_dbg (void)
6830{
6831 inst.instruction |= inst.operands[0].imm;
6832}
6833
b99bd4ef 6834static void
c19d1205 6835do_it (void)
b99bd4ef 6836{
c19d1205
ZW
6837 /* There is no IT instruction in ARM mode. We
6838 process it but do not generate code for it. */
6839 inst.size = 0;
09d92015 6840}
b99bd4ef 6841
09d92015 6842static void
c19d1205 6843do_ldmstm (void)
ea6ef066 6844{
c19d1205
ZW
6845 int base_reg = inst.operands[0].reg;
6846 int range = inst.operands[1].imm;
ea6ef066 6847
c19d1205
ZW
6848 inst.instruction |= base_reg << 16;
6849 inst.instruction |= range;
ea6ef066 6850
c19d1205
ZW
6851 if (inst.operands[1].writeback)
6852 inst.instruction |= LDM_TYPE_2_OR_3;
09d92015 6853
c19d1205 6854 if (inst.operands[0].writeback)
ea6ef066 6855 {
c19d1205
ZW
6856 inst.instruction |= WRITE_BACK;
6857 /* Check for unpredictable uses of writeback. */
6858 if (inst.instruction & LOAD_BIT)
09d92015 6859 {
c19d1205
ZW
6860 /* Not allowed in LDM type 2. */
6861 if ((inst.instruction & LDM_TYPE_2_OR_3)
6862 && ((range & (1 << REG_PC)) == 0))
6863 as_warn (_("writeback of base register is UNPREDICTABLE"));
6864 /* Only allowed if base reg not in list for other types. */
6865 else if (range & (1 << base_reg))
6866 as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
6867 }
6868 else /* STM. */
6869 {
6870 /* Not allowed for type 2. */
6871 if (inst.instruction & LDM_TYPE_2_OR_3)
6872 as_warn (_("writeback of base register is UNPREDICTABLE"));
6873 /* Only allowed if base reg not in list, or first in list. */
6874 else if ((range & (1 << base_reg))
6875 && (range & ((1 << base_reg) - 1)))
6876 as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
09d92015 6877 }
ea6ef066 6878 }
a737bd4d
NC
6879}
6880
c19d1205
ZW
6881/* ARMv5TE load-consecutive (argument parse)
6882 Mode is like LDRH.
6883
6884 LDRccD R, mode
6885 STRccD R, mode. */
6886
a737bd4d 6887static void
c19d1205 6888do_ldrd (void)
a737bd4d 6889{
c19d1205
ZW
6890 constraint (inst.operands[0].reg % 2 != 0,
6891 _("first destination register must be even"));
6892 constraint (inst.operands[1].present
6893 && inst.operands[1].reg != inst.operands[0].reg + 1,
6894 _("can only load two consecutive registers"));
6895 constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
6896 constraint (!inst.operands[2].isreg, _("'[' expected"));
a737bd4d 6897
c19d1205
ZW
6898 if (!inst.operands[1].present)
6899 inst.operands[1].reg = inst.operands[0].reg + 1;
6900
6901 if (inst.instruction & LOAD_BIT)
a737bd4d 6902 {
c19d1205
ZW
6903 /* encode_arm_addr_mode_3 will diagnose overlap between the base
6904 register and the first register written; we have to diagnose
6905 overlap between the base and the second register written here. */
ea6ef066 6906
c19d1205
ZW
6907 if (inst.operands[2].reg == inst.operands[1].reg
6908 && (inst.operands[2].writeback || inst.operands[2].postind))
6909 as_warn (_("base register written back, and overlaps "
6910 "second destination register"));
b05fe5cf 6911
c19d1205
ZW
6912 /* For an index-register load, the index register must not overlap the
6913 destination (even if not write-back). */
6914 else if (inst.operands[2].immisreg
ca3f61f7
NC
6915 && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
6916 || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
c19d1205 6917 as_warn (_("index register overlaps destination register"));
b05fe5cf 6918 }
c19d1205
ZW
6919
6920 inst.instruction |= inst.operands[0].reg << 12;
6921 encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
b05fe5cf
ZW
6922}
6923
6924static void
c19d1205 6925do_ldrex (void)
b05fe5cf 6926{
c19d1205
ZW
6927 constraint (!inst.operands[1].isreg || !inst.operands[1].preind
6928 || inst.operands[1].postind || inst.operands[1].writeback
6929 || inst.operands[1].immisreg || inst.operands[1].shifted
01cfc07f
NC
6930 || inst.operands[1].negative
6931 /* This can arise if the programmer has written
6932 strex rN, rM, foo
6933 or if they have mistakenly used a register name as the last
6934 operand, eg:
6935 strex rN, rM, rX
6936 It is very difficult to distinguish between these two cases
6937 because "rX" might actually be a label. ie the register
6938 name has been occluded by a symbol of the same name. So we
6939 just generate a general 'bad addressing mode' type error
6940 message and leave it up to the programmer to discover the
6941 true cause and fix their mistake. */
6942 || (inst.operands[1].reg == REG_PC),
6943 BAD_ADDR_MODE);
b05fe5cf 6944
c19d1205
ZW
6945 constraint (inst.reloc.exp.X_op != O_constant
6946 || inst.reloc.exp.X_add_number != 0,
6947 _("offset must be zero in ARM encoding"));
b05fe5cf 6948
c19d1205
ZW
6949 inst.instruction |= inst.operands[0].reg << 12;
6950 inst.instruction |= inst.operands[1].reg << 16;
6951 inst.reloc.type = BFD_RELOC_UNUSED;
b05fe5cf
ZW
6952}
6953
6954static void
c19d1205 6955do_ldrexd (void)
b05fe5cf 6956{
c19d1205
ZW
6957 constraint (inst.operands[0].reg % 2 != 0,
6958 _("even register required"));
6959 constraint (inst.operands[1].present
6960 && inst.operands[1].reg != inst.operands[0].reg + 1,
6961 _("can only load two consecutive registers"));
6962 /* If op 1 were present and equal to PC, this function wouldn't
6963 have been called in the first place. */
6964 constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
b05fe5cf 6965
c19d1205
ZW
6966 inst.instruction |= inst.operands[0].reg << 12;
6967 inst.instruction |= inst.operands[2].reg << 16;
b05fe5cf
ZW
6968}
6969
6970static void
c19d1205 6971do_ldst (void)
b05fe5cf 6972{
c19d1205
ZW
6973 inst.instruction |= inst.operands[0].reg << 12;
6974 if (!inst.operands[1].isreg)
6975 if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
b05fe5cf 6976 return;
c19d1205 6977 encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
b05fe5cf
ZW
6978}
6979
6980static void
c19d1205 6981do_ldstt (void)
b05fe5cf 6982{
c19d1205
ZW
6983 /* ldrt/strt always use post-indexed addressing. Turn [Rn] into [Rn]! and
6984 reject [Rn,...]. */
6985 if (inst.operands[1].preind)
b05fe5cf 6986 {
c19d1205
ZW
6987 constraint (inst.reloc.exp.X_op != O_constant ||
6988 inst.reloc.exp.X_add_number != 0,
6989 _("this instruction requires a post-indexed address"));
b05fe5cf 6990
c19d1205
ZW
6991 inst.operands[1].preind = 0;
6992 inst.operands[1].postind = 1;
6993 inst.operands[1].writeback = 1;
b05fe5cf 6994 }
c19d1205
ZW
6995 inst.instruction |= inst.operands[0].reg << 12;
6996 encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
6997}
b05fe5cf 6998
c19d1205 6999/* Halfword and signed-byte load/store operations. */
b05fe5cf 7000
c19d1205
ZW
7001static void
7002do_ldstv4 (void)
7003{
7004 inst.instruction |= inst.operands[0].reg << 12;
7005 if (!inst.operands[1].isreg)
7006 if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
b05fe5cf 7007 return;
c19d1205 7008 encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
b05fe5cf
ZW
7009}
7010
7011static void
c19d1205 7012do_ldsttv4 (void)
b05fe5cf 7013{
c19d1205
ZW
7014 /* ldrt/strt always use post-indexed addressing. Turn [Rn] into [Rn]! and
7015 reject [Rn,...]. */
7016 if (inst.operands[1].preind)
b05fe5cf 7017 {
c19d1205
ZW
7018 constraint (inst.reloc.exp.X_op != O_constant ||
7019 inst.reloc.exp.X_add_number != 0,
7020 _("this instruction requires a post-indexed address"));
b05fe5cf 7021
c19d1205
ZW
7022 inst.operands[1].preind = 0;
7023 inst.operands[1].postind = 1;
7024 inst.operands[1].writeback = 1;
b05fe5cf 7025 }
c19d1205
ZW
7026 inst.instruction |= inst.operands[0].reg << 12;
7027 encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
7028}
b05fe5cf 7029
c19d1205
ZW
7030/* Co-processor register load/store.
7031 Format: <LDC|STC>{cond}[L] CP#,CRd,<address> */
7032static void
7033do_lstc (void)
7034{
7035 inst.instruction |= inst.operands[0].reg << 8;
7036 inst.instruction |= inst.operands[1].reg << 12;
7037 encode_arm_cp_address (2, TRUE, TRUE, 0);
b05fe5cf
ZW
7038}
7039
b05fe5cf 7040static void
c19d1205 7041do_mlas (void)
b05fe5cf 7042{
c19d1205
ZW
7043 /* This restriction does not apply to mls (nor to mla in v6, but
7044 that's hard to detect at present). */
7045 if (inst.operands[0].reg == inst.operands[1].reg
7046 && !(inst.instruction & 0x00400000))
7047 as_tsktsk (_("rd and rm should be different in mla"));
b05fe5cf 7048
c19d1205
ZW
7049 inst.instruction |= inst.operands[0].reg << 16;
7050 inst.instruction |= inst.operands[1].reg;
7051 inst.instruction |= inst.operands[2].reg << 8;
7052 inst.instruction |= inst.operands[3].reg << 12;
b05fe5cf 7053
c19d1205 7054}
b05fe5cf 7055
c19d1205
ZW
7056static void
7057do_mov (void)
7058{
7059 inst.instruction |= inst.operands[0].reg << 12;
7060 encode_arm_shifter_operand (1);
7061}
b05fe5cf 7062
c19d1205
ZW
7063/* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>. */
7064static void
7065do_mov16 (void)
7066{
b6895b4f
PB
7067 bfd_vma imm;
7068 bfd_boolean top;
7069
7070 top = (inst.instruction & 0x00400000) != 0;
7071 constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
7072 _(":lower16: not allowed this instruction"));
7073 constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
7074 _(":upper16: not allowed instruction"));
c19d1205 7075 inst.instruction |= inst.operands[0].reg << 12;
b6895b4f
PB
7076 if (inst.reloc.type == BFD_RELOC_UNUSED)
7077 {
7078 imm = inst.reloc.exp.X_add_number;
7079 /* The value is in two pieces: 0:11, 16:19. */
7080 inst.instruction |= (imm & 0x00000fff);
7081 inst.instruction |= (imm & 0x0000f000) << 4;
7082 }
b05fe5cf 7083}
b99bd4ef 7084
037e8744
JB
7085static void do_vfp_nsyn_opcode (const char *);
7086
7087static int
7088do_vfp_nsyn_mrs (void)
7089{
7090 if (inst.operands[0].isvec)
7091 {
7092 if (inst.operands[1].reg != 1)
7093 first_error (_("operand 1 must be FPSCR"));
7094 memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
7095 memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
7096 do_vfp_nsyn_opcode ("fmstat");
7097 }
7098 else if (inst.operands[1].isvec)
7099 do_vfp_nsyn_opcode ("fmrx");
7100 else
7101 return FAIL;
7102
7103 return SUCCESS;
7104}
7105
7106static int
7107do_vfp_nsyn_msr (void)
7108{
7109 if (inst.operands[0].isvec)
7110 do_vfp_nsyn_opcode ("fmxr");
7111 else
7112 return FAIL;
7113
7114 return SUCCESS;
7115}
7116
b99bd4ef 7117static void
c19d1205 7118do_mrs (void)
b99bd4ef 7119{
037e8744
JB
7120 if (do_vfp_nsyn_mrs () == SUCCESS)
7121 return;
7122
c19d1205
ZW
7123 /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all. */
7124 constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
7125 != (PSR_c|PSR_f),
7126 _("'CPSR' or 'SPSR' expected"));
7127 inst.instruction |= inst.operands[0].reg << 12;
7128 inst.instruction |= (inst.operands[1].imm & SPSR_BIT);
7129}
b99bd4ef 7130
c19d1205
ZW
7131/* Two possible forms:
7132 "{C|S}PSR_<field>, Rm",
7133 "{C|S}PSR_f, #expression". */
b99bd4ef 7134
c19d1205
ZW
7135static void
7136do_msr (void)
7137{
037e8744
JB
7138 if (do_vfp_nsyn_msr () == SUCCESS)
7139 return;
7140
c19d1205
ZW
7141 inst.instruction |= inst.operands[0].imm;
7142 if (inst.operands[1].isreg)
7143 inst.instruction |= inst.operands[1].reg;
7144 else
b99bd4ef 7145 {
c19d1205
ZW
7146 inst.instruction |= INST_IMMEDIATE;
7147 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
7148 inst.reloc.pc_rel = 0;
b99bd4ef 7149 }
b99bd4ef
NC
7150}
7151
c19d1205
ZW
7152static void
7153do_mul (void)
a737bd4d 7154{
c19d1205
ZW
7155 if (!inst.operands[2].present)
7156 inst.operands[2].reg = inst.operands[0].reg;
7157 inst.instruction |= inst.operands[0].reg << 16;
7158 inst.instruction |= inst.operands[1].reg;
7159 inst.instruction |= inst.operands[2].reg << 8;
a737bd4d 7160
c19d1205
ZW
7161 if (inst.operands[0].reg == inst.operands[1].reg)
7162 as_tsktsk (_("rd and rm should be different in mul"));
a737bd4d
NC
7163}
7164
c19d1205
ZW
7165/* Long Multiply Parser
7166 UMULL RdLo, RdHi, Rm, Rs
7167 SMULL RdLo, RdHi, Rm, Rs
7168 UMLAL RdLo, RdHi, Rm, Rs
7169 SMLAL RdLo, RdHi, Rm, Rs. */
b99bd4ef
NC
7170
7171static void
c19d1205 7172do_mull (void)
b99bd4ef 7173{
c19d1205
ZW
7174 inst.instruction |= inst.operands[0].reg << 12;
7175 inst.instruction |= inst.operands[1].reg << 16;
7176 inst.instruction |= inst.operands[2].reg;
7177 inst.instruction |= inst.operands[3].reg << 8;
b99bd4ef 7178
c19d1205
ZW
7179 /* rdhi, rdlo and rm must all be different. */
7180 if (inst.operands[0].reg == inst.operands[1].reg
7181 || inst.operands[0].reg == inst.operands[2].reg
7182 || inst.operands[1].reg == inst.operands[2].reg)
7183 as_tsktsk (_("rdhi, rdlo and rm must all be different"));
7184}
b99bd4ef 7185
c19d1205
ZW
7186static void
7187do_nop (void)
7188{
7189 if (inst.operands[0].present)
7190 {
7191 /* Architectural NOP hints are CPSR sets with no bits selected. */
7192 inst.instruction &= 0xf0000000;
7193 inst.instruction |= 0x0320f000 + inst.operands[0].imm;
7194 }
b99bd4ef
NC
7195}
7196
c19d1205
ZW
7197/* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
7198 PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
7199 Condition defaults to COND_ALWAYS.
7200 Error if Rd, Rn or Rm are R15. */
b99bd4ef
NC
7201
7202static void
c19d1205 7203do_pkhbt (void)
b99bd4ef 7204{
c19d1205
ZW
7205 inst.instruction |= inst.operands[0].reg << 12;
7206 inst.instruction |= inst.operands[1].reg << 16;
7207 inst.instruction |= inst.operands[2].reg;
7208 if (inst.operands[3].present)
7209 encode_arm_shift (3);
7210}
b99bd4ef 7211
c19d1205 7212/* ARM V6 PKHTB (Argument Parse). */
b99bd4ef 7213
c19d1205
ZW
7214static void
7215do_pkhtb (void)
7216{
7217 if (!inst.operands[3].present)
b99bd4ef 7218 {
c19d1205
ZW
7219 /* If the shift specifier is omitted, turn the instruction
7220 into pkhbt rd, rm, rn. */
7221 inst.instruction &= 0xfff00010;
7222 inst.instruction |= inst.operands[0].reg << 12;
7223 inst.instruction |= inst.operands[1].reg;
7224 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef
NC
7225 }
7226 else
7227 {
c19d1205
ZW
7228 inst.instruction |= inst.operands[0].reg << 12;
7229 inst.instruction |= inst.operands[1].reg << 16;
7230 inst.instruction |= inst.operands[2].reg;
7231 encode_arm_shift (3);
b99bd4ef
NC
7232 }
7233}
7234
c19d1205
ZW
7235/* ARMv5TE: Preload-Cache
7236
7237 PLD <addr_mode>
7238
7239 Syntactically, like LDR with B=1, W=0, L=1. */
b99bd4ef
NC
7240
7241static void
c19d1205 7242do_pld (void)
b99bd4ef 7243{
c19d1205
ZW
7244 constraint (!inst.operands[0].isreg,
7245 _("'[' expected after PLD mnemonic"));
7246 constraint (inst.operands[0].postind,
7247 _("post-indexed expression used in preload instruction"));
7248 constraint (inst.operands[0].writeback,
7249 _("writeback used in preload instruction"));
7250 constraint (!inst.operands[0].preind,
7251 _("unindexed addressing used in preload instruction"));
c19d1205
ZW
7252 encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
7253}
b99bd4ef 7254
62b3e311
PB
7255/* ARMv7: PLI <addr_mode> */
7256static void
7257do_pli (void)
7258{
7259 constraint (!inst.operands[0].isreg,
7260 _("'[' expected after PLI mnemonic"));
7261 constraint (inst.operands[0].postind,
7262 _("post-indexed expression used in preload instruction"));
7263 constraint (inst.operands[0].writeback,
7264 _("writeback used in preload instruction"));
7265 constraint (!inst.operands[0].preind,
7266 _("unindexed addressing used in preload instruction"));
7267 encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
7268 inst.instruction &= ~PRE_INDEX;
7269}
7270
c19d1205
ZW
7271static void
7272do_push_pop (void)
7273{
7274 inst.operands[1] = inst.operands[0];
7275 memset (&inst.operands[0], 0, sizeof inst.operands[0]);
7276 inst.operands[0].isreg = 1;
7277 inst.operands[0].writeback = 1;
7278 inst.operands[0].reg = REG_SP;
7279 do_ldmstm ();
7280}
b99bd4ef 7281
c19d1205
ZW
7282/* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
7283 word at the specified address and the following word
7284 respectively.
7285 Unconditionally executed.
7286 Error if Rn is R15. */
b99bd4ef 7287
c19d1205
ZW
7288static void
7289do_rfe (void)
7290{
7291 inst.instruction |= inst.operands[0].reg << 16;
7292 if (inst.operands[0].writeback)
7293 inst.instruction |= WRITE_BACK;
7294}
b99bd4ef 7295
c19d1205 7296/* ARM V6 ssat (argument parse). */
b99bd4ef 7297
c19d1205
ZW
7298static void
7299do_ssat (void)
7300{
7301 inst.instruction |= inst.operands[0].reg << 12;
7302 inst.instruction |= (inst.operands[1].imm - 1) << 16;
7303 inst.instruction |= inst.operands[2].reg;
b99bd4ef 7304
c19d1205
ZW
7305 if (inst.operands[3].present)
7306 encode_arm_shift (3);
b99bd4ef
NC
7307}
7308
c19d1205 7309/* ARM V6 usat (argument parse). */
b99bd4ef
NC
7310
7311static void
c19d1205 7312do_usat (void)
b99bd4ef 7313{
c19d1205
ZW
7314 inst.instruction |= inst.operands[0].reg << 12;
7315 inst.instruction |= inst.operands[1].imm << 16;
7316 inst.instruction |= inst.operands[2].reg;
b99bd4ef 7317
c19d1205
ZW
7318 if (inst.operands[3].present)
7319 encode_arm_shift (3);
b99bd4ef
NC
7320}
7321
c19d1205 7322/* ARM V6 ssat16 (argument parse). */
09d92015
MM
7323
7324static void
c19d1205 7325do_ssat16 (void)
09d92015 7326{
c19d1205
ZW
7327 inst.instruction |= inst.operands[0].reg << 12;
7328 inst.instruction |= ((inst.operands[1].imm - 1) << 16);
7329 inst.instruction |= inst.operands[2].reg;
09d92015
MM
7330}
7331
c19d1205
ZW
7332static void
7333do_usat16 (void)
a737bd4d 7334{
c19d1205
ZW
7335 inst.instruction |= inst.operands[0].reg << 12;
7336 inst.instruction |= inst.operands[1].imm << 16;
7337 inst.instruction |= inst.operands[2].reg;
7338}
a737bd4d 7339
c19d1205
ZW
7340/* ARM V6 SETEND (argument parse). Sets the E bit in the CPSR while
7341 preserving the other bits.
a737bd4d 7342
c19d1205
ZW
7343 setend <endian_specifier>, where <endian_specifier> is either
7344 BE or LE. */
a737bd4d 7345
c19d1205
ZW
7346static void
7347do_setend (void)
7348{
7349 if (inst.operands[0].imm)
7350 inst.instruction |= 0x200;
a737bd4d
NC
7351}
7352
7353static void
c19d1205 7354do_shift (void)
a737bd4d 7355{
c19d1205
ZW
7356 unsigned int Rm = (inst.operands[1].present
7357 ? inst.operands[1].reg
7358 : inst.operands[0].reg);
a737bd4d 7359
c19d1205
ZW
7360 inst.instruction |= inst.operands[0].reg << 12;
7361 inst.instruction |= Rm;
7362 if (inst.operands[2].isreg) /* Rd, {Rm,} Rs */
a737bd4d 7363 {
c19d1205
ZW
7364 inst.instruction |= inst.operands[2].reg << 8;
7365 inst.instruction |= SHIFT_BY_REG;
a737bd4d
NC
7366 }
7367 else
c19d1205 7368 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
a737bd4d
NC
7369}
7370
09d92015 7371static void
3eb17e6b 7372do_smc (void)
09d92015 7373{
3eb17e6b 7374 inst.reloc.type = BFD_RELOC_ARM_SMC;
c19d1205 7375 inst.reloc.pc_rel = 0;
09d92015
MM
7376}
7377
09d92015 7378static void
c19d1205 7379do_swi (void)
09d92015 7380{
c19d1205
ZW
7381 inst.reloc.type = BFD_RELOC_ARM_SWI;
7382 inst.reloc.pc_rel = 0;
09d92015
MM
7383}
7384
c19d1205
ZW
7385/* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
7386 SMLAxy{cond} Rd,Rm,Rs,Rn
7387 SMLAWy{cond} Rd,Rm,Rs,Rn
7388 Error if any register is R15. */
e16bb312 7389
c19d1205
ZW
7390static void
7391do_smla (void)
e16bb312 7392{
c19d1205
ZW
7393 inst.instruction |= inst.operands[0].reg << 16;
7394 inst.instruction |= inst.operands[1].reg;
7395 inst.instruction |= inst.operands[2].reg << 8;
7396 inst.instruction |= inst.operands[3].reg << 12;
7397}
a737bd4d 7398
c19d1205
ZW
7399/* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
7400 SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
7401 Error if any register is R15.
7402 Warning if Rdlo == Rdhi. */
a737bd4d 7403
c19d1205
ZW
7404static void
7405do_smlal (void)
7406{
7407 inst.instruction |= inst.operands[0].reg << 12;
7408 inst.instruction |= inst.operands[1].reg << 16;
7409 inst.instruction |= inst.operands[2].reg;
7410 inst.instruction |= inst.operands[3].reg << 8;
a737bd4d 7411
c19d1205
ZW
7412 if (inst.operands[0].reg == inst.operands[1].reg)
7413 as_tsktsk (_("rdhi and rdlo must be different"));
7414}
a737bd4d 7415
c19d1205
ZW
7416/* ARM V5E (El Segundo) signed-multiply (argument parse)
7417 SMULxy{cond} Rd,Rm,Rs
7418 Error if any register is R15. */
a737bd4d 7419
c19d1205
ZW
7420static void
7421do_smul (void)
7422{
7423 inst.instruction |= inst.operands[0].reg << 16;
7424 inst.instruction |= inst.operands[1].reg;
7425 inst.instruction |= inst.operands[2].reg << 8;
7426}
a737bd4d 7427
c19d1205 7428/* ARM V6 srs (argument parse). */
a737bd4d 7429
c19d1205
ZW
7430static void
7431do_srs (void)
7432{
7433 inst.instruction |= inst.operands[0].imm;
7434 if (inst.operands[0].writeback)
7435 inst.instruction |= WRITE_BACK;
7436}
a737bd4d 7437
c19d1205 7438/* ARM V6 strex (argument parse). */
a737bd4d 7439
c19d1205
ZW
7440static void
7441do_strex (void)
7442{
7443 constraint (!inst.operands[2].isreg || !inst.operands[2].preind
7444 || inst.operands[2].postind || inst.operands[2].writeback
7445 || inst.operands[2].immisreg || inst.operands[2].shifted
01cfc07f
NC
7446 || inst.operands[2].negative
7447 /* See comment in do_ldrex(). */
7448 || (inst.operands[2].reg == REG_PC),
7449 BAD_ADDR_MODE);
a737bd4d 7450
c19d1205
ZW
7451 constraint (inst.operands[0].reg == inst.operands[1].reg
7452 || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
a737bd4d 7453
c19d1205
ZW
7454 constraint (inst.reloc.exp.X_op != O_constant
7455 || inst.reloc.exp.X_add_number != 0,
7456 _("offset must be zero in ARM encoding"));
a737bd4d 7457
c19d1205
ZW
7458 inst.instruction |= inst.operands[0].reg << 12;
7459 inst.instruction |= inst.operands[1].reg;
7460 inst.instruction |= inst.operands[2].reg << 16;
7461 inst.reloc.type = BFD_RELOC_UNUSED;
e16bb312
NC
7462}
7463
7464static void
c19d1205 7465do_strexd (void)
e16bb312 7466{
c19d1205
ZW
7467 constraint (inst.operands[1].reg % 2 != 0,
7468 _("even register required"));
7469 constraint (inst.operands[2].present
7470 && inst.operands[2].reg != inst.operands[1].reg + 1,
7471 _("can only store two consecutive registers"));
7472 /* If op 2 were present and equal to PC, this function wouldn't
7473 have been called in the first place. */
7474 constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
e16bb312 7475
c19d1205
ZW
7476 constraint (inst.operands[0].reg == inst.operands[1].reg
7477 || inst.operands[0].reg == inst.operands[1].reg + 1
7478 || inst.operands[0].reg == inst.operands[3].reg,
7479 BAD_OVERLAP);
e16bb312 7480
c19d1205
ZW
7481 inst.instruction |= inst.operands[0].reg << 12;
7482 inst.instruction |= inst.operands[1].reg;
7483 inst.instruction |= inst.operands[3].reg << 16;
e16bb312
NC
7484}
7485
c19d1205
ZW
7486/* ARM V6 SXTAH extracts a 16-bit value from a register, sign
7487 extends it to 32-bits, and adds the result to a value in another
7488 register. You can specify a rotation by 0, 8, 16, or 24 bits
7489 before extracting the 16-bit value.
7490 SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
7491 Condition defaults to COND_ALWAYS.
7492 Error if any register uses R15. */
7493
e16bb312 7494static void
c19d1205 7495do_sxtah (void)
e16bb312 7496{
c19d1205
ZW
7497 inst.instruction |= inst.operands[0].reg << 12;
7498 inst.instruction |= inst.operands[1].reg << 16;
7499 inst.instruction |= inst.operands[2].reg;
7500 inst.instruction |= inst.operands[3].imm << 10;
7501}
e16bb312 7502
c19d1205 7503/* ARM V6 SXTH.
e16bb312 7504
c19d1205
ZW
7505 SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
7506 Condition defaults to COND_ALWAYS.
7507 Error if any register uses R15. */
e16bb312
NC
7508
7509static void
c19d1205 7510do_sxth (void)
e16bb312 7511{
c19d1205
ZW
7512 inst.instruction |= inst.operands[0].reg << 12;
7513 inst.instruction |= inst.operands[1].reg;
7514 inst.instruction |= inst.operands[2].imm << 10;
e16bb312 7515}
c19d1205
ZW
7516\f
7517/* VFP instructions. In a logical order: SP variant first, monad
7518 before dyad, arithmetic then move then load/store. */
e16bb312
NC
7519
7520static void
c19d1205 7521do_vfp_sp_monadic (void)
e16bb312 7522{
5287ad62
JB
7523 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7524 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
e16bb312
NC
7525}
7526
7527static void
c19d1205 7528do_vfp_sp_dyadic (void)
e16bb312 7529{
5287ad62
JB
7530 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7531 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
7532 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
e16bb312
NC
7533}
7534
7535static void
c19d1205 7536do_vfp_sp_compare_z (void)
e16bb312 7537{
5287ad62 7538 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
e16bb312
NC
7539}
7540
7541static void
c19d1205 7542do_vfp_dp_sp_cvt (void)
e16bb312 7543{
5287ad62
JB
7544 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7545 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
e16bb312
NC
7546}
7547
7548static void
c19d1205 7549do_vfp_sp_dp_cvt (void)
e16bb312 7550{
5287ad62
JB
7551 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7552 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
e16bb312
NC
7553}
7554
7555static void
c19d1205 7556do_vfp_reg_from_sp (void)
e16bb312 7557{
c19d1205 7558 inst.instruction |= inst.operands[0].reg << 12;
5287ad62 7559 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
e16bb312
NC
7560}
7561
7562static void
c19d1205 7563do_vfp_reg2_from_sp2 (void)
e16bb312 7564{
c19d1205
ZW
7565 constraint (inst.operands[2].imm != 2,
7566 _("only two consecutive VFP SP registers allowed here"));
7567 inst.instruction |= inst.operands[0].reg << 12;
7568 inst.instruction |= inst.operands[1].reg << 16;
5287ad62 7569 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
e16bb312
NC
7570}
7571
7572static void
c19d1205 7573do_vfp_sp_from_reg (void)
e16bb312 7574{
5287ad62 7575 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
c19d1205 7576 inst.instruction |= inst.operands[1].reg << 12;
e16bb312
NC
7577}
7578
7579static void
c19d1205 7580do_vfp_sp2_from_reg2 (void)
e16bb312 7581{
c19d1205
ZW
7582 constraint (inst.operands[0].imm != 2,
7583 _("only two consecutive VFP SP registers allowed here"));
5287ad62 7584 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
c19d1205
ZW
7585 inst.instruction |= inst.operands[1].reg << 12;
7586 inst.instruction |= inst.operands[2].reg << 16;
e16bb312
NC
7587}
7588
7589static void
c19d1205 7590do_vfp_sp_ldst (void)
e16bb312 7591{
5287ad62 7592 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
c19d1205 7593 encode_arm_cp_address (1, FALSE, TRUE, 0);
e16bb312
NC
7594}
7595
7596static void
c19d1205 7597do_vfp_dp_ldst (void)
e16bb312 7598{
5287ad62 7599 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
c19d1205 7600 encode_arm_cp_address (1, FALSE, TRUE, 0);
e16bb312
NC
7601}
7602
c19d1205 7603
e16bb312 7604static void
c19d1205 7605vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
e16bb312 7606{
c19d1205
ZW
7607 if (inst.operands[0].writeback)
7608 inst.instruction |= WRITE_BACK;
7609 else
7610 constraint (ldstm_type != VFP_LDSTMIA,
7611 _("this addressing mode requires base-register writeback"));
7612 inst.instruction |= inst.operands[0].reg << 16;
5287ad62 7613 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
c19d1205 7614 inst.instruction |= inst.operands[1].imm;
e16bb312
NC
7615}
7616
7617static void
c19d1205 7618vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
e16bb312 7619{
c19d1205 7620 int count;
e16bb312 7621
c19d1205
ZW
7622 if (inst.operands[0].writeback)
7623 inst.instruction |= WRITE_BACK;
7624 else
7625 constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
7626 _("this addressing mode requires base-register writeback"));
e16bb312 7627
c19d1205 7628 inst.instruction |= inst.operands[0].reg << 16;
5287ad62 7629 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
e16bb312 7630
c19d1205
ZW
7631 count = inst.operands[1].imm << 1;
7632 if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
7633 count += 1;
e16bb312 7634
c19d1205 7635 inst.instruction |= count;
e16bb312
NC
7636}
7637
7638static void
c19d1205 7639do_vfp_sp_ldstmia (void)
e16bb312 7640{
c19d1205 7641 vfp_sp_ldstm (VFP_LDSTMIA);
e16bb312
NC
7642}
7643
7644static void
c19d1205 7645do_vfp_sp_ldstmdb (void)
e16bb312 7646{
c19d1205 7647 vfp_sp_ldstm (VFP_LDSTMDB);
e16bb312
NC
7648}
7649
7650static void
c19d1205 7651do_vfp_dp_ldstmia (void)
e16bb312 7652{
c19d1205 7653 vfp_dp_ldstm (VFP_LDSTMIA);
e16bb312
NC
7654}
7655
7656static void
c19d1205 7657do_vfp_dp_ldstmdb (void)
e16bb312 7658{
c19d1205 7659 vfp_dp_ldstm (VFP_LDSTMDB);
e16bb312
NC
7660}
7661
7662static void
c19d1205 7663do_vfp_xp_ldstmia (void)
e16bb312 7664{
c19d1205
ZW
7665 vfp_dp_ldstm (VFP_LDSTMIAX);
7666}
e16bb312 7667
c19d1205
ZW
7668static void
7669do_vfp_xp_ldstmdb (void)
7670{
7671 vfp_dp_ldstm (VFP_LDSTMDBX);
e16bb312 7672}
5287ad62
JB
7673
7674static void
7675do_vfp_dp_rd_rm (void)
7676{
7677 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7678 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
7679}
7680
7681static void
7682do_vfp_dp_rn_rd (void)
7683{
7684 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
7685 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
7686}
7687
7688static void
7689do_vfp_dp_rd_rn (void)
7690{
7691 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7692 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
7693}
7694
7695static void
7696do_vfp_dp_rd_rn_rm (void)
7697{
7698 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7699 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
7700 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
7701}
7702
7703static void
7704do_vfp_dp_rd (void)
7705{
7706 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7707}
7708
7709static void
7710do_vfp_dp_rm_rd_rn (void)
7711{
7712 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
7713 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
7714 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
7715}
7716
7717/* VFPv3 instructions. */
7718static void
7719do_vfp_sp_const (void)
7720{
7721 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7722 inst.instruction |= (inst.operands[1].imm & 15) << 16;
7723 inst.instruction |= (inst.operands[1].imm >> 4);
7724}
7725
7726static void
7727do_vfp_dp_const (void)
7728{
7729 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7730 inst.instruction |= (inst.operands[1].imm & 15) << 16;
7731 inst.instruction |= (inst.operands[1].imm >> 4);
7732}
7733
7734static void
7735vfp_conv (int srcsize)
7736{
7737 unsigned immbits = srcsize - inst.operands[1].imm;
7738 inst.instruction |= (immbits & 1) << 5;
7739 inst.instruction |= (immbits >> 1);
7740}
7741
7742static void
7743do_vfp_sp_conv_16 (void)
7744{
7745 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7746 vfp_conv (16);
7747}
7748
7749static void
7750do_vfp_dp_conv_16 (void)
7751{
7752 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7753 vfp_conv (16);
7754}
7755
7756static void
7757do_vfp_sp_conv_32 (void)
7758{
7759 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
7760 vfp_conv (32);
7761}
7762
7763static void
7764do_vfp_dp_conv_32 (void)
7765{
7766 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
7767 vfp_conv (32);
7768}
7769
c19d1205
ZW
7770\f
7771/* FPA instructions. Also in a logical order. */
e16bb312 7772
c19d1205
ZW
7773static void
7774do_fpa_cmp (void)
7775{
7776 inst.instruction |= inst.operands[0].reg << 16;
7777 inst.instruction |= inst.operands[1].reg;
7778}
b99bd4ef
NC
7779
7780static void
c19d1205 7781do_fpa_ldmstm (void)
b99bd4ef 7782{
c19d1205
ZW
7783 inst.instruction |= inst.operands[0].reg << 12;
7784 switch (inst.operands[1].imm)
7785 {
7786 case 1: inst.instruction |= CP_T_X; break;
7787 case 2: inst.instruction |= CP_T_Y; break;
7788 case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
7789 case 4: break;
7790 default: abort ();
7791 }
b99bd4ef 7792
c19d1205
ZW
7793 if (inst.instruction & (PRE_INDEX | INDEX_UP))
7794 {
7795 /* The instruction specified "ea" or "fd", so we can only accept
7796 [Rn]{!}. The instruction does not really support stacking or
7797 unstacking, so we have to emulate these by setting appropriate
7798 bits and offsets. */
7799 constraint (inst.reloc.exp.X_op != O_constant
7800 || inst.reloc.exp.X_add_number != 0,
7801 _("this instruction does not support indexing"));
b99bd4ef 7802
c19d1205
ZW
7803 if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
7804 inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
b99bd4ef 7805
c19d1205
ZW
7806 if (!(inst.instruction & INDEX_UP))
7807 inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
b99bd4ef 7808
c19d1205
ZW
7809 if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
7810 {
7811 inst.operands[2].preind = 0;
7812 inst.operands[2].postind = 1;
7813 }
7814 }
b99bd4ef 7815
c19d1205 7816 encode_arm_cp_address (2, TRUE, TRUE, 0);
b99bd4ef 7817}
037e8744 7818
c19d1205
ZW
7819\f
7820/* iWMMXt instructions: strictly in alphabetical order. */
b99bd4ef 7821
c19d1205
ZW
7822static void
7823do_iwmmxt_tandorc (void)
7824{
7825 constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
7826}
b99bd4ef 7827
c19d1205
ZW
7828static void
7829do_iwmmxt_textrc (void)
7830{
7831 inst.instruction |= inst.operands[0].reg << 12;
7832 inst.instruction |= inst.operands[1].imm;
7833}
b99bd4ef
NC
7834
7835static void
c19d1205 7836do_iwmmxt_textrm (void)
b99bd4ef 7837{
c19d1205
ZW
7838 inst.instruction |= inst.operands[0].reg << 12;
7839 inst.instruction |= inst.operands[1].reg << 16;
7840 inst.instruction |= inst.operands[2].imm;
7841}
b99bd4ef 7842
c19d1205
ZW
7843static void
7844do_iwmmxt_tinsr (void)
7845{
7846 inst.instruction |= inst.operands[0].reg << 16;
7847 inst.instruction |= inst.operands[1].reg << 12;
7848 inst.instruction |= inst.operands[2].imm;
7849}
b99bd4ef 7850
c19d1205
ZW
7851static void
7852do_iwmmxt_tmia (void)
7853{
7854 inst.instruction |= inst.operands[0].reg << 5;
7855 inst.instruction |= inst.operands[1].reg;
7856 inst.instruction |= inst.operands[2].reg << 12;
7857}
b99bd4ef 7858
c19d1205
ZW
7859static void
7860do_iwmmxt_waligni (void)
7861{
7862 inst.instruction |= inst.operands[0].reg << 12;
7863 inst.instruction |= inst.operands[1].reg << 16;
7864 inst.instruction |= inst.operands[2].reg;
7865 inst.instruction |= inst.operands[3].imm << 20;
7866}
b99bd4ef 7867
2d447fca
JM
7868static void
7869do_iwmmxt_wmerge (void)
7870{
7871 inst.instruction |= inst.operands[0].reg << 12;
7872 inst.instruction |= inst.operands[1].reg << 16;
7873 inst.instruction |= inst.operands[2].reg;
7874 inst.instruction |= inst.operands[3].imm << 21;
7875}
7876
c19d1205
ZW
7877static void
7878do_iwmmxt_wmov (void)
7879{
7880 /* WMOV rD, rN is an alias for WOR rD, rN, rN. */
7881 inst.instruction |= inst.operands[0].reg << 12;
7882 inst.instruction |= inst.operands[1].reg << 16;
7883 inst.instruction |= inst.operands[1].reg;
7884}
b99bd4ef 7885
c19d1205
ZW
7886static void
7887do_iwmmxt_wldstbh (void)
7888{
8f06b2d8 7889 int reloc;
c19d1205 7890 inst.instruction |= inst.operands[0].reg << 12;
8f06b2d8
PB
7891 if (thumb_mode)
7892 reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
7893 else
7894 reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
7895 encode_arm_cp_address (1, TRUE, FALSE, reloc);
b99bd4ef
NC
7896}
7897
c19d1205
ZW
7898static void
7899do_iwmmxt_wldstw (void)
7900{
7901 /* RIWR_RIWC clears .isreg for a control register. */
7902 if (!inst.operands[0].isreg)
7903 {
7904 constraint (inst.cond != COND_ALWAYS, BAD_COND);
7905 inst.instruction |= 0xf0000000;
7906 }
b99bd4ef 7907
c19d1205
ZW
7908 inst.instruction |= inst.operands[0].reg << 12;
7909 encode_arm_cp_address (1, TRUE, TRUE, 0);
7910}
b99bd4ef
NC
7911
7912static void
c19d1205 7913do_iwmmxt_wldstd (void)
b99bd4ef 7914{
c19d1205 7915 inst.instruction |= inst.operands[0].reg << 12;
2d447fca
JM
7916 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
7917 && inst.operands[1].immisreg)
7918 {
7919 inst.instruction &= ~0x1a000ff;
7920 inst.instruction |= (0xf << 28);
7921 if (inst.operands[1].preind)
7922 inst.instruction |= PRE_INDEX;
7923 if (!inst.operands[1].negative)
7924 inst.instruction |= INDEX_UP;
7925 if (inst.operands[1].writeback)
7926 inst.instruction |= WRITE_BACK;
7927 inst.instruction |= inst.operands[1].reg << 16;
7928 inst.instruction |= inst.reloc.exp.X_add_number << 4;
7929 inst.instruction |= inst.operands[1].imm;
7930 }
7931 else
7932 encode_arm_cp_address (1, TRUE, FALSE, 0);
c19d1205 7933}
b99bd4ef 7934
c19d1205
ZW
7935static void
7936do_iwmmxt_wshufh (void)
7937{
7938 inst.instruction |= inst.operands[0].reg << 12;
7939 inst.instruction |= inst.operands[1].reg << 16;
7940 inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
7941 inst.instruction |= (inst.operands[2].imm & 0x0f);
7942}
b99bd4ef 7943
c19d1205
ZW
7944static void
7945do_iwmmxt_wzero (void)
7946{
7947 /* WZERO reg is an alias for WANDN reg, reg, reg. */
7948 inst.instruction |= inst.operands[0].reg;
7949 inst.instruction |= inst.operands[0].reg << 12;
7950 inst.instruction |= inst.operands[0].reg << 16;
7951}
2d447fca
JM
7952
7953static void
7954do_iwmmxt_wrwrwr_or_imm5 (void)
7955{
7956 if (inst.operands[2].isreg)
7957 do_rd_rn_rm ();
7958 else {
7959 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
7960 _("immediate operand requires iWMMXt2"));
7961 do_rd_rn ();
7962 if (inst.operands[2].imm == 0)
7963 {
7964 switch ((inst.instruction >> 20) & 0xf)
7965 {
7966 case 4:
7967 case 5:
7968 case 6:
7969 case 7:
7970 /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16. */
7971 inst.operands[2].imm = 16;
7972 inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
7973 break;
7974 case 8:
7975 case 9:
7976 case 10:
7977 case 11:
7978 /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32. */
7979 inst.operands[2].imm = 32;
7980 inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
7981 break;
7982 case 12:
7983 case 13:
7984 case 14:
7985 case 15:
7986 {
7987 /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn. */
7988 unsigned long wrn;
7989 wrn = (inst.instruction >> 16) & 0xf;
7990 inst.instruction &= 0xff0fff0f;
7991 inst.instruction |= wrn;
7992 /* Bail out here; the instruction is now assembled. */
7993 return;
7994 }
7995 }
7996 }
7997 /* Map 32 -> 0, etc. */
7998 inst.operands[2].imm &= 0x1f;
7999 inst.instruction |= (0xf << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
8000 }
8001}
c19d1205
ZW
8002\f
8003/* Cirrus Maverick instructions. Simple 2-, 3-, and 4-register
8004 operations first, then control, shift, and load/store. */
b99bd4ef 8005
c19d1205 8006/* Insns like "foo X,Y,Z". */
b99bd4ef 8007
c19d1205
ZW
8008static void
8009do_mav_triple (void)
8010{
8011 inst.instruction |= inst.operands[0].reg << 16;
8012 inst.instruction |= inst.operands[1].reg;
8013 inst.instruction |= inst.operands[2].reg << 12;
8014}
b99bd4ef 8015
c19d1205
ZW
8016/* Insns like "foo W,X,Y,Z".
8017 where W=MVAX[0:3] and X,Y,Z=MVFX[0:15]. */
a737bd4d 8018
c19d1205
ZW
8019static void
8020do_mav_quad (void)
8021{
8022 inst.instruction |= inst.operands[0].reg << 5;
8023 inst.instruction |= inst.operands[1].reg << 12;
8024 inst.instruction |= inst.operands[2].reg << 16;
8025 inst.instruction |= inst.operands[3].reg;
a737bd4d
NC
8026}
8027
c19d1205
ZW
8028/* cfmvsc32<cond> DSPSC,MVDX[15:0]. */
8029static void
8030do_mav_dspsc (void)
a737bd4d 8031{
c19d1205
ZW
8032 inst.instruction |= inst.operands[1].reg << 12;
8033}
a737bd4d 8034
c19d1205
ZW
8035/* Maverick shift immediate instructions.
8036 cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
8037 cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0]. */
a737bd4d 8038
c19d1205
ZW
8039static void
8040do_mav_shift (void)
8041{
8042 int imm = inst.operands[2].imm;
a737bd4d 8043
c19d1205
ZW
8044 inst.instruction |= inst.operands[0].reg << 12;
8045 inst.instruction |= inst.operands[1].reg << 16;
a737bd4d 8046
c19d1205
ZW
8047 /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
8048 Bits 5-7 of the insn should have bits 4-6 of the immediate.
8049 Bit 4 should be 0. */
8050 imm = (imm & 0xf) | ((imm & 0x70) << 1);
a737bd4d 8051
c19d1205
ZW
8052 inst.instruction |= imm;
8053}
8054\f
8055/* XScale instructions. Also sorted arithmetic before move. */
a737bd4d 8056
c19d1205
ZW
8057/* Xscale multiply-accumulate (argument parse)
8058 MIAcc acc0,Rm,Rs
8059 MIAPHcc acc0,Rm,Rs
8060 MIAxycc acc0,Rm,Rs. */
a737bd4d 8061
c19d1205
ZW
8062static void
8063do_xsc_mia (void)
8064{
8065 inst.instruction |= inst.operands[1].reg;
8066 inst.instruction |= inst.operands[2].reg << 12;
8067}
a737bd4d 8068
c19d1205 8069/* Xscale move-accumulator-register (argument parse)
a737bd4d 8070
c19d1205 8071 MARcc acc0,RdLo,RdHi. */
b99bd4ef 8072
c19d1205
ZW
8073static void
8074do_xsc_mar (void)
8075{
8076 inst.instruction |= inst.operands[1].reg << 12;
8077 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef
NC
8078}
8079
c19d1205 8080/* Xscale move-register-accumulator (argument parse)
b99bd4ef 8081
c19d1205 8082 MRAcc RdLo,RdHi,acc0. */
b99bd4ef
NC
8083
8084static void
c19d1205 8085do_xsc_mra (void)
b99bd4ef 8086{
c19d1205
ZW
8087 constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
8088 inst.instruction |= inst.operands[0].reg << 12;
8089 inst.instruction |= inst.operands[1].reg << 16;
8090}
8091\f
8092/* Encoding functions relevant only to Thumb. */
b99bd4ef 8093
c19d1205
ZW
8094/* inst.operands[i] is a shifted-register operand; encode
8095 it into inst.instruction in the format used by Thumb32. */
8096
8097static void
8098encode_thumb32_shifted_operand (int i)
8099{
8100 unsigned int value = inst.reloc.exp.X_add_number;
8101 unsigned int shift = inst.operands[i].shift_kind;
b99bd4ef 8102
9c3c69f2
PB
8103 constraint (inst.operands[i].immisreg,
8104 _("shift by register not allowed in thumb mode"));
c19d1205
ZW
8105 inst.instruction |= inst.operands[i].reg;
8106 if (shift == SHIFT_RRX)
8107 inst.instruction |= SHIFT_ROR << 4;
8108 else
b99bd4ef 8109 {
c19d1205
ZW
8110 constraint (inst.reloc.exp.X_op != O_constant,
8111 _("expression too complex"));
8112
8113 constraint (value > 32
8114 || (value == 32 && (shift == SHIFT_LSL
8115 || shift == SHIFT_ROR)),
8116 _("shift expression is too large"));
8117
8118 if (value == 0)
8119 shift = SHIFT_LSL;
8120 else if (value == 32)
8121 value = 0;
8122
8123 inst.instruction |= shift << 4;
8124 inst.instruction |= (value & 0x1c) << 10;
8125 inst.instruction |= (value & 0x03) << 6;
b99bd4ef 8126 }
c19d1205 8127}
b99bd4ef 8128
b99bd4ef 8129
c19d1205
ZW
8130/* inst.operands[i] was set up by parse_address. Encode it into a
8131 Thumb32 format load or store instruction. Reject forms that cannot
8132 be used with such instructions. If is_t is true, reject forms that
8133 cannot be used with a T instruction; if is_d is true, reject forms
8134 that cannot be used with a D instruction. */
b99bd4ef 8135
c19d1205
ZW
8136static void
8137encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
8138{
8139 bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
8140
8141 constraint (!inst.operands[i].isreg,
53365c0d 8142 _("Instruction does not support =N addresses"));
b99bd4ef 8143
c19d1205
ZW
8144 inst.instruction |= inst.operands[i].reg << 16;
8145 if (inst.operands[i].immisreg)
b99bd4ef 8146 {
c19d1205
ZW
8147 constraint (is_pc, _("cannot use register index with PC-relative addressing"));
8148 constraint (is_t || is_d, _("cannot use register index with this instruction"));
8149 constraint (inst.operands[i].negative,
8150 _("Thumb does not support negative register indexing"));
8151 constraint (inst.operands[i].postind,
8152 _("Thumb does not support register post-indexing"));
8153 constraint (inst.operands[i].writeback,
8154 _("Thumb does not support register indexing with writeback"));
8155 constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
8156 _("Thumb supports only LSL in shifted register indexing"));
b99bd4ef 8157
f40d1643 8158 inst.instruction |= inst.operands[i].imm;
c19d1205 8159 if (inst.operands[i].shifted)
b99bd4ef 8160 {
c19d1205
ZW
8161 constraint (inst.reloc.exp.X_op != O_constant,
8162 _("expression too complex"));
9c3c69f2
PB
8163 constraint (inst.reloc.exp.X_add_number < 0
8164 || inst.reloc.exp.X_add_number > 3,
c19d1205 8165 _("shift out of range"));
9c3c69f2 8166 inst.instruction |= inst.reloc.exp.X_add_number << 4;
c19d1205
ZW
8167 }
8168 inst.reloc.type = BFD_RELOC_UNUSED;
8169 }
8170 else if (inst.operands[i].preind)
8171 {
8172 constraint (is_pc && inst.operands[i].writeback,
8173 _("cannot use writeback with PC-relative addressing"));
f40d1643 8174 constraint (is_t && inst.operands[i].writeback,
c19d1205
ZW
8175 _("cannot use writeback with this instruction"));
8176
8177 if (is_d)
8178 {
8179 inst.instruction |= 0x01000000;
8180 if (inst.operands[i].writeback)
8181 inst.instruction |= 0x00200000;
b99bd4ef 8182 }
c19d1205 8183 else
b99bd4ef 8184 {
c19d1205
ZW
8185 inst.instruction |= 0x00000c00;
8186 if (inst.operands[i].writeback)
8187 inst.instruction |= 0x00000100;
b99bd4ef 8188 }
c19d1205 8189 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
b99bd4ef 8190 }
c19d1205 8191 else if (inst.operands[i].postind)
b99bd4ef 8192 {
c19d1205
ZW
8193 assert (inst.operands[i].writeback);
8194 constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
8195 constraint (is_t, _("cannot use post-indexing with this instruction"));
8196
8197 if (is_d)
8198 inst.instruction |= 0x00200000;
8199 else
8200 inst.instruction |= 0x00000900;
8201 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
8202 }
8203 else /* unindexed - only for coprocessor */
8204 inst.error = _("instruction does not accept unindexed addressing");
8205}
8206
8207/* Table of Thumb instructions which exist in both 16- and 32-bit
8208 encodings (the latter only in post-V6T2 cores). The index is the
8209 value used in the insns table below. When there is more than one
8210 possible 16-bit encoding for the instruction, this table always
0110f2b8
PB
8211 holds variant (1).
8212 Also contains several pseudo-instructions used during relaxation. */
c19d1205
ZW
8213#define T16_32_TAB \
8214 X(adc, 4140, eb400000), \
8215 X(adcs, 4140, eb500000), \
8216 X(add, 1c00, eb000000), \
8217 X(adds, 1c00, eb100000), \
0110f2b8
PB
8218 X(addi, 0000, f1000000), \
8219 X(addis, 0000, f1100000), \
8220 X(add_pc,000f, f20f0000), \
8221 X(add_sp,000d, f10d0000), \
e9f89963 8222 X(adr, 000f, f20f0000), \
c19d1205
ZW
8223 X(and, 4000, ea000000), \
8224 X(ands, 4000, ea100000), \
8225 X(asr, 1000, fa40f000), \
8226 X(asrs, 1000, fa50f000), \
0110f2b8
PB
8227 X(b, e000, f000b000), \
8228 X(bcond, d000, f0008000), \
c19d1205
ZW
8229 X(bic, 4380, ea200000), \
8230 X(bics, 4380, ea300000), \
8231 X(cmn, 42c0, eb100f00), \
8232 X(cmp, 2800, ebb00f00), \
8233 X(cpsie, b660, f3af8400), \
8234 X(cpsid, b670, f3af8600), \
8235 X(cpy, 4600, ea4f0000), \
0110f2b8 8236 X(dec_sp,80dd, f1bd0d00), \
c19d1205
ZW
8237 X(eor, 4040, ea800000), \
8238 X(eors, 4040, ea900000), \
0110f2b8 8239 X(inc_sp,00dd, f10d0d00), \
c19d1205
ZW
8240 X(ldmia, c800, e8900000), \
8241 X(ldr, 6800, f8500000), \
8242 X(ldrb, 7800, f8100000), \
8243 X(ldrh, 8800, f8300000), \
8244 X(ldrsb, 5600, f9100000), \
8245 X(ldrsh, 5e00, f9300000), \
0110f2b8
PB
8246 X(ldr_pc,4800, f85f0000), \
8247 X(ldr_pc2,4800, f85f0000), \
8248 X(ldr_sp,9800, f85d0000), \
c19d1205
ZW
8249 X(lsl, 0000, fa00f000), \
8250 X(lsls, 0000, fa10f000), \
8251 X(lsr, 0800, fa20f000), \
8252 X(lsrs, 0800, fa30f000), \
8253 X(mov, 2000, ea4f0000), \
8254 X(movs, 2000, ea5f0000), \
8255 X(mul, 4340, fb00f000), \
8256 X(muls, 4340, ffffffff), /* no 32b muls */ \
8257 X(mvn, 43c0, ea6f0000), \
8258 X(mvns, 43c0, ea7f0000), \
8259 X(neg, 4240, f1c00000), /* rsb #0 */ \
8260 X(negs, 4240, f1d00000), /* rsbs #0 */ \
8261 X(orr, 4300, ea400000), \
8262 X(orrs, 4300, ea500000), \
e9f89963
PB
8263 X(pop, bc00, e8bd0000), /* ldmia sp!,... */ \
8264 X(push, b400, e92d0000), /* stmdb sp!,... */ \
c19d1205
ZW
8265 X(rev, ba00, fa90f080), \
8266 X(rev16, ba40, fa90f090), \
8267 X(revsh, bac0, fa90f0b0), \
8268 X(ror, 41c0, fa60f000), \
8269 X(rors, 41c0, fa70f000), \
8270 X(sbc, 4180, eb600000), \
8271 X(sbcs, 4180, eb700000), \
8272 X(stmia, c000, e8800000), \
8273 X(str, 6000, f8400000), \
8274 X(strb, 7000, f8000000), \
8275 X(strh, 8000, f8200000), \
0110f2b8 8276 X(str_sp,9000, f84d0000), \
c19d1205
ZW
8277 X(sub, 1e00, eba00000), \
8278 X(subs, 1e00, ebb00000), \
0110f2b8
PB
8279 X(subi, 8000, f1a00000), \
8280 X(subis, 8000, f1b00000), \
c19d1205
ZW
8281 X(sxtb, b240, fa4ff080), \
8282 X(sxth, b200, fa0ff080), \
8283 X(tst, 4200, ea100f00), \
8284 X(uxtb, b2c0, fa5ff080), \
8285 X(uxth, b280, fa1ff080), \
8286 X(nop, bf00, f3af8000), \
8287 X(yield, bf10, f3af8001), \
8288 X(wfe, bf20, f3af8002), \
8289 X(wfi, bf30, f3af8003), \
8290 X(sev, bf40, f3af9004), /* typo, 8004? */
8291
8292/* To catch errors in encoding functions, the codes are all offset by
8293 0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
8294 as 16-bit instructions. */
8295#define X(a,b,c) T_MNEM_##a
8296enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
8297#undef X
8298
8299#define X(a,b,c) 0x##b
8300static const unsigned short thumb_op16[] = { T16_32_TAB };
8301#define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
8302#undef X
8303
8304#define X(a,b,c) 0x##c
8305static const unsigned int thumb_op32[] = { T16_32_TAB };
8306#define THUMB_OP32(n) (thumb_op32[(n) - (T16_32_OFFSET + 1)])
8307#define THUMB_SETS_FLAGS(n) (THUMB_OP32 (n) & 0x00100000)
8308#undef X
8309#undef T16_32_TAB
8310
8311/* Thumb instruction encoders, in alphabetical order. */
8312
92e90b6e
PB
8313/* ADDW or SUBW. */
8314static void
8315do_t_add_sub_w (void)
8316{
8317 int Rd, Rn;
8318
8319 Rd = inst.operands[0].reg;
8320 Rn = inst.operands[1].reg;
8321
8322 constraint (Rd == 15, _("PC not allowed as destination"));
8323 inst.instruction |= (Rn << 16) | (Rd << 8);
8324 inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
8325}
8326
c19d1205
ZW
8327/* Parse an add or subtract instruction. We get here with inst.instruction
8328 equalling any of THUMB_OPCODE_add, adds, sub, or subs. */
8329
8330static void
8331do_t_add_sub (void)
8332{
8333 int Rd, Rs, Rn;
8334
8335 Rd = inst.operands[0].reg;
8336 Rs = (inst.operands[1].present
8337 ? inst.operands[1].reg /* Rd, Rs, foo */
8338 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
8339
8340 if (unified_syntax)
8341 {
0110f2b8
PB
8342 bfd_boolean flags;
8343 bfd_boolean narrow;
8344 int opcode;
8345
8346 flags = (inst.instruction == T_MNEM_adds
8347 || inst.instruction == T_MNEM_subs);
8348 if (flags)
8349 narrow = (current_it_mask == 0);
8350 else
8351 narrow = (current_it_mask != 0);
c19d1205 8352 if (!inst.operands[2].isreg)
b99bd4ef 8353 {
16805f35
PB
8354 int add;
8355
8356 add = (inst.instruction == T_MNEM_add
8357 || inst.instruction == T_MNEM_adds);
0110f2b8
PB
8358 opcode = 0;
8359 if (inst.size_req != 4)
8360 {
0110f2b8
PB
8361 /* Attempt to use a narrow opcode, with relaxation if
8362 appropriate. */
8363 if (Rd == REG_SP && Rs == REG_SP && !flags)
8364 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
8365 else if (Rd <= 7 && Rs == REG_SP && add && !flags)
8366 opcode = T_MNEM_add_sp;
8367 else if (Rd <= 7 && Rs == REG_PC && add && !flags)
8368 opcode = T_MNEM_add_pc;
8369 else if (Rd <= 7 && Rs <= 7 && narrow)
8370 {
8371 if (flags)
8372 opcode = add ? T_MNEM_addis : T_MNEM_subis;
8373 else
8374 opcode = add ? T_MNEM_addi : T_MNEM_subi;
8375 }
8376 if (opcode)
8377 {
8378 inst.instruction = THUMB_OP16(opcode);
8379 inst.instruction |= (Rd << 4) | Rs;
8380 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
8381 if (inst.size_req != 2)
8382 inst.relax = opcode;
8383 }
8384 else
8385 constraint (inst.size_req == 2, BAD_HIREG);
8386 }
8387 if (inst.size_req == 4
8388 || (inst.size_req != 2 && !opcode))
8389 {
16805f35
PB
8390 if (Rs == REG_PC)
8391 {
8392 /* Always use addw/subw. */
8393 inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
8394 inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
8395 }
8396 else
8397 {
8398 inst.instruction = THUMB_OP32 (inst.instruction);
8399 inst.instruction = (inst.instruction & 0xe1ffffff)
8400 | 0x10000000;
8401 if (flags)
8402 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
8403 else
8404 inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
8405 }
0110f2b8
PB
8406 inst.instruction |= inst.operands[0].reg << 8;
8407 inst.instruction |= inst.operands[1].reg << 16;
0110f2b8 8408 }
b99bd4ef 8409 }
c19d1205
ZW
8410 else
8411 {
8412 Rn = inst.operands[2].reg;
8413 /* See if we can do this with a 16-bit instruction. */
8414 if (!inst.operands[2].shifted && inst.size_req != 4)
8415 {
e27ec89e
PB
8416 if (Rd > 7 || Rs > 7 || Rn > 7)
8417 narrow = FALSE;
8418
8419 if (narrow)
c19d1205 8420 {
e27ec89e
PB
8421 inst.instruction = ((inst.instruction == T_MNEM_adds
8422 || inst.instruction == T_MNEM_add)
c19d1205
ZW
8423 ? T_OPCODE_ADD_R3
8424 : T_OPCODE_SUB_R3);
8425 inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
8426 return;
8427 }
b99bd4ef 8428
c19d1205
ZW
8429 if (inst.instruction == T_MNEM_add)
8430 {
8431 if (Rd == Rs)
8432 {
8433 inst.instruction = T_OPCODE_ADD_HI;
8434 inst.instruction |= (Rd & 8) << 4;
8435 inst.instruction |= (Rd & 7);
8436 inst.instruction |= Rn << 3;
8437 return;
8438 }
8439 /* ... because addition is commutative! */
8440 else if (Rd == Rn)
8441 {
8442 inst.instruction = T_OPCODE_ADD_HI;
8443 inst.instruction |= (Rd & 8) << 4;
8444 inst.instruction |= (Rd & 7);
8445 inst.instruction |= Rs << 3;
8446 return;
8447 }
8448 }
8449 }
8450 /* If we get here, it can't be done in 16 bits. */
8451 constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
8452 _("shift must be constant"));
8453 inst.instruction = THUMB_OP32 (inst.instruction);
8454 inst.instruction |= Rd << 8;
8455 inst.instruction |= Rs << 16;
8456 encode_thumb32_shifted_operand (2);
8457 }
8458 }
8459 else
8460 {
8461 constraint (inst.instruction == T_MNEM_adds
8462 || inst.instruction == T_MNEM_subs,
8463 BAD_THUMB32);
b99bd4ef 8464
c19d1205 8465 if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
b99bd4ef 8466 {
c19d1205
ZW
8467 constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
8468 || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
8469 BAD_HIREG);
8470
8471 inst.instruction = (inst.instruction == T_MNEM_add
8472 ? 0x0000 : 0x8000);
8473 inst.instruction |= (Rd << 4) | Rs;
8474 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
b99bd4ef
NC
8475 return;
8476 }
8477
c19d1205
ZW
8478 Rn = inst.operands[2].reg;
8479 constraint (inst.operands[2].shifted, _("unshifted register required"));
b99bd4ef 8480
c19d1205
ZW
8481 /* We now have Rd, Rs, and Rn set to registers. */
8482 if (Rd > 7 || Rs > 7 || Rn > 7)
b99bd4ef 8483 {
c19d1205
ZW
8484 /* Can't do this for SUB. */
8485 constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
8486 inst.instruction = T_OPCODE_ADD_HI;
8487 inst.instruction |= (Rd & 8) << 4;
8488 inst.instruction |= (Rd & 7);
8489 if (Rs == Rd)
8490 inst.instruction |= Rn << 3;
8491 else if (Rn == Rd)
8492 inst.instruction |= Rs << 3;
8493 else
8494 constraint (1, _("dest must overlap one source register"));
8495 }
8496 else
8497 {
8498 inst.instruction = (inst.instruction == T_MNEM_add
8499 ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
8500 inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
b99bd4ef 8501 }
b99bd4ef 8502 }
b99bd4ef
NC
8503}
8504
c19d1205
ZW
8505static void
8506do_t_adr (void)
8507{
0110f2b8
PB
8508 if (unified_syntax && inst.size_req == 0 && inst.operands[0].reg <= 7)
8509 {
8510 /* Defer to section relaxation. */
8511 inst.relax = inst.instruction;
8512 inst.instruction = THUMB_OP16 (inst.instruction);
8513 inst.instruction |= inst.operands[0].reg << 4;
8514 }
8515 else if (unified_syntax && inst.size_req != 2)
e9f89963 8516 {
0110f2b8 8517 /* Generate a 32-bit opcode. */
e9f89963
PB
8518 inst.instruction = THUMB_OP32 (inst.instruction);
8519 inst.instruction |= inst.operands[0].reg << 8;
8520 inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
8521 inst.reloc.pc_rel = 1;
8522 }
8523 else
8524 {
0110f2b8 8525 /* Generate a 16-bit opcode. */
e9f89963
PB
8526 inst.instruction = THUMB_OP16 (inst.instruction);
8527 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
8528 inst.reloc.exp.X_add_number -= 4; /* PC relative adjust. */
8529 inst.reloc.pc_rel = 1;
b99bd4ef 8530
e9f89963
PB
8531 inst.instruction |= inst.operands[0].reg << 4;
8532 }
c19d1205 8533}
b99bd4ef 8534
c19d1205
ZW
8535/* Arithmetic instructions for which there is just one 16-bit
8536 instruction encoding, and it allows only two low registers.
8537 For maximal compatibility with ARM syntax, we allow three register
8538 operands even when Thumb-32 instructions are not available, as long
8539 as the first two are identical. For instance, both "sbc r0,r1" and
8540 "sbc r0,r0,r1" are allowed. */
b99bd4ef 8541static void
c19d1205 8542do_t_arit3 (void)
b99bd4ef 8543{
c19d1205 8544 int Rd, Rs, Rn;
b99bd4ef 8545
c19d1205
ZW
8546 Rd = inst.operands[0].reg;
8547 Rs = (inst.operands[1].present
8548 ? inst.operands[1].reg /* Rd, Rs, foo */
8549 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
8550 Rn = inst.operands[2].reg;
b99bd4ef 8551
c19d1205 8552 if (unified_syntax)
b99bd4ef 8553 {
c19d1205
ZW
8554 if (!inst.operands[2].isreg)
8555 {
8556 /* For an immediate, we always generate a 32-bit opcode;
8557 section relaxation will shrink it later if possible. */
8558 inst.instruction = THUMB_OP32 (inst.instruction);
8559 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
8560 inst.instruction |= Rd << 8;
8561 inst.instruction |= Rs << 16;
8562 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
8563 }
8564 else
8565 {
e27ec89e
PB
8566 bfd_boolean narrow;
8567
c19d1205 8568 /* See if we can do this with a 16-bit instruction. */
e27ec89e
PB
8569 if (THUMB_SETS_FLAGS (inst.instruction))
8570 narrow = current_it_mask == 0;
8571 else
8572 narrow = current_it_mask != 0;
8573
8574 if (Rd > 7 || Rn > 7 || Rs > 7)
8575 narrow = FALSE;
8576 if (inst.operands[2].shifted)
8577 narrow = FALSE;
8578 if (inst.size_req == 4)
8579 narrow = FALSE;
8580
8581 if (narrow
c19d1205
ZW
8582 && Rd == Rs)
8583 {
8584 inst.instruction = THUMB_OP16 (inst.instruction);
8585 inst.instruction |= Rd;
8586 inst.instruction |= Rn << 3;
8587 return;
8588 }
b99bd4ef 8589
c19d1205
ZW
8590 /* If we get here, it can't be done in 16 bits. */
8591 constraint (inst.operands[2].shifted
8592 && inst.operands[2].immisreg,
8593 _("shift must be constant"));
8594 inst.instruction = THUMB_OP32 (inst.instruction);
8595 inst.instruction |= Rd << 8;
8596 inst.instruction |= Rs << 16;
8597 encode_thumb32_shifted_operand (2);
8598 }
a737bd4d 8599 }
c19d1205 8600 else
b99bd4ef 8601 {
c19d1205
ZW
8602 /* On its face this is a lie - the instruction does set the
8603 flags. However, the only supported mnemonic in this mode
8604 says it doesn't. */
8605 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
a737bd4d 8606
c19d1205
ZW
8607 constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
8608 _("unshifted register required"));
8609 constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
8610 constraint (Rd != Rs,
8611 _("dest and source1 must be the same register"));
a737bd4d 8612
c19d1205
ZW
8613 inst.instruction = THUMB_OP16 (inst.instruction);
8614 inst.instruction |= Rd;
8615 inst.instruction |= Rn << 3;
b99bd4ef 8616 }
a737bd4d 8617}
b99bd4ef 8618
c19d1205
ZW
8619/* Similarly, but for instructions where the arithmetic operation is
8620 commutative, so we can allow either of them to be different from
8621 the destination operand in a 16-bit instruction. For instance, all
8622 three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
8623 accepted. */
8624static void
8625do_t_arit3c (void)
a737bd4d 8626{
c19d1205 8627 int Rd, Rs, Rn;
b99bd4ef 8628
c19d1205
ZW
8629 Rd = inst.operands[0].reg;
8630 Rs = (inst.operands[1].present
8631 ? inst.operands[1].reg /* Rd, Rs, foo */
8632 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
8633 Rn = inst.operands[2].reg;
a737bd4d 8634
c19d1205 8635 if (unified_syntax)
a737bd4d 8636 {
c19d1205 8637 if (!inst.operands[2].isreg)
b99bd4ef 8638 {
c19d1205
ZW
8639 /* For an immediate, we always generate a 32-bit opcode;
8640 section relaxation will shrink it later if possible. */
8641 inst.instruction = THUMB_OP32 (inst.instruction);
8642 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
8643 inst.instruction |= Rd << 8;
8644 inst.instruction |= Rs << 16;
8645 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
b99bd4ef 8646 }
c19d1205 8647 else
a737bd4d 8648 {
e27ec89e
PB
8649 bfd_boolean narrow;
8650
c19d1205 8651 /* See if we can do this with a 16-bit instruction. */
e27ec89e
PB
8652 if (THUMB_SETS_FLAGS (inst.instruction))
8653 narrow = current_it_mask == 0;
8654 else
8655 narrow = current_it_mask != 0;
8656
8657 if (Rd > 7 || Rn > 7 || Rs > 7)
8658 narrow = FALSE;
8659 if (inst.operands[2].shifted)
8660 narrow = FALSE;
8661 if (inst.size_req == 4)
8662 narrow = FALSE;
8663
8664 if (narrow)
a737bd4d 8665 {
c19d1205 8666 if (Rd == Rs)
a737bd4d 8667 {
c19d1205
ZW
8668 inst.instruction = THUMB_OP16 (inst.instruction);
8669 inst.instruction |= Rd;
8670 inst.instruction |= Rn << 3;
8671 return;
a737bd4d 8672 }
c19d1205 8673 if (Rd == Rn)
a737bd4d 8674 {
c19d1205
ZW
8675 inst.instruction = THUMB_OP16 (inst.instruction);
8676 inst.instruction |= Rd;
8677 inst.instruction |= Rs << 3;
8678 return;
a737bd4d
NC
8679 }
8680 }
c19d1205
ZW
8681
8682 /* If we get here, it can't be done in 16 bits. */
8683 constraint (inst.operands[2].shifted
8684 && inst.operands[2].immisreg,
8685 _("shift must be constant"));
8686 inst.instruction = THUMB_OP32 (inst.instruction);
8687 inst.instruction |= Rd << 8;
8688 inst.instruction |= Rs << 16;
8689 encode_thumb32_shifted_operand (2);
a737bd4d 8690 }
b99bd4ef 8691 }
c19d1205
ZW
8692 else
8693 {
8694 /* On its face this is a lie - the instruction does set the
8695 flags. However, the only supported mnemonic in this mode
8696 says it doesn't. */
8697 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
a737bd4d 8698
c19d1205
ZW
8699 constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
8700 _("unshifted register required"));
8701 constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
8702
8703 inst.instruction = THUMB_OP16 (inst.instruction);
8704 inst.instruction |= Rd;
8705
8706 if (Rd == Rs)
8707 inst.instruction |= Rn << 3;
8708 else if (Rd == Rn)
8709 inst.instruction |= Rs << 3;
8710 else
8711 constraint (1, _("dest must overlap one source register"));
8712 }
a737bd4d
NC
8713}
8714
62b3e311
PB
8715static void
8716do_t_barrier (void)
8717{
8718 if (inst.operands[0].present)
8719 {
8720 constraint ((inst.instruction & 0xf0) != 0x40
8721 && inst.operands[0].imm != 0xf,
8722 "bad barrier type");
8723 inst.instruction |= inst.operands[0].imm;
8724 }
8725 else
8726 inst.instruction |= 0xf;
8727}
8728
c19d1205
ZW
8729static void
8730do_t_bfc (void)
a737bd4d 8731{
c19d1205
ZW
8732 unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
8733 constraint (msb > 32, _("bit-field extends past end of register"));
8734 /* The instruction encoding stores the LSB and MSB,
8735 not the LSB and width. */
8736 inst.instruction |= inst.operands[0].reg << 8;
8737 inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
8738 inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
8739 inst.instruction |= msb - 1;
b99bd4ef
NC
8740}
8741
c19d1205
ZW
8742static void
8743do_t_bfi (void)
b99bd4ef 8744{
c19d1205 8745 unsigned int msb;
b99bd4ef 8746
c19d1205
ZW
8747 /* #0 in second position is alternative syntax for bfc, which is
8748 the same instruction but with REG_PC in the Rm field. */
8749 if (!inst.operands[1].isreg)
8750 inst.operands[1].reg = REG_PC;
b99bd4ef 8751
c19d1205
ZW
8752 msb = inst.operands[2].imm + inst.operands[3].imm;
8753 constraint (msb > 32, _("bit-field extends past end of register"));
8754 /* The instruction encoding stores the LSB and MSB,
8755 not the LSB and width. */
8756 inst.instruction |= inst.operands[0].reg << 8;
8757 inst.instruction |= inst.operands[1].reg << 16;
8758 inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
8759 inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
8760 inst.instruction |= msb - 1;
b99bd4ef
NC
8761}
8762
c19d1205
ZW
8763static void
8764do_t_bfx (void)
b99bd4ef 8765{
c19d1205
ZW
8766 constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
8767 _("bit-field extends past end of register"));
8768 inst.instruction |= inst.operands[0].reg << 8;
8769 inst.instruction |= inst.operands[1].reg << 16;
8770 inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
8771 inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
8772 inst.instruction |= inst.operands[3].imm - 1;
8773}
b99bd4ef 8774
c19d1205
ZW
8775/* ARM V5 Thumb BLX (argument parse)
8776 BLX <target_addr> which is BLX(1)
8777 BLX <Rm> which is BLX(2)
8778 Unfortunately, there are two different opcodes for this mnemonic.
8779 So, the insns[].value is not used, and the code here zaps values
8780 into inst.instruction.
b99bd4ef 8781
c19d1205
ZW
8782 ??? How to take advantage of the additional two bits of displacement
8783 available in Thumb32 mode? Need new relocation? */
b99bd4ef 8784
c19d1205
ZW
8785static void
8786do_t_blx (void)
8787{
dfa9f0d5 8788 constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH);
c19d1205
ZW
8789 if (inst.operands[0].isreg)
8790 /* We have a register, so this is BLX(2). */
8791 inst.instruction |= inst.operands[0].reg << 3;
b99bd4ef
NC
8792 else
8793 {
c19d1205 8794 /* No register. This must be BLX(1). */
2fc8bdac 8795 inst.instruction = 0xf000e800;
39b41c9c
PB
8796#ifdef OBJ_ELF
8797 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
8798 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
8799 else
8800#endif
8801 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BLX;
c19d1205 8802 inst.reloc.pc_rel = 1;
b99bd4ef
NC
8803 }
8804}
8805
c19d1205
ZW
8806static void
8807do_t_branch (void)
b99bd4ef 8808{
0110f2b8 8809 int opcode;
dfa9f0d5
PB
8810 int cond;
8811
8812 if (current_it_mask)
8813 {
8814 /* Conditional branches inside IT blocks are encoded as unconditional
8815 branches. */
8816 cond = COND_ALWAYS;
8817 /* A branch must be the last instruction in an IT block. */
8818 constraint (current_it_mask != 0x10, BAD_BRANCH);
8819 }
8820 else
8821 cond = inst.cond;
8822
8823 if (cond != COND_ALWAYS)
0110f2b8
PB
8824 opcode = T_MNEM_bcond;
8825 else
8826 opcode = inst.instruction;
8827
8828 if (unified_syntax && inst.size_req == 4)
c19d1205 8829 {
0110f2b8 8830 inst.instruction = THUMB_OP32(opcode);
dfa9f0d5 8831 if (cond == COND_ALWAYS)
0110f2b8 8832 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH25;
c19d1205
ZW
8833 else
8834 {
dfa9f0d5
PB
8835 assert (cond != 0xF);
8836 inst.instruction |= cond << 22;
c19d1205
ZW
8837 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH20;
8838 }
8839 }
b99bd4ef
NC
8840 else
8841 {
0110f2b8 8842 inst.instruction = THUMB_OP16(opcode);
dfa9f0d5 8843 if (cond == COND_ALWAYS)
c19d1205
ZW
8844 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH12;
8845 else
b99bd4ef 8846 {
dfa9f0d5 8847 inst.instruction |= cond << 8;
c19d1205 8848 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH9;
b99bd4ef 8849 }
0110f2b8
PB
8850 /* Allow section relaxation. */
8851 if (unified_syntax && inst.size_req != 2)
8852 inst.relax = opcode;
b99bd4ef 8853 }
c19d1205
ZW
8854
8855 inst.reloc.pc_rel = 1;
b99bd4ef
NC
8856}
8857
8858static void
c19d1205 8859do_t_bkpt (void)
b99bd4ef 8860{
dfa9f0d5
PB
8861 constraint (inst.cond != COND_ALWAYS,
8862 _("instruction is always unconditional"));
c19d1205 8863 if (inst.operands[0].present)
b99bd4ef 8864 {
c19d1205
ZW
8865 constraint (inst.operands[0].imm > 255,
8866 _("immediate value out of range"));
8867 inst.instruction |= inst.operands[0].imm;
b99bd4ef 8868 }
b99bd4ef
NC
8869}
8870
8871static void
c19d1205 8872do_t_branch23 (void)
b99bd4ef 8873{
dfa9f0d5 8874 constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH);
c19d1205 8875 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
90e4755a
RE
8876 inst.reloc.pc_rel = 1;
8877
c19d1205
ZW
8878 /* If the destination of the branch is a defined symbol which does not have
8879 the THUMB_FUNC attribute, then we must be calling a function which has
8880 the (interfacearm) attribute. We look for the Thumb entry point to that
8881 function and change the branch to refer to that function instead. */
8882 if ( inst.reloc.exp.X_op == O_symbol
8883 && inst.reloc.exp.X_add_symbol != NULL
8884 && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
8885 && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
8886 inst.reloc.exp.X_add_symbol =
8887 find_real_start (inst.reloc.exp.X_add_symbol);
90e4755a
RE
8888}
8889
8890static void
c19d1205 8891do_t_bx (void)
90e4755a 8892{
dfa9f0d5 8893 constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH);
c19d1205
ZW
8894 inst.instruction |= inst.operands[0].reg << 3;
8895 /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC. The reloc
8896 should cause the alignment to be checked once it is known. This is
8897 because BX PC only works if the instruction is word aligned. */
8898}
90e4755a 8899
c19d1205
ZW
8900static void
8901do_t_bxj (void)
8902{
dfa9f0d5 8903 constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH);
c19d1205
ZW
8904 if (inst.operands[0].reg == REG_PC)
8905 as_tsktsk (_("use of r15 in bxj is not really useful"));
90e4755a 8906
c19d1205 8907 inst.instruction |= inst.operands[0].reg << 16;
90e4755a
RE
8908}
8909
8910static void
c19d1205 8911do_t_clz (void)
90e4755a 8912{
c19d1205
ZW
8913 inst.instruction |= inst.operands[0].reg << 8;
8914 inst.instruction |= inst.operands[1].reg << 16;
8915 inst.instruction |= inst.operands[1].reg;
8916}
90e4755a 8917
dfa9f0d5
PB
8918static void
8919do_t_cps (void)
8920{
8921 constraint (current_it_mask, BAD_NOT_IT);
8922 inst.instruction |= inst.operands[0].imm;
8923}
8924
c19d1205
ZW
8925static void
8926do_t_cpsi (void)
8927{
dfa9f0d5 8928 constraint (current_it_mask, BAD_NOT_IT);
c19d1205 8929 if (unified_syntax
62b3e311
PB
8930 && (inst.operands[1].present || inst.size_req == 4)
8931 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
90e4755a 8932 {
c19d1205
ZW
8933 unsigned int imod = (inst.instruction & 0x0030) >> 4;
8934 inst.instruction = 0xf3af8000;
8935 inst.instruction |= imod << 9;
8936 inst.instruction |= inst.operands[0].imm << 5;
8937 if (inst.operands[1].present)
8938 inst.instruction |= 0x100 | inst.operands[1].imm;
90e4755a 8939 }
c19d1205 8940 else
90e4755a 8941 {
62b3e311
PB
8942 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
8943 && (inst.operands[0].imm & 4),
8944 _("selected processor does not support 'A' form "
8945 "of this instruction"));
8946 constraint (inst.operands[1].present || inst.size_req == 4,
c19d1205
ZW
8947 _("Thumb does not support the 2-argument "
8948 "form of this instruction"));
8949 inst.instruction |= inst.operands[0].imm;
90e4755a 8950 }
90e4755a
RE
8951}
8952
c19d1205
ZW
8953/* THUMB CPY instruction (argument parse). */
8954
90e4755a 8955static void
c19d1205 8956do_t_cpy (void)
90e4755a 8957{
c19d1205 8958 if (inst.size_req == 4)
90e4755a 8959 {
c19d1205
ZW
8960 inst.instruction = THUMB_OP32 (T_MNEM_mov);
8961 inst.instruction |= inst.operands[0].reg << 8;
8962 inst.instruction |= inst.operands[1].reg;
90e4755a 8963 }
c19d1205 8964 else
90e4755a 8965 {
c19d1205
ZW
8966 inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
8967 inst.instruction |= (inst.operands[0].reg & 0x7);
8968 inst.instruction |= inst.operands[1].reg << 3;
90e4755a 8969 }
90e4755a
RE
8970}
8971
90e4755a 8972static void
c19d1205 8973do_t_czb (void)
90e4755a 8974{
dfa9f0d5 8975 constraint (current_it_mask, BAD_NOT_IT);
c19d1205
ZW
8976 constraint (inst.operands[0].reg > 7, BAD_HIREG);
8977 inst.instruction |= inst.operands[0].reg;
8978 inst.reloc.pc_rel = 1;
8979 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
8980}
90e4755a 8981
62b3e311
PB
8982static void
8983do_t_dbg (void)
8984{
8985 inst.instruction |= inst.operands[0].imm;
8986}
8987
8988static void
8989do_t_div (void)
8990{
8991 if (!inst.operands[1].present)
8992 inst.operands[1].reg = inst.operands[0].reg;
8993 inst.instruction |= inst.operands[0].reg << 8;
8994 inst.instruction |= inst.operands[1].reg << 16;
8995 inst.instruction |= inst.operands[2].reg;
8996}
8997
c19d1205
ZW
8998static void
8999do_t_hint (void)
9000{
9001 if (unified_syntax && inst.size_req == 4)
9002 inst.instruction = THUMB_OP32 (inst.instruction);
9003 else
9004 inst.instruction = THUMB_OP16 (inst.instruction);
9005}
90e4755a 9006
c19d1205
ZW
9007static void
9008do_t_it (void)
9009{
9010 unsigned int cond = inst.operands[0].imm;
e27ec89e 9011
dfa9f0d5 9012 constraint (current_it_mask, BAD_NOT_IT);
e27ec89e
PB
9013 current_it_mask = (inst.instruction & 0xf) | 0x10;
9014 current_cc = cond;
9015
9016 /* If the condition is a negative condition, invert the mask. */
c19d1205 9017 if ((cond & 0x1) == 0x0)
90e4755a 9018 {
c19d1205 9019 unsigned int mask = inst.instruction & 0x000f;
90e4755a 9020
c19d1205
ZW
9021 if ((mask & 0x7) == 0)
9022 /* no conversion needed */;
9023 else if ((mask & 0x3) == 0)
e27ec89e
PB
9024 mask ^= 0x8;
9025 else if ((mask & 0x1) == 0)
9026 mask ^= 0xC;
c19d1205 9027 else
e27ec89e 9028 mask ^= 0xE;
90e4755a 9029
e27ec89e
PB
9030 inst.instruction &= 0xfff0;
9031 inst.instruction |= mask;
c19d1205 9032 }
90e4755a 9033
c19d1205
ZW
9034 inst.instruction |= cond << 4;
9035}
90e4755a 9036
c19d1205
ZW
9037static void
9038do_t_ldmstm (void)
9039{
9040 /* This really doesn't seem worth it. */
9041 constraint (inst.reloc.type != BFD_RELOC_UNUSED,
9042 _("expression too complex"));
9043 constraint (inst.operands[1].writeback,
9044 _("Thumb load/store multiple does not support {reglist}^"));
90e4755a 9045
c19d1205
ZW
9046 if (unified_syntax)
9047 {
9048 /* See if we can use a 16-bit instruction. */
9049 if (inst.instruction < 0xffff /* not ldmdb/stmdb */
9050 && inst.size_req != 4
9051 && inst.operands[0].reg <= 7
9052 && !(inst.operands[1].imm & ~0xff)
9053 && (inst.instruction == T_MNEM_stmia
9054 ? inst.operands[0].writeback
9055 : (inst.operands[0].writeback
9056 == !(inst.operands[1].imm & (1 << inst.operands[0].reg)))))
90e4755a 9057 {
c19d1205
ZW
9058 if (inst.instruction == T_MNEM_stmia
9059 && (inst.operands[1].imm & (1 << inst.operands[0].reg))
9060 && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
9061 as_warn (_("value stored for r%d is UNPREDICTABLE"),
9062 inst.operands[0].reg);
90e4755a 9063
c19d1205
ZW
9064 inst.instruction = THUMB_OP16 (inst.instruction);
9065 inst.instruction |= inst.operands[0].reg << 8;
9066 inst.instruction |= inst.operands[1].imm;
9067 }
9068 else
9069 {
9070 if (inst.operands[1].imm & (1 << 13))
9071 as_warn (_("SP should not be in register list"));
9072 if (inst.instruction == T_MNEM_stmia)
90e4755a 9073 {
c19d1205
ZW
9074 if (inst.operands[1].imm & (1 << 15))
9075 as_warn (_("PC should not be in register list"));
9076 if (inst.operands[1].imm & (1 << inst.operands[0].reg))
9077 as_warn (_("value stored for r%d is UNPREDICTABLE"),
9078 inst.operands[0].reg);
90e4755a
RE
9079 }
9080 else
9081 {
c19d1205
ZW
9082 if (inst.operands[1].imm & (1 << 14)
9083 && inst.operands[1].imm & (1 << 15))
9084 as_warn (_("LR and PC should not both be in register list"));
9085 if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
9086 && inst.operands[0].writeback)
9087 as_warn (_("base register should not be in register list "
9088 "when written back"));
90e4755a 9089 }
c19d1205
ZW
9090 if (inst.instruction < 0xffff)
9091 inst.instruction = THUMB_OP32 (inst.instruction);
9092 inst.instruction |= inst.operands[0].reg << 16;
9093 inst.instruction |= inst.operands[1].imm;
9094 if (inst.operands[0].writeback)
9095 inst.instruction |= WRITE_BACK;
90e4755a
RE
9096 }
9097 }
c19d1205 9098 else
90e4755a 9099 {
c19d1205
ZW
9100 constraint (inst.operands[0].reg > 7
9101 || (inst.operands[1].imm & ~0xff), BAD_HIREG);
9102 if (inst.instruction == T_MNEM_stmia)
f03698e6 9103 {
c19d1205
ZW
9104 if (!inst.operands[0].writeback)
9105 as_warn (_("this instruction will write back the base register"));
9106 if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
9107 && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
9108 as_warn (_("value stored for r%d is UNPREDICTABLE"),
9109 inst.operands[0].reg);
f03698e6 9110 }
c19d1205 9111 else
90e4755a 9112 {
c19d1205
ZW
9113 if (!inst.operands[0].writeback
9114 && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
9115 as_warn (_("this instruction will write back the base register"));
9116 else if (inst.operands[0].writeback
9117 && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
9118 as_warn (_("this instruction will not write back the base register"));
90e4755a
RE
9119 }
9120
c19d1205
ZW
9121 inst.instruction = THUMB_OP16 (inst.instruction);
9122 inst.instruction |= inst.operands[0].reg << 8;
9123 inst.instruction |= inst.operands[1].imm;
9124 }
9125}
e28cd48c 9126
c19d1205
ZW
9127static void
9128do_t_ldrex (void)
9129{
9130 constraint (!inst.operands[1].isreg || !inst.operands[1].preind
9131 || inst.operands[1].postind || inst.operands[1].writeback
9132 || inst.operands[1].immisreg || inst.operands[1].shifted
9133 || inst.operands[1].negative,
01cfc07f 9134 BAD_ADDR_MODE);
e28cd48c 9135
c19d1205
ZW
9136 inst.instruction |= inst.operands[0].reg << 12;
9137 inst.instruction |= inst.operands[1].reg << 16;
9138 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
9139}
e28cd48c 9140
c19d1205
ZW
9141static void
9142do_t_ldrexd (void)
9143{
9144 if (!inst.operands[1].present)
1cac9012 9145 {
c19d1205
ZW
9146 constraint (inst.operands[0].reg == REG_LR,
9147 _("r14 not allowed as first register "
9148 "when second register is omitted"));
9149 inst.operands[1].reg = inst.operands[0].reg + 1;
b99bd4ef 9150 }
c19d1205
ZW
9151 constraint (inst.operands[0].reg == inst.operands[1].reg,
9152 BAD_OVERLAP);
b99bd4ef 9153
c19d1205
ZW
9154 inst.instruction |= inst.operands[0].reg << 12;
9155 inst.instruction |= inst.operands[1].reg << 8;
9156 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef
NC
9157}
9158
9159static void
c19d1205 9160do_t_ldst (void)
b99bd4ef 9161{
0110f2b8
PB
9162 unsigned long opcode;
9163 int Rn;
9164
9165 opcode = inst.instruction;
c19d1205 9166 if (unified_syntax)
b99bd4ef 9167 {
53365c0d
PB
9168 if (!inst.operands[1].isreg)
9169 {
9170 if (opcode <= 0xffff)
9171 inst.instruction = THUMB_OP32 (opcode);
9172 if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
9173 return;
9174 }
0110f2b8
PB
9175 if (inst.operands[1].isreg
9176 && !inst.operands[1].writeback
c19d1205
ZW
9177 && !inst.operands[1].shifted && !inst.operands[1].postind
9178 && !inst.operands[1].negative && inst.operands[0].reg <= 7
0110f2b8
PB
9179 && opcode <= 0xffff
9180 && inst.size_req != 4)
c19d1205 9181 {
0110f2b8
PB
9182 /* Insn may have a 16-bit form. */
9183 Rn = inst.operands[1].reg;
9184 if (inst.operands[1].immisreg)
9185 {
9186 inst.instruction = THUMB_OP16 (opcode);
9187 /* [Rn, Ri] */
9188 if (Rn <= 7 && inst.operands[1].imm <= 7)
9189 goto op16;
9190 }
9191 else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
9192 && opcode != T_MNEM_ldrsb)
9193 || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
9194 || (Rn == REG_SP && opcode == T_MNEM_str))
9195 {
9196 /* [Rn, #const] */
9197 if (Rn > 7)
9198 {
9199 if (Rn == REG_PC)
9200 {
9201 if (inst.reloc.pc_rel)
9202 opcode = T_MNEM_ldr_pc2;
9203 else
9204 opcode = T_MNEM_ldr_pc;
9205 }
9206 else
9207 {
9208 if (opcode == T_MNEM_ldr)
9209 opcode = T_MNEM_ldr_sp;
9210 else
9211 opcode = T_MNEM_str_sp;
9212 }
9213 inst.instruction = inst.operands[0].reg << 8;
9214 }
9215 else
9216 {
9217 inst.instruction = inst.operands[0].reg;
9218 inst.instruction |= inst.operands[1].reg << 3;
9219 }
9220 inst.instruction |= THUMB_OP16 (opcode);
9221 if (inst.size_req == 2)
9222 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
9223 else
9224 inst.relax = opcode;
9225 return;
9226 }
c19d1205 9227 }
0110f2b8
PB
9228 /* Definitely a 32-bit variant. */
9229 inst.instruction = THUMB_OP32 (opcode);
c19d1205
ZW
9230 inst.instruction |= inst.operands[0].reg << 12;
9231 encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
b99bd4ef
NC
9232 return;
9233 }
9234
c19d1205
ZW
9235 constraint (inst.operands[0].reg > 7, BAD_HIREG);
9236
9237 if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
b99bd4ef 9238 {
c19d1205
ZW
9239 /* Only [Rn,Rm] is acceptable. */
9240 constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
9241 constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
9242 || inst.operands[1].postind || inst.operands[1].shifted
9243 || inst.operands[1].negative,
9244 _("Thumb does not support this addressing mode"));
9245 inst.instruction = THUMB_OP16 (inst.instruction);
9246 goto op16;
b99bd4ef 9247 }
c19d1205
ZW
9248
9249 inst.instruction = THUMB_OP16 (inst.instruction);
9250 if (!inst.operands[1].isreg)
9251 if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
9252 return;
b99bd4ef 9253
c19d1205
ZW
9254 constraint (!inst.operands[1].preind
9255 || inst.operands[1].shifted
9256 || inst.operands[1].writeback,
9257 _("Thumb does not support this addressing mode"));
9258 if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
90e4755a 9259 {
c19d1205
ZW
9260 constraint (inst.instruction & 0x0600,
9261 _("byte or halfword not valid for base register"));
9262 constraint (inst.operands[1].reg == REG_PC
9263 && !(inst.instruction & THUMB_LOAD_BIT),
9264 _("r15 based store not allowed"));
9265 constraint (inst.operands[1].immisreg,
9266 _("invalid base register for register offset"));
b99bd4ef 9267
c19d1205
ZW
9268 if (inst.operands[1].reg == REG_PC)
9269 inst.instruction = T_OPCODE_LDR_PC;
9270 else if (inst.instruction & THUMB_LOAD_BIT)
9271 inst.instruction = T_OPCODE_LDR_SP;
9272 else
9273 inst.instruction = T_OPCODE_STR_SP;
b99bd4ef 9274
c19d1205
ZW
9275 inst.instruction |= inst.operands[0].reg << 8;
9276 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
9277 return;
9278 }
90e4755a 9279
c19d1205
ZW
9280 constraint (inst.operands[1].reg > 7, BAD_HIREG);
9281 if (!inst.operands[1].immisreg)
9282 {
9283 /* Immediate offset. */
9284 inst.instruction |= inst.operands[0].reg;
9285 inst.instruction |= inst.operands[1].reg << 3;
9286 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
9287 return;
9288 }
90e4755a 9289
c19d1205
ZW
9290 /* Register offset. */
9291 constraint (inst.operands[1].imm > 7, BAD_HIREG);
9292 constraint (inst.operands[1].negative,
9293 _("Thumb does not support this addressing mode"));
90e4755a 9294
c19d1205
ZW
9295 op16:
9296 switch (inst.instruction)
9297 {
9298 case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
9299 case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
9300 case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
9301 case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
9302 case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
9303 case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
9304 case 0x5600 /* ldrsb */:
9305 case 0x5e00 /* ldrsh */: break;
9306 default: abort ();
9307 }
90e4755a 9308
c19d1205
ZW
9309 inst.instruction |= inst.operands[0].reg;
9310 inst.instruction |= inst.operands[1].reg << 3;
9311 inst.instruction |= inst.operands[1].imm << 6;
9312}
90e4755a 9313
c19d1205
ZW
9314static void
9315do_t_ldstd (void)
9316{
9317 if (!inst.operands[1].present)
b99bd4ef 9318 {
c19d1205
ZW
9319 inst.operands[1].reg = inst.operands[0].reg + 1;
9320 constraint (inst.operands[0].reg == REG_LR,
9321 _("r14 not allowed here"));
b99bd4ef 9322 }
c19d1205
ZW
9323 inst.instruction |= inst.operands[0].reg << 12;
9324 inst.instruction |= inst.operands[1].reg << 8;
9325 encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
9326
b99bd4ef
NC
9327}
9328
c19d1205
ZW
9329static void
9330do_t_ldstt (void)
9331{
9332 inst.instruction |= inst.operands[0].reg << 12;
9333 encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
9334}
a737bd4d 9335
b99bd4ef 9336static void
c19d1205 9337do_t_mla (void)
b99bd4ef 9338{
c19d1205
ZW
9339 inst.instruction |= inst.operands[0].reg << 8;
9340 inst.instruction |= inst.operands[1].reg << 16;
9341 inst.instruction |= inst.operands[2].reg;
9342 inst.instruction |= inst.operands[3].reg << 12;
9343}
b99bd4ef 9344
c19d1205
ZW
9345static void
9346do_t_mlal (void)
9347{
9348 inst.instruction |= inst.operands[0].reg << 12;
9349 inst.instruction |= inst.operands[1].reg << 8;
9350 inst.instruction |= inst.operands[2].reg << 16;
9351 inst.instruction |= inst.operands[3].reg;
9352}
b99bd4ef 9353
c19d1205
ZW
9354static void
9355do_t_mov_cmp (void)
9356{
9357 if (unified_syntax)
b99bd4ef 9358 {
c19d1205
ZW
9359 int r0off = (inst.instruction == T_MNEM_mov
9360 || inst.instruction == T_MNEM_movs) ? 8 : 16;
0110f2b8 9361 unsigned long opcode;
3d388997
PB
9362 bfd_boolean narrow;
9363 bfd_boolean low_regs;
9364
9365 low_regs = (inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7);
0110f2b8 9366 opcode = inst.instruction;
3d388997 9367 if (current_it_mask)
0110f2b8 9368 narrow = opcode != T_MNEM_movs;
3d388997 9369 else
0110f2b8 9370 narrow = opcode != T_MNEM_movs || low_regs;
3d388997
PB
9371 if (inst.size_req == 4
9372 || inst.operands[1].shifted)
9373 narrow = FALSE;
9374
c19d1205
ZW
9375 if (!inst.operands[1].isreg)
9376 {
0110f2b8
PB
9377 /* Immediate operand. */
9378 if (current_it_mask == 0 && opcode == T_MNEM_mov)
9379 narrow = 0;
9380 if (low_regs && narrow)
9381 {
9382 inst.instruction = THUMB_OP16 (opcode);
9383 inst.instruction |= inst.operands[0].reg << 8;
9384 if (inst.size_req == 2)
9385 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
9386 else
9387 inst.relax = opcode;
9388 }
9389 else
9390 {
9391 inst.instruction = THUMB_OP32 (inst.instruction);
9392 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9393 inst.instruction |= inst.operands[0].reg << r0off;
9394 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9395 }
c19d1205 9396 }
3d388997 9397 else if (!narrow)
c19d1205
ZW
9398 {
9399 inst.instruction = THUMB_OP32 (inst.instruction);
9400 inst.instruction |= inst.operands[0].reg << r0off;
9401 encode_thumb32_shifted_operand (1);
9402 }
9403 else
9404 switch (inst.instruction)
9405 {
9406 case T_MNEM_mov:
9407 inst.instruction = T_OPCODE_MOV_HR;
9408 inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
9409 inst.instruction |= (inst.operands[0].reg & 0x7);
9410 inst.instruction |= inst.operands[1].reg << 3;
9411 break;
b99bd4ef 9412
c19d1205
ZW
9413 case T_MNEM_movs:
9414 /* We know we have low registers at this point.
9415 Generate ADD Rd, Rs, #0. */
9416 inst.instruction = T_OPCODE_ADD_I3;
9417 inst.instruction |= inst.operands[0].reg;
9418 inst.instruction |= inst.operands[1].reg << 3;
9419 break;
9420
9421 case T_MNEM_cmp:
3d388997 9422 if (low_regs)
c19d1205
ZW
9423 {
9424 inst.instruction = T_OPCODE_CMP_LR;
9425 inst.instruction |= inst.operands[0].reg;
9426 inst.instruction |= inst.operands[1].reg << 3;
9427 }
9428 else
9429 {
9430 inst.instruction = T_OPCODE_CMP_HR;
9431 inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
9432 inst.instruction |= (inst.operands[0].reg & 0x7);
9433 inst.instruction |= inst.operands[1].reg << 3;
9434 }
9435 break;
9436 }
b99bd4ef
NC
9437 return;
9438 }
9439
c19d1205
ZW
9440 inst.instruction = THUMB_OP16 (inst.instruction);
9441 if (inst.operands[1].isreg)
b99bd4ef 9442 {
c19d1205 9443 if (inst.operands[0].reg < 8 && inst.operands[1].reg < 8)
b99bd4ef 9444 {
c19d1205
ZW
9445 /* A move of two lowregs is encoded as ADD Rd, Rs, #0
9446 since a MOV instruction produces unpredictable results. */
9447 if (inst.instruction == T_OPCODE_MOV_I8)
9448 inst.instruction = T_OPCODE_ADD_I3;
b99bd4ef 9449 else
c19d1205 9450 inst.instruction = T_OPCODE_CMP_LR;
b99bd4ef 9451
c19d1205
ZW
9452 inst.instruction |= inst.operands[0].reg;
9453 inst.instruction |= inst.operands[1].reg << 3;
b99bd4ef
NC
9454 }
9455 else
9456 {
c19d1205
ZW
9457 if (inst.instruction == T_OPCODE_MOV_I8)
9458 inst.instruction = T_OPCODE_MOV_HR;
9459 else
9460 inst.instruction = T_OPCODE_CMP_HR;
9461 do_t_cpy ();
b99bd4ef
NC
9462 }
9463 }
c19d1205 9464 else
b99bd4ef 9465 {
c19d1205
ZW
9466 constraint (inst.operands[0].reg > 7,
9467 _("only lo regs allowed with immediate"));
9468 inst.instruction |= inst.operands[0].reg << 8;
9469 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
9470 }
9471}
b99bd4ef 9472
c19d1205
ZW
9473static void
9474do_t_mov16 (void)
9475{
b6895b4f
PB
9476 bfd_vma imm;
9477 bfd_boolean top;
9478
9479 top = (inst.instruction & 0x00800000) != 0;
9480 if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
9481 {
9482 constraint (top, _(":lower16: not allowed this instruction"));
9483 inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
9484 }
9485 else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
9486 {
9487 constraint (!top, _(":upper16: not allowed this instruction"));
9488 inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
9489 }
9490
c19d1205 9491 inst.instruction |= inst.operands[0].reg << 8;
b6895b4f
PB
9492 if (inst.reloc.type == BFD_RELOC_UNUSED)
9493 {
9494 imm = inst.reloc.exp.X_add_number;
9495 inst.instruction |= (imm & 0xf000) << 4;
9496 inst.instruction |= (imm & 0x0800) << 15;
9497 inst.instruction |= (imm & 0x0700) << 4;
9498 inst.instruction |= (imm & 0x00ff);
9499 }
c19d1205 9500}
b99bd4ef 9501
c19d1205
ZW
9502static void
9503do_t_mvn_tst (void)
9504{
9505 if (unified_syntax)
9506 {
9507 int r0off = (inst.instruction == T_MNEM_mvn
9508 || inst.instruction == T_MNEM_mvns) ? 8 : 16;
3d388997
PB
9509 bfd_boolean narrow;
9510
9511 if (inst.size_req == 4
9512 || inst.instruction > 0xffff
9513 || inst.operands[1].shifted
9514 || inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
9515 narrow = FALSE;
9516 else if (inst.instruction == T_MNEM_cmn)
9517 narrow = TRUE;
9518 else if (THUMB_SETS_FLAGS (inst.instruction))
9519 narrow = (current_it_mask == 0);
9520 else
9521 narrow = (current_it_mask != 0);
9522
c19d1205 9523 if (!inst.operands[1].isreg)
b99bd4ef 9524 {
c19d1205
ZW
9525 /* For an immediate, we always generate a 32-bit opcode;
9526 section relaxation will shrink it later if possible. */
9527 if (inst.instruction < 0xffff)
9528 inst.instruction = THUMB_OP32 (inst.instruction);
9529 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9530 inst.instruction |= inst.operands[0].reg << r0off;
9531 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
b99bd4ef 9532 }
c19d1205 9533 else
b99bd4ef 9534 {
c19d1205 9535 /* See if we can do this with a 16-bit instruction. */
3d388997 9536 if (narrow)
b99bd4ef 9537 {
c19d1205
ZW
9538 inst.instruction = THUMB_OP16 (inst.instruction);
9539 inst.instruction |= inst.operands[0].reg;
9540 inst.instruction |= inst.operands[1].reg << 3;
b99bd4ef 9541 }
c19d1205 9542 else
b99bd4ef 9543 {
c19d1205
ZW
9544 constraint (inst.operands[1].shifted
9545 && inst.operands[1].immisreg,
9546 _("shift must be constant"));
9547 if (inst.instruction < 0xffff)
9548 inst.instruction = THUMB_OP32 (inst.instruction);
9549 inst.instruction |= inst.operands[0].reg << r0off;
9550 encode_thumb32_shifted_operand (1);
b99bd4ef 9551 }
b99bd4ef
NC
9552 }
9553 }
9554 else
9555 {
c19d1205
ZW
9556 constraint (inst.instruction > 0xffff
9557 || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
9558 constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
9559 _("unshifted register required"));
9560 constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
9561 BAD_HIREG);
b99bd4ef 9562
c19d1205
ZW
9563 inst.instruction = THUMB_OP16 (inst.instruction);
9564 inst.instruction |= inst.operands[0].reg;
9565 inst.instruction |= inst.operands[1].reg << 3;
b99bd4ef 9566 }
b99bd4ef
NC
9567}
9568
b05fe5cf 9569static void
c19d1205 9570do_t_mrs (void)
b05fe5cf 9571{
62b3e311 9572 int flags;
037e8744
JB
9573
9574 if (do_vfp_nsyn_mrs () == SUCCESS)
9575 return;
9576
62b3e311
PB
9577 flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
9578 if (flags == 0)
9579 {
9580 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7m),
9581 _("selected processor does not support "
9582 "requested special purpose register"));
9583 }
9584 else
9585 {
9586 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1),
9587 _("selected processor does not support "
9588 "requested special purpose register %x"));
9589 /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all. */
9590 constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
9591 _("'CPSR' or 'SPSR' expected"));
9592 }
9593
c19d1205 9594 inst.instruction |= inst.operands[0].reg << 8;
62b3e311
PB
9595 inst.instruction |= (flags & SPSR_BIT) >> 2;
9596 inst.instruction |= inst.operands[1].imm & 0xff;
c19d1205 9597}
b05fe5cf 9598
c19d1205
ZW
9599static void
9600do_t_msr (void)
9601{
62b3e311
PB
9602 int flags;
9603
037e8744
JB
9604 if (do_vfp_nsyn_msr () == SUCCESS)
9605 return;
9606
c19d1205
ZW
9607 constraint (!inst.operands[1].isreg,
9608 _("Thumb encoding does not support an immediate here"));
62b3e311
PB
9609 flags = inst.operands[0].imm;
9610 if (flags & ~0xff)
9611 {
9612 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1),
9613 _("selected processor does not support "
9614 "requested special purpose register"));
9615 }
9616 else
9617 {
9618 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7m),
9619 _("selected processor does not support "
9620 "requested special purpose register"));
9621 flags |= PSR_f;
9622 }
9623 inst.instruction |= (flags & SPSR_BIT) >> 2;
9624 inst.instruction |= (flags & ~SPSR_BIT) >> 8;
9625 inst.instruction |= (flags & 0xff);
c19d1205
ZW
9626 inst.instruction |= inst.operands[1].reg << 16;
9627}
b05fe5cf 9628
c19d1205
ZW
9629static void
9630do_t_mul (void)
9631{
9632 if (!inst.operands[2].present)
9633 inst.operands[2].reg = inst.operands[0].reg;
b05fe5cf 9634
c19d1205
ZW
9635 /* There is no 32-bit MULS and no 16-bit MUL. */
9636 if (unified_syntax && inst.instruction == T_MNEM_mul)
b05fe5cf 9637 {
c19d1205
ZW
9638 inst.instruction = THUMB_OP32 (inst.instruction);
9639 inst.instruction |= inst.operands[0].reg << 8;
9640 inst.instruction |= inst.operands[1].reg << 16;
9641 inst.instruction |= inst.operands[2].reg << 0;
b05fe5cf 9642 }
c19d1205 9643 else
b05fe5cf 9644 {
c19d1205
ZW
9645 constraint (!unified_syntax
9646 && inst.instruction == T_MNEM_muls, BAD_THUMB32);
9647 constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
9648 BAD_HIREG);
b05fe5cf 9649
c19d1205
ZW
9650 inst.instruction = THUMB_OP16 (inst.instruction);
9651 inst.instruction |= inst.operands[0].reg;
b05fe5cf 9652
c19d1205
ZW
9653 if (inst.operands[0].reg == inst.operands[1].reg)
9654 inst.instruction |= inst.operands[2].reg << 3;
9655 else if (inst.operands[0].reg == inst.operands[2].reg)
9656 inst.instruction |= inst.operands[1].reg << 3;
9657 else
9658 constraint (1, _("dest must overlap one source register"));
9659 }
9660}
b05fe5cf 9661
c19d1205
ZW
9662static void
9663do_t_mull (void)
9664{
9665 inst.instruction |= inst.operands[0].reg << 12;
9666 inst.instruction |= inst.operands[1].reg << 8;
9667 inst.instruction |= inst.operands[2].reg << 16;
9668 inst.instruction |= inst.operands[3].reg;
b05fe5cf 9669
c19d1205
ZW
9670 if (inst.operands[0].reg == inst.operands[1].reg)
9671 as_tsktsk (_("rdhi and rdlo must be different"));
9672}
b05fe5cf 9673
c19d1205
ZW
9674static void
9675do_t_nop (void)
9676{
9677 if (unified_syntax)
9678 {
9679 if (inst.size_req == 4 || inst.operands[0].imm > 15)
b05fe5cf 9680 {
c19d1205
ZW
9681 inst.instruction = THUMB_OP32 (inst.instruction);
9682 inst.instruction |= inst.operands[0].imm;
9683 }
9684 else
9685 {
9686 inst.instruction = THUMB_OP16 (inst.instruction);
9687 inst.instruction |= inst.operands[0].imm << 4;
9688 }
9689 }
9690 else
9691 {
9692 constraint (inst.operands[0].present,
9693 _("Thumb does not support NOP with hints"));
9694 inst.instruction = 0x46c0;
9695 }
9696}
b05fe5cf 9697
c19d1205
ZW
9698static void
9699do_t_neg (void)
9700{
9701 if (unified_syntax)
9702 {
3d388997
PB
9703 bfd_boolean narrow;
9704
9705 if (THUMB_SETS_FLAGS (inst.instruction))
9706 narrow = (current_it_mask == 0);
9707 else
9708 narrow = (current_it_mask != 0);
9709 if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
9710 narrow = FALSE;
9711 if (inst.size_req == 4)
9712 narrow = FALSE;
9713
9714 if (!narrow)
c19d1205
ZW
9715 {
9716 inst.instruction = THUMB_OP32 (inst.instruction);
9717 inst.instruction |= inst.operands[0].reg << 8;
9718 inst.instruction |= inst.operands[1].reg << 16;
b05fe5cf
ZW
9719 }
9720 else
9721 {
c19d1205
ZW
9722 inst.instruction = THUMB_OP16 (inst.instruction);
9723 inst.instruction |= inst.operands[0].reg;
9724 inst.instruction |= inst.operands[1].reg << 3;
b05fe5cf
ZW
9725 }
9726 }
9727 else
9728 {
c19d1205
ZW
9729 constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
9730 BAD_HIREG);
9731 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
9732
9733 inst.instruction = THUMB_OP16 (inst.instruction);
9734 inst.instruction |= inst.operands[0].reg;
9735 inst.instruction |= inst.operands[1].reg << 3;
9736 }
9737}
9738
9739static void
9740do_t_pkhbt (void)
9741{
9742 inst.instruction |= inst.operands[0].reg << 8;
9743 inst.instruction |= inst.operands[1].reg << 16;
9744 inst.instruction |= inst.operands[2].reg;
9745 if (inst.operands[3].present)
9746 {
9747 unsigned int val = inst.reloc.exp.X_add_number;
9748 constraint (inst.reloc.exp.X_op != O_constant,
9749 _("expression too complex"));
9750 inst.instruction |= (val & 0x1c) << 10;
9751 inst.instruction |= (val & 0x03) << 6;
b05fe5cf 9752 }
c19d1205 9753}
b05fe5cf 9754
c19d1205
ZW
9755static void
9756do_t_pkhtb (void)
9757{
9758 if (!inst.operands[3].present)
9759 inst.instruction &= ~0x00000020;
9760 do_t_pkhbt ();
b05fe5cf
ZW
9761}
9762
c19d1205
ZW
9763static void
9764do_t_pld (void)
9765{
9766 encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
9767}
b05fe5cf 9768
c19d1205
ZW
9769static void
9770do_t_push_pop (void)
b99bd4ef 9771{
e9f89963
PB
9772 unsigned mask;
9773
c19d1205
ZW
9774 constraint (inst.operands[0].writeback,
9775 _("push/pop do not support {reglist}^"));
9776 constraint (inst.reloc.type != BFD_RELOC_UNUSED,
9777 _("expression too complex"));
b99bd4ef 9778
e9f89963
PB
9779 mask = inst.operands[0].imm;
9780 if ((mask & ~0xff) == 0)
c19d1205
ZW
9781 inst.instruction = THUMB_OP16 (inst.instruction);
9782 else if ((inst.instruction == T_MNEM_push
e9f89963 9783 && (mask & ~0xff) == 1 << REG_LR)
c19d1205 9784 || (inst.instruction == T_MNEM_pop
e9f89963 9785 && (mask & ~0xff) == 1 << REG_PC))
b99bd4ef 9786 {
c19d1205
ZW
9787 inst.instruction = THUMB_OP16 (inst.instruction);
9788 inst.instruction |= THUMB_PP_PC_LR;
e9f89963 9789 mask &= 0xff;
c19d1205
ZW
9790 }
9791 else if (unified_syntax)
9792 {
e9f89963
PB
9793 if (mask & (1 << 13))
9794 inst.error = _("SP not allowed in register list");
c19d1205 9795 if (inst.instruction == T_MNEM_push)
b99bd4ef 9796 {
e9f89963
PB
9797 if (mask & (1 << 15))
9798 inst.error = _("PC not allowed in register list");
c19d1205
ZW
9799 }
9800 else
9801 {
e9f89963
PB
9802 if (mask & (1 << 14)
9803 && mask & (1 << 15))
9804 inst.error = _("LR and PC should not both be in register list");
c19d1205 9805 }
e9f89963
PB
9806 if ((mask & (mask - 1)) == 0)
9807 {
9808 /* Single register push/pop implemented as str/ldr. */
9809 if (inst.instruction == T_MNEM_push)
9810 inst.instruction = 0xf84d0d04; /* str reg, [sp, #-4]! */
9811 else
9812 inst.instruction = 0xf85d0b04; /* ldr reg, [sp], #4 */
9813 mask = ffs(mask) - 1;
9814 mask <<= 12;
9815 }
9816 else
9817 inst.instruction = THUMB_OP32 (inst.instruction);
c19d1205
ZW
9818 }
9819 else
9820 {
9821 inst.error = _("invalid register list to push/pop instruction");
9822 return;
9823 }
b99bd4ef 9824
e9f89963 9825 inst.instruction |= mask;
c19d1205 9826}
b99bd4ef 9827
c19d1205
ZW
9828static void
9829do_t_rbit (void)
9830{
9831 inst.instruction |= inst.operands[0].reg << 8;
9832 inst.instruction |= inst.operands[1].reg << 16;
9833}
b99bd4ef 9834
c19d1205
ZW
9835static void
9836do_t_rev (void)
9837{
9838 if (inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7
9839 && inst.size_req != 4)
9840 {
9841 inst.instruction = THUMB_OP16 (inst.instruction);
9842 inst.instruction |= inst.operands[0].reg;
9843 inst.instruction |= inst.operands[1].reg << 3;
9844 }
9845 else if (unified_syntax)
9846 {
9847 inst.instruction = THUMB_OP32 (inst.instruction);
9848 inst.instruction |= inst.operands[0].reg << 8;
9849 inst.instruction |= inst.operands[1].reg << 16;
9850 inst.instruction |= inst.operands[1].reg;
9851 }
9852 else
9853 inst.error = BAD_HIREG;
9854}
b99bd4ef 9855
c19d1205
ZW
9856static void
9857do_t_rsb (void)
9858{
9859 int Rd, Rs;
b99bd4ef 9860
c19d1205
ZW
9861 Rd = inst.operands[0].reg;
9862 Rs = (inst.operands[1].present
9863 ? inst.operands[1].reg /* Rd, Rs, foo */
9864 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
b99bd4ef 9865
c19d1205
ZW
9866 inst.instruction |= Rd << 8;
9867 inst.instruction |= Rs << 16;
9868 if (!inst.operands[2].isreg)
9869 {
9870 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9871 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9872 }
9873 else
9874 encode_thumb32_shifted_operand (2);
9875}
b99bd4ef 9876
c19d1205
ZW
9877static void
9878do_t_setend (void)
9879{
dfa9f0d5 9880 constraint (current_it_mask, BAD_NOT_IT);
c19d1205
ZW
9881 if (inst.operands[0].imm)
9882 inst.instruction |= 0x8;
9883}
b99bd4ef 9884
c19d1205
ZW
9885static void
9886do_t_shift (void)
9887{
9888 if (!inst.operands[1].present)
9889 inst.operands[1].reg = inst.operands[0].reg;
9890
9891 if (unified_syntax)
9892 {
3d388997
PB
9893 bfd_boolean narrow;
9894 int shift_kind;
9895
9896 switch (inst.instruction)
9897 {
9898 case T_MNEM_asr:
9899 case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
9900 case T_MNEM_lsl:
9901 case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
9902 case T_MNEM_lsr:
9903 case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
9904 case T_MNEM_ror:
9905 case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
9906 default: abort ();
9907 }
9908
9909 if (THUMB_SETS_FLAGS (inst.instruction))
9910 narrow = (current_it_mask == 0);
9911 else
9912 narrow = (current_it_mask != 0);
9913 if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
9914 narrow = FALSE;
9915 if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
9916 narrow = FALSE;
9917 if (inst.operands[2].isreg
9918 && (inst.operands[1].reg != inst.operands[0].reg
9919 || inst.operands[2].reg > 7))
9920 narrow = FALSE;
9921 if (inst.size_req == 4)
9922 narrow = FALSE;
9923
9924 if (!narrow)
c19d1205
ZW
9925 {
9926 if (inst.operands[2].isreg)
b99bd4ef 9927 {
c19d1205
ZW
9928 inst.instruction = THUMB_OP32 (inst.instruction);
9929 inst.instruction |= inst.operands[0].reg << 8;
9930 inst.instruction |= inst.operands[1].reg << 16;
9931 inst.instruction |= inst.operands[2].reg;
9932 }
9933 else
9934 {
9935 inst.operands[1].shifted = 1;
3d388997 9936 inst.operands[1].shift_kind = shift_kind;
c19d1205
ZW
9937 inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
9938 ? T_MNEM_movs : T_MNEM_mov);
9939 inst.instruction |= inst.operands[0].reg << 8;
9940 encode_thumb32_shifted_operand (1);
9941 /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup. */
9942 inst.reloc.type = BFD_RELOC_UNUSED;
b99bd4ef
NC
9943 }
9944 }
9945 else
9946 {
c19d1205 9947 if (inst.operands[2].isreg)
b99bd4ef 9948 {
3d388997 9949 switch (shift_kind)
b99bd4ef 9950 {
3d388997
PB
9951 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
9952 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
9953 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
9954 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
c19d1205 9955 default: abort ();
b99bd4ef 9956 }
c19d1205
ZW
9957
9958 inst.instruction |= inst.operands[0].reg;
9959 inst.instruction |= inst.operands[2].reg << 3;
b99bd4ef
NC
9960 }
9961 else
9962 {
3d388997 9963 switch (shift_kind)
b99bd4ef 9964 {
3d388997
PB
9965 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
9966 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
9967 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
c19d1205 9968 default: abort ();
b99bd4ef 9969 }
c19d1205
ZW
9970 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
9971 inst.instruction |= inst.operands[0].reg;
9972 inst.instruction |= inst.operands[1].reg << 3;
b99bd4ef
NC
9973 }
9974 }
c19d1205
ZW
9975 }
9976 else
9977 {
9978 constraint (inst.operands[0].reg > 7
9979 || inst.operands[1].reg > 7, BAD_HIREG);
9980 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
b99bd4ef 9981
c19d1205
ZW
9982 if (inst.operands[2].isreg) /* Rd, {Rs,} Rn */
9983 {
9984 constraint (inst.operands[2].reg > 7, BAD_HIREG);
9985 constraint (inst.operands[0].reg != inst.operands[1].reg,
9986 _("source1 and dest must be same register"));
b99bd4ef 9987
c19d1205
ZW
9988 switch (inst.instruction)
9989 {
9990 case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
9991 case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
9992 case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
9993 case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
9994 default: abort ();
9995 }
9996
9997 inst.instruction |= inst.operands[0].reg;
9998 inst.instruction |= inst.operands[2].reg << 3;
9999 }
10000 else
b99bd4ef 10001 {
c19d1205
ZW
10002 switch (inst.instruction)
10003 {
10004 case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
10005 case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
10006 case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
10007 case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
10008 default: abort ();
10009 }
10010 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
10011 inst.instruction |= inst.operands[0].reg;
10012 inst.instruction |= inst.operands[1].reg << 3;
b99bd4ef
NC
10013 }
10014 }
b99bd4ef
NC
10015}
10016
10017static void
c19d1205 10018do_t_simd (void)
b99bd4ef 10019{
c19d1205
ZW
10020 inst.instruction |= inst.operands[0].reg << 8;
10021 inst.instruction |= inst.operands[1].reg << 16;
10022 inst.instruction |= inst.operands[2].reg;
10023}
b99bd4ef 10024
c19d1205 10025static void
3eb17e6b 10026do_t_smc (void)
c19d1205
ZW
10027{
10028 unsigned int value = inst.reloc.exp.X_add_number;
10029 constraint (inst.reloc.exp.X_op != O_constant,
10030 _("expression too complex"));
10031 inst.reloc.type = BFD_RELOC_UNUSED;
10032 inst.instruction |= (value & 0xf000) >> 12;
10033 inst.instruction |= (value & 0x0ff0);
10034 inst.instruction |= (value & 0x000f) << 16;
10035}
b99bd4ef 10036
c19d1205
ZW
10037static void
10038do_t_ssat (void)
10039{
10040 inst.instruction |= inst.operands[0].reg << 8;
10041 inst.instruction |= inst.operands[1].imm - 1;
10042 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef 10043
c19d1205 10044 if (inst.operands[3].present)
b99bd4ef 10045 {
c19d1205
ZW
10046 constraint (inst.reloc.exp.X_op != O_constant,
10047 _("expression too complex"));
b99bd4ef 10048
c19d1205 10049 if (inst.reloc.exp.X_add_number != 0)
6189168b 10050 {
c19d1205
ZW
10051 if (inst.operands[3].shift_kind == SHIFT_ASR)
10052 inst.instruction |= 0x00200000; /* sh bit */
10053 inst.instruction |= (inst.reloc.exp.X_add_number & 0x1c) << 10;
10054 inst.instruction |= (inst.reloc.exp.X_add_number & 0x03) << 6;
6189168b 10055 }
c19d1205 10056 inst.reloc.type = BFD_RELOC_UNUSED;
6189168b 10057 }
b99bd4ef
NC
10058}
10059
0dd132b6 10060static void
c19d1205 10061do_t_ssat16 (void)
0dd132b6 10062{
c19d1205
ZW
10063 inst.instruction |= inst.operands[0].reg << 8;
10064 inst.instruction |= inst.operands[1].imm - 1;
10065 inst.instruction |= inst.operands[2].reg << 16;
10066}
0dd132b6 10067
c19d1205
ZW
10068static void
10069do_t_strex (void)
10070{
10071 constraint (!inst.operands[2].isreg || !inst.operands[2].preind
10072 || inst.operands[2].postind || inst.operands[2].writeback
10073 || inst.operands[2].immisreg || inst.operands[2].shifted
10074 || inst.operands[2].negative,
01cfc07f 10075 BAD_ADDR_MODE);
0dd132b6 10076
c19d1205
ZW
10077 inst.instruction |= inst.operands[0].reg << 8;
10078 inst.instruction |= inst.operands[1].reg << 12;
10079 inst.instruction |= inst.operands[2].reg << 16;
10080 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
0dd132b6
NC
10081}
10082
b99bd4ef 10083static void
c19d1205 10084do_t_strexd (void)
b99bd4ef 10085{
c19d1205
ZW
10086 if (!inst.operands[2].present)
10087 inst.operands[2].reg = inst.operands[1].reg + 1;
b99bd4ef 10088
c19d1205
ZW
10089 constraint (inst.operands[0].reg == inst.operands[1].reg
10090 || inst.operands[0].reg == inst.operands[2].reg
10091 || inst.operands[0].reg == inst.operands[3].reg
10092 || inst.operands[1].reg == inst.operands[2].reg,
10093 BAD_OVERLAP);
b99bd4ef 10094
c19d1205
ZW
10095 inst.instruction |= inst.operands[0].reg;
10096 inst.instruction |= inst.operands[1].reg << 12;
10097 inst.instruction |= inst.operands[2].reg << 8;
10098 inst.instruction |= inst.operands[3].reg << 16;
b99bd4ef
NC
10099}
10100
10101static void
c19d1205 10102do_t_sxtah (void)
b99bd4ef 10103{
c19d1205
ZW
10104 inst.instruction |= inst.operands[0].reg << 8;
10105 inst.instruction |= inst.operands[1].reg << 16;
10106 inst.instruction |= inst.operands[2].reg;
10107 inst.instruction |= inst.operands[3].imm << 4;
10108}
b99bd4ef 10109
c19d1205
ZW
10110static void
10111do_t_sxth (void)
10112{
10113 if (inst.instruction <= 0xffff && inst.size_req != 4
10114 && inst.operands[0].reg <= 7 && inst.operands[1].reg <= 7
10115 && (!inst.operands[2].present || inst.operands[2].imm == 0))
b99bd4ef 10116 {
c19d1205
ZW
10117 inst.instruction = THUMB_OP16 (inst.instruction);
10118 inst.instruction |= inst.operands[0].reg;
10119 inst.instruction |= inst.operands[1].reg << 3;
b99bd4ef 10120 }
c19d1205 10121 else if (unified_syntax)
b99bd4ef 10122 {
c19d1205
ZW
10123 if (inst.instruction <= 0xffff)
10124 inst.instruction = THUMB_OP32 (inst.instruction);
10125 inst.instruction |= inst.operands[0].reg << 8;
10126 inst.instruction |= inst.operands[1].reg;
10127 inst.instruction |= inst.operands[2].imm << 4;
b99bd4ef 10128 }
c19d1205 10129 else
b99bd4ef 10130 {
c19d1205
ZW
10131 constraint (inst.operands[2].present && inst.operands[2].imm != 0,
10132 _("Thumb encoding does not support rotation"));
10133 constraint (1, BAD_HIREG);
b99bd4ef 10134 }
c19d1205 10135}
b99bd4ef 10136
c19d1205
ZW
10137static void
10138do_t_swi (void)
10139{
10140 inst.reloc.type = BFD_RELOC_ARM_SWI;
10141}
b99bd4ef 10142
92e90b6e
PB
10143static void
10144do_t_tb (void)
10145{
10146 int half;
10147
10148 half = (inst.instruction & 0x10) != 0;
dfa9f0d5
PB
10149 constraint (current_it_mask && current_it_mask != 0x10, BAD_BRANCH);
10150 constraint (inst.operands[0].immisreg,
10151 _("instruction requires register index"));
92e90b6e
PB
10152 constraint (inst.operands[0].imm == 15,
10153 _("PC is not a valid index register"));
10154 constraint (!half && inst.operands[0].shifted,
10155 _("instruction does not allow shifted index"));
92e90b6e
PB
10156 inst.instruction |= (inst.operands[0].reg << 16) | inst.operands[0].imm;
10157}
10158
c19d1205
ZW
10159static void
10160do_t_usat (void)
10161{
10162 inst.instruction |= inst.operands[0].reg << 8;
10163 inst.instruction |= inst.operands[1].imm;
10164 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef 10165
c19d1205 10166 if (inst.operands[3].present)
b99bd4ef 10167 {
c19d1205
ZW
10168 constraint (inst.reloc.exp.X_op != O_constant,
10169 _("expression too complex"));
10170 if (inst.reloc.exp.X_add_number != 0)
10171 {
10172 if (inst.operands[3].shift_kind == SHIFT_ASR)
10173 inst.instruction |= 0x00200000; /* sh bit */
b99bd4ef 10174
c19d1205
ZW
10175 inst.instruction |= (inst.reloc.exp.X_add_number & 0x1c) << 10;
10176 inst.instruction |= (inst.reloc.exp.X_add_number & 0x03) << 6;
10177 }
10178 inst.reloc.type = BFD_RELOC_UNUSED;
b99bd4ef 10179 }
b99bd4ef
NC
10180}
10181
10182static void
c19d1205 10183do_t_usat16 (void)
b99bd4ef 10184{
c19d1205
ZW
10185 inst.instruction |= inst.operands[0].reg << 8;
10186 inst.instruction |= inst.operands[1].imm;
10187 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef 10188}
c19d1205 10189
5287ad62
JB
10190/* Neon instruction encoder helpers. */
10191
10192/* Encodings for the different types for various Neon opcodes. */
b99bd4ef 10193
5287ad62
JB
10194/* An "invalid" code for the following tables. */
10195#define N_INV -1u
10196
10197struct neon_tab_entry
b99bd4ef 10198{
5287ad62
JB
10199 unsigned integer;
10200 unsigned float_or_poly;
10201 unsigned scalar_or_imm;
10202};
10203
10204/* Map overloaded Neon opcodes to their respective encodings. */
10205#define NEON_ENC_TAB \
10206 X(vabd, 0x0000700, 0x1200d00, N_INV), \
10207 X(vmax, 0x0000600, 0x0000f00, N_INV), \
10208 X(vmin, 0x0000610, 0x0200f00, N_INV), \
10209 X(vpadd, 0x0000b10, 0x1000d00, N_INV), \
10210 X(vpmax, 0x0000a00, 0x1000f00, N_INV), \
10211 X(vpmin, 0x0000a10, 0x1200f00, N_INV), \
10212 X(vadd, 0x0000800, 0x0000d00, N_INV), \
10213 X(vsub, 0x1000800, 0x0200d00, N_INV), \
10214 X(vceq, 0x1000810, 0x0000e00, 0x1b10100), \
10215 X(vcge, 0x0000310, 0x1000e00, 0x1b10080), \
10216 X(vcgt, 0x0000300, 0x1200e00, 0x1b10000), \
10217 /* Register variants of the following two instructions are encoded as
10218 vcge / vcgt with the operands reversed. */ \
10219 X(vclt, 0x0000310, 0x1000e00, 0x1b10200), \
10220 X(vcle, 0x0000300, 0x1200e00, 0x1b10180), \
10221 X(vmla, 0x0000900, 0x0000d10, 0x0800040), \
10222 X(vmls, 0x1000900, 0x0200d10, 0x0800440), \
10223 X(vmul, 0x0000910, 0x1000d10, 0x0800840), \
10224 X(vmull, 0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float. */ \
10225 X(vmlal, 0x0800800, N_INV, 0x0800240), \
10226 X(vmlsl, 0x0800a00, N_INV, 0x0800640), \
10227 X(vqdmlal, 0x0800900, N_INV, 0x0800340), \
10228 X(vqdmlsl, 0x0800b00, N_INV, 0x0800740), \
10229 X(vqdmull, 0x0800d00, N_INV, 0x0800b40), \
10230 X(vqdmulh, 0x0000b00, N_INV, 0x0800c40), \
10231 X(vqrdmulh, 0x1000b00, N_INV, 0x0800d40), \
10232 X(vshl, 0x0000400, N_INV, 0x0800510), \
10233 X(vqshl, 0x0000410, N_INV, 0x0800710), \
10234 X(vand, 0x0000110, N_INV, 0x0800030), \
10235 X(vbic, 0x0100110, N_INV, 0x0800030), \
10236 X(veor, 0x1000110, N_INV, N_INV), \
10237 X(vorn, 0x0300110, N_INV, 0x0800010), \
10238 X(vorr, 0x0200110, N_INV, 0x0800010), \
10239 X(vmvn, 0x1b00580, N_INV, 0x0800030), \
10240 X(vshll, 0x1b20300, N_INV, 0x0800a10), /* max shift, immediate. */ \
10241 X(vcvt, 0x1b30600, N_INV, 0x0800e10), /* integer, fixed-point. */ \
10242 X(vdup, 0xe800b10, N_INV, 0x1b00c00), /* arm, scalar. */ \
10243 X(vld1, 0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup. */ \
10244 X(vst1, 0x0000000, 0x0800000, N_INV), \
10245 X(vld2, 0x0200100, 0x0a00100, 0x0a00d00), \
10246 X(vst2, 0x0000100, 0x0800100, N_INV), \
10247 X(vld3, 0x0200200, 0x0a00200, 0x0a00e00), \
10248 X(vst3, 0x0000200, 0x0800200, N_INV), \
10249 X(vld4, 0x0200300, 0x0a00300, 0x0a00f00), \
10250 X(vst4, 0x0000300, 0x0800300, N_INV), \
10251 X(vmovn, 0x1b20200, N_INV, N_INV), \
10252 X(vtrn, 0x1b20080, N_INV, N_INV), \
10253 X(vqmovn, 0x1b20200, N_INV, N_INV), \
037e8744
JB
10254 X(vqmovun, 0x1b20240, N_INV, N_INV), \
10255 X(vnmul, 0xe200a40, 0xe200b40, N_INV), \
10256 X(vnmla, 0xe000a40, 0xe000b40, N_INV), \
10257 X(vnmls, 0xe100a40, 0xe100b40, N_INV), \
10258 X(vcmp, 0xeb40a40, 0xeb40b40, N_INV), \
10259 X(vcmpz, 0xeb50a40, 0xeb50b40, N_INV), \
10260 X(vcmpe, 0xeb40ac0, 0xeb40bc0, N_INV), \
10261 X(vcmpez, 0xeb50ac0, 0xeb50bc0, N_INV)
5287ad62
JB
10262
10263enum neon_opc
10264{
10265#define X(OPC,I,F,S) N_MNEM_##OPC
10266NEON_ENC_TAB
10267#undef X
10268};
b99bd4ef 10269
5287ad62
JB
10270static const struct neon_tab_entry neon_enc_tab[] =
10271{
10272#define X(OPC,I,F,S) { (I), (F), (S) }
10273NEON_ENC_TAB
10274#undef X
10275};
b99bd4ef 10276
5287ad62
JB
10277#define NEON_ENC_INTEGER(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
10278#define NEON_ENC_ARMREG(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
10279#define NEON_ENC_POLY(X) (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
10280#define NEON_ENC_FLOAT(X) (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
10281#define NEON_ENC_SCALAR(X) (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
10282#define NEON_ENC_IMMED(X) (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
10283#define NEON_ENC_INTERLV(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
10284#define NEON_ENC_LANE(X) (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
10285#define NEON_ENC_DUP(X) (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
037e8744
JB
10286#define NEON_ENC_SINGLE(X) \
10287 ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
10288#define NEON_ENC_DOUBLE(X) \
10289 ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
5287ad62 10290
037e8744
JB
10291/* Define shapes for instruction operands. The following mnemonic characters
10292 are used in this table:
5287ad62 10293
037e8744 10294 F - VFP S<n> register
5287ad62
JB
10295 D - Neon D<n> register
10296 Q - Neon Q<n> register
10297 I - Immediate
10298 S - Scalar
10299 R - ARM register
10300 L - D<n> register list
037e8744
JB
10301
10302 This table is used to generate various data:
10303 - enumerations of the form NS_DDR to be used as arguments to
10304 neon_select_shape.
10305 - a table classifying shapes into single, double, quad, mixed.
10306 - a table used to drive neon_select_shape.
5287ad62 10307*/
b99bd4ef 10308
037e8744
JB
10309#define NEON_SHAPE_DEF \
10310 X(3, (D, D, D), DOUBLE), \
10311 X(3, (Q, Q, Q), QUAD), \
10312 X(3, (D, D, I), DOUBLE), \
10313 X(3, (Q, Q, I), QUAD), \
10314 X(3, (D, D, S), DOUBLE), \
10315 X(3, (Q, Q, S), QUAD), \
10316 X(2, (D, D), DOUBLE), \
10317 X(2, (Q, Q), QUAD), \
10318 X(2, (D, S), DOUBLE), \
10319 X(2, (Q, S), QUAD), \
10320 X(2, (D, R), DOUBLE), \
10321 X(2, (Q, R), QUAD), \
10322 X(2, (D, I), DOUBLE), \
10323 X(2, (Q, I), QUAD), \
10324 X(3, (D, L, D), DOUBLE), \
10325 X(2, (D, Q), MIXED), \
10326 X(2, (Q, D), MIXED), \
10327 X(3, (D, Q, I), MIXED), \
10328 X(3, (Q, D, I), MIXED), \
10329 X(3, (Q, D, D), MIXED), \
10330 X(3, (D, Q, Q), MIXED), \
10331 X(3, (Q, Q, D), MIXED), \
10332 X(3, (Q, D, S), MIXED), \
10333 X(3, (D, Q, S), MIXED), \
10334 X(4, (D, D, D, I), DOUBLE), \
10335 X(4, (Q, Q, Q, I), QUAD), \
10336 X(2, (F, F), SINGLE), \
10337 X(3, (F, F, F), SINGLE), \
10338 X(2, (F, I), SINGLE), \
10339 X(2, (F, D), MIXED), \
10340 X(2, (D, F), MIXED), \
10341 X(3, (F, F, I), MIXED), \
10342 X(4, (R, R, F, F), SINGLE), \
10343 X(4, (F, F, R, R), SINGLE), \
10344 X(3, (D, R, R), DOUBLE), \
10345 X(3, (R, R, D), DOUBLE), \
10346 X(2, (S, R), SINGLE), \
10347 X(2, (R, S), SINGLE), \
10348 X(2, (F, R), SINGLE), \
10349 X(2, (R, F), SINGLE)
10350
10351#define S2(A,B) NS_##A##B
10352#define S3(A,B,C) NS_##A##B##C
10353#define S4(A,B,C,D) NS_##A##B##C##D
10354
10355#define X(N, L, C) S##N L
10356
5287ad62
JB
10357enum neon_shape
10358{
037e8744
JB
10359 NEON_SHAPE_DEF,
10360 NS_NULL
5287ad62 10361};
b99bd4ef 10362
037e8744
JB
10363#undef X
10364#undef S2
10365#undef S3
10366#undef S4
10367
10368enum neon_shape_class
10369{
10370 SC_SINGLE,
10371 SC_DOUBLE,
10372 SC_QUAD,
10373 SC_MIXED
10374};
10375
10376#define X(N, L, C) SC_##C
10377
10378static enum neon_shape_class neon_shape_class[] =
10379{
10380 NEON_SHAPE_DEF
10381};
10382
10383#undef X
10384
10385enum neon_shape_el
10386{
10387 SE_F,
10388 SE_D,
10389 SE_Q,
10390 SE_I,
10391 SE_S,
10392 SE_R,
10393 SE_L
10394};
10395
10396/* Register widths of above. */
10397static unsigned neon_shape_el_size[] =
10398{
10399 32,
10400 64,
10401 128,
10402 0,
10403 32,
10404 32,
10405 0
10406};
10407
10408struct neon_shape_info
10409{
10410 unsigned els;
10411 enum neon_shape_el el[NEON_MAX_TYPE_ELS];
10412};
10413
10414#define S2(A,B) { SE_##A, SE_##B }
10415#define S3(A,B,C) { SE_##A, SE_##B, SE_##C }
10416#define S4(A,B,C,D) { SE_##A, SE_##B, SE_##C, SE_##D }
10417
10418#define X(N, L, C) { N, S##N L }
10419
10420static struct neon_shape_info neon_shape_tab[] =
10421{
10422 NEON_SHAPE_DEF
10423};
10424
10425#undef X
10426#undef S2
10427#undef S3
10428#undef S4
10429
5287ad62
JB
10430/* Bit masks used in type checking given instructions.
10431 'N_EQK' means the type must be the same as (or based on in some way) the key
10432 type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
10433 set, various other bits can be set as well in order to modify the meaning of
10434 the type constraint. */
10435
10436enum neon_type_mask
10437{
10438 N_S8 = 0x000001,
10439 N_S16 = 0x000002,
10440 N_S32 = 0x000004,
10441 N_S64 = 0x000008,
10442 N_U8 = 0x000010,
10443 N_U16 = 0x000020,
10444 N_U32 = 0x000040,
10445 N_U64 = 0x000080,
10446 N_I8 = 0x000100,
10447 N_I16 = 0x000200,
10448 N_I32 = 0x000400,
10449 N_I64 = 0x000800,
10450 N_8 = 0x001000,
10451 N_16 = 0x002000,
10452 N_32 = 0x004000,
10453 N_64 = 0x008000,
10454 N_P8 = 0x010000,
10455 N_P16 = 0x020000,
10456 N_F32 = 0x040000,
037e8744
JB
10457 N_F64 = 0x080000,
10458 N_KEY = 0x100000, /* key element (main type specifier). */
10459 N_EQK = 0x200000, /* given operand has the same type & size as the key. */
10460 N_VFP = 0x400000, /* VFP mode: operand size must match register width. */
5287ad62
JB
10461 N_DBL = 0x000001, /* if N_EQK, this operand is twice the size. */
10462 N_HLF = 0x000002, /* if N_EQK, this operand is half the size. */
10463 N_SGN = 0x000004, /* if N_EQK, this operand is forced to be signed. */
10464 N_UNS = 0x000008, /* if N_EQK, this operand is forced to be unsigned. */
10465 N_INT = 0x000010, /* if N_EQK, this operand is forced to be integer. */
10466 N_FLT = 0x000020, /* if N_EQK, this operand is forced to be float. */
dcbf9037 10467 N_SIZ = 0x000040, /* if N_EQK, this operand is forced to be size-only. */
5287ad62 10468 N_UTYP = 0,
037e8744 10469 N_MAX_NONSPECIAL = N_F64
5287ad62
JB
10470};
10471
dcbf9037
JB
10472#define N_ALLMODS (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
10473
5287ad62
JB
10474#define N_SU_ALL (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
10475#define N_SU_32 (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
10476#define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
10477#define N_SUF_32 (N_SU_32 | N_F32)
10478#define N_I_ALL (N_I8 | N_I16 | N_I32 | N_I64)
10479#define N_IF_32 (N_I8 | N_I16 | N_I32 | N_F32)
10480
10481/* Pass this as the first type argument to neon_check_type to ignore types
10482 altogether. */
10483#define N_IGNORE_TYPE (N_KEY | N_EQK)
10484
037e8744
JB
10485/* Select a "shape" for the current instruction (describing register types or
10486 sizes) from a list of alternatives. Return NS_NULL if the current instruction
10487 doesn't fit. For non-polymorphic shapes, checking is usually done as a
10488 function of operand parsing, so this function doesn't need to be called.
10489 Shapes should be listed in order of decreasing length. */
5287ad62
JB
10490
10491static enum neon_shape
037e8744 10492neon_select_shape (enum neon_shape shape, ...)
5287ad62 10493{
037e8744
JB
10494 va_list ap;
10495 enum neon_shape first_shape = shape;
5287ad62
JB
10496
10497 /* Fix missing optional operands. FIXME: we don't know at this point how
10498 many arguments we should have, so this makes the assumption that we have
10499 > 1. This is true of all current Neon opcodes, I think, but may not be
10500 true in the future. */
10501 if (!inst.operands[1].present)
10502 inst.operands[1] = inst.operands[0];
10503
037e8744 10504 va_start (ap, shape);
5287ad62 10505
037e8744
JB
10506 for (; shape != NS_NULL; shape = va_arg (ap, int))
10507 {
10508 unsigned j;
10509 int matches = 1;
10510
10511 for (j = 0; j < neon_shape_tab[shape].els; j++)
10512 {
10513 if (!inst.operands[j].present)
10514 {
10515 matches = 0;
10516 break;
10517 }
10518
10519 switch (neon_shape_tab[shape].el[j])
10520 {
10521 case SE_F:
10522 if (!(inst.operands[j].isreg
10523 && inst.operands[j].isvec
10524 && inst.operands[j].issingle
10525 && !inst.operands[j].isquad))
10526 matches = 0;
10527 break;
10528
10529 case SE_D:
10530 if (!(inst.operands[j].isreg
10531 && inst.operands[j].isvec
10532 && !inst.operands[j].isquad
10533 && !inst.operands[j].issingle))
10534 matches = 0;
10535 break;
10536
10537 case SE_R:
10538 if (!(inst.operands[j].isreg
10539 && !inst.operands[j].isvec))
10540 matches = 0;
10541 break;
10542
10543 case SE_Q:
10544 if (!(inst.operands[j].isreg
10545 && inst.operands[j].isvec
10546 && inst.operands[j].isquad
10547 && !inst.operands[j].issingle))
10548 matches = 0;
10549 break;
10550
10551 case SE_I:
10552 if (!(!inst.operands[j].isreg
10553 && !inst.operands[j].isscalar))
10554 matches = 0;
10555 break;
10556
10557 case SE_S:
10558 if (!(!inst.operands[j].isreg
10559 && inst.operands[j].isscalar))
10560 matches = 0;
10561 break;
10562
10563 case SE_L:
10564 break;
10565 }
10566 }
10567 if (matches)
5287ad62 10568 break;
037e8744 10569 }
5287ad62 10570
037e8744 10571 va_end (ap);
5287ad62 10572
037e8744
JB
10573 if (shape == NS_NULL && first_shape != NS_NULL)
10574 first_error (_("invalid instruction shape"));
5287ad62 10575
037e8744
JB
10576 return shape;
10577}
5287ad62 10578
037e8744
JB
10579/* True if SHAPE is predominantly a quadword operation (most of the time, this
10580 means the Q bit should be set). */
10581
10582static int
10583neon_quad (enum neon_shape shape)
10584{
10585 return neon_shape_class[shape] == SC_QUAD;
5287ad62 10586}
037e8744 10587
5287ad62
JB
10588static void
10589neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
10590 unsigned *g_size)
10591{
10592 /* Allow modification to be made to types which are constrained to be
10593 based on the key element, based on bits set alongside N_EQK. */
10594 if ((typebits & N_EQK) != 0)
10595 {
10596 if ((typebits & N_HLF) != 0)
10597 *g_size /= 2;
10598 else if ((typebits & N_DBL) != 0)
10599 *g_size *= 2;
10600 if ((typebits & N_SGN) != 0)
10601 *g_type = NT_signed;
10602 else if ((typebits & N_UNS) != 0)
10603 *g_type = NT_unsigned;
10604 else if ((typebits & N_INT) != 0)
10605 *g_type = NT_integer;
10606 else if ((typebits & N_FLT) != 0)
10607 *g_type = NT_float;
dcbf9037
JB
10608 else if ((typebits & N_SIZ) != 0)
10609 *g_type = NT_untyped;
5287ad62
JB
10610 }
10611}
10612
10613/* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
10614 operand type, i.e. the single type specified in a Neon instruction when it
10615 is the only one given. */
10616
10617static struct neon_type_el
10618neon_type_promote (struct neon_type_el *key, unsigned thisarg)
10619{
10620 struct neon_type_el dest = *key;
10621
10622 assert ((thisarg & N_EQK) != 0);
10623
10624 neon_modify_type_size (thisarg, &dest.type, &dest.size);
10625
10626 return dest;
10627}
10628
10629/* Convert Neon type and size into compact bitmask representation. */
10630
10631static enum neon_type_mask
10632type_chk_of_el_type (enum neon_el_type type, unsigned size)
10633{
10634 switch (type)
10635 {
10636 case NT_untyped:
10637 switch (size)
10638 {
10639 case 8: return N_8;
10640 case 16: return N_16;
10641 case 32: return N_32;
10642 case 64: return N_64;
10643 default: ;
10644 }
10645 break;
10646
10647 case NT_integer:
10648 switch (size)
10649 {
10650 case 8: return N_I8;
10651 case 16: return N_I16;
10652 case 32: return N_I32;
10653 case 64: return N_I64;
10654 default: ;
10655 }
10656 break;
10657
10658 case NT_float:
037e8744
JB
10659 switch (size)
10660 {
10661 case 32: return N_F32;
10662 case 64: return N_F64;
10663 default: ;
10664 }
5287ad62
JB
10665 break;
10666
10667 case NT_poly:
10668 switch (size)
10669 {
10670 case 8: return N_P8;
10671 case 16: return N_P16;
10672 default: ;
10673 }
10674 break;
10675
10676 case NT_signed:
10677 switch (size)
10678 {
10679 case 8: return N_S8;
10680 case 16: return N_S16;
10681 case 32: return N_S32;
10682 case 64: return N_S64;
10683 default: ;
10684 }
10685 break;
10686
10687 case NT_unsigned:
10688 switch (size)
10689 {
10690 case 8: return N_U8;
10691 case 16: return N_U16;
10692 case 32: return N_U32;
10693 case 64: return N_U64;
10694 default: ;
10695 }
10696 break;
10697
10698 default: ;
10699 }
10700
10701 return N_UTYP;
10702}
10703
10704/* Convert compact Neon bitmask type representation to a type and size. Only
10705 handles the case where a single bit is set in the mask. */
10706
dcbf9037 10707static int
5287ad62
JB
10708el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
10709 enum neon_type_mask mask)
10710{
dcbf9037
JB
10711 if ((mask & N_EQK) != 0)
10712 return FAIL;
10713
5287ad62
JB
10714 if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
10715 *size = 8;
dcbf9037 10716 else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_P16)) != 0)
5287ad62 10717 *size = 16;
dcbf9037 10718 else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
5287ad62 10719 *size = 32;
037e8744 10720 else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64)) != 0)
5287ad62 10721 *size = 64;
dcbf9037
JB
10722 else
10723 return FAIL;
10724
5287ad62
JB
10725 if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
10726 *type = NT_signed;
dcbf9037 10727 else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
5287ad62 10728 *type = NT_unsigned;
dcbf9037 10729 else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
5287ad62 10730 *type = NT_integer;
dcbf9037 10731 else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
5287ad62 10732 *type = NT_untyped;
dcbf9037 10733 else if ((mask & (N_P8 | N_P16)) != 0)
5287ad62 10734 *type = NT_poly;
037e8744 10735 else if ((mask & (N_F32 | N_F64)) != 0)
5287ad62 10736 *type = NT_float;
dcbf9037
JB
10737 else
10738 return FAIL;
10739
10740 return SUCCESS;
5287ad62
JB
10741}
10742
10743/* Modify a bitmask of allowed types. This is only needed for type
10744 relaxation. */
10745
10746static unsigned
10747modify_types_allowed (unsigned allowed, unsigned mods)
10748{
10749 unsigned size;
10750 enum neon_el_type type;
10751 unsigned destmask;
10752 int i;
10753
10754 destmask = 0;
10755
10756 for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
10757 {
dcbf9037
JB
10758 if (el_type_of_type_chk (&type, &size, allowed & i) == SUCCESS)
10759 {
10760 neon_modify_type_size (mods, &type, &size);
10761 destmask |= type_chk_of_el_type (type, size);
10762 }
5287ad62
JB
10763 }
10764
10765 return destmask;
10766}
10767
10768/* Check type and return type classification.
10769 The manual states (paraphrase): If one datatype is given, it indicates the
10770 type given in:
10771 - the second operand, if there is one
10772 - the operand, if there is no second operand
10773 - the result, if there are no operands.
10774 This isn't quite good enough though, so we use a concept of a "key" datatype
10775 which is set on a per-instruction basis, which is the one which matters when
10776 only one data type is written.
10777 Note: this function has side-effects (e.g. filling in missing operands). All
037e8744 10778 Neon instructions should call it before performing bit encoding. */
5287ad62
JB
10779
10780static struct neon_type_el
10781neon_check_type (unsigned els, enum neon_shape ns, ...)
10782{
10783 va_list ap;
10784 unsigned i, pass, key_el = 0;
10785 unsigned types[NEON_MAX_TYPE_ELS];
10786 enum neon_el_type k_type = NT_invtype;
10787 unsigned k_size = -1u;
10788 struct neon_type_el badtype = {NT_invtype, -1};
10789 unsigned key_allowed = 0;
10790
10791 /* Optional registers in Neon instructions are always (not) in operand 1.
10792 Fill in the missing operand here, if it was omitted. */
10793 if (els > 1 && !inst.operands[1].present)
10794 inst.operands[1] = inst.operands[0];
10795
10796 /* Suck up all the varargs. */
10797 va_start (ap, ns);
10798 for (i = 0; i < els; i++)
10799 {
10800 unsigned thisarg = va_arg (ap, unsigned);
10801 if (thisarg == N_IGNORE_TYPE)
10802 {
10803 va_end (ap);
10804 return badtype;
10805 }
10806 types[i] = thisarg;
10807 if ((thisarg & N_KEY) != 0)
10808 key_el = i;
10809 }
10810 va_end (ap);
10811
dcbf9037
JB
10812 if (inst.vectype.elems > 0)
10813 for (i = 0; i < els; i++)
10814 if (inst.operands[i].vectype.type != NT_invtype)
10815 {
10816 first_error (_("types specified in both the mnemonic and operands"));
10817 return badtype;
10818 }
10819
5287ad62
JB
10820 /* Duplicate inst.vectype elements here as necessary.
10821 FIXME: No idea if this is exactly the same as the ARM assembler,
10822 particularly when an insn takes one register and one non-register
10823 operand. */
10824 if (inst.vectype.elems == 1 && els > 1)
10825 {
10826 unsigned j;
10827 inst.vectype.elems = els;
10828 inst.vectype.el[key_el] = inst.vectype.el[0];
10829 for (j = 0; j < els; j++)
dcbf9037
JB
10830 if (j != key_el)
10831 inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
10832 types[j]);
10833 }
10834 else if (inst.vectype.elems == 0 && els > 0)
10835 {
10836 unsigned j;
10837 /* No types were given after the mnemonic, so look for types specified
10838 after each operand. We allow some flexibility here; as long as the
10839 "key" operand has a type, we can infer the others. */
10840 for (j = 0; j < els; j++)
10841 if (inst.operands[j].vectype.type != NT_invtype)
10842 inst.vectype.el[j] = inst.operands[j].vectype;
10843
10844 if (inst.operands[key_el].vectype.type != NT_invtype)
5287ad62 10845 {
dcbf9037
JB
10846 for (j = 0; j < els; j++)
10847 if (inst.operands[j].vectype.type == NT_invtype)
10848 inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
10849 types[j]);
10850 }
10851 else
10852 {
10853 first_error (_("operand types can't be inferred"));
10854 return badtype;
5287ad62
JB
10855 }
10856 }
10857 else if (inst.vectype.elems != els)
10858 {
dcbf9037 10859 first_error (_("type specifier has the wrong number of parts"));
5287ad62
JB
10860 return badtype;
10861 }
10862
10863 for (pass = 0; pass < 2; pass++)
10864 {
10865 for (i = 0; i < els; i++)
10866 {
10867 unsigned thisarg = types[i];
10868 unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
10869 ? modify_types_allowed (key_allowed, thisarg) : thisarg;
10870 enum neon_el_type g_type = inst.vectype.el[i].type;
10871 unsigned g_size = inst.vectype.el[i].size;
10872
10873 /* Decay more-specific signed & unsigned types to sign-insensitive
10874 integer types if sign-specific variants are unavailable. */
10875 if ((g_type == NT_signed || g_type == NT_unsigned)
10876 && (types_allowed & N_SU_ALL) == 0)
10877 g_type = NT_integer;
10878
10879 /* If only untyped args are allowed, decay any more specific types to
10880 them. Some instructions only care about signs for some element
10881 sizes, so handle that properly. */
10882 if ((g_size == 8 && (types_allowed & N_8) != 0)
10883 || (g_size == 16 && (types_allowed & N_16) != 0)
10884 || (g_size == 32 && (types_allowed & N_32) != 0)
10885 || (g_size == 64 && (types_allowed & N_64) != 0))
10886 g_type = NT_untyped;
10887
10888 if (pass == 0)
10889 {
10890 if ((thisarg & N_KEY) != 0)
10891 {
10892 k_type = g_type;
10893 k_size = g_size;
10894 key_allowed = thisarg & ~N_KEY;
10895 }
10896 }
10897 else
10898 {
037e8744
JB
10899 if ((thisarg & N_VFP) != 0)
10900 {
10901 enum neon_shape_el regshape = neon_shape_tab[ns].el[i];
10902 unsigned regwidth = neon_shape_el_size[regshape], match;
10903
10904 /* In VFP mode, operands must match register widths. If we
10905 have a key operand, use its width, else use the width of
10906 the current operand. */
10907 if (k_size != -1u)
10908 match = k_size;
10909 else
10910 match = g_size;
10911
10912 if (regwidth != match)
10913 {
10914 first_error (_("operand size must match register width"));
10915 return badtype;
10916 }
10917 }
10918
5287ad62
JB
10919 if ((thisarg & N_EQK) == 0)
10920 {
10921 unsigned given_type = type_chk_of_el_type (g_type, g_size);
10922
10923 if ((given_type & types_allowed) == 0)
10924 {
dcbf9037 10925 first_error (_("bad type in Neon instruction"));
5287ad62
JB
10926 return badtype;
10927 }
10928 }
10929 else
10930 {
10931 enum neon_el_type mod_k_type = k_type;
10932 unsigned mod_k_size = k_size;
10933 neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
10934 if (g_type != mod_k_type || g_size != mod_k_size)
10935 {
dcbf9037 10936 first_error (_("inconsistent types in Neon instruction"));
5287ad62
JB
10937 return badtype;
10938 }
10939 }
10940 }
10941 }
10942 }
10943
10944 return inst.vectype.el[key_el];
10945}
10946
037e8744 10947/* Neon-style VFP instruction forwarding. */
5287ad62 10948
037e8744
JB
10949/* Thumb VFP instructions have 0xE in the condition field. */
10950
10951static void
10952do_vfp_cond_or_thumb (void)
5287ad62
JB
10953{
10954 if (thumb_mode)
037e8744 10955 inst.instruction |= 0xe0000000;
5287ad62 10956 else
037e8744 10957 inst.instruction |= inst.cond << 28;
5287ad62
JB
10958}
10959
037e8744
JB
10960/* Look up and encode a simple mnemonic, for use as a helper function for the
10961 Neon-style VFP syntax. This avoids duplication of bits of the insns table,
10962 etc. It is assumed that operand parsing has already been done, and that the
10963 operands are in the form expected by the given opcode (this isn't necessarily
10964 the same as the form in which they were parsed, hence some massaging must
10965 take place before this function is called).
10966 Checks current arch version against that in the looked-up opcode. */
5287ad62 10967
037e8744
JB
10968static void
10969do_vfp_nsyn_opcode (const char *opname)
5287ad62 10970{
037e8744
JB
10971 const struct asm_opcode *opcode;
10972
10973 opcode = hash_find (arm_ops_hsh, opname);
5287ad62 10974
037e8744
JB
10975 if (!opcode)
10976 abort ();
5287ad62 10977
037e8744
JB
10978 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
10979 thumb_mode ? *opcode->tvariant : *opcode->avariant),
10980 _(BAD_FPU));
5287ad62 10981
037e8744
JB
10982 if (thumb_mode)
10983 {
10984 inst.instruction = opcode->tvalue;
10985 opcode->tencode ();
10986 }
10987 else
10988 {
10989 inst.instruction = (inst.cond << 28) | opcode->avalue;
10990 opcode->aencode ();
10991 }
10992}
5287ad62
JB
10993
10994static void
037e8744 10995do_vfp_nsyn_add_sub (enum neon_shape rs)
5287ad62 10996{
037e8744
JB
10997 int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
10998
10999 if (rs == NS_FFF)
11000 {
11001 if (is_add)
11002 do_vfp_nsyn_opcode ("fadds");
11003 else
11004 do_vfp_nsyn_opcode ("fsubs");
11005 }
11006 else
11007 {
11008 if (is_add)
11009 do_vfp_nsyn_opcode ("faddd");
11010 else
11011 do_vfp_nsyn_opcode ("fsubd");
11012 }
11013}
11014
11015/* Check operand types to see if this is a VFP instruction, and if so call
11016 PFN (). */
11017
11018static int
11019try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
11020{
11021 enum neon_shape rs;
11022 struct neon_type_el et;
11023
11024 switch (args)
11025 {
11026 case 2:
11027 rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
11028 et = neon_check_type (2, rs,
11029 N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
11030 break;
11031
11032 case 3:
11033 rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
11034 et = neon_check_type (3, rs,
11035 N_EQK | N_VFP, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
11036 break;
11037
11038 default:
11039 abort ();
11040 }
11041
11042 if (et.type != NT_invtype)
11043 {
11044 pfn (rs);
11045 return SUCCESS;
11046 }
11047 else
11048 inst.error = NULL;
11049
11050 return FAIL;
11051}
11052
11053static void
11054do_vfp_nsyn_mla_mls (enum neon_shape rs)
11055{
11056 int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
11057
11058 if (rs == NS_FFF)
11059 {
11060 if (is_mla)
11061 do_vfp_nsyn_opcode ("fmacs");
11062 else
11063 do_vfp_nsyn_opcode ("fmscs");
11064 }
11065 else
11066 {
11067 if (is_mla)
11068 do_vfp_nsyn_opcode ("fmacd");
11069 else
11070 do_vfp_nsyn_opcode ("fmscd");
11071 }
11072}
11073
11074static void
11075do_vfp_nsyn_mul (enum neon_shape rs)
11076{
11077 if (rs == NS_FFF)
11078 do_vfp_nsyn_opcode ("fmuls");
11079 else
11080 do_vfp_nsyn_opcode ("fmuld");
11081}
11082
11083static void
11084do_vfp_nsyn_abs_neg (enum neon_shape rs)
11085{
11086 int is_neg = (inst.instruction & 0x80) != 0;
11087 neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_VFP | N_KEY);
11088
11089 if (rs == NS_FF)
11090 {
11091 if (is_neg)
11092 do_vfp_nsyn_opcode ("fnegs");
11093 else
11094 do_vfp_nsyn_opcode ("fabss");
11095 }
11096 else
11097 {
11098 if (is_neg)
11099 do_vfp_nsyn_opcode ("fnegd");
11100 else
11101 do_vfp_nsyn_opcode ("fabsd");
11102 }
11103}
11104
11105/* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
11106 insns belong to Neon, and are handled elsewhere. */
11107
11108static void
11109do_vfp_nsyn_ldm_stm (int is_dbmode)
11110{
11111 int is_ldm = (inst.instruction & (1 << 20)) != 0;
11112 if (is_ldm)
11113 {
11114 if (is_dbmode)
11115 do_vfp_nsyn_opcode ("fldmdbs");
11116 else
11117 do_vfp_nsyn_opcode ("fldmias");
11118 }
11119 else
11120 {
11121 if (is_dbmode)
11122 do_vfp_nsyn_opcode ("fstmdbs");
11123 else
11124 do_vfp_nsyn_opcode ("fstmias");
11125 }
11126}
11127
037e8744
JB
11128static void
11129do_vfp_nsyn_sqrt (void)
11130{
11131 enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
11132 neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
11133
11134 if (rs == NS_FF)
11135 do_vfp_nsyn_opcode ("fsqrts");
11136 else
11137 do_vfp_nsyn_opcode ("fsqrtd");
11138}
11139
11140static void
11141do_vfp_nsyn_div (void)
11142{
11143 enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
11144 neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
11145 N_F32 | N_F64 | N_KEY | N_VFP);
11146
11147 if (rs == NS_FFF)
11148 do_vfp_nsyn_opcode ("fdivs");
11149 else
11150 do_vfp_nsyn_opcode ("fdivd");
11151}
11152
11153static void
11154do_vfp_nsyn_nmul (void)
11155{
11156 enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
11157 neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
11158 N_F32 | N_F64 | N_KEY | N_VFP);
11159
11160 if (rs == NS_FFF)
11161 {
11162 inst.instruction = NEON_ENC_SINGLE (inst.instruction);
11163 do_vfp_sp_dyadic ();
11164 }
11165 else
11166 {
11167 inst.instruction = NEON_ENC_DOUBLE (inst.instruction);
11168 do_vfp_dp_rd_rn_rm ();
11169 }
11170 do_vfp_cond_or_thumb ();
11171}
11172
11173static void
11174do_vfp_nsyn_cmp (void)
11175{
11176 if (inst.operands[1].isreg)
11177 {
11178 enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
11179 neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
11180
11181 if (rs == NS_FF)
11182 {
11183 inst.instruction = NEON_ENC_SINGLE (inst.instruction);
11184 do_vfp_sp_monadic ();
11185 }
11186 else
11187 {
11188 inst.instruction = NEON_ENC_DOUBLE (inst.instruction);
11189 do_vfp_dp_rd_rm ();
11190 }
11191 }
11192 else
11193 {
11194 enum neon_shape rs = neon_select_shape (NS_FI, NS_DI, NS_NULL);
11195 neon_check_type (2, rs, N_F32 | N_F64 | N_KEY | N_VFP, N_EQK);
11196
11197 switch (inst.instruction & 0x0fffffff)
11198 {
11199 case N_MNEM_vcmp:
11200 inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
11201 break;
11202 case N_MNEM_vcmpe:
11203 inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
11204 break;
11205 default:
11206 abort ();
11207 }
11208
11209 if (rs == NS_FI)
11210 {
11211 inst.instruction = NEON_ENC_SINGLE (inst.instruction);
11212 do_vfp_sp_compare_z ();
11213 }
11214 else
11215 {
11216 inst.instruction = NEON_ENC_DOUBLE (inst.instruction);
11217 do_vfp_dp_rd ();
11218 }
11219 }
11220 do_vfp_cond_or_thumb ();
11221}
11222
11223static void
11224nsyn_insert_sp (void)
11225{
11226 inst.operands[1] = inst.operands[0];
11227 memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
11228 inst.operands[0].reg = 13;
11229 inst.operands[0].isreg = 1;
11230 inst.operands[0].writeback = 1;
11231 inst.operands[0].present = 1;
11232}
11233
11234static void
11235do_vfp_nsyn_push (void)
11236{
11237 nsyn_insert_sp ();
11238 if (inst.operands[1].issingle)
11239 do_vfp_nsyn_opcode ("fstmdbs");
11240 else
11241 do_vfp_nsyn_opcode ("fstmdbd");
11242}
11243
11244static void
11245do_vfp_nsyn_pop (void)
11246{
11247 nsyn_insert_sp ();
11248 if (inst.operands[1].issingle)
11249 do_vfp_nsyn_opcode ("fldmdbs");
11250 else
11251 do_vfp_nsyn_opcode ("fldmdbd");
11252}
11253
11254/* Fix up Neon data-processing instructions, ORing in the correct bits for
11255 ARM mode or Thumb mode and moving the encoded bit 24 to bit 28. */
11256
11257static unsigned
11258neon_dp_fixup (unsigned i)
11259{
11260 if (thumb_mode)
11261 {
11262 /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode. */
11263 if (i & (1 << 24))
11264 i |= 1 << 28;
11265
11266 i &= ~(1 << 24);
11267
11268 i |= 0xef000000;
11269 }
11270 else
11271 i |= 0xf2000000;
11272
11273 return i;
11274}
11275
11276/* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
11277 (0, 1, 2, 3). */
11278
11279static unsigned
11280neon_logbits (unsigned x)
11281{
11282 return ffs (x) - 4;
11283}
11284
11285#define LOW4(R) ((R) & 0xf)
11286#define HI1(R) (((R) >> 4) & 1)
11287
11288/* Encode insns with bit pattern:
11289
11290 |28/24|23|22 |21 20|19 16|15 12|11 8|7|6|5|4|3 0|
11291 | U |x |D |size | Rn | Rd |x x x x|N|Q|M|x| Rm |
11292
11293 SIZE is passed in bits. -1 means size field isn't changed, in case it has a
11294 different meaning for some instruction. */
11295
11296static void
11297neon_three_same (int isquad, int ubit, int size)
11298{
11299 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
11300 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
11301 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
11302 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
11303 inst.instruction |= LOW4 (inst.operands[2].reg);
11304 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
11305 inst.instruction |= (isquad != 0) << 6;
11306 inst.instruction |= (ubit != 0) << 24;
11307 if (size != -1)
11308 inst.instruction |= neon_logbits (size) << 20;
11309
11310 inst.instruction = neon_dp_fixup (inst.instruction);
11311}
11312
11313/* Encode instructions of the form:
11314
11315 |28/24|23|22|21 20|19 18|17 16|15 12|11 7|6|5|4|3 0|
11316 | U |x |D |x x |size |x x | Rd |x x x x x|Q|M|x| Rm |
5287ad62
JB
11317
11318 Don't write size if SIZE == -1. */
11319
11320static void
11321neon_two_same (int qbit, int ubit, int size)
11322{
11323 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
11324 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
11325 inst.instruction |= LOW4 (inst.operands[1].reg);
11326 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
11327 inst.instruction |= (qbit != 0) << 6;
11328 inst.instruction |= (ubit != 0) << 24;
11329
11330 if (size != -1)
11331 inst.instruction |= neon_logbits (size) << 18;
11332
11333 inst.instruction = neon_dp_fixup (inst.instruction);
11334}
11335
11336/* Neon instruction encoders, in approximate order of appearance. */
11337
11338static void
11339do_neon_dyadic_i_su (void)
11340{
037e8744 11341 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
11342 struct neon_type_el et = neon_check_type (3, rs,
11343 N_EQK, N_EQK, N_SU_32 | N_KEY);
037e8744 11344 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
11345}
11346
11347static void
11348do_neon_dyadic_i64_su (void)
11349{
037e8744 11350 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
11351 struct neon_type_el et = neon_check_type (3, rs,
11352 N_EQK, N_EQK, N_SU_ALL | N_KEY);
037e8744 11353 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
11354}
11355
11356static void
11357neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
11358 unsigned immbits)
11359{
11360 unsigned size = et.size >> 3;
11361 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
11362 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
11363 inst.instruction |= LOW4 (inst.operands[1].reg);
11364 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
11365 inst.instruction |= (isquad != 0) << 6;
11366 inst.instruction |= immbits << 16;
11367 inst.instruction |= (size >> 3) << 7;
11368 inst.instruction |= (size & 0x7) << 19;
11369 if (write_ubit)
11370 inst.instruction |= (uval != 0) << 24;
11371
11372 inst.instruction = neon_dp_fixup (inst.instruction);
11373}
11374
11375static void
11376do_neon_shl_imm (void)
11377{
11378 if (!inst.operands[2].isreg)
11379 {
037e8744 11380 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
11381 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
11382 inst.instruction = NEON_ENC_IMMED (inst.instruction);
037e8744 11383 neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm);
5287ad62
JB
11384 }
11385 else
11386 {
037e8744 11387 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
11388 struct neon_type_el et = neon_check_type (3, rs,
11389 N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
11390 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
037e8744 11391 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
11392 }
11393}
11394
11395static void
11396do_neon_qshl_imm (void)
11397{
11398 if (!inst.operands[2].isreg)
11399 {
037e8744 11400 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
11401 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
11402 inst.instruction = NEON_ENC_IMMED (inst.instruction);
037e8744 11403 neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
5287ad62
JB
11404 inst.operands[2].imm);
11405 }
11406 else
11407 {
037e8744 11408 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
11409 struct neon_type_el et = neon_check_type (3, rs,
11410 N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
11411 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
037e8744 11412 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
11413 }
11414}
11415
11416static int
11417neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
11418{
036dc3f7
PB
11419 /* Handle .I8 pseudo-instructions. */
11420 if (size == 8)
5287ad62 11421 {
5287ad62
JB
11422 /* Unfortunately, this will make everything apart from zero out-of-range.
11423 FIXME is this the intended semantics? There doesn't seem much point in
11424 accepting .I8 if so. */
11425 immediate |= immediate << 8;
11426 size = 16;
036dc3f7
PB
11427 }
11428
11429 if (size >= 32)
11430 {
11431 if (immediate == (immediate & 0x000000ff))
11432 {
11433 *immbits = immediate;
11434 return 0x1;
11435 }
11436 else if (immediate == (immediate & 0x0000ff00))
11437 {
11438 *immbits = immediate >> 8;
11439 return 0x3;
11440 }
11441 else if (immediate == (immediate & 0x00ff0000))
11442 {
11443 *immbits = immediate >> 16;
11444 return 0x5;
11445 }
11446 else if (immediate == (immediate & 0xff000000))
11447 {
11448 *immbits = immediate >> 24;
11449 return 0x7;
11450 }
11451 if ((immediate & 0xffff) != (immediate >> 16))
11452 goto bad_immediate;
11453 immediate &= 0xffff;
5287ad62
JB
11454 }
11455
11456 if (immediate == (immediate & 0x000000ff))
11457 {
11458 *immbits = immediate;
036dc3f7 11459 return 0x9;
5287ad62
JB
11460 }
11461 else if (immediate == (immediate & 0x0000ff00))
11462 {
11463 *immbits = immediate >> 8;
036dc3f7 11464 return 0xb;
5287ad62
JB
11465 }
11466
11467 bad_immediate:
dcbf9037 11468 first_error (_("immediate value out of range"));
5287ad62
JB
11469 return FAIL;
11470}
11471
11472/* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
11473 A, B, C, D. */
11474
11475static int
11476neon_bits_same_in_bytes (unsigned imm)
11477{
11478 return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
11479 && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
11480 && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
11481 && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
11482}
11483
11484/* For immediate of above form, return 0bABCD. */
11485
11486static unsigned
11487neon_squash_bits (unsigned imm)
11488{
11489 return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
11490 | ((imm & 0x01000000) >> 21);
11491}
11492
136da414 11493/* Compress quarter-float representation to 0b...000 abcdefgh. */
5287ad62
JB
11494
11495static unsigned
11496neon_qfloat_bits (unsigned imm)
11497{
136da414 11498 return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
5287ad62
JB
11499}
11500
11501/* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
11502 the instruction. *OP is passed as the initial value of the op field, and
11503 may be set to a different value depending on the constant (i.e.
11504 "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
036dc3f7
PB
11505 MVN). If the immediate looks like a repeated parttern then also
11506 try smaller element sizes. */
5287ad62
JB
11507
11508static int
11509neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, unsigned *immbits,
136da414 11510 int *op, int size, enum neon_el_type type)
5287ad62 11511{
136da414
JB
11512 if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
11513 {
11514 if (size != 32 || *op == 1)
11515 return FAIL;
11516 *immbits = neon_qfloat_bits (immlo);
11517 return 0xf;
11518 }
036dc3f7
PB
11519
11520 if (size == 64)
5287ad62 11521 {
036dc3f7
PB
11522 if (neon_bits_same_in_bytes (immhi)
11523 && neon_bits_same_in_bytes (immlo))
11524 {
11525 if (*op == 1)
11526 return FAIL;
11527 *immbits = (neon_squash_bits (immhi) << 4)
11528 | neon_squash_bits (immlo);
11529 *op = 1;
11530 return 0xe;
11531 }
11532
11533 if (immhi != immlo)
11534 return FAIL;
5287ad62 11535 }
036dc3f7
PB
11536
11537 if (size >= 32)
5287ad62 11538 {
036dc3f7
PB
11539 if (immlo == (immlo & 0x000000ff))
11540 {
11541 *immbits = immlo;
11542 return 0x0;
11543 }
11544 else if (immlo == (immlo & 0x0000ff00))
11545 {
11546 *immbits = immlo >> 8;
11547 return 0x2;
11548 }
11549 else if (immlo == (immlo & 0x00ff0000))
11550 {
11551 *immbits = immlo >> 16;
11552 return 0x4;
11553 }
11554 else if (immlo == (immlo & 0xff000000))
11555 {
11556 *immbits = immlo >> 24;
11557 return 0x6;
11558 }
11559 else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
11560 {
11561 *immbits = (immlo >> 8) & 0xff;
11562 return 0xc;
11563 }
11564 else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
11565 {
11566 *immbits = (immlo >> 16) & 0xff;
11567 return 0xd;
11568 }
11569
11570 if ((immlo & 0xffff) != (immlo >> 16))
11571 return FAIL;
11572 immlo &= 0xffff;
5287ad62 11573 }
036dc3f7
PB
11574
11575 if (size >= 16)
5287ad62 11576 {
036dc3f7
PB
11577 if (immlo == (immlo & 0x000000ff))
11578 {
11579 *immbits = immlo;
11580 return 0x8;
11581 }
11582 else if (immlo == (immlo & 0x0000ff00))
11583 {
11584 *immbits = immlo >> 8;
11585 return 0xa;
11586 }
11587
11588 if ((immlo & 0xff) != (immlo >> 8))
11589 return FAIL;
11590 immlo &= 0xff;
5287ad62 11591 }
036dc3f7
PB
11592
11593 if (immlo == (immlo & 0x000000ff))
5287ad62 11594 {
036dc3f7
PB
11595 /* Don't allow MVN with 8-bit immediate. */
11596 if (*op == 1)
11597 return FAIL;
11598 *immbits = immlo;
11599 return 0xe;
5287ad62 11600 }
5287ad62
JB
11601
11602 return FAIL;
11603}
11604
11605/* Write immediate bits [7:0] to the following locations:
11606
11607 |28/24|23 19|18 16|15 4|3 0|
11608 | 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|
11609
11610 This function is used by VMOV/VMVN/VORR/VBIC. */
11611
11612static void
11613neon_write_immbits (unsigned immbits)
11614{
11615 inst.instruction |= immbits & 0xf;
11616 inst.instruction |= ((immbits >> 4) & 0x7) << 16;
11617 inst.instruction |= ((immbits >> 7) & 0x1) << 24;
11618}
11619
11620/* Invert low-order SIZE bits of XHI:XLO. */
11621
11622static void
11623neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
11624{
11625 unsigned immlo = xlo ? *xlo : 0;
11626 unsigned immhi = xhi ? *xhi : 0;
11627
11628 switch (size)
11629 {
11630 case 8:
11631 immlo = (~immlo) & 0xff;
11632 break;
11633
11634 case 16:
11635 immlo = (~immlo) & 0xffff;
11636 break;
11637
11638 case 64:
11639 immhi = (~immhi) & 0xffffffff;
11640 /* fall through. */
11641
11642 case 32:
11643 immlo = (~immlo) & 0xffffffff;
11644 break;
11645
11646 default:
11647 abort ();
11648 }
11649
11650 if (xlo)
11651 *xlo = immlo;
11652
11653 if (xhi)
11654 *xhi = immhi;
11655}
11656
11657static void
11658do_neon_logic (void)
11659{
11660 if (inst.operands[2].present && inst.operands[2].isreg)
11661 {
037e8744 11662 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
11663 neon_check_type (3, rs, N_IGNORE_TYPE);
11664 /* U bit and size field were set as part of the bitmask. */
11665 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
037e8744 11666 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
11667 }
11668 else
11669 {
037e8744
JB
11670 enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
11671 struct neon_type_el et = neon_check_type (2, rs,
11672 N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
5287ad62
JB
11673 enum neon_opc opcode = inst.instruction & 0x0fffffff;
11674 unsigned immbits;
11675 int cmode;
11676
11677 if (et.type == NT_invtype)
11678 return;
11679
11680 inst.instruction = NEON_ENC_IMMED (inst.instruction);
11681
036dc3f7
PB
11682 immbits = inst.operands[1].imm;
11683 if (et.size == 64)
11684 {
11685 /* .i64 is a pseudo-op, so the immediate must be a repeating
11686 pattern. */
11687 if (immbits != (inst.operands[1].regisimm ?
11688 inst.operands[1].reg : 0))
11689 {
11690 /* Set immbits to an invalid constant. */
11691 immbits = 0xdeadbeef;
11692 }
11693 }
11694
5287ad62
JB
11695 switch (opcode)
11696 {
11697 case N_MNEM_vbic:
036dc3f7 11698 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
5287ad62
JB
11699 break;
11700
11701 case N_MNEM_vorr:
036dc3f7 11702 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
5287ad62
JB
11703 break;
11704
11705 case N_MNEM_vand:
11706 /* Pseudo-instruction for VBIC. */
5287ad62
JB
11707 neon_invert_size (&immbits, 0, et.size);
11708 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
11709 break;
11710
11711 case N_MNEM_vorn:
11712 /* Pseudo-instruction for VORR. */
5287ad62
JB
11713 neon_invert_size (&immbits, 0, et.size);
11714 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
11715 break;
11716
11717 default:
11718 abort ();
11719 }
11720
11721 if (cmode == FAIL)
11722 return;
11723
037e8744 11724 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
11725 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
11726 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
11727 inst.instruction |= cmode << 8;
11728 neon_write_immbits (immbits);
11729
11730 inst.instruction = neon_dp_fixup (inst.instruction);
11731 }
11732}
11733
11734static void
11735do_neon_bitfield (void)
11736{
037e8744 11737 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
dcbf9037 11738 neon_check_type (3, rs, N_IGNORE_TYPE);
037e8744 11739 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
11740}
11741
11742static void
dcbf9037
JB
11743neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
11744 unsigned destbits)
5287ad62 11745{
037e8744 11746 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
dcbf9037
JB
11747 struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
11748 types | N_KEY);
5287ad62
JB
11749 if (et.type == NT_float)
11750 {
11751 inst.instruction = NEON_ENC_FLOAT (inst.instruction);
037e8744 11752 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
11753 }
11754 else
11755 {
11756 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
037e8744 11757 neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
5287ad62
JB
11758 }
11759}
11760
11761static void
11762do_neon_dyadic_if_su (void)
11763{
dcbf9037 11764 neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
5287ad62
JB
11765}
11766
11767static void
11768do_neon_dyadic_if_su_d (void)
11769{
11770 /* This version only allow D registers, but that constraint is enforced during
11771 operand parsing so we don't need to do anything extra here. */
dcbf9037 11772 neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
5287ad62
JB
11773}
11774
5287ad62
JB
11775static void
11776do_neon_dyadic_if_i_d (void)
11777{
428e3f1f
PB
11778 /* The "untyped" case can't happen. Do this to stop the "U" bit being
11779 affected if we specify unsigned args. */
11780 neon_dyadic_misc (NT_untyped, N_IF_32, 0);
5287ad62
JB
11781}
11782
037e8744
JB
11783enum vfp_or_neon_is_neon_bits
11784{
11785 NEON_CHECK_CC = 1,
11786 NEON_CHECK_ARCH = 2
11787};
11788
11789/* Call this function if an instruction which may have belonged to the VFP or
11790 Neon instruction sets, but turned out to be a Neon instruction (due to the
11791 operand types involved, etc.). We have to check and/or fix-up a couple of
11792 things:
11793
11794 - Make sure the user hasn't attempted to make a Neon instruction
11795 conditional.
11796 - Alter the value in the condition code field if necessary.
11797 - Make sure that the arch supports Neon instructions.
11798
11799 Which of these operations take place depends on bits from enum
11800 vfp_or_neon_is_neon_bits.
11801
11802 WARNING: This function has side effects! If NEON_CHECK_CC is used and the
11803 current instruction's condition is COND_ALWAYS, the condition field is
11804 changed to inst.uncond_value. This is necessary because instructions shared
11805 between VFP and Neon may be conditional for the VFP variants only, and the
11806 unconditional Neon version must have, e.g., 0xF in the condition field. */
11807
11808static int
11809vfp_or_neon_is_neon (unsigned check)
11810{
11811 /* Conditions are always legal in Thumb mode (IT blocks). */
11812 if (!thumb_mode && (check & NEON_CHECK_CC))
11813 {
11814 if (inst.cond != COND_ALWAYS)
11815 {
11816 first_error (_(BAD_COND));
11817 return FAIL;
11818 }
11819 if (inst.uncond_value != -1)
11820 inst.instruction |= inst.uncond_value << 28;
11821 }
11822
11823 if ((check & NEON_CHECK_ARCH)
11824 && !ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1))
11825 {
11826 first_error (_(BAD_FPU));
11827 return FAIL;
11828 }
11829
11830 return SUCCESS;
11831}
11832
5287ad62
JB
11833static void
11834do_neon_addsub_if_i (void)
11835{
037e8744
JB
11836 if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
11837 return;
11838
11839 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
11840 return;
11841
5287ad62
JB
11842 /* The "untyped" case can't happen. Do this to stop the "U" bit being
11843 affected if we specify unsigned args. */
dcbf9037 11844 neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
5287ad62
JB
11845}
11846
11847/* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
11848 result to be:
11849 V<op> A,B (A is operand 0, B is operand 2)
11850 to mean:
11851 V<op> A,B,A
11852 not:
11853 V<op> A,B,B
11854 so handle that case specially. */
11855
11856static void
11857neon_exchange_operands (void)
11858{
11859 void *scratch = alloca (sizeof (inst.operands[0]));
11860 if (inst.operands[1].present)
11861 {
11862 /* Swap operands[1] and operands[2]. */
11863 memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
11864 inst.operands[1] = inst.operands[2];
11865 memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
11866 }
11867 else
11868 {
11869 inst.operands[1] = inst.operands[2];
11870 inst.operands[2] = inst.operands[0];
11871 }
11872}
11873
11874static void
11875neon_compare (unsigned regtypes, unsigned immtypes, int invert)
11876{
11877 if (inst.operands[2].isreg)
11878 {
11879 if (invert)
11880 neon_exchange_operands ();
dcbf9037 11881 neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
5287ad62
JB
11882 }
11883 else
11884 {
037e8744 11885 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
dcbf9037
JB
11886 struct neon_type_el et = neon_check_type (2, rs,
11887 N_EQK | N_SIZ, immtypes | N_KEY);
5287ad62
JB
11888
11889 inst.instruction = NEON_ENC_IMMED (inst.instruction);
11890 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
11891 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
11892 inst.instruction |= LOW4 (inst.operands[1].reg);
11893 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
037e8744 11894 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
11895 inst.instruction |= (et.type == NT_float) << 10;
11896 inst.instruction |= neon_logbits (et.size) << 18;
11897
11898 inst.instruction = neon_dp_fixup (inst.instruction);
11899 }
11900}
11901
11902static void
11903do_neon_cmp (void)
11904{
11905 neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, FALSE);
11906}
11907
11908static void
11909do_neon_cmp_inv (void)
11910{
11911 neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, TRUE);
11912}
11913
11914static void
11915do_neon_ceq (void)
11916{
11917 neon_compare (N_IF_32, N_IF_32, FALSE);
11918}
11919
11920/* For multiply instructions, we have the possibility of 16-bit or 32-bit
11921 scalars, which are encoded in 5 bits, M : Rm.
11922 For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
11923 M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
11924 index in M. */
11925
11926static unsigned
11927neon_scalar_for_mul (unsigned scalar, unsigned elsize)
11928{
dcbf9037
JB
11929 unsigned regno = NEON_SCALAR_REG (scalar);
11930 unsigned elno = NEON_SCALAR_INDEX (scalar);
5287ad62
JB
11931
11932 switch (elsize)
11933 {
11934 case 16:
11935 if (regno > 7 || elno > 3)
11936 goto bad_scalar;
11937 return regno | (elno << 3);
11938
11939 case 32:
11940 if (regno > 15 || elno > 1)
11941 goto bad_scalar;
11942 return regno | (elno << 4);
11943
11944 default:
11945 bad_scalar:
dcbf9037 11946 first_error (_("scalar out of range for multiply instruction"));
5287ad62
JB
11947 }
11948
11949 return 0;
11950}
11951
11952/* Encode multiply / multiply-accumulate scalar instructions. */
11953
11954static void
11955neon_mul_mac (struct neon_type_el et, int ubit)
11956{
dcbf9037
JB
11957 unsigned scalar;
11958
11959 /* Give a more helpful error message if we have an invalid type. */
11960 if (et.type == NT_invtype)
11961 return;
11962
11963 scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
5287ad62
JB
11964 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
11965 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
11966 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
11967 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
11968 inst.instruction |= LOW4 (scalar);
11969 inst.instruction |= HI1 (scalar) << 5;
11970 inst.instruction |= (et.type == NT_float) << 8;
11971 inst.instruction |= neon_logbits (et.size) << 20;
11972 inst.instruction |= (ubit != 0) << 24;
11973
11974 inst.instruction = neon_dp_fixup (inst.instruction);
11975}
11976
11977static void
11978do_neon_mac_maybe_scalar (void)
11979{
037e8744
JB
11980 if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
11981 return;
11982
11983 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
11984 return;
11985
5287ad62
JB
11986 if (inst.operands[2].isscalar)
11987 {
037e8744 11988 enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
5287ad62
JB
11989 struct neon_type_el et = neon_check_type (3, rs,
11990 N_EQK, N_EQK, N_I16 | N_I32 | N_F32 | N_KEY);
11991 inst.instruction = NEON_ENC_SCALAR (inst.instruction);
037e8744 11992 neon_mul_mac (et, neon_quad (rs));
5287ad62
JB
11993 }
11994 else
428e3f1f
PB
11995 {
11996 /* The "untyped" case can't happen. Do this to stop the "U" bit being
11997 affected if we specify unsigned args. */
11998 neon_dyadic_misc (NT_untyped, N_IF_32, 0);
11999 }
5287ad62
JB
12000}
12001
12002static void
12003do_neon_tst (void)
12004{
037e8744 12005 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
12006 struct neon_type_el et = neon_check_type (3, rs,
12007 N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
037e8744 12008 neon_three_same (neon_quad (rs), 0, et.size);
5287ad62
JB
12009}
12010
12011/* VMUL with 3 registers allows the P8 type. The scalar version supports the
12012 same types as the MAC equivalents. The polynomial type for this instruction
12013 is encoded the same as the integer type. */
12014
12015static void
12016do_neon_mul (void)
12017{
037e8744
JB
12018 if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
12019 return;
12020
12021 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
12022 return;
12023
5287ad62
JB
12024 if (inst.operands[2].isscalar)
12025 do_neon_mac_maybe_scalar ();
12026 else
dcbf9037 12027 neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F32 | N_P8, 0);
5287ad62
JB
12028}
12029
12030static void
12031do_neon_qdmulh (void)
12032{
12033 if (inst.operands[2].isscalar)
12034 {
037e8744 12035 enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
5287ad62
JB
12036 struct neon_type_el et = neon_check_type (3, rs,
12037 N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
12038 inst.instruction = NEON_ENC_SCALAR (inst.instruction);
037e8744 12039 neon_mul_mac (et, neon_quad (rs));
5287ad62
JB
12040 }
12041 else
12042 {
037e8744 12043 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
12044 struct neon_type_el et = neon_check_type (3, rs,
12045 N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
12046 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12047 /* The U bit (rounding) comes from bit mask. */
037e8744 12048 neon_three_same (neon_quad (rs), 0, et.size);
5287ad62
JB
12049 }
12050}
12051
12052static void
12053do_neon_fcmp_absolute (void)
12054{
037e8744 12055 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
12056 neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
12057 /* Size field comes from bit mask. */
037e8744 12058 neon_three_same (neon_quad (rs), 1, -1);
5287ad62
JB
12059}
12060
12061static void
12062do_neon_fcmp_absolute_inv (void)
12063{
12064 neon_exchange_operands ();
12065 do_neon_fcmp_absolute ();
12066}
12067
12068static void
12069do_neon_step (void)
12070{
037e8744 12071 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62 12072 neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
037e8744 12073 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
12074}
12075
12076static void
12077do_neon_abs_neg (void)
12078{
037e8744
JB
12079 enum neon_shape rs;
12080 struct neon_type_el et;
12081
12082 if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
12083 return;
12084
12085 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
12086 return;
12087
12088 rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
12089 et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_F32 | N_KEY);
12090
5287ad62
JB
12091 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12092 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12093 inst.instruction |= LOW4 (inst.operands[1].reg);
12094 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
037e8744 12095 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
12096 inst.instruction |= (et.type == NT_float) << 10;
12097 inst.instruction |= neon_logbits (et.size) << 18;
12098
12099 inst.instruction = neon_dp_fixup (inst.instruction);
12100}
12101
12102static void
12103do_neon_sli (void)
12104{
037e8744 12105 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
12106 struct neon_type_el et = neon_check_type (2, rs,
12107 N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
12108 int imm = inst.operands[2].imm;
12109 constraint (imm < 0 || (unsigned)imm >= et.size,
12110 _("immediate out of range for insert"));
037e8744 12111 neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
5287ad62
JB
12112}
12113
12114static void
12115do_neon_sri (void)
12116{
037e8744 12117 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
12118 struct neon_type_el et = neon_check_type (2, rs,
12119 N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
12120 int imm = inst.operands[2].imm;
12121 constraint (imm < 1 || (unsigned)imm > et.size,
12122 _("immediate out of range for insert"));
037e8744 12123 neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
5287ad62
JB
12124}
12125
12126static void
12127do_neon_qshlu_imm (void)
12128{
037e8744 12129 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
12130 struct neon_type_el et = neon_check_type (2, rs,
12131 N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
12132 int imm = inst.operands[2].imm;
12133 constraint (imm < 0 || (unsigned)imm >= et.size,
12134 _("immediate out of range for shift"));
12135 /* Only encodes the 'U present' variant of the instruction.
12136 In this case, signed types have OP (bit 8) set to 0.
12137 Unsigned types have OP set to 1. */
12138 inst.instruction |= (et.type == NT_unsigned) << 8;
12139 /* The rest of the bits are the same as other immediate shifts. */
037e8744 12140 neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
5287ad62
JB
12141}
12142
12143static void
12144do_neon_qmovn (void)
12145{
12146 struct neon_type_el et = neon_check_type (2, NS_DQ,
12147 N_EQK | N_HLF, N_SU_16_64 | N_KEY);
12148 /* Saturating move where operands can be signed or unsigned, and the
12149 destination has the same signedness. */
12150 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12151 if (et.type == NT_unsigned)
12152 inst.instruction |= 0xc0;
12153 else
12154 inst.instruction |= 0x80;
12155 neon_two_same (0, 1, et.size / 2);
12156}
12157
12158static void
12159do_neon_qmovun (void)
12160{
12161 struct neon_type_el et = neon_check_type (2, NS_DQ,
12162 N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
12163 /* Saturating move with unsigned results. Operands must be signed. */
12164 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12165 neon_two_same (0, 1, et.size / 2);
12166}
12167
12168static void
12169do_neon_rshift_sat_narrow (void)
12170{
12171 /* FIXME: Types for narrowing. If operands are signed, results can be signed
12172 or unsigned. If operands are unsigned, results must also be unsigned. */
12173 struct neon_type_el et = neon_check_type (2, NS_DQI,
12174 N_EQK | N_HLF, N_SU_16_64 | N_KEY);
12175 int imm = inst.operands[2].imm;
12176 /* This gets the bounds check, size encoding and immediate bits calculation
12177 right. */
12178 et.size /= 2;
12179
12180 /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
12181 VQMOVN.I<size> <Dd>, <Qm>. */
12182 if (imm == 0)
12183 {
12184 inst.operands[2].present = 0;
12185 inst.instruction = N_MNEM_vqmovn;
12186 do_neon_qmovn ();
12187 return;
12188 }
12189
12190 constraint (imm < 1 || (unsigned)imm > et.size,
12191 _("immediate out of range"));
12192 neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
12193}
12194
12195static void
12196do_neon_rshift_sat_narrow_u (void)
12197{
12198 /* FIXME: Types for narrowing. If operands are signed, results can be signed
12199 or unsigned. If operands are unsigned, results must also be unsigned. */
12200 struct neon_type_el et = neon_check_type (2, NS_DQI,
12201 N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
12202 int imm = inst.operands[2].imm;
12203 /* This gets the bounds check, size encoding and immediate bits calculation
12204 right. */
12205 et.size /= 2;
12206
12207 /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
12208 VQMOVUN.I<size> <Dd>, <Qm>. */
12209 if (imm == 0)
12210 {
12211 inst.operands[2].present = 0;
12212 inst.instruction = N_MNEM_vqmovun;
12213 do_neon_qmovun ();
12214 return;
12215 }
12216
12217 constraint (imm < 1 || (unsigned)imm > et.size,
12218 _("immediate out of range"));
12219 /* FIXME: The manual is kind of unclear about what value U should have in
12220 VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
12221 must be 1. */
12222 neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
12223}
12224
12225static void
12226do_neon_movn (void)
12227{
12228 struct neon_type_el et = neon_check_type (2, NS_DQ,
12229 N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
12230 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12231 neon_two_same (0, 1, et.size / 2);
12232}
12233
12234static void
12235do_neon_rshift_narrow (void)
12236{
12237 struct neon_type_el et = neon_check_type (2, NS_DQI,
12238 N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
12239 int imm = inst.operands[2].imm;
12240 /* This gets the bounds check, size encoding and immediate bits calculation
12241 right. */
12242 et.size /= 2;
12243
12244 /* If immediate is zero then we are a pseudo-instruction for
12245 VMOVN.I<size> <Dd>, <Qm> */
12246 if (imm == 0)
12247 {
12248 inst.operands[2].present = 0;
12249 inst.instruction = N_MNEM_vmovn;
12250 do_neon_movn ();
12251 return;
12252 }
12253
12254 constraint (imm < 1 || (unsigned)imm > et.size,
12255 _("immediate out of range for narrowing operation"));
12256 neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
12257}
12258
12259static void
12260do_neon_shll (void)
12261{
12262 /* FIXME: Type checking when lengthening. */
12263 struct neon_type_el et = neon_check_type (2, NS_QDI,
12264 N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
12265 unsigned imm = inst.operands[2].imm;
12266
12267 if (imm == et.size)
12268 {
12269 /* Maximum shift variant. */
12270 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12271 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12272 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12273 inst.instruction |= LOW4 (inst.operands[1].reg);
12274 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12275 inst.instruction |= neon_logbits (et.size) << 18;
12276
12277 inst.instruction = neon_dp_fixup (inst.instruction);
12278 }
12279 else
12280 {
12281 /* A more-specific type check for non-max versions. */
12282 et = neon_check_type (2, NS_QDI,
12283 N_EQK | N_DBL, N_SU_32 | N_KEY);
12284 inst.instruction = NEON_ENC_IMMED (inst.instruction);
12285 neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
12286 }
12287}
12288
037e8744 12289/* Check the various types for the VCVT instruction, and return which version
5287ad62
JB
12290 the current instruction is. */
12291
12292static int
12293neon_cvt_flavour (enum neon_shape rs)
12294{
037e8744
JB
12295#define CVT_VAR(C,X,Y) \
12296 et = neon_check_type (2, rs, whole_reg | (X), whole_reg | (Y)); \
12297 if (et.type != NT_invtype) \
12298 { \
12299 inst.error = NULL; \
12300 return (C); \
5287ad62
JB
12301 }
12302 struct neon_type_el et;
037e8744
JB
12303 unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
12304 || rs == NS_FF) ? N_VFP : 0;
12305 /* The instruction versions which take an immediate take one register
12306 argument, which is extended to the width of the full register. Thus the
12307 "source" and "destination" registers must have the same width. Hack that
12308 here by making the size equal to the key (wider, in this case) operand. */
12309 unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
5287ad62
JB
12310
12311 CVT_VAR (0, N_S32, N_F32);
12312 CVT_VAR (1, N_U32, N_F32);
12313 CVT_VAR (2, N_F32, N_S32);
12314 CVT_VAR (3, N_F32, N_U32);
12315
037e8744
JB
12316 whole_reg = N_VFP;
12317
12318 /* VFP instructions. */
12319 CVT_VAR (4, N_F32, N_F64);
12320 CVT_VAR (5, N_F64, N_F32);
12321 CVT_VAR (6, N_S32, N_F64 | key);
12322 CVT_VAR (7, N_U32, N_F64 | key);
12323 CVT_VAR (8, N_F64 | key, N_S32);
12324 CVT_VAR (9, N_F64 | key, N_U32);
12325 /* VFP instructions with bitshift. */
12326 CVT_VAR (10, N_F32 | key, N_S16);
12327 CVT_VAR (11, N_F32 | key, N_U16);
12328 CVT_VAR (12, N_F64 | key, N_S16);
12329 CVT_VAR (13, N_F64 | key, N_U16);
12330 CVT_VAR (14, N_S16, N_F32 | key);
12331 CVT_VAR (15, N_U16, N_F32 | key);
12332 CVT_VAR (16, N_S16, N_F64 | key);
12333 CVT_VAR (17, N_U16, N_F64 | key);
12334
5287ad62
JB
12335 return -1;
12336#undef CVT_VAR
12337}
12338
037e8744
JB
12339/* Neon-syntax VFP conversions. */
12340
5287ad62 12341static void
037e8744 12342do_vfp_nsyn_cvt (enum neon_shape rs, int flavour)
5287ad62 12343{
037e8744
JB
12344 const char *opname = 0;
12345
12346 if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI)
5287ad62 12347 {
037e8744
JB
12348 /* Conversions with immediate bitshift. */
12349 const char *enc[] =
12350 {
12351 "ftosls",
12352 "ftouls",
12353 "fsltos",
12354 "fultos",
12355 NULL,
12356 NULL,
12357 "ftosld",
12358 "ftould",
12359 "fsltod",
12360 "fultod",
12361 "fshtos",
12362 "fuhtos",
12363 "fshtod",
12364 "fuhtod",
12365 "ftoshs",
12366 "ftouhs",
12367 "ftoshd",
12368 "ftouhd"
12369 };
12370
12371 if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
12372 {
12373 opname = enc[flavour];
12374 constraint (inst.operands[0].reg != inst.operands[1].reg,
12375 _("operands 0 and 1 must be the same register"));
12376 inst.operands[1] = inst.operands[2];
12377 memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
12378 }
5287ad62
JB
12379 }
12380 else
12381 {
037e8744
JB
12382 /* Conversions without bitshift. */
12383 const char *enc[] =
12384 {
12385 "ftosis",
12386 "ftouis",
12387 "fsitos",
12388 "fuitos",
12389 "fcvtsd",
12390 "fcvtds",
12391 "ftosid",
12392 "ftouid",
12393 "fsitod",
12394 "fuitod"
12395 };
12396
12397 if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
12398 opname = enc[flavour];
12399 }
12400
12401 if (opname)
12402 do_vfp_nsyn_opcode (opname);
12403}
12404
12405static void
12406do_vfp_nsyn_cvtz (void)
12407{
12408 enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_NULL);
12409 int flavour = neon_cvt_flavour (rs);
12410 const char *enc[] =
12411 {
12412 "ftosizs",
12413 "ftouizs",
12414 NULL,
12415 NULL,
12416 NULL,
12417 NULL,
12418 "ftosizd",
12419 "ftouizd"
12420 };
12421
12422 if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
12423 do_vfp_nsyn_opcode (enc[flavour]);
12424}
12425
12426static void
12427do_neon_cvt (void)
12428{
12429 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
12430 NS_FD, NS_DF, NS_FF, NS_NULL);
12431 int flavour = neon_cvt_flavour (rs);
12432
12433 /* VFP rather than Neon conversions. */
12434 if (flavour >= 4)
12435 {
12436 do_vfp_nsyn_cvt (rs, flavour);
12437 return;
12438 }
12439
12440 switch (rs)
12441 {
12442 case NS_DDI:
12443 case NS_QQI:
12444 {
12445 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
12446 return;
12447
12448 /* Fixed-point conversion with #0 immediate is encoded as an
12449 integer conversion. */
12450 if (inst.operands[2].present && inst.operands[2].imm == 0)
12451 goto int_encode;
12452 unsigned immbits = 32 - inst.operands[2].imm;
12453 unsigned enctab[] = { 0x0000100, 0x1000100, 0x0, 0x1000000 };
12454 inst.instruction = NEON_ENC_IMMED (inst.instruction);
12455 if (flavour != -1)
12456 inst.instruction |= enctab[flavour];
12457 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12458 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12459 inst.instruction |= LOW4 (inst.operands[1].reg);
12460 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12461 inst.instruction |= neon_quad (rs) << 6;
12462 inst.instruction |= 1 << 21;
12463 inst.instruction |= immbits << 16;
12464
12465 inst.instruction = neon_dp_fixup (inst.instruction);
12466 }
12467 break;
12468
12469 case NS_DD:
12470 case NS_QQ:
12471 int_encode:
12472 {
12473 unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080 };
12474
12475 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12476
12477 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
12478 return;
12479
12480 if (flavour != -1)
12481 inst.instruction |= enctab[flavour];
12482
12483 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12484 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12485 inst.instruction |= LOW4 (inst.operands[1].reg);
12486 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12487 inst.instruction |= neon_quad (rs) << 6;
12488 inst.instruction |= 2 << 18;
12489
12490 inst.instruction = neon_dp_fixup (inst.instruction);
12491 }
12492 break;
12493
12494 default:
12495 /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32). */
12496 do_vfp_nsyn_cvt (rs, flavour);
5287ad62 12497 }
5287ad62
JB
12498}
12499
12500static void
12501neon_move_immediate (void)
12502{
037e8744
JB
12503 enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
12504 struct neon_type_el et = neon_check_type (2, rs,
12505 N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
5287ad62
JB
12506 unsigned immlo, immhi = 0, immbits;
12507 int op, cmode;
12508
037e8744
JB
12509 constraint (et.type == NT_invtype,
12510 _("operand size must be specified for immediate VMOV"));
12511
5287ad62
JB
12512 /* We start out as an MVN instruction if OP = 1, MOV otherwise. */
12513 op = (inst.instruction & (1 << 5)) != 0;
12514
12515 immlo = inst.operands[1].imm;
12516 if (inst.operands[1].regisimm)
12517 immhi = inst.operands[1].reg;
12518
12519 constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
12520 _("immediate has bits set outside the operand size"));
12521
12522 if ((cmode = neon_cmode_for_move_imm (immlo, immhi, &immbits, &op,
136da414 12523 et.size, et.type)) == FAIL)
5287ad62
JB
12524 {
12525 /* Invert relevant bits only. */
12526 neon_invert_size (&immlo, &immhi, et.size);
12527 /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
12528 with one or the other; those cases are caught by
12529 neon_cmode_for_move_imm. */
12530 op = !op;
12531 if ((cmode = neon_cmode_for_move_imm (immlo, immhi, &immbits, &op,
136da414 12532 et.size, et.type)) == FAIL)
5287ad62 12533 {
dcbf9037 12534 first_error (_("immediate out of range"));
5287ad62
JB
12535 return;
12536 }
12537 }
12538
12539 inst.instruction &= ~(1 << 5);
12540 inst.instruction |= op << 5;
12541
12542 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12543 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
037e8744 12544 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
12545 inst.instruction |= cmode << 8;
12546
12547 neon_write_immbits (immbits);
12548}
12549
12550static void
12551do_neon_mvn (void)
12552{
12553 if (inst.operands[1].isreg)
12554 {
037e8744 12555 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
12556
12557 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12558 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12559 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12560 inst.instruction |= LOW4 (inst.operands[1].reg);
12561 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
037e8744 12562 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
12563 }
12564 else
12565 {
12566 inst.instruction = NEON_ENC_IMMED (inst.instruction);
12567 neon_move_immediate ();
12568 }
12569
12570 inst.instruction = neon_dp_fixup (inst.instruction);
12571}
12572
12573/* Encode instructions of form:
12574
12575 |28/24|23|22|21 20|19 16|15 12|11 8|7|6|5|4|3 0|
12576 | U |x |D |size | Rn | Rd |x x x x|N|x|M|x| Rm |
12577
12578*/
12579
12580static void
12581neon_mixed_length (struct neon_type_el et, unsigned size)
12582{
12583 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12584 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12585 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
12586 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
12587 inst.instruction |= LOW4 (inst.operands[2].reg);
12588 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
12589 inst.instruction |= (et.type == NT_unsigned) << 24;
12590 inst.instruction |= neon_logbits (size) << 20;
12591
12592 inst.instruction = neon_dp_fixup (inst.instruction);
12593}
12594
12595static void
12596do_neon_dyadic_long (void)
12597{
12598 /* FIXME: Type checking for lengthening op. */
12599 struct neon_type_el et = neon_check_type (3, NS_QDD,
12600 N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
12601 neon_mixed_length (et, et.size);
12602}
12603
12604static void
12605do_neon_abal (void)
12606{
12607 struct neon_type_el et = neon_check_type (3, NS_QDD,
12608 N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
12609 neon_mixed_length (et, et.size);
12610}
12611
12612static void
12613neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
12614{
12615 if (inst.operands[2].isscalar)
12616 {
dcbf9037
JB
12617 struct neon_type_el et = neon_check_type (3, NS_QDS,
12618 N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
5287ad62
JB
12619 inst.instruction = NEON_ENC_SCALAR (inst.instruction);
12620 neon_mul_mac (et, et.type == NT_unsigned);
12621 }
12622 else
12623 {
12624 struct neon_type_el et = neon_check_type (3, NS_QDD,
12625 N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
12626 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12627 neon_mixed_length (et, et.size);
12628 }
12629}
12630
12631static void
12632do_neon_mac_maybe_scalar_long (void)
12633{
12634 neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
12635}
12636
12637static void
12638do_neon_dyadic_wide (void)
12639{
12640 struct neon_type_el et = neon_check_type (3, NS_QQD,
12641 N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
12642 neon_mixed_length (et, et.size);
12643}
12644
12645static void
12646do_neon_dyadic_narrow (void)
12647{
12648 struct neon_type_el et = neon_check_type (3, NS_QDD,
12649 N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
428e3f1f
PB
12650 /* Operand sign is unimportant, and the U bit is part of the opcode,
12651 so force the operand type to integer. */
12652 et.type = NT_integer;
5287ad62
JB
12653 neon_mixed_length (et, et.size / 2);
12654}
12655
12656static void
12657do_neon_mul_sat_scalar_long (void)
12658{
12659 neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
12660}
12661
12662static void
12663do_neon_vmull (void)
12664{
12665 if (inst.operands[2].isscalar)
12666 do_neon_mac_maybe_scalar_long ();
12667 else
12668 {
12669 struct neon_type_el et = neon_check_type (3, NS_QDD,
12670 N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_KEY);
12671 if (et.type == NT_poly)
12672 inst.instruction = NEON_ENC_POLY (inst.instruction);
12673 else
12674 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
12675 /* For polynomial encoding, size field must be 0b00 and the U bit must be
12676 zero. Should be OK as-is. */
12677 neon_mixed_length (et, et.size);
12678 }
12679}
12680
12681static void
12682do_neon_ext (void)
12683{
037e8744 12684 enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
5287ad62
JB
12685 struct neon_type_el et = neon_check_type (3, rs,
12686 N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
12687 unsigned imm = (inst.operands[3].imm * et.size) / 8;
12688 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12689 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12690 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
12691 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
12692 inst.instruction |= LOW4 (inst.operands[2].reg);
12693 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
037e8744 12694 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
12695 inst.instruction |= imm << 8;
12696
12697 inst.instruction = neon_dp_fixup (inst.instruction);
12698}
12699
12700static void
12701do_neon_rev (void)
12702{
037e8744 12703 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
12704 struct neon_type_el et = neon_check_type (2, rs,
12705 N_EQK, N_8 | N_16 | N_32 | N_KEY);
12706 unsigned op = (inst.instruction >> 7) & 3;
12707 /* N (width of reversed regions) is encoded as part of the bitmask. We
12708 extract it here to check the elements to be reversed are smaller.
12709 Otherwise we'd get a reserved instruction. */
12710 unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
12711 assert (elsize != 0);
12712 constraint (et.size >= elsize,
12713 _("elements must be smaller than reversal region"));
037e8744 12714 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
12715}
12716
12717static void
12718do_neon_dup (void)
12719{
12720 if (inst.operands[1].isscalar)
12721 {
037e8744 12722 enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
dcbf9037
JB
12723 struct neon_type_el et = neon_check_type (2, rs,
12724 N_EQK, N_8 | N_16 | N_32 | N_KEY);
5287ad62 12725 unsigned sizebits = et.size >> 3;
dcbf9037 12726 unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
5287ad62 12727 int logsize = neon_logbits (et.size);
dcbf9037 12728 unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
037e8744
JB
12729
12730 if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
12731 return;
12732
5287ad62
JB
12733 inst.instruction = NEON_ENC_SCALAR (inst.instruction);
12734 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12735 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12736 inst.instruction |= LOW4 (dm);
12737 inst.instruction |= HI1 (dm) << 5;
037e8744 12738 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
12739 inst.instruction |= x << 17;
12740 inst.instruction |= sizebits << 16;
12741
12742 inst.instruction = neon_dp_fixup (inst.instruction);
12743 }
12744 else
12745 {
037e8744
JB
12746 enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
12747 struct neon_type_el et = neon_check_type (2, rs,
12748 N_8 | N_16 | N_32 | N_KEY, N_EQK);
5287ad62
JB
12749 /* Duplicate ARM register to lanes of vector. */
12750 inst.instruction = NEON_ENC_ARMREG (inst.instruction);
12751 switch (et.size)
12752 {
12753 case 8: inst.instruction |= 0x400000; break;
12754 case 16: inst.instruction |= 0x000020; break;
12755 case 32: inst.instruction |= 0x000000; break;
12756 default: break;
12757 }
12758 inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
12759 inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
12760 inst.instruction |= HI1 (inst.operands[0].reg) << 7;
037e8744 12761 inst.instruction |= neon_quad (rs) << 21;
5287ad62
JB
12762 /* The encoding for this instruction is identical for the ARM and Thumb
12763 variants, except for the condition field. */
037e8744 12764 do_vfp_cond_or_thumb ();
5287ad62
JB
12765 }
12766}
12767
12768/* VMOV has particularly many variations. It can be one of:
12769 0. VMOV<c><q> <Qd>, <Qm>
12770 1. VMOV<c><q> <Dd>, <Dm>
12771 (Register operations, which are VORR with Rm = Rn.)
12772 2. VMOV<c><q>.<dt> <Qd>, #<imm>
12773 3. VMOV<c><q>.<dt> <Dd>, #<imm>
12774 (Immediate loads.)
12775 4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
12776 (ARM register to scalar.)
12777 5. VMOV<c><q> <Dm>, <Rd>, <Rn>
12778 (Two ARM registers to vector.)
12779 6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
12780 (Scalar to ARM register.)
12781 7. VMOV<c><q> <Rd>, <Rn>, <Dm>
12782 (Vector to two ARM registers.)
037e8744
JB
12783 8. VMOV.F32 <Sd>, <Sm>
12784 9. VMOV.F64 <Dd>, <Dm>
12785 (VFP register moves.)
12786 10. VMOV.F32 <Sd>, #imm
12787 11. VMOV.F64 <Dd>, #imm
12788 (VFP float immediate load.)
12789 12. VMOV <Rd>, <Sm>
12790 (VFP single to ARM reg.)
12791 13. VMOV <Sd>, <Rm>
12792 (ARM reg to VFP single.)
12793 14. VMOV <Rd>, <Re>, <Sn>, <Sm>
12794 (Two ARM regs to two VFP singles.)
12795 15. VMOV <Sd>, <Se>, <Rn>, <Rm>
12796 (Two VFP singles to two ARM regs.)
5287ad62 12797
037e8744
JB
12798 These cases can be disambiguated using neon_select_shape, except cases 1/9
12799 and 3/11 which depend on the operand type too.
5287ad62
JB
12800
12801 All the encoded bits are hardcoded by this function.
12802
b7fc2769
JB
12803 Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
12804 Cases 5, 7 may be used with VFPv2 and above.
12805
5287ad62
JB
12806 FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
12807 can specify a type where it doesn't make sense to, and is ignored).
12808*/
12809
12810static void
12811do_neon_mov (void)
12812{
037e8744
JB
12813 enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
12814 NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR, NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
12815 NS_NULL);
12816 struct neon_type_el et;
12817 const char *ldconst = 0;
5287ad62 12818
037e8744 12819 switch (rs)
5287ad62 12820 {
037e8744
JB
12821 case NS_DD: /* case 1/9. */
12822 et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
12823 /* It is not an error here if no type is given. */
12824 inst.error = NULL;
12825 if (et.type == NT_float && et.size == 64)
5287ad62 12826 {
037e8744
JB
12827 do_vfp_nsyn_opcode ("fcpyd");
12828 break;
5287ad62 12829 }
037e8744 12830 /* fall through. */
5287ad62 12831
037e8744
JB
12832 case NS_QQ: /* case 0/1. */
12833 {
12834 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
12835 return;
12836 /* The architecture manual I have doesn't explicitly state which
12837 value the U bit should have for register->register moves, but
12838 the equivalent VORR instruction has U = 0, so do that. */
12839 inst.instruction = 0x0200110;
12840 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
12841 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
12842 inst.instruction |= LOW4 (inst.operands[1].reg);
12843 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
12844 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
12845 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
12846 inst.instruction |= neon_quad (rs) << 6;
12847
12848 inst.instruction = neon_dp_fixup (inst.instruction);
12849 }
12850 break;
12851
12852 case NS_DI: /* case 3/11. */
12853 et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
12854 inst.error = NULL;
12855 if (et.type == NT_float && et.size == 64)
5287ad62 12856 {
037e8744
JB
12857 /* case 11 (fconstd). */
12858 ldconst = "fconstd";
12859 goto encode_fconstd;
5287ad62 12860 }
037e8744
JB
12861 /* fall through. */
12862
12863 case NS_QI: /* case 2/3. */
12864 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
12865 return;
12866 inst.instruction = 0x0800010;
12867 neon_move_immediate ();
12868 inst.instruction = neon_dp_fixup (inst.instruction);
5287ad62
JB
12869 break;
12870
037e8744
JB
12871 case NS_SR: /* case 4. */
12872 {
12873 unsigned bcdebits = 0;
12874 struct neon_type_el et = neon_check_type (2, NS_NULL,
12875 N_8 | N_16 | N_32 | N_KEY, N_EQK);
12876 int logsize = neon_logbits (et.size);
12877 unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
12878 unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
12879
12880 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
12881 _(BAD_FPU));
12882 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
12883 && et.size != 32, _(BAD_FPU));
12884 constraint (et.type == NT_invtype, _("bad type for scalar"));
12885 constraint (x >= 64 / et.size, _("scalar index out of range"));
12886
12887 switch (et.size)
12888 {
12889 case 8: bcdebits = 0x8; break;
12890 case 16: bcdebits = 0x1; break;
12891 case 32: bcdebits = 0x0; break;
12892 default: ;
12893 }
12894
12895 bcdebits |= x << logsize;
12896
12897 inst.instruction = 0xe000b10;
12898 do_vfp_cond_or_thumb ();
12899 inst.instruction |= LOW4 (dn) << 16;
12900 inst.instruction |= HI1 (dn) << 7;
12901 inst.instruction |= inst.operands[1].reg << 12;
12902 inst.instruction |= (bcdebits & 3) << 5;
12903 inst.instruction |= (bcdebits >> 2) << 21;
12904 }
12905 break;
12906
12907 case NS_DRR: /* case 5 (fmdrr). */
b7fc2769 12908 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
037e8744 12909 _(BAD_FPU));
b7fc2769 12910
037e8744
JB
12911 inst.instruction = 0xc400b10;
12912 do_vfp_cond_or_thumb ();
12913 inst.instruction |= LOW4 (inst.operands[0].reg);
12914 inst.instruction |= HI1 (inst.operands[0].reg) << 5;
12915 inst.instruction |= inst.operands[1].reg << 12;
12916 inst.instruction |= inst.operands[2].reg << 16;
12917 break;
12918
12919 case NS_RS: /* case 6. */
12920 {
12921 struct neon_type_el et = neon_check_type (2, NS_NULL,
12922 N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
12923 unsigned logsize = neon_logbits (et.size);
12924 unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
12925 unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
12926 unsigned abcdebits = 0;
12927
12928 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
12929 _(BAD_FPU));
12930 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
12931 && et.size != 32, _(BAD_FPU));
12932 constraint (et.type == NT_invtype, _("bad type for scalar"));
12933 constraint (x >= 64 / et.size, _("scalar index out of range"));
12934
12935 switch (et.size)
12936 {
12937 case 8: abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
12938 case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
12939 case 32: abcdebits = 0x00; break;
12940 default: ;
12941 }
12942
12943 abcdebits |= x << logsize;
12944 inst.instruction = 0xe100b10;
12945 do_vfp_cond_or_thumb ();
12946 inst.instruction |= LOW4 (dn) << 16;
12947 inst.instruction |= HI1 (dn) << 7;
12948 inst.instruction |= inst.operands[0].reg << 12;
12949 inst.instruction |= (abcdebits & 3) << 5;
12950 inst.instruction |= (abcdebits >> 2) << 21;
12951 }
12952 break;
12953
12954 case NS_RRD: /* case 7 (fmrrd). */
12955 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
12956 _(BAD_FPU));
12957
12958 inst.instruction = 0xc500b10;
12959 do_vfp_cond_or_thumb ();
12960 inst.instruction |= inst.operands[0].reg << 12;
12961 inst.instruction |= inst.operands[1].reg << 16;
12962 inst.instruction |= LOW4 (inst.operands[2].reg);
12963 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
12964 break;
12965
12966 case NS_FF: /* case 8 (fcpys). */
12967 do_vfp_nsyn_opcode ("fcpys");
12968 break;
12969
12970 case NS_FI: /* case 10 (fconsts). */
12971 ldconst = "fconsts";
12972 encode_fconstd:
12973 if (is_quarter_float (inst.operands[1].imm))
5287ad62 12974 {
037e8744
JB
12975 inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
12976 do_vfp_nsyn_opcode (ldconst);
5287ad62
JB
12977 }
12978 else
037e8744
JB
12979 first_error (_("immediate out of range"));
12980 break;
12981
12982 case NS_RF: /* case 12 (fmrs). */
12983 do_vfp_nsyn_opcode ("fmrs");
12984 break;
12985
12986 case NS_FR: /* case 13 (fmsr). */
12987 do_vfp_nsyn_opcode ("fmsr");
12988 break;
12989
12990 /* The encoders for the fmrrs and fmsrr instructions expect three operands
12991 (one of which is a list), but we have parsed four. Do some fiddling to
12992 make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
12993 expect. */
12994 case NS_RRFF: /* case 14 (fmrrs). */
12995 constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
12996 _("VFP registers must be adjacent"));
12997 inst.operands[2].imm = 2;
12998 memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
12999 do_vfp_nsyn_opcode ("fmrrs");
13000 break;
13001
13002 case NS_FFRR: /* case 15 (fmsrr). */
13003 constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
13004 _("VFP registers must be adjacent"));
13005 inst.operands[1] = inst.operands[2];
13006 inst.operands[2] = inst.operands[3];
13007 inst.operands[0].imm = 2;
13008 memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
13009 do_vfp_nsyn_opcode ("fmsrr");
5287ad62
JB
13010 break;
13011
13012 default:
13013 abort ();
13014 }
13015}
13016
13017static void
13018do_neon_rshift_round_imm (void)
13019{
037e8744 13020 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
13021 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
13022 int imm = inst.operands[2].imm;
13023
13024 /* imm == 0 case is encoded as VMOV for V{R}SHR. */
13025 if (imm == 0)
13026 {
13027 inst.operands[2].present = 0;
13028 do_neon_mov ();
13029 return;
13030 }
13031
13032 constraint (imm < 1 || (unsigned)imm > et.size,
13033 _("immediate out of range for shift"));
037e8744 13034 neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
5287ad62
JB
13035 et.size - imm);
13036}
13037
13038static void
13039do_neon_movl (void)
13040{
13041 struct neon_type_el et = neon_check_type (2, NS_QD,
13042 N_EQK | N_DBL, N_SU_32 | N_KEY);
13043 unsigned sizebits = et.size >> 3;
13044 inst.instruction |= sizebits << 19;
13045 neon_two_same (0, et.type == NT_unsigned, -1);
13046}
13047
13048static void
13049do_neon_trn (void)
13050{
037e8744 13051 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
13052 struct neon_type_el et = neon_check_type (2, rs,
13053 N_EQK, N_8 | N_16 | N_32 | N_KEY);
13054 inst.instruction = NEON_ENC_INTEGER (inst.instruction);
037e8744 13055 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
13056}
13057
13058static void
13059do_neon_zip_uzp (void)
13060{
037e8744 13061 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
13062 struct neon_type_el et = neon_check_type (2, rs,
13063 N_EQK, N_8 | N_16 | N_32 | N_KEY);
13064 if (rs == NS_DD && et.size == 32)
13065 {
13066 /* Special case: encode as VTRN.32 <Dd>, <Dm>. */
13067 inst.instruction = N_MNEM_vtrn;
13068 do_neon_trn ();
13069 return;
13070 }
037e8744 13071 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
13072}
13073
13074static void
13075do_neon_sat_abs_neg (void)
13076{
037e8744 13077 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
13078 struct neon_type_el et = neon_check_type (2, rs,
13079 N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
037e8744 13080 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
13081}
13082
13083static void
13084do_neon_pair_long (void)
13085{
037e8744 13086 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
13087 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
13088 /* Unsigned is encoded in OP field (bit 7) for these instruction. */
13089 inst.instruction |= (et.type == NT_unsigned) << 7;
037e8744 13090 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
13091}
13092
13093static void
13094do_neon_recip_est (void)
13095{
037e8744 13096 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
13097 struct neon_type_el et = neon_check_type (2, rs,
13098 N_EQK | N_FLT, N_F32 | N_U32 | N_KEY);
13099 inst.instruction |= (et.type == NT_float) << 8;
037e8744 13100 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
13101}
13102
13103static void
13104do_neon_cls (void)
13105{
037e8744 13106 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
13107 struct neon_type_el et = neon_check_type (2, rs,
13108 N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
037e8744 13109 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
13110}
13111
13112static void
13113do_neon_clz (void)
13114{
037e8744 13115 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
13116 struct neon_type_el et = neon_check_type (2, rs,
13117 N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
037e8744 13118 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
13119}
13120
13121static void
13122do_neon_cnt (void)
13123{
037e8744 13124 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
13125 struct neon_type_el et = neon_check_type (2, rs,
13126 N_EQK | N_INT, N_8 | N_KEY);
037e8744 13127 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
13128}
13129
13130static void
13131do_neon_swp (void)
13132{
037e8744
JB
13133 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
13134 neon_two_same (neon_quad (rs), 1, -1);
5287ad62
JB
13135}
13136
13137static void
13138do_neon_tbl_tbx (void)
13139{
13140 unsigned listlenbits;
dcbf9037 13141 neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
5287ad62
JB
13142
13143 if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
13144 {
dcbf9037 13145 first_error (_("bad list length for table lookup"));
5287ad62
JB
13146 return;
13147 }
13148
13149 listlenbits = inst.operands[1].imm - 1;
13150 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13151 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13152 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13153 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13154 inst.instruction |= LOW4 (inst.operands[2].reg);
13155 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
13156 inst.instruction |= listlenbits << 8;
13157
13158 inst.instruction = neon_dp_fixup (inst.instruction);
13159}
13160
13161static void
13162do_neon_ldm_stm (void)
13163{
13164 /* P, U and L bits are part of bitmask. */
13165 int is_dbmode = (inst.instruction & (1 << 24)) != 0;
13166 unsigned offsetbits = inst.operands[1].imm * 2;
13167
037e8744
JB
13168 if (inst.operands[1].issingle)
13169 {
13170 do_vfp_nsyn_ldm_stm (is_dbmode);
13171 return;
13172 }
13173
5287ad62
JB
13174 constraint (is_dbmode && !inst.operands[0].writeback,
13175 _("writeback (!) must be used for VLDMDB and VSTMDB"));
13176
13177 constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
13178 _("register list must contain at least 1 and at most 16 "
13179 "registers"));
13180
13181 inst.instruction |= inst.operands[0].reg << 16;
13182 inst.instruction |= inst.operands[0].writeback << 21;
13183 inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
13184 inst.instruction |= HI1 (inst.operands[1].reg) << 22;
13185
13186 inst.instruction |= offsetbits;
13187
037e8744 13188 do_vfp_cond_or_thumb ();
5287ad62
JB
13189}
13190
13191static void
13192do_neon_ldr_str (void)
13193{
5287ad62
JB
13194 int is_ldr = (inst.instruction & (1 << 20)) != 0;
13195
037e8744
JB
13196 if (inst.operands[0].issingle)
13197 {
cd2f129f
JB
13198 if (is_ldr)
13199 do_vfp_nsyn_opcode ("flds");
13200 else
13201 do_vfp_nsyn_opcode ("fsts");
5287ad62
JB
13202 }
13203 else
5287ad62 13204 {
cd2f129f
JB
13205 if (is_ldr)
13206 do_vfp_nsyn_opcode ("fldd");
5287ad62 13207 else
cd2f129f 13208 do_vfp_nsyn_opcode ("fstd");
5287ad62 13209 }
5287ad62
JB
13210}
13211
13212/* "interleave" version also handles non-interleaving register VLD1/VST1
13213 instructions. */
13214
13215static void
13216do_neon_ld_st_interleave (void)
13217{
037e8744 13218 struct neon_type_el et = neon_check_type (1, NS_NULL,
5287ad62
JB
13219 N_8 | N_16 | N_32 | N_64);
13220 unsigned alignbits = 0;
13221 unsigned idx;
13222 /* The bits in this table go:
13223 0: register stride of one (0) or two (1)
13224 1,2: register list length, minus one (1, 2, 3, 4).
13225 3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
13226 We use -1 for invalid entries. */
13227 const int typetable[] =
13228 {
13229 0x7, -1, 0xa, -1, 0x6, -1, 0x2, -1, /* VLD1 / VST1. */
13230 -1, -1, 0x8, 0x9, -1, -1, 0x3, -1, /* VLD2 / VST2. */
13231 -1, -1, -1, -1, 0x4, 0x5, -1, -1, /* VLD3 / VST3. */
13232 -1, -1, -1, -1, -1, -1, 0x0, 0x1 /* VLD4 / VST4. */
13233 };
13234 int typebits;
13235
dcbf9037
JB
13236 if (et.type == NT_invtype)
13237 return;
13238
5287ad62
JB
13239 if (inst.operands[1].immisalign)
13240 switch (inst.operands[1].imm >> 8)
13241 {
13242 case 64: alignbits = 1; break;
13243 case 128:
13244 if (NEON_REGLIST_LENGTH (inst.operands[0].imm) == 3)
13245 goto bad_alignment;
13246 alignbits = 2;
13247 break;
13248 case 256:
13249 if (NEON_REGLIST_LENGTH (inst.operands[0].imm) == 3)
13250 goto bad_alignment;
13251 alignbits = 3;
13252 break;
13253 default:
13254 bad_alignment:
dcbf9037 13255 first_error (_("bad alignment"));
5287ad62
JB
13256 return;
13257 }
13258
13259 inst.instruction |= alignbits << 4;
13260 inst.instruction |= neon_logbits (et.size) << 6;
13261
13262 /* Bits [4:6] of the immediate in a list specifier encode register stride
13263 (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
13264 VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
13265 up the right value for "type" in a table based on this value and the given
13266 list style, then stick it back. */
13267 idx = ((inst.operands[0].imm >> 4) & 7)
13268 | (((inst.instruction >> 8) & 3) << 3);
13269
13270 typebits = typetable[idx];
13271
13272 constraint (typebits == -1, _("bad list type for instruction"));
13273
13274 inst.instruction &= ~0xf00;
13275 inst.instruction |= typebits << 8;
13276}
13277
13278/* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
13279 *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
13280 otherwise. The variable arguments are a list of pairs of legal (size, align)
13281 values, terminated with -1. */
13282
13283static int
13284neon_alignment_bit (int size, int align, int *do_align, ...)
13285{
13286 va_list ap;
13287 int result = FAIL, thissize, thisalign;
13288
13289 if (!inst.operands[1].immisalign)
13290 {
13291 *do_align = 0;
13292 return SUCCESS;
13293 }
13294
13295 va_start (ap, do_align);
13296
13297 do
13298 {
13299 thissize = va_arg (ap, int);
13300 if (thissize == -1)
13301 break;
13302 thisalign = va_arg (ap, int);
13303
13304 if (size == thissize && align == thisalign)
13305 result = SUCCESS;
13306 }
13307 while (result != SUCCESS);
13308
13309 va_end (ap);
13310
13311 if (result == SUCCESS)
13312 *do_align = 1;
13313 else
dcbf9037 13314 first_error (_("unsupported alignment for instruction"));
5287ad62
JB
13315
13316 return result;
13317}
13318
13319static void
13320do_neon_ld_st_lane (void)
13321{
037e8744 13322 struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
5287ad62
JB
13323 int align_good, do_align = 0;
13324 int logsize = neon_logbits (et.size);
13325 int align = inst.operands[1].imm >> 8;
13326 int n = (inst.instruction >> 8) & 3;
13327 int max_el = 64 / et.size;
13328
dcbf9037
JB
13329 if (et.type == NT_invtype)
13330 return;
13331
5287ad62
JB
13332 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
13333 _("bad list length"));
13334 constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
13335 _("scalar index out of range"));
13336 constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
13337 && et.size == 8,
13338 _("stride of 2 unavailable when element size is 8"));
13339
13340 switch (n)
13341 {
13342 case 0: /* VLD1 / VST1. */
13343 align_good = neon_alignment_bit (et.size, align, &do_align, 16, 16,
13344 32, 32, -1);
13345 if (align_good == FAIL)
13346 return;
13347 if (do_align)
13348 {
13349 unsigned alignbits = 0;
13350 switch (et.size)
13351 {
13352 case 16: alignbits = 0x1; break;
13353 case 32: alignbits = 0x3; break;
13354 default: ;
13355 }
13356 inst.instruction |= alignbits << 4;
13357 }
13358 break;
13359
13360 case 1: /* VLD2 / VST2. */
13361 align_good = neon_alignment_bit (et.size, align, &do_align, 8, 16, 16, 32,
13362 32, 64, -1);
13363 if (align_good == FAIL)
13364 return;
13365 if (do_align)
13366 inst.instruction |= 1 << 4;
13367 break;
13368
13369 case 2: /* VLD3 / VST3. */
13370 constraint (inst.operands[1].immisalign,
13371 _("can't use alignment with this instruction"));
13372 break;
13373
13374 case 3: /* VLD4 / VST4. */
13375 align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
13376 16, 64, 32, 64, 32, 128, -1);
13377 if (align_good == FAIL)
13378 return;
13379 if (do_align)
13380 {
13381 unsigned alignbits = 0;
13382 switch (et.size)
13383 {
13384 case 8: alignbits = 0x1; break;
13385 case 16: alignbits = 0x1; break;
13386 case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
13387 default: ;
13388 }
13389 inst.instruction |= alignbits << 4;
13390 }
13391 break;
13392
13393 default: ;
13394 }
13395
13396 /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32. */
13397 if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
13398 inst.instruction |= 1 << (4 + logsize);
13399
13400 inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
13401 inst.instruction |= logsize << 10;
13402}
13403
13404/* Encode single n-element structure to all lanes VLD<n> instructions. */
13405
13406static void
13407do_neon_ld_dup (void)
13408{
037e8744 13409 struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
5287ad62
JB
13410 int align_good, do_align = 0;
13411
dcbf9037
JB
13412 if (et.type == NT_invtype)
13413 return;
13414
5287ad62
JB
13415 switch ((inst.instruction >> 8) & 3)
13416 {
13417 case 0: /* VLD1. */
13418 assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
13419 align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
13420 &do_align, 16, 16, 32, 32, -1);
13421 if (align_good == FAIL)
13422 return;
13423 switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
13424 {
13425 case 1: break;
13426 case 2: inst.instruction |= 1 << 5; break;
dcbf9037 13427 default: first_error (_("bad list length")); return;
5287ad62
JB
13428 }
13429 inst.instruction |= neon_logbits (et.size) << 6;
13430 break;
13431
13432 case 1: /* VLD2. */
13433 align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
13434 &do_align, 8, 16, 16, 32, 32, 64, -1);
13435 if (align_good == FAIL)
13436 return;
13437 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
13438 _("bad list length"));
13439 if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
13440 inst.instruction |= 1 << 5;
13441 inst.instruction |= neon_logbits (et.size) << 6;
13442 break;
13443
13444 case 2: /* VLD3. */
13445 constraint (inst.operands[1].immisalign,
13446 _("can't use alignment with this instruction"));
13447 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
13448 _("bad list length"));
13449 if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
13450 inst.instruction |= 1 << 5;
13451 inst.instruction |= neon_logbits (et.size) << 6;
13452 break;
13453
13454 case 3: /* VLD4. */
13455 {
13456 int align = inst.operands[1].imm >> 8;
13457 align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
13458 16, 64, 32, 64, 32, 128, -1);
13459 if (align_good == FAIL)
13460 return;
13461 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
13462 _("bad list length"));
13463 if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
13464 inst.instruction |= 1 << 5;
13465 if (et.size == 32 && align == 128)
13466 inst.instruction |= 0x3 << 6;
13467 else
13468 inst.instruction |= neon_logbits (et.size) << 6;
13469 }
13470 break;
13471
13472 default: ;
13473 }
13474
13475 inst.instruction |= do_align << 4;
13476}
13477
13478/* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
13479 apart from bits [11:4]. */
13480
13481static void
13482do_neon_ldx_stx (void)
13483{
13484 switch (NEON_LANE (inst.operands[0].imm))
13485 {
13486 case NEON_INTERLEAVE_LANES:
13487 inst.instruction = NEON_ENC_INTERLV (inst.instruction);
13488 do_neon_ld_st_interleave ();
13489 break;
13490
13491 case NEON_ALL_LANES:
13492 inst.instruction = NEON_ENC_DUP (inst.instruction);
13493 do_neon_ld_dup ();
13494 break;
13495
13496 default:
13497 inst.instruction = NEON_ENC_LANE (inst.instruction);
13498 do_neon_ld_st_lane ();
13499 }
13500
13501 /* L bit comes from bit mask. */
13502 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13503 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13504 inst.instruction |= inst.operands[1].reg << 16;
13505
13506 if (inst.operands[1].postind)
13507 {
13508 int postreg = inst.operands[1].imm & 0xf;
13509 constraint (!inst.operands[1].immisreg,
13510 _("post-index must be a register"));
13511 constraint (postreg == 0xd || postreg == 0xf,
13512 _("bad register for post-index"));
13513 inst.instruction |= postreg;
13514 }
13515 else if (inst.operands[1].writeback)
13516 {
13517 inst.instruction |= 0xd;
13518 }
13519 else
13520 inst.instruction |= 0xf;
13521
13522 if (thumb_mode)
13523 inst.instruction |= 0xf9000000;
13524 else
13525 inst.instruction |= 0xf4000000;
13526}
13527
13528\f
13529/* Overall per-instruction processing. */
13530
13531/* We need to be able to fix up arbitrary expressions in some statements.
13532 This is so that we can handle symbols that are an arbitrary distance from
13533 the pc. The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
13534 which returns part of an address in a form which will be valid for
13535 a data instruction. We do this by pushing the expression into a symbol
13536 in the expr_section, and creating a fix for that. */
13537
13538static void
13539fix_new_arm (fragS * frag,
13540 int where,
13541 short int size,
13542 expressionS * exp,
13543 int pc_rel,
13544 int reloc)
13545{
13546 fixS * new_fix;
13547
13548 switch (exp->X_op)
13549 {
13550 case O_constant:
13551 case O_symbol:
13552 case O_add:
13553 case O_subtract:
13554 new_fix = fix_new_exp (frag, where, size, exp, pc_rel, reloc);
13555 break;
13556
13557 default:
13558 new_fix = fix_new (frag, where, size, make_expr_symbol (exp), 0,
13559 pc_rel, reloc);
13560 break;
13561 }
13562
13563 /* Mark whether the fix is to a THUMB instruction, or an ARM
13564 instruction. */
13565 new_fix->tc_fix_data = thumb_mode;
13566}
13567
13568/* Create a frg for an instruction requiring relaxation. */
13569static void
13570output_relax_insn (void)
13571{
13572 char * to;
13573 symbolS *sym;
0110f2b8
PB
13574 int offset;
13575
6e1cb1a6
PB
13576 /* The size of the instruction is unknown, so tie the debug info to the
13577 start of the instruction. */
13578 dwarf2_emit_insn (0);
6e1cb1a6 13579
0110f2b8
PB
13580 switch (inst.reloc.exp.X_op)
13581 {
13582 case O_symbol:
13583 sym = inst.reloc.exp.X_add_symbol;
13584 offset = inst.reloc.exp.X_add_number;
13585 break;
13586 case O_constant:
13587 sym = NULL;
13588 offset = inst.reloc.exp.X_add_number;
13589 break;
13590 default:
13591 sym = make_expr_symbol (&inst.reloc.exp);
13592 offset = 0;
13593 break;
13594 }
13595 to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
13596 inst.relax, sym, offset, NULL/*offset, opcode*/);
13597 md_number_to_chars (to, inst.instruction, THUMB_SIZE);
0110f2b8
PB
13598}
13599
13600/* Write a 32-bit thumb instruction to buf. */
13601static void
13602put_thumb32_insn (char * buf, unsigned long insn)
13603{
13604 md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
13605 md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
13606}
13607
b99bd4ef 13608static void
c19d1205 13609output_inst (const char * str)
b99bd4ef 13610{
c19d1205 13611 char * to = NULL;
b99bd4ef 13612
c19d1205 13613 if (inst.error)
b99bd4ef 13614 {
c19d1205 13615 as_bad ("%s -- `%s'", inst.error, str);
b99bd4ef
NC
13616 return;
13617 }
0110f2b8
PB
13618 if (inst.relax) {
13619 output_relax_insn();
13620 return;
13621 }
c19d1205
ZW
13622 if (inst.size == 0)
13623 return;
b99bd4ef 13624
c19d1205
ZW
13625 to = frag_more (inst.size);
13626
13627 if (thumb_mode && (inst.size > THUMB_SIZE))
b99bd4ef 13628 {
c19d1205 13629 assert (inst.size == (2 * THUMB_SIZE));
0110f2b8 13630 put_thumb32_insn (to, inst.instruction);
b99bd4ef 13631 }
c19d1205 13632 else if (inst.size > INSN_SIZE)
b99bd4ef 13633 {
c19d1205
ZW
13634 assert (inst.size == (2 * INSN_SIZE));
13635 md_number_to_chars (to, inst.instruction, INSN_SIZE);
13636 md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
b99bd4ef 13637 }
c19d1205
ZW
13638 else
13639 md_number_to_chars (to, inst.instruction, inst.size);
b99bd4ef 13640
c19d1205
ZW
13641 if (inst.reloc.type != BFD_RELOC_UNUSED)
13642 fix_new_arm (frag_now, to - frag_now->fr_literal,
13643 inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
13644 inst.reloc.type);
b99bd4ef 13645
c19d1205 13646 dwarf2_emit_insn (inst.size);
c19d1205 13647}
b99bd4ef 13648
c19d1205
ZW
13649/* Tag values used in struct asm_opcode's tag field. */
13650enum opcode_tag
13651{
13652 OT_unconditional, /* Instruction cannot be conditionalized.
13653 The ARM condition field is still 0xE. */
13654 OT_unconditionalF, /* Instruction cannot be conditionalized
13655 and carries 0xF in its ARM condition field. */
13656 OT_csuffix, /* Instruction takes a conditional suffix. */
037e8744
JB
13657 OT_csuffixF, /* Some forms of the instruction take a conditional
13658 suffix, others place 0xF where the condition field
13659 would be. */
c19d1205
ZW
13660 OT_cinfix3, /* Instruction takes a conditional infix,
13661 beginning at character index 3. (In
13662 unified mode, it becomes a suffix.) */
088fa78e
KH
13663 OT_cinfix3_deprecated, /* The same as OT_cinfix3. This is used for
13664 tsts, cmps, cmns, and teqs. */
e3cb604e
PB
13665 OT_cinfix3_legacy, /* Legacy instruction takes a conditional infix at
13666 character index 3, even in unified mode. Used for
13667 legacy instructions where suffix and infix forms
13668 may be ambiguous. */
c19d1205 13669 OT_csuf_or_in3, /* Instruction takes either a conditional
e3cb604e 13670 suffix or an infix at character index 3. */
c19d1205
ZW
13671 OT_odd_infix_unc, /* This is the unconditional variant of an
13672 instruction that takes a conditional infix
13673 at an unusual position. In unified mode,
13674 this variant will accept a suffix. */
13675 OT_odd_infix_0 /* Values greater than or equal to OT_odd_infix_0
13676 are the conditional variants of instructions that
13677 take conditional infixes in unusual positions.
13678 The infix appears at character index
13679 (tag - OT_odd_infix_0). These are not accepted
13680 in unified mode. */
13681};
b99bd4ef 13682
c19d1205
ZW
13683/* Subroutine of md_assemble, responsible for looking up the primary
13684 opcode from the mnemonic the user wrote. STR points to the
13685 beginning of the mnemonic.
13686
13687 This is not simply a hash table lookup, because of conditional
13688 variants. Most instructions have conditional variants, which are
13689 expressed with a _conditional affix_ to the mnemonic. If we were
13690 to encode each conditional variant as a literal string in the opcode
13691 table, it would have approximately 20,000 entries.
13692
13693 Most mnemonics take this affix as a suffix, and in unified syntax,
13694 'most' is upgraded to 'all'. However, in the divided syntax, some
13695 instructions take the affix as an infix, notably the s-variants of
13696 the arithmetic instructions. Of those instructions, all but six
13697 have the infix appear after the third character of the mnemonic.
13698
13699 Accordingly, the algorithm for looking up primary opcodes given
13700 an identifier is:
13701
13702 1. Look up the identifier in the opcode table.
13703 If we find a match, go to step U.
13704
13705 2. Look up the last two characters of the identifier in the
13706 conditions table. If we find a match, look up the first N-2
13707 characters of the identifier in the opcode table. If we
13708 find a match, go to step CE.
13709
13710 3. Look up the fourth and fifth characters of the identifier in
13711 the conditions table. If we find a match, extract those
13712 characters from the identifier, and look up the remaining
13713 characters in the opcode table. If we find a match, go
13714 to step CM.
13715
13716 4. Fail.
13717
13718 U. Examine the tag field of the opcode structure, in case this is
13719 one of the six instructions with its conditional infix in an
13720 unusual place. If it is, the tag tells us where to find the
13721 infix; look it up in the conditions table and set inst.cond
13722 accordingly. Otherwise, this is an unconditional instruction.
13723 Again set inst.cond accordingly. Return the opcode structure.
13724
13725 CE. Examine the tag field to make sure this is an instruction that
13726 should receive a conditional suffix. If it is not, fail.
13727 Otherwise, set inst.cond from the suffix we already looked up,
13728 and return the opcode structure.
13729
13730 CM. Examine the tag field to make sure this is an instruction that
13731 should receive a conditional infix after the third character.
13732 If it is not, fail. Otherwise, undo the edits to the current
13733 line of input and proceed as for case CE. */
13734
13735static const struct asm_opcode *
13736opcode_lookup (char **str)
13737{
13738 char *end, *base;
13739 char *affix;
13740 const struct asm_opcode *opcode;
13741 const struct asm_cond *cond;
e3cb604e 13742 char save[2];
267d2029
JB
13743 bfd_boolean neon_supported;
13744
13745 neon_supported = ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1);
c19d1205
ZW
13746
13747 /* Scan up to the end of the mnemonic, which must end in white space,
267d2029 13748 '.' (in unified mode, or for Neon instructions), or end of string. */
c19d1205 13749 for (base = end = *str; *end != '\0'; end++)
267d2029 13750 if (*end == ' ' || ((unified_syntax || neon_supported) && *end == '.'))
c19d1205 13751 break;
b99bd4ef 13752
c19d1205
ZW
13753 if (end == base)
13754 return 0;
b99bd4ef 13755
5287ad62 13756 /* Handle a possible width suffix and/or Neon type suffix. */
c19d1205 13757 if (end[0] == '.')
b99bd4ef 13758 {
5287ad62
JB
13759 int offset = 2;
13760
267d2029
JB
13761 /* The .w and .n suffixes are only valid if the unified syntax is in
13762 use. */
13763 if (unified_syntax && end[1] == 'w')
c19d1205 13764 inst.size_req = 4;
267d2029 13765 else if (unified_syntax && end[1] == 'n')
c19d1205
ZW
13766 inst.size_req = 2;
13767 else
5287ad62
JB
13768 offset = 0;
13769
13770 inst.vectype.elems = 0;
13771
13772 *str = end + offset;
b99bd4ef 13773
5287ad62
JB
13774 if (end[offset] == '.')
13775 {
267d2029
JB
13776 /* See if we have a Neon type suffix (possible in either unified or
13777 non-unified ARM syntax mode). */
dcbf9037 13778 if (parse_neon_type (&inst.vectype, str) == FAIL)
5287ad62
JB
13779 return 0;
13780 }
13781 else if (end[offset] != '\0' && end[offset] != ' ')
13782 return 0;
b99bd4ef 13783 }
c19d1205
ZW
13784 else
13785 *str = end;
b99bd4ef 13786
c19d1205
ZW
13787 /* Look for unaffixed or special-case affixed mnemonic. */
13788 opcode = hash_find_n (arm_ops_hsh, base, end - base);
13789 if (opcode)
b99bd4ef 13790 {
c19d1205
ZW
13791 /* step U */
13792 if (opcode->tag < OT_odd_infix_0)
b99bd4ef 13793 {
c19d1205
ZW
13794 inst.cond = COND_ALWAYS;
13795 return opcode;
b99bd4ef 13796 }
b99bd4ef 13797
c19d1205
ZW
13798 if (unified_syntax)
13799 as_warn (_("conditional infixes are deprecated in unified syntax"));
13800 affix = base + (opcode->tag - OT_odd_infix_0);
13801 cond = hash_find_n (arm_cond_hsh, affix, 2);
13802 assert (cond);
b99bd4ef 13803
c19d1205
ZW
13804 inst.cond = cond->value;
13805 return opcode;
13806 }
b99bd4ef 13807
c19d1205
ZW
13808 /* Cannot have a conditional suffix on a mnemonic of less than two
13809 characters. */
13810 if (end - base < 3)
13811 return 0;
b99bd4ef 13812
c19d1205
ZW
13813 /* Look for suffixed mnemonic. */
13814 affix = end - 2;
13815 cond = hash_find_n (arm_cond_hsh, affix, 2);
13816 opcode = hash_find_n (arm_ops_hsh, base, affix - base);
13817 if (opcode && cond)
13818 {
13819 /* step CE */
13820 switch (opcode->tag)
13821 {
e3cb604e
PB
13822 case OT_cinfix3_legacy:
13823 /* Ignore conditional suffixes matched on infix only mnemonics. */
13824 break;
13825
c19d1205 13826 case OT_cinfix3:
088fa78e 13827 case OT_cinfix3_deprecated:
c19d1205
ZW
13828 case OT_odd_infix_unc:
13829 if (!unified_syntax)
e3cb604e 13830 return 0;
c19d1205
ZW
13831 /* else fall through */
13832
13833 case OT_csuffix:
037e8744 13834 case OT_csuffixF:
c19d1205
ZW
13835 case OT_csuf_or_in3:
13836 inst.cond = cond->value;
13837 return opcode;
13838
13839 case OT_unconditional:
13840 case OT_unconditionalF:
dfa9f0d5
PB
13841 if (thumb_mode)
13842 {
13843 inst.cond = cond->value;
13844 }
13845 else
13846 {
13847 /* delayed diagnostic */
13848 inst.error = BAD_COND;
13849 inst.cond = COND_ALWAYS;
13850 }
c19d1205 13851 return opcode;
b99bd4ef 13852
c19d1205
ZW
13853 default:
13854 return 0;
13855 }
13856 }
b99bd4ef 13857
c19d1205
ZW
13858 /* Cannot have a usual-position infix on a mnemonic of less than
13859 six characters (five would be a suffix). */
13860 if (end - base < 6)
13861 return 0;
b99bd4ef 13862
c19d1205
ZW
13863 /* Look for infixed mnemonic in the usual position. */
13864 affix = base + 3;
13865 cond = hash_find_n (arm_cond_hsh, affix, 2);
e3cb604e
PB
13866 if (!cond)
13867 return 0;
13868
13869 memcpy (save, affix, 2);
13870 memmove (affix, affix + 2, (end - affix) - 2);
13871 opcode = hash_find_n (arm_ops_hsh, base, (end - base) - 2);
13872 memmove (affix + 2, affix, (end - affix) - 2);
13873 memcpy (affix, save, 2);
13874
088fa78e
KH
13875 if (opcode
13876 && (opcode->tag == OT_cinfix3
13877 || opcode->tag == OT_cinfix3_deprecated
13878 || opcode->tag == OT_csuf_or_in3
13879 || opcode->tag == OT_cinfix3_legacy))
b99bd4ef 13880 {
c19d1205 13881 /* step CM */
088fa78e
KH
13882 if (unified_syntax
13883 && (opcode->tag == OT_cinfix3
13884 || opcode->tag == OT_cinfix3_deprecated))
c19d1205
ZW
13885 as_warn (_("conditional infixes are deprecated in unified syntax"));
13886
13887 inst.cond = cond->value;
13888 return opcode;
b99bd4ef
NC
13889 }
13890
c19d1205 13891 return 0;
b99bd4ef
NC
13892}
13893
c19d1205
ZW
13894void
13895md_assemble (char *str)
b99bd4ef 13896{
c19d1205
ZW
13897 char *p = str;
13898 const struct asm_opcode * opcode;
b99bd4ef 13899
c19d1205
ZW
13900 /* Align the previous label if needed. */
13901 if (last_label_seen != NULL)
b99bd4ef 13902 {
c19d1205
ZW
13903 symbol_set_frag (last_label_seen, frag_now);
13904 S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
13905 S_SET_SEGMENT (last_label_seen, now_seg);
b99bd4ef
NC
13906 }
13907
c19d1205
ZW
13908 memset (&inst, '\0', sizeof (inst));
13909 inst.reloc.type = BFD_RELOC_UNUSED;
b99bd4ef 13910
c19d1205
ZW
13911 opcode = opcode_lookup (&p);
13912 if (!opcode)
b99bd4ef 13913 {
c19d1205 13914 /* It wasn't an instruction, but it might be a register alias of
dcbf9037
JB
13915 the form alias .req reg, or a Neon .dn/.qn directive. */
13916 if (!create_register_alias (str, p)
13917 && !create_neon_reg_alias (str, p))
c19d1205 13918 as_bad (_("bad instruction `%s'"), str);
b99bd4ef 13919
b99bd4ef
NC
13920 return;
13921 }
13922
088fa78e
KH
13923 if (opcode->tag == OT_cinfix3_deprecated)
13924 as_warn (_("s suffix on comparison instruction is deprecated"));
13925
037e8744
JB
13926 /* The value which unconditional instructions should have in place of the
13927 condition field. */
13928 inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
13929
c19d1205 13930 if (thumb_mode)
b99bd4ef 13931 {
e74cfd16 13932 arm_feature_set variant;
8f06b2d8
PB
13933
13934 variant = cpu_variant;
13935 /* Only allow coprocessor instructions on Thumb-2 capable devices. */
e74cfd16
PB
13936 if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
13937 ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
c19d1205 13938 /* Check that this instruction is supported for this CPU. */
62b3e311
PB
13939 if (!opcode->tvariant
13940 || (thumb_mode == 1
13941 && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
b99bd4ef 13942 {
c19d1205 13943 as_bad (_("selected processor does not support `%s'"), str);
b99bd4ef
NC
13944 return;
13945 }
c19d1205
ZW
13946 if (inst.cond != COND_ALWAYS && !unified_syntax
13947 && opcode->tencode != do_t_branch)
b99bd4ef 13948 {
c19d1205 13949 as_bad (_("Thumb does not support conditional execution"));
b99bd4ef
NC
13950 return;
13951 }
13952
e27ec89e
PB
13953 /* Check conditional suffixes. */
13954 if (current_it_mask)
13955 {
13956 int cond;
13957 cond = current_cc ^ ((current_it_mask >> 4) & 1) ^ 1;
dfa9f0d5
PB
13958 current_it_mask <<= 1;
13959 current_it_mask &= 0x1f;
13960 /* The BKPT instruction is unconditional even in an IT block. */
13961 if (!inst.error
13962 && cond != inst.cond && opcode->tencode != do_t_bkpt)
e27ec89e
PB
13963 {
13964 as_bad (_("incorrect condition in IT block"));
13965 return;
13966 }
e27ec89e
PB
13967 }
13968 else if (inst.cond != COND_ALWAYS && opcode->tencode != do_t_branch)
13969 {
13970 as_bad (_("thumb conditional instrunction not in IT block"));
13971 return;
13972 }
13973
c19d1205
ZW
13974 mapping_state (MAP_THUMB);
13975 inst.instruction = opcode->tvalue;
13976
13977 if (!parse_operands (p, opcode->operands))
13978 opcode->tencode ();
13979
e27ec89e
PB
13980 /* Clear current_it_mask at the end of an IT block. */
13981 if (current_it_mask == 0x10)
13982 current_it_mask = 0;
13983
0110f2b8 13984 if (!(inst.error || inst.relax))
b99bd4ef 13985 {
c19d1205
ZW
13986 assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
13987 inst.size = (inst.instruction > 0xffff ? 4 : 2);
13988 if (inst.size_req && inst.size_req != inst.size)
b99bd4ef 13989 {
c19d1205 13990 as_bad (_("cannot honor width suffix -- `%s'"), str);
b99bd4ef
NC
13991 return;
13992 }
13993 }
e74cfd16
PB
13994 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
13995 *opcode->tvariant);
ee065d83 13996 /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
708587a4 13997 set those bits when Thumb-2 32-bit instructions are seen. ie.
ee065d83
PB
13998 anything other than bl/blx.
13999 This is overly pessimistic for relaxable instructions. */
14000 if ((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
14001 || inst.relax)
e74cfd16
PB
14002 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
14003 arm_ext_v6t2);
c19d1205 14004 }
3e9e4fcf 14005 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
c19d1205
ZW
14006 {
14007 /* Check that this instruction is supported for this CPU. */
62b3e311
PB
14008 if (!opcode->avariant ||
14009 !ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant))
b99bd4ef 14010 {
c19d1205
ZW
14011 as_bad (_("selected processor does not support `%s'"), str);
14012 return;
b99bd4ef 14013 }
c19d1205 14014 if (inst.size_req)
b99bd4ef 14015 {
c19d1205
ZW
14016 as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
14017 return;
b99bd4ef
NC
14018 }
14019
c19d1205
ZW
14020 mapping_state (MAP_ARM);
14021 inst.instruction = opcode->avalue;
14022 if (opcode->tag == OT_unconditionalF)
14023 inst.instruction |= 0xF << 28;
14024 else
14025 inst.instruction |= inst.cond << 28;
14026 inst.size = INSN_SIZE;
14027 if (!parse_operands (p, opcode->operands))
14028 opcode->aencode ();
ee065d83
PB
14029 /* Arm mode bx is marked as both v4T and v5 because it's still required
14030 on a hypothetical non-thumb v5 core. */
e74cfd16
PB
14031 if (ARM_CPU_HAS_FEATURE (*opcode->avariant, arm_ext_v4t)
14032 || ARM_CPU_HAS_FEATURE (*opcode->avariant, arm_ext_v5))
14033 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
ee065d83 14034 else
e74cfd16
PB
14035 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
14036 *opcode->avariant);
b99bd4ef 14037 }
3e9e4fcf
JB
14038 else
14039 {
14040 as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
14041 "-- `%s'"), str);
14042 return;
14043 }
c19d1205
ZW
14044 output_inst (str);
14045}
b99bd4ef 14046
c19d1205
ZW
14047/* Various frobbings of labels and their addresses. */
14048
14049void
14050arm_start_line_hook (void)
14051{
14052 last_label_seen = NULL;
b99bd4ef
NC
14053}
14054
c19d1205
ZW
14055void
14056arm_frob_label (symbolS * sym)
b99bd4ef 14057{
c19d1205 14058 last_label_seen = sym;
b99bd4ef 14059
c19d1205 14060 ARM_SET_THUMB (sym, thumb_mode);
b99bd4ef 14061
c19d1205
ZW
14062#if defined OBJ_COFF || defined OBJ_ELF
14063 ARM_SET_INTERWORK (sym, support_interwork);
14064#endif
b99bd4ef 14065
c19d1205
ZW
14066 /* Note - do not allow local symbols (.Lxxx) to be labeled
14067 as Thumb functions. This is because these labels, whilst
14068 they exist inside Thumb code, are not the entry points for
14069 possible ARM->Thumb calls. Also, these labels can be used
14070 as part of a computed goto or switch statement. eg gcc
14071 can generate code that looks like this:
b99bd4ef 14072
c19d1205
ZW
14073 ldr r2, [pc, .Laaa]
14074 lsl r3, r3, #2
14075 ldr r2, [r3, r2]
14076 mov pc, r2
b99bd4ef 14077
c19d1205
ZW
14078 .Lbbb: .word .Lxxx
14079 .Lccc: .word .Lyyy
14080 ..etc...
14081 .Laaa: .word Lbbb
b99bd4ef 14082
c19d1205
ZW
14083 The first instruction loads the address of the jump table.
14084 The second instruction converts a table index into a byte offset.
14085 The third instruction gets the jump address out of the table.
14086 The fourth instruction performs the jump.
b99bd4ef 14087
c19d1205
ZW
14088 If the address stored at .Laaa is that of a symbol which has the
14089 Thumb_Func bit set, then the linker will arrange for this address
14090 to have the bottom bit set, which in turn would mean that the
14091 address computation performed by the third instruction would end
14092 up with the bottom bit set. Since the ARM is capable of unaligned
14093 word loads, the instruction would then load the incorrect address
14094 out of the jump table, and chaos would ensue. */
14095 if (label_is_thumb_function_name
14096 && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
14097 && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
b99bd4ef 14098 {
c19d1205
ZW
14099 /* When the address of a Thumb function is taken the bottom
14100 bit of that address should be set. This will allow
14101 interworking between Arm and Thumb functions to work
14102 correctly. */
b99bd4ef 14103
c19d1205 14104 THUMB_SET_FUNC (sym, 1);
b99bd4ef 14105
c19d1205 14106 label_is_thumb_function_name = FALSE;
b99bd4ef 14107 }
07a53e5c 14108
07a53e5c 14109 dwarf2_emit_label (sym);
b99bd4ef
NC
14110}
14111
c19d1205
ZW
14112int
14113arm_data_in_code (void)
b99bd4ef 14114{
c19d1205 14115 if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
b99bd4ef 14116 {
c19d1205
ZW
14117 *input_line_pointer = '/';
14118 input_line_pointer += 5;
14119 *input_line_pointer = 0;
14120 return 1;
b99bd4ef
NC
14121 }
14122
c19d1205 14123 return 0;
b99bd4ef
NC
14124}
14125
c19d1205
ZW
14126char *
14127arm_canonicalize_symbol_name (char * name)
b99bd4ef 14128{
c19d1205 14129 int len;
b99bd4ef 14130
c19d1205
ZW
14131 if (thumb_mode && (len = strlen (name)) > 5
14132 && streq (name + len - 5, "/data"))
14133 *(name + len - 5) = 0;
b99bd4ef 14134
c19d1205 14135 return name;
b99bd4ef 14136}
c19d1205
ZW
14137\f
14138/* Table of all register names defined by default. The user can
14139 define additional names with .req. Note that all register names
14140 should appear in both upper and lowercase variants. Some registers
14141 also have mixed-case names. */
b99bd4ef 14142
dcbf9037 14143#define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
c19d1205 14144#define REGNUM(p,n,t) REGDEF(p##n, n, t)
5287ad62 14145#define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
c19d1205
ZW
14146#define REGSET(p,t) \
14147 REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
14148 REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
14149 REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
14150 REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
5287ad62
JB
14151#define REGSETH(p,t) \
14152 REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
14153 REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
14154 REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
14155 REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
14156#define REGSET2(p,t) \
14157 REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
14158 REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
14159 REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
14160 REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
7ed4c4c5 14161
c19d1205 14162static const struct reg_entry reg_names[] =
7ed4c4c5 14163{
c19d1205
ZW
14164 /* ARM integer registers. */
14165 REGSET(r, RN), REGSET(R, RN),
7ed4c4c5 14166
c19d1205
ZW
14167 /* ATPCS synonyms. */
14168 REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
14169 REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
14170 REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
7ed4c4c5 14171
c19d1205
ZW
14172 REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
14173 REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
14174 REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
7ed4c4c5 14175
c19d1205
ZW
14176 /* Well-known aliases. */
14177 REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
14178 REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
14179
14180 REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
14181 REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
14182
14183 /* Coprocessor numbers. */
14184 REGSET(p, CP), REGSET(P, CP),
14185
14186 /* Coprocessor register numbers. The "cr" variants are for backward
14187 compatibility. */
14188 REGSET(c, CN), REGSET(C, CN),
14189 REGSET(cr, CN), REGSET(CR, CN),
14190
14191 /* FPA registers. */
14192 REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
14193 REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
14194
14195 REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
14196 REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
14197
14198 /* VFP SP registers. */
5287ad62
JB
14199 REGSET(s,VFS), REGSET(S,VFS),
14200 REGSETH(s,VFS), REGSETH(S,VFS),
c19d1205
ZW
14201
14202 /* VFP DP Registers. */
5287ad62
JB
14203 REGSET(d,VFD), REGSET(D,VFD),
14204 /* Extra Neon DP registers. */
14205 REGSETH(d,VFD), REGSETH(D,VFD),
14206
14207 /* Neon QP registers. */
14208 REGSET2(q,NQ), REGSET2(Q,NQ),
c19d1205
ZW
14209
14210 /* VFP control registers. */
14211 REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
14212 REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
14213
14214 /* Maverick DSP coprocessor registers. */
14215 REGSET(mvf,MVF), REGSET(mvd,MVD), REGSET(mvfx,MVFX), REGSET(mvdx,MVDX),
14216 REGSET(MVF,MVF), REGSET(MVD,MVD), REGSET(MVFX,MVFX), REGSET(MVDX,MVDX),
14217
14218 REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
14219 REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
14220 REGDEF(dspsc,0,DSPSC),
14221
14222 REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
14223 REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
14224 REGDEF(DSPSC,0,DSPSC),
14225
14226 /* iWMMXt data registers - p0, c0-15. */
14227 REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
14228
14229 /* iWMMXt control registers - p1, c0-3. */
14230 REGDEF(wcid, 0,MMXWC), REGDEF(wCID, 0,MMXWC), REGDEF(WCID, 0,MMXWC),
14231 REGDEF(wcon, 1,MMXWC), REGDEF(wCon, 1,MMXWC), REGDEF(WCON, 1,MMXWC),
14232 REGDEF(wcssf, 2,MMXWC), REGDEF(wCSSF, 2,MMXWC), REGDEF(WCSSF, 2,MMXWC),
14233 REGDEF(wcasf, 3,MMXWC), REGDEF(wCASF, 3,MMXWC), REGDEF(WCASF, 3,MMXWC),
14234
14235 /* iWMMXt scalar (constant/offset) registers - p1, c8-11. */
14236 REGDEF(wcgr0, 8,MMXWCG), REGDEF(wCGR0, 8,MMXWCG), REGDEF(WCGR0, 8,MMXWCG),
14237 REGDEF(wcgr1, 9,MMXWCG), REGDEF(wCGR1, 9,MMXWCG), REGDEF(WCGR1, 9,MMXWCG),
14238 REGDEF(wcgr2,10,MMXWCG), REGDEF(wCGR2,10,MMXWCG), REGDEF(WCGR2,10,MMXWCG),
14239 REGDEF(wcgr3,11,MMXWCG), REGDEF(wCGR3,11,MMXWCG), REGDEF(WCGR3,11,MMXWCG),
14240
14241 /* XScale accumulator registers. */
14242 REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
14243};
14244#undef REGDEF
14245#undef REGNUM
14246#undef REGSET
7ed4c4c5 14247
c19d1205
ZW
14248/* Table of all PSR suffixes. Bare "CPSR" and "SPSR" are handled
14249 within psr_required_here. */
14250static const struct asm_psr psrs[] =
14251{
14252 /* Backward compatibility notation. Note that "all" is no longer
14253 truly all possible PSR bits. */
14254 {"all", PSR_c | PSR_f},
14255 {"flg", PSR_f},
14256 {"ctl", PSR_c},
14257
14258 /* Individual flags. */
14259 {"f", PSR_f},
14260 {"c", PSR_c},
14261 {"x", PSR_x},
14262 {"s", PSR_s},
14263 /* Combinations of flags. */
14264 {"fs", PSR_f | PSR_s},
14265 {"fx", PSR_f | PSR_x},
14266 {"fc", PSR_f | PSR_c},
14267 {"sf", PSR_s | PSR_f},
14268 {"sx", PSR_s | PSR_x},
14269 {"sc", PSR_s | PSR_c},
14270 {"xf", PSR_x | PSR_f},
14271 {"xs", PSR_x | PSR_s},
14272 {"xc", PSR_x | PSR_c},
14273 {"cf", PSR_c | PSR_f},
14274 {"cs", PSR_c | PSR_s},
14275 {"cx", PSR_c | PSR_x},
14276 {"fsx", PSR_f | PSR_s | PSR_x},
14277 {"fsc", PSR_f | PSR_s | PSR_c},
14278 {"fxs", PSR_f | PSR_x | PSR_s},
14279 {"fxc", PSR_f | PSR_x | PSR_c},
14280 {"fcs", PSR_f | PSR_c | PSR_s},
14281 {"fcx", PSR_f | PSR_c | PSR_x},
14282 {"sfx", PSR_s | PSR_f | PSR_x},
14283 {"sfc", PSR_s | PSR_f | PSR_c},
14284 {"sxf", PSR_s | PSR_x | PSR_f},
14285 {"sxc", PSR_s | PSR_x | PSR_c},
14286 {"scf", PSR_s | PSR_c | PSR_f},
14287 {"scx", PSR_s | PSR_c | PSR_x},
14288 {"xfs", PSR_x | PSR_f | PSR_s},
14289 {"xfc", PSR_x | PSR_f | PSR_c},
14290 {"xsf", PSR_x | PSR_s | PSR_f},
14291 {"xsc", PSR_x | PSR_s | PSR_c},
14292 {"xcf", PSR_x | PSR_c | PSR_f},
14293 {"xcs", PSR_x | PSR_c | PSR_s},
14294 {"cfs", PSR_c | PSR_f | PSR_s},
14295 {"cfx", PSR_c | PSR_f | PSR_x},
14296 {"csf", PSR_c | PSR_s | PSR_f},
14297 {"csx", PSR_c | PSR_s | PSR_x},
14298 {"cxf", PSR_c | PSR_x | PSR_f},
14299 {"cxs", PSR_c | PSR_x | PSR_s},
14300 {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
14301 {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
14302 {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
14303 {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
14304 {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
14305 {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
14306 {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
14307 {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
14308 {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
14309 {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
14310 {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
14311 {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
14312 {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
14313 {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
14314 {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
14315 {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
14316 {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
14317 {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
14318 {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
14319 {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
14320 {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
14321 {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
14322 {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
14323 {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
14324};
14325
62b3e311
PB
14326/* Table of V7M psr names. */
14327static const struct asm_psr v7m_psrs[] =
14328{
14329 {"apsr", 0 },
14330 {"iapsr", 1 },
14331 {"eapsr", 2 },
14332 {"psr", 3 },
14333 {"ipsr", 5 },
14334 {"epsr", 6 },
14335 {"iepsr", 7 },
14336 {"msp", 8 },
14337 {"psp", 9 },
14338 {"primask", 16},
14339 {"basepri", 17},
14340 {"basepri_max", 18},
14341 {"faultmask", 19},
14342 {"control", 20}
14343};
14344
c19d1205
ZW
14345/* Table of all shift-in-operand names. */
14346static const struct asm_shift_name shift_names [] =
b99bd4ef 14347{
c19d1205
ZW
14348 { "asl", SHIFT_LSL }, { "ASL", SHIFT_LSL },
14349 { "lsl", SHIFT_LSL }, { "LSL", SHIFT_LSL },
14350 { "lsr", SHIFT_LSR }, { "LSR", SHIFT_LSR },
14351 { "asr", SHIFT_ASR }, { "ASR", SHIFT_ASR },
14352 { "ror", SHIFT_ROR }, { "ROR", SHIFT_ROR },
14353 { "rrx", SHIFT_RRX }, { "RRX", SHIFT_RRX }
14354};
b99bd4ef 14355
c19d1205
ZW
14356/* Table of all explicit relocation names. */
14357#ifdef OBJ_ELF
14358static struct reloc_entry reloc_names[] =
14359{
14360 { "got", BFD_RELOC_ARM_GOT32 }, { "GOT", BFD_RELOC_ARM_GOT32 },
14361 { "gotoff", BFD_RELOC_ARM_GOTOFF }, { "GOTOFF", BFD_RELOC_ARM_GOTOFF },
14362 { "plt", BFD_RELOC_ARM_PLT32 }, { "PLT", BFD_RELOC_ARM_PLT32 },
14363 { "target1", BFD_RELOC_ARM_TARGET1 }, { "TARGET1", BFD_RELOC_ARM_TARGET1 },
14364 { "target2", BFD_RELOC_ARM_TARGET2 }, { "TARGET2", BFD_RELOC_ARM_TARGET2 },
14365 { "sbrel", BFD_RELOC_ARM_SBREL32 }, { "SBREL", BFD_RELOC_ARM_SBREL32 },
14366 { "tlsgd", BFD_RELOC_ARM_TLS_GD32}, { "TLSGD", BFD_RELOC_ARM_TLS_GD32},
14367 { "tlsldm", BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM", BFD_RELOC_ARM_TLS_LDM32},
14368 { "tlsldo", BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO", BFD_RELOC_ARM_TLS_LDO32},
14369 { "gottpoff",BFD_RELOC_ARM_TLS_IE32}, { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
14370 { "tpoff", BFD_RELOC_ARM_TLS_LE32}, { "TPOFF", BFD_RELOC_ARM_TLS_LE32}
14371};
14372#endif
b99bd4ef 14373
c19d1205
ZW
14374/* Table of all conditional affixes. 0xF is not defined as a condition code. */
14375static const struct asm_cond conds[] =
14376{
14377 {"eq", 0x0},
14378 {"ne", 0x1},
14379 {"cs", 0x2}, {"hs", 0x2},
14380 {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
14381 {"mi", 0x4},
14382 {"pl", 0x5},
14383 {"vs", 0x6},
14384 {"vc", 0x7},
14385 {"hi", 0x8},
14386 {"ls", 0x9},
14387 {"ge", 0xa},
14388 {"lt", 0xb},
14389 {"gt", 0xc},
14390 {"le", 0xd},
14391 {"al", 0xe}
14392};
bfae80f2 14393
62b3e311
PB
14394static struct asm_barrier_opt barrier_opt_names[] =
14395{
14396 { "sy", 0xf },
14397 { "un", 0x7 },
14398 { "st", 0xe },
14399 { "unst", 0x6 }
14400};
14401
c19d1205
ZW
14402/* Table of ARM-format instructions. */
14403
14404/* Macros for gluing together operand strings. N.B. In all cases
14405 other than OPS0, the trailing OP_stop comes from default
14406 zero-initialization of the unspecified elements of the array. */
14407#define OPS0() { OP_stop, }
14408#define OPS1(a) { OP_##a, }
14409#define OPS2(a,b) { OP_##a,OP_##b, }
14410#define OPS3(a,b,c) { OP_##a,OP_##b,OP_##c, }
14411#define OPS4(a,b,c,d) { OP_##a,OP_##b,OP_##c,OP_##d, }
14412#define OPS5(a,b,c,d,e) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
14413#define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
14414
14415/* These macros abstract out the exact format of the mnemonic table and
14416 save some repeated characters. */
14417
14418/* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix. */
14419#define TxCE(mnem, op, top, nops, ops, ae, te) \
14420 { #mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
1887dd22 14421 THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
14422
14423/* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
14424 a T_MNEM_xyz enumerator. */
14425#define TCE(mnem, aop, top, nops, ops, ae, te) \
14426 TxCE(mnem, aop, 0x##top, nops, ops, ae, te)
14427#define tCE(mnem, aop, top, nops, ops, ae, te) \
14428 TxCE(mnem, aop, T_MNEM_##top, nops, ops, ae, te)
14429
14430/* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
14431 infix after the third character. */
14432#define TxC3(mnem, op, top, nops, ops, ae, te) \
14433 { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
1887dd22 14434 THUMB_VARIANT, do_##ae, do_##te }
088fa78e
KH
14435#define TxC3w(mnem, op, top, nops, ops, ae, te) \
14436 { #mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
14437 THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
14438#define TC3(mnem, aop, top, nops, ops, ae, te) \
14439 TxC3(mnem, aop, 0x##top, nops, ops, ae, te)
088fa78e
KH
14440#define TC3w(mnem, aop, top, nops, ops, ae, te) \
14441 TxC3w(mnem, aop, 0x##top, nops, ops, ae, te)
c19d1205
ZW
14442#define tC3(mnem, aop, top, nops, ops, ae, te) \
14443 TxC3(mnem, aop, T_MNEM_##top, nops, ops, ae, te)
088fa78e
KH
14444#define tC3w(mnem, aop, top, nops, ops, ae, te) \
14445 TxC3w(mnem, aop, T_MNEM_##top, nops, ops, ae, te)
c19d1205
ZW
14446
14447/* Mnemonic with a conditional infix in an unusual place. Each and every variant has to
14448 appear in the condition table. */
14449#define TxCM_(m1, m2, m3, op, top, nops, ops, ae, te) \
14450 { #m1 #m2 #m3, OPS##nops ops, sizeof(#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof(#m1) - 1, \
1887dd22 14451 0x##op, top, ARM_VARIANT, THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
14452
14453#define TxCM(m1, m2, op, top, nops, ops, ae, te) \
14454 TxCM_(m1, , m2, op, top, nops, ops, ae, te), \
14455 TxCM_(m1, eq, m2, op, top, nops, ops, ae, te), \
14456 TxCM_(m1, ne, m2, op, top, nops, ops, ae, te), \
14457 TxCM_(m1, cs, m2, op, top, nops, ops, ae, te), \
14458 TxCM_(m1, hs, m2, op, top, nops, ops, ae, te), \
14459 TxCM_(m1, cc, m2, op, top, nops, ops, ae, te), \
14460 TxCM_(m1, ul, m2, op, top, nops, ops, ae, te), \
14461 TxCM_(m1, lo, m2, op, top, nops, ops, ae, te), \
14462 TxCM_(m1, mi, m2, op, top, nops, ops, ae, te), \
14463 TxCM_(m1, pl, m2, op, top, nops, ops, ae, te), \
14464 TxCM_(m1, vs, m2, op, top, nops, ops, ae, te), \
14465 TxCM_(m1, vc, m2, op, top, nops, ops, ae, te), \
14466 TxCM_(m1, hi, m2, op, top, nops, ops, ae, te), \
14467 TxCM_(m1, ls, m2, op, top, nops, ops, ae, te), \
14468 TxCM_(m1, ge, m2, op, top, nops, ops, ae, te), \
14469 TxCM_(m1, lt, m2, op, top, nops, ops, ae, te), \
14470 TxCM_(m1, gt, m2, op, top, nops, ops, ae, te), \
14471 TxCM_(m1, le, m2, op, top, nops, ops, ae, te), \
14472 TxCM_(m1, al, m2, op, top, nops, ops, ae, te)
14473
14474#define TCM(m1,m2, aop, top, nops, ops, ae, te) \
14475 TxCM(m1,m2, aop, 0x##top, nops, ops, ae, te)
14476#define tCM(m1,m2, aop, top, nops, ops, ae, te) \
14477 TxCM(m1,m2, aop, T_MNEM_##top, nops, ops, ae, te)
14478
14479/* Mnemonic that cannot be conditionalized. The ARM condition-code
dfa9f0d5
PB
14480 field is still 0xE. Many of the Thumb variants can be executed
14481 conditionally, so this is checked separately. */
c19d1205
ZW
14482#define TUE(mnem, op, top, nops, ops, ae, te) \
14483 { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
1887dd22 14484 THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
14485
14486/* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
14487 condition code field. */
14488#define TUF(mnem, op, top, nops, ops, ae, te) \
14489 { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
1887dd22 14490 THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
14491
14492/* ARM-only variants of all the above. */
6a86118a
NC
14493#define CE(mnem, op, nops, ops, ae) \
14494 { #mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
14495
14496#define C3(mnem, op, nops, ops, ae) \
14497 { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
14498
e3cb604e
PB
14499/* Legacy mnemonics that always have conditional infix after the third
14500 character. */
14501#define CL(mnem, op, nops, ops, ae) \
14502 { #mnem, OPS##nops ops, OT_cinfix3_legacy, \
14503 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
14504
8f06b2d8
PB
14505/* Coprocessor instructions. Isomorphic between Arm and Thumb-2. */
14506#define cCE(mnem, op, nops, ops, ae) \
14507 { #mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
14508
e3cb604e
PB
14509/* Legacy coprocessor instructions where conditional infix and conditional
14510 suffix are ambiguous. For consistency this includes all FPA instructions,
14511 not just the potentially ambiguous ones. */
14512#define cCL(mnem, op, nops, ops, ae) \
14513 { #mnem, OPS##nops ops, OT_cinfix3_legacy, \
14514 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
14515
14516/* Coprocessor, takes either a suffix or a position-3 infix
14517 (for an FPA corner case). */
14518#define C3E(mnem, op, nops, ops, ae) \
14519 { #mnem, OPS##nops ops, OT_csuf_or_in3, \
14520 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
8f06b2d8 14521
6a86118a
NC
14522#define xCM_(m1, m2, m3, op, nops, ops, ae) \
14523 { #m1 #m2 #m3, OPS##nops ops, \
14524 sizeof(#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof(#m1) - 1, \
14525 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
14526
14527#define CM(m1, m2, op, nops, ops, ae) \
14528 xCM_(m1, , m2, op, nops, ops, ae), \
14529 xCM_(m1, eq, m2, op, nops, ops, ae), \
14530 xCM_(m1, ne, m2, op, nops, ops, ae), \
14531 xCM_(m1, cs, m2, op, nops, ops, ae), \
14532 xCM_(m1, hs, m2, op, nops, ops, ae), \
14533 xCM_(m1, cc, m2, op, nops, ops, ae), \
14534 xCM_(m1, ul, m2, op, nops, ops, ae), \
14535 xCM_(m1, lo, m2, op, nops, ops, ae), \
14536 xCM_(m1, mi, m2, op, nops, ops, ae), \
14537 xCM_(m1, pl, m2, op, nops, ops, ae), \
14538 xCM_(m1, vs, m2, op, nops, ops, ae), \
14539 xCM_(m1, vc, m2, op, nops, ops, ae), \
14540 xCM_(m1, hi, m2, op, nops, ops, ae), \
14541 xCM_(m1, ls, m2, op, nops, ops, ae), \
14542 xCM_(m1, ge, m2, op, nops, ops, ae), \
14543 xCM_(m1, lt, m2, op, nops, ops, ae), \
14544 xCM_(m1, gt, m2, op, nops, ops, ae), \
14545 xCM_(m1, le, m2, op, nops, ops, ae), \
14546 xCM_(m1, al, m2, op, nops, ops, ae)
14547
14548#define UE(mnem, op, nops, ops, ae) \
14549 { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
14550
14551#define UF(mnem, op, nops, ops, ae) \
14552 { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
14553
5287ad62
JB
14554/* Neon data-processing. ARM versions are unconditional with cond=0xf.
14555 The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
14556 use the same encoding function for each. */
14557#define NUF(mnem, op, nops, ops, enc) \
14558 { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op, \
14559 ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
14560
14561/* Neon data processing, version which indirects through neon_enc_tab for
14562 the various overloaded versions of opcodes. */
14563#define nUF(mnem, op, nops, ops, enc) \
14564 { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM_##op, N_MNEM_##op, \
14565 ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
14566
14567/* Neon insn with conditional suffix for the ARM version, non-overloaded
14568 version. */
037e8744
JB
14569#define NCE_tag(mnem, op, nops, ops, enc, tag) \
14570 { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT, \
5287ad62
JB
14571 THUMB_VARIANT, do_##enc, do_##enc }
14572
037e8744
JB
14573#define NCE(mnem, op, nops, ops, enc) \
14574 NCE_tag(mnem, op, nops, ops, enc, OT_csuffix)
14575
14576#define NCEF(mnem, op, nops, ops, enc) \
14577 NCE_tag(mnem, op, nops, ops, enc, OT_csuffixF)
14578
5287ad62 14579/* Neon insn with conditional suffix for the ARM version, overloaded types. */
037e8744
JB
14580#define nCE_tag(mnem, op, nops, ops, enc, tag) \
14581 { #mnem, OPS##nops ops, tag, N_MNEM_##op, N_MNEM_##op, \
5287ad62
JB
14582 ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
14583
037e8744
JB
14584#define nCE(mnem, op, nops, ops, enc) \
14585 nCE_tag(mnem, op, nops, ops, enc, OT_csuffix)
14586
14587#define nCEF(mnem, op, nops, ops, enc) \
14588 nCE_tag(mnem, op, nops, ops, enc, OT_csuffixF)
14589
c19d1205
ZW
14590#define do_0 0
14591
14592/* Thumb-only, unconditional. */
14593#define UT(mnem, op, nops, ops, te) TUE(mnem, 0, op, nops, ops, 0, te)
14594
c19d1205 14595static const struct asm_opcode insns[] =
bfae80f2 14596{
e74cfd16
PB
14597#define ARM_VARIANT &arm_ext_v1 /* Core ARM Instructions. */
14598#define THUMB_VARIANT &arm_ext_v4t
c19d1205
ZW
14599 tCE(and, 0000000, and, 3, (RR, oRR, SH), arit, t_arit3c),
14600 tC3(ands, 0100000, ands, 3, (RR, oRR, SH), arit, t_arit3c),
14601 tCE(eor, 0200000, eor, 3, (RR, oRR, SH), arit, t_arit3c),
14602 tC3(eors, 0300000, eors, 3, (RR, oRR, SH), arit, t_arit3c),
14603 tCE(sub, 0400000, sub, 3, (RR, oRR, SH), arit, t_add_sub),
14604 tC3(subs, 0500000, subs, 3, (RR, oRR, SH), arit, t_add_sub),
4962c51a
MS
14605 tCE(add, 0800000, add, 3, (RR, oRR, SHG), arit, t_add_sub),
14606 tC3(adds, 0900000, adds, 3, (RR, oRR, SHG), arit, t_add_sub),
c19d1205
ZW
14607 tCE(adc, 0a00000, adc, 3, (RR, oRR, SH), arit, t_arit3c),
14608 tC3(adcs, 0b00000, adcs, 3, (RR, oRR, SH), arit, t_arit3c),
14609 tCE(sbc, 0c00000, sbc, 3, (RR, oRR, SH), arit, t_arit3),
14610 tC3(sbcs, 0d00000, sbcs, 3, (RR, oRR, SH), arit, t_arit3),
14611 tCE(orr, 1800000, orr, 3, (RR, oRR, SH), arit, t_arit3c),
14612 tC3(orrs, 1900000, orrs, 3, (RR, oRR, SH), arit, t_arit3c),
14613 tCE(bic, 1c00000, bic, 3, (RR, oRR, SH), arit, t_arit3),
14614 tC3(bics, 1d00000, bics, 3, (RR, oRR, SH), arit, t_arit3),
14615
14616 /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
14617 for setting PSR flag bits. They are obsolete in V6 and do not
14618 have Thumb equivalents. */
14619 tCE(tst, 1100000, tst, 2, (RR, SH), cmp, t_mvn_tst),
088fa78e 14620 tC3w(tsts, 1100000, tst, 2, (RR, SH), cmp, t_mvn_tst),
e3cb604e 14621 CL(tstp, 110f000, 2, (RR, SH), cmp),
c19d1205 14622 tCE(cmp, 1500000, cmp, 2, (RR, SH), cmp, t_mov_cmp),
088fa78e 14623 tC3w(cmps, 1500000, cmp, 2, (RR, SH), cmp, t_mov_cmp),
e3cb604e 14624 CL(cmpp, 150f000, 2, (RR, SH), cmp),
c19d1205 14625 tCE(cmn, 1700000, cmn, 2, (RR, SH), cmp, t_mvn_tst),
088fa78e 14626 tC3w(cmns, 1700000, cmn, 2, (RR, SH), cmp, t_mvn_tst),
e3cb604e 14627 CL(cmnp, 170f000, 2, (RR, SH), cmp),
c19d1205
ZW
14628
14629 tCE(mov, 1a00000, mov, 2, (RR, SH), mov, t_mov_cmp),
14630 tC3(movs, 1b00000, movs, 2, (RR, SH), mov, t_mov_cmp),
14631 tCE(mvn, 1e00000, mvn, 2, (RR, SH), mov, t_mvn_tst),
14632 tC3(mvns, 1f00000, mvns, 2, (RR, SH), mov, t_mvn_tst),
14633
4962c51a
MS
14634 tCE(ldr, 4100000, ldr, 2, (RR, ADDRGLDR),ldst, t_ldst),
14635 tC3(ldrb, 4500000, ldrb, 2, (RR, ADDRGLDR),ldst, t_ldst),
14636 tCE(str, 4000000, str, 2, (RR, ADDRGLDR),ldst, t_ldst),
14637 tC3(strb, 4400000, strb, 2, (RR, ADDRGLDR),ldst, t_ldst),
c19d1205 14638
f5208ef2 14639 tCE(stm, 8800000, stmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
c19d1205
ZW
14640 tC3(stmia, 8800000, stmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
14641 tC3(stmea, 8800000, stmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
f5208ef2 14642 tCE(ldm, 8900000, ldmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
c19d1205
ZW
14643 tC3(ldmia, 8900000, ldmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
14644 tC3(ldmfd, 8900000, ldmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
14645
14646 TCE(swi, f000000, df00, 1, (EXPi), swi, t_swi),
c16d2bf0 14647 TCE(svc, f000000, df00, 1, (EXPi), swi, t_swi),
0110f2b8 14648 tCE(b, a000000, b, 1, (EXPr), branch, t_branch),
39b41c9c 14649 TCE(bl, b000000, f000f800, 1, (EXPr), bl, t_branch23),
bfae80f2 14650
c19d1205 14651 /* Pseudo ops. */
e9f89963 14652 tCE(adr, 28f0000, adr, 2, (RR, EXP), adr, t_adr),
2fc8bdac
ZW
14653 C3(adrl, 28f0000, 2, (RR, EXP), adrl),
14654 tCE(nop, 1a00000, nop, 1, (oI255c), nop, t_nop),
c19d1205
ZW
14655
14656 /* Thumb-compatibility pseudo ops. */
14657 tCE(lsl, 1a00000, lsl, 3, (RR, oRR, SH), shift, t_shift),
14658 tC3(lsls, 1b00000, lsls, 3, (RR, oRR, SH), shift, t_shift),
14659 tCE(lsr, 1a00020, lsr, 3, (RR, oRR, SH), shift, t_shift),
14660 tC3(lsrs, 1b00020, lsrs, 3, (RR, oRR, SH), shift, t_shift),
14661 tCE(asr, 1a00040, asr, 3, (RR, oRR, SH), shift, t_shift),
2fc8bdac 14662 tC3(asrs, 1b00040, asrs, 3, (RR, oRR, SH), shift, t_shift),
c19d1205
ZW
14663 tCE(ror, 1a00060, ror, 3, (RR, oRR, SH), shift, t_shift),
14664 tC3(rors, 1b00060, rors, 3, (RR, oRR, SH), shift, t_shift),
14665 tCE(neg, 2600000, neg, 2, (RR, RR), rd_rn, t_neg),
14666 tC3(negs, 2700000, negs, 2, (RR, RR), rd_rn, t_neg),
14667 tCE(push, 92d0000, push, 1, (REGLST), push_pop, t_push_pop),
14668 tCE(pop, 8bd0000, pop, 1, (REGLST), push_pop, t_push_pop),
14669
14670#undef THUMB_VARIANT
e74cfd16 14671#define THUMB_VARIANT &arm_ext_v6
2fc8bdac 14672 TCE(cpy, 1a00000, 4600, 2, (RR, RR), rd_rm, t_cpy),
c19d1205
ZW
14673
14674 /* V1 instructions with no Thumb analogue prior to V6T2. */
14675#undef THUMB_VARIANT
e74cfd16 14676#define THUMB_VARIANT &arm_ext_v6t2
c19d1205
ZW
14677 TCE(rsb, 0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
14678 TC3(rsbs, 0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
14679 TCE(teq, 1300000, ea900f00, 2, (RR, SH), cmp, t_mvn_tst),
088fa78e 14680 TC3w(teqs, 1300000, ea900f00, 2, (RR, SH), cmp, t_mvn_tst),
e3cb604e 14681 CL(teqp, 130f000, 2, (RR, SH), cmp),
c19d1205
ZW
14682
14683 TC3(ldrt, 4300000, f8500e00, 2, (RR, ADDR), ldstt, t_ldstt),
3e94bf1a 14684 TC3(ldrbt, 4700000, f8100e00, 2, (RR, ADDR), ldstt, t_ldstt),
c19d1205 14685 TC3(strt, 4200000, f8400e00, 2, (RR, ADDR), ldstt, t_ldstt),
3e94bf1a 14686 TC3(strbt, 4600000, f8000e00, 2, (RR, ADDR), ldstt, t_ldstt),
c19d1205 14687
9c3c69f2
PB
14688 TC3(stmdb, 9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
14689 TC3(stmfd, 9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
c19d1205 14690
9c3c69f2
PB
14691 TC3(ldmdb, 9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
14692 TC3(ldmea, 9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
c19d1205
ZW
14693
14694 /* V1 instructions with no Thumb analogue at all. */
14695 CE(rsc, 0e00000, 3, (RR, oRR, SH), arit),
14696 C3(rscs, 0f00000, 3, (RR, oRR, SH), arit),
14697
14698 C3(stmib, 9800000, 2, (RRw, REGLST), ldmstm),
14699 C3(stmfa, 9800000, 2, (RRw, REGLST), ldmstm),
14700 C3(stmda, 8000000, 2, (RRw, REGLST), ldmstm),
14701 C3(stmed, 8000000, 2, (RRw, REGLST), ldmstm),
14702 C3(ldmib, 9900000, 2, (RRw, REGLST), ldmstm),
14703 C3(ldmed, 9900000, 2, (RRw, REGLST), ldmstm),
14704 C3(ldmda, 8100000, 2, (RRw, REGLST), ldmstm),
14705 C3(ldmfa, 8100000, 2, (RRw, REGLST), ldmstm),
14706
14707#undef ARM_VARIANT
e74cfd16 14708#define ARM_VARIANT &arm_ext_v2 /* ARM 2 - multiplies. */
c19d1205 14709#undef THUMB_VARIANT
e74cfd16 14710#define THUMB_VARIANT &arm_ext_v4t
c19d1205
ZW
14711 tCE(mul, 0000090, mul, 3, (RRnpc, RRnpc, oRR), mul, t_mul),
14712 tC3(muls, 0100090, muls, 3, (RRnpc, RRnpc, oRR), mul, t_mul),
14713
14714#undef THUMB_VARIANT
e74cfd16 14715#define THUMB_VARIANT &arm_ext_v6t2
c19d1205
ZW
14716 TCE(mla, 0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
14717 C3(mlas, 0300090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
14718
14719 /* Generic coprocessor instructions. */
14720 TCE(cdp, e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp, cdp),
4962c51a
MS
14721 TCE(ldc, c100000, ec100000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
14722 TC3(ldcl, c500000, ec500000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
14723 TCE(stc, c000000, ec000000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
14724 TC3(stcl, c400000, ec400000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
c19d1205
ZW
14725 TCE(mcr, e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
14726 TCE(mrc, e100010, ee100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
14727
14728#undef ARM_VARIANT
e74cfd16 14729#define ARM_VARIANT &arm_ext_v2s /* ARM 3 - swp instructions. */
c19d1205
ZW
14730 CE(swp, 1000090, 3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
14731 C3(swpb, 1400090, 3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
14732
14733#undef ARM_VARIANT
e74cfd16 14734#define ARM_VARIANT &arm_ext_v3 /* ARM 6 Status register instructions. */
037e8744
JB
14735 TCE(mrs, 10f0000, f3ef8000, 2, (APSR_RR, RVC_PSR), mrs, t_mrs),
14736 TCE(msr, 120f000, f3808000, 2, (RVC_PSR, RR_EXi), msr, t_msr),
c19d1205
ZW
14737
14738#undef ARM_VARIANT
e74cfd16 14739#define ARM_VARIANT &arm_ext_v3m /* ARM 7M long multiplies. */
c19d1205
ZW
14740 TCE(smull, 0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
14741 CM(smull,s, 0d00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
14742 TCE(umull, 0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
14743 CM(umull,s, 0900090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
14744 TCE(smlal, 0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
14745 CM(smlal,s, 0f00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
14746 TCE(umlal, 0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
14747 CM(umlal,s, 0b00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
14748
14749#undef ARM_VARIANT
e74cfd16 14750#define ARM_VARIANT &arm_ext_v4 /* ARM Architecture 4. */
c19d1205 14751#undef THUMB_VARIANT
e74cfd16 14752#define THUMB_VARIANT &arm_ext_v4t
4962c51a
MS
14753 tC3(ldrh, 01000b0, ldrh, 2, (RR, ADDRGLDRS), ldstv4, t_ldst),
14754 tC3(strh, 00000b0, strh, 2, (RR, ADDRGLDRS), ldstv4, t_ldst),
14755 tC3(ldrsh, 01000f0, ldrsh, 2, (RR, ADDRGLDRS), ldstv4, t_ldst),
14756 tC3(ldrsb, 01000d0, ldrsb, 2, (RR, ADDRGLDRS), ldstv4, t_ldst),
14757 tCM(ld,sh, 01000f0, ldrsh, 2, (RR, ADDRGLDRS), ldstv4, t_ldst),
14758 tCM(ld,sb, 01000d0, ldrsb, 2, (RR, ADDRGLDRS), ldstv4, t_ldst),
c19d1205
ZW
14759
14760#undef ARM_VARIANT
e74cfd16 14761#define ARM_VARIANT &arm_ext_v4t_5
c19d1205
ZW
14762 /* ARM Architecture 4T. */
14763 /* Note: bx (and blx) are required on V5, even if the processor does
14764 not support Thumb. */
14765 TCE(bx, 12fff10, 4700, 1, (RR), bx, t_bx),
14766
14767#undef ARM_VARIANT
e74cfd16 14768#define ARM_VARIANT &arm_ext_v5 /* ARM Architecture 5T. */
c19d1205 14769#undef THUMB_VARIANT
e74cfd16 14770#define THUMB_VARIANT &arm_ext_v5t
c19d1205
ZW
14771 /* Note: blx has 2 variants; the .value coded here is for
14772 BLX(2). Only this variant has conditional execution. */
14773 TCE(blx, 12fff30, 4780, 1, (RR_EXr), blx, t_blx),
14774 TUE(bkpt, 1200070, be00, 1, (oIffffb), bkpt, t_bkpt),
14775
14776#undef THUMB_VARIANT
e74cfd16 14777#define THUMB_VARIANT &arm_ext_v6t2
c19d1205 14778 TCE(clz, 16f0f10, fab0f080, 2, (RRnpc, RRnpc), rd_rm, t_clz),
4962c51a
MS
14779 TUF(ldc2, c100000, fc100000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
14780 TUF(ldc2l, c500000, fc500000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
14781 TUF(stc2, c000000, fc000000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
14782 TUF(stc2l, c400000, fc400000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
c19d1205
ZW
14783 TUF(cdp2, e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp, cdp),
14784 TUF(mcr2, e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
14785 TUF(mrc2, e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
14786
14787#undef ARM_VARIANT
e74cfd16 14788#define ARM_VARIANT &arm_ext_v5exp /* ARM Architecture 5TExP. */
c19d1205
ZW
14789 TCE(smlabb, 1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
14790 TCE(smlatb, 10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
14791 TCE(smlabt, 10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
14792 TCE(smlatt, 10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
14793
14794 TCE(smlawb, 1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
14795 TCE(smlawt, 12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
14796
14797 TCE(smlalbb, 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
14798 TCE(smlaltb, 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
14799 TCE(smlalbt, 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
14800 TCE(smlaltt, 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
14801
14802 TCE(smulbb, 1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14803 TCE(smultb, 16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14804 TCE(smulbt, 16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14805 TCE(smultt, 16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14806
14807 TCE(smulwb, 12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14808 TCE(smulwt, 12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14809
14810 TCE(qadd, 1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, rd_rm_rn),
14811 TCE(qdadd, 1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, rd_rm_rn),
14812 TCE(qsub, 1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, rd_rm_rn),
14813 TCE(qdsub, 1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, rd_rm_rn),
14814
14815#undef ARM_VARIANT
e74cfd16 14816#define ARM_VARIANT &arm_ext_v5e /* ARM Architecture 5TE. */
c19d1205 14817 TUF(pld, 450f000, f810f000, 1, (ADDR), pld, t_pld),
4962c51a
MS
14818 TC3(ldrd, 00000d0, e9500000, 3, (RRnpc, oRRnpc, ADDRGLDRS), ldrd, t_ldstd),
14819 TC3(strd, 00000f0, e9400000, 3, (RRnpc, oRRnpc, ADDRGLDRS), ldrd, t_ldstd),
c19d1205
ZW
14820
14821 TCE(mcrr, c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
14822 TCE(mrrc, c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
14823
14824#undef ARM_VARIANT
e74cfd16 14825#define ARM_VARIANT &arm_ext_v5j /* ARM Architecture 5TEJ. */
c19d1205
ZW
14826 TCE(bxj, 12fff20, f3c08f00, 1, (RR), bxj, t_bxj),
14827
14828#undef ARM_VARIANT
e74cfd16 14829#define ARM_VARIANT &arm_ext_v6 /* ARM V6. */
c19d1205 14830#undef THUMB_VARIANT
e74cfd16 14831#define THUMB_VARIANT &arm_ext_v6
c19d1205
ZW
14832 TUF(cpsie, 1080000, b660, 2, (CPSF, oI31b), cpsi, t_cpsi),
14833 TUF(cpsid, 10c0000, b670, 2, (CPSF, oI31b), cpsi, t_cpsi),
14834 tCE(rev, 6bf0f30, rev, 2, (RRnpc, RRnpc), rd_rm, t_rev),
14835 tCE(rev16, 6bf0fb0, rev16, 2, (RRnpc, RRnpc), rd_rm, t_rev),
14836 tCE(revsh, 6ff0fb0, revsh, 2, (RRnpc, RRnpc), rd_rm, t_rev),
14837 tCE(sxth, 6bf0070, sxth, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
14838 tCE(uxth, 6ff0070, uxth, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
14839 tCE(sxtb, 6af0070, sxtb, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
14840 tCE(uxtb, 6ef0070, uxtb, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
14841 TUF(setend, 1010000, b650, 1, (ENDI), setend, t_setend),
14842
14843#undef THUMB_VARIANT
e74cfd16 14844#define THUMB_VARIANT &arm_ext_v6t2
c19d1205
ZW
14845 TCE(ldrex, 1900f9f, e8500f00, 2, (RRnpc, ADDR), ldrex, t_ldrex),
14846 TUF(mcrr2, c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
14847 TUF(mrrc2, c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
62b3e311
PB
14848
14849 TCE(ssat, 6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat, t_ssat),
14850 TCE(usat, 6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat, t_usat),
14851
14852/* ARM V6 not included in V7M (eg. integer SIMD). */
14853#undef THUMB_VARIANT
14854#define THUMB_VARIANT &arm_ext_v6_notm
dfa9f0d5 14855 TUF(cps, 1020000, f3af8100, 1, (I31b), imm0, t_cps),
c19d1205
ZW
14856 TCE(pkhbt, 6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll), pkhbt, t_pkhbt),
14857 TCE(pkhtb, 6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar), pkhtb, t_pkhtb),
14858 TCE(qadd16, 6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14859 TCE(qadd8, 6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14860 TCE(qaddsubx, 6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14861 TCE(qsub16, 6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14862 TCE(qsub8, 6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14863 TCE(qsubaddx, 6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14864 TCE(sadd16, 6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14865 TCE(sadd8, 6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14866 TCE(saddsubx, 6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14867 TCE(shadd16, 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14868 TCE(shadd8, 6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14869 TCE(shaddsubx, 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14870 TCE(shsub16, 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14871 TCE(shsub8, 6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14872 TCE(shsubaddx, 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14873 TCE(ssub16, 6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14874 TCE(ssub8, 6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14875 TCE(ssubaddx, 6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14876 TCE(uadd16, 6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14877 TCE(uadd8, 6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14878 TCE(uaddsubx, 6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14879 TCE(uhadd16, 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14880 TCE(uhadd8, 6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14881 TCE(uhaddsubx, 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14882 TCE(uhsub16, 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14883 TCE(uhsub8, 6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14884 TCE(uhsubaddx, 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14885 TCE(uqadd16, 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14886 TCE(uqadd8, 6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14887 TCE(uqaddsubx, 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14888 TCE(uqsub16, 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14889 TCE(uqsub8, 6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14890 TCE(uqsubaddx, 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14891 TCE(usub16, 6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14892 TCE(usub8, 6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14893 TCE(usubaddx, 6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
14894 TUF(rfeia, 8900a00, e990c000, 1, (RRw), rfe, rfe),
14895 UF(rfeib, 9900a00, 1, (RRw), rfe),
14896 UF(rfeda, 8100a00, 1, (RRw), rfe),
14897 TUF(rfedb, 9100a00, e810c000, 1, (RRw), rfe, rfe),
14898 TUF(rfefd, 8900a00, e990c000, 1, (RRw), rfe, rfe),
14899 UF(rfefa, 9900a00, 1, (RRw), rfe),
14900 UF(rfeea, 8100a00, 1, (RRw), rfe),
14901 TUF(rfeed, 9100a00, e810c000, 1, (RRw), rfe, rfe),
14902 TCE(sxtah, 6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
14903 TCE(sxtab16, 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
14904 TCE(sxtab, 6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
14905 TCE(sxtb16, 68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
14906 TCE(uxtah, 6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
14907 TCE(uxtab16, 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
14908 TCE(uxtab, 6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
14909 TCE(uxtb16, 6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
f1022c90 14910 TCE(sel, 6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
c19d1205
ZW
14911 TCE(smlad, 7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
14912 TCE(smladx, 7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
14913 TCE(smlald, 7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
14914 TCE(smlaldx, 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
14915 TCE(smlsd, 7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
14916 TCE(smlsdx, 7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
14917 TCE(smlsld, 7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
14918 TCE(smlsldx, 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
14919 TCE(smmla, 7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
14920 TCE(smmlar, 7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
14921 TCE(smmls, 75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
14922 TCE(smmlsr, 75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
14923 TCE(smmul, 750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14924 TCE(smmulr, 750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14925 TCE(smuad, 700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14926 TCE(smuadx, 700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14927 TCE(smusd, 700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14928 TCE(smusdx, 700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14929 TUF(srsia, 8cd0500, e980c000, 1, (I31w), srs, srs),
14930 UF(srsib, 9cd0500, 1, (I31w), srs),
14931 UF(srsda, 84d0500, 1, (I31w), srs),
14932 TUF(srsdb, 94d0500, e800c000, 1, (I31w), srs, srs),
c19d1205
ZW
14933 TCE(ssat16, 6a00f30, f3200000, 3, (RRnpc, I16, RRnpc), ssat16, t_ssat16),
14934 TCE(strex, 1800f90, e8400000, 3, (RRnpc, RRnpc, ADDR), strex, t_strex),
14935 TCE(umaal, 0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal, t_mlal),
14936 TCE(usad8, 780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
14937 TCE(usada8, 7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
c19d1205
ZW
14938 TCE(usat16, 6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc), usat16, t_usat16),
14939
14940#undef ARM_VARIANT
e74cfd16 14941#define ARM_VARIANT &arm_ext_v6k
c19d1205 14942#undef THUMB_VARIANT
e74cfd16 14943#define THUMB_VARIANT &arm_ext_v6k
c19d1205
ZW
14944 tCE(yield, 320f001, yield, 0, (), noargs, t_hint),
14945 tCE(wfe, 320f002, wfe, 0, (), noargs, t_hint),
14946 tCE(wfi, 320f003, wfi, 0, (), noargs, t_hint),
14947 tCE(sev, 320f004, sev, 0, (), noargs, t_hint),
14948
ebdca51a
PB
14949#undef THUMB_VARIANT
14950#define THUMB_VARIANT &arm_ext_v6_notm
14951 TCE(ldrexd, 1b00f9f, e8d0007f, 3, (RRnpc, oRRnpc, RRnpcb), ldrexd, t_ldrexd),
14952 TCE(strexd, 1a00f90, e8c00070, 4, (RRnpc, RRnpc, oRRnpc, RRnpcb), strexd, t_strexd),
14953
c19d1205 14954#undef THUMB_VARIANT
e74cfd16 14955#define THUMB_VARIANT &arm_ext_v6t2
c19d1205
ZW
14956 TCE(ldrexb, 1d00f9f, e8d00f4f, 2, (RRnpc, RRnpcb), rd_rn, rd_rn),
14957 TCE(ldrexh, 1f00f9f, e8d00f5f, 2, (RRnpc, RRnpcb), rd_rn, rd_rn),
c19d1205
ZW
14958 TCE(strexb, 1c00f90, e8c00f40, 3, (RRnpc, RRnpc, ADDR), strex, rm_rd_rn),
14959 TCE(strexh, 1e00f90, e8c00f50, 3, (RRnpc, RRnpc, ADDR), strex, rm_rd_rn),
c19d1205
ZW
14960 TUF(clrex, 57ff01f, f3bf8f2f, 0, (), noargs, noargs),
14961
14962#undef ARM_VARIANT
e74cfd16 14963#define ARM_VARIANT &arm_ext_v6z
3eb17e6b 14964 TCE(smc, 1600070, f7f08000, 1, (EXPi), smc, t_smc),
c19d1205
ZW
14965
14966#undef ARM_VARIANT
e74cfd16 14967#define ARM_VARIANT &arm_ext_v6t2
c19d1205
ZW
14968 TCE(bfc, 7c0001f, f36f0000, 3, (RRnpc, I31, I32), bfc, t_bfc),
14969 TCE(bfi, 7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
14970 TCE(sbfx, 7a00050, f3400000, 4, (RR, RR, I31, I32), bfx, t_bfx),
14971 TCE(ubfx, 7e00050, f3c00000, 4, (RR, RR, I31, I32), bfx, t_bfx),
14972
14973 TCE(mls, 0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
b6895b4f
PB
14974 TCE(movw, 3000000, f2400000, 2, (RRnpc, HALF), mov16, t_mov16),
14975 TCE(movt, 3400000, f2c00000, 2, (RRnpc, HALF), mov16, t_mov16),
401a54cf 14976 TCE(rbit, 6ff0f30, fa90f0a0, 2, (RR, RR), rd_rm, t_rbit),
c19d1205
ZW
14977
14978 TC3(ldrht, 03000b0, f8300e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
14979 TC3(ldrsht, 03000f0, f9300e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
14980 TC3(ldrsbt, 03000d0, f9100e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
14981 TC3(strht, 02000b0, f8200e00, 2, (RR, ADDR), ldsttv4, t_ldstt),
14982
14983 UT(cbnz, b900, 2, (RR, EXP), t_czb),
14984 UT(cbz, b100, 2, (RR, EXP), t_czb),
f91e006c
PB
14985 /* ARM does not really have an IT instruction, so always allow it. */
14986#undef ARM_VARIANT
14987#define ARM_VARIANT &arm_ext_v1
c19d1205
ZW
14988 TUE(it, 0, bf08, 1, (COND), it, t_it),
14989 TUE(itt, 0, bf0c, 1, (COND), it, t_it),
14990 TUE(ite, 0, bf04, 1, (COND), it, t_it),
14991 TUE(ittt, 0, bf0e, 1, (COND), it, t_it),
14992 TUE(itet, 0, bf06, 1, (COND), it, t_it),
14993 TUE(itte, 0, bf0a, 1, (COND), it, t_it),
14994 TUE(itee, 0, bf02, 1, (COND), it, t_it),
14995 TUE(itttt, 0, bf0f, 1, (COND), it, t_it),
14996 TUE(itett, 0, bf07, 1, (COND), it, t_it),
14997 TUE(ittet, 0, bf0b, 1, (COND), it, t_it),
14998 TUE(iteet, 0, bf03, 1, (COND), it, t_it),
14999 TUE(ittte, 0, bf0d, 1, (COND), it, t_it),
15000 TUE(itete, 0, bf05, 1, (COND), it, t_it),
15001 TUE(ittee, 0, bf09, 1, (COND), it, t_it),
15002 TUE(iteee, 0, bf01, 1, (COND), it, t_it),
15003
92e90b6e
PB
15004 /* Thumb2 only instructions. */
15005#undef ARM_VARIANT
e74cfd16 15006#define ARM_VARIANT NULL
92e90b6e
PB
15007
15008 TCE(addw, 0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
15009 TCE(subw, 0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
15010 TCE(tbb, 0, e8d0f000, 1, (TB), 0, t_tb),
15011 TCE(tbh, 0, e8d0f010, 1, (TB), 0, t_tb),
15012
62b3e311
PB
15013 /* Thumb-2 hardware division instructions (R and M profiles only). */
15014#undef THUMB_VARIANT
15015#define THUMB_VARIANT &arm_ext_div
15016 TCE(sdiv, 0, fb90f0f0, 3, (RR, oRR, RR), 0, t_div),
15017 TCE(udiv, 0, fbb0f0f0, 3, (RR, oRR, RR), 0, t_div),
15018
15019 /* ARM V7 instructions. */
15020#undef ARM_VARIANT
15021#define ARM_VARIANT &arm_ext_v7
15022#undef THUMB_VARIANT
15023#define THUMB_VARIANT &arm_ext_v7
15024 TUF(pli, 450f000, f910f000, 1, (ADDR), pli, t_pld),
15025 TCE(dbg, 320f0f0, f3af80f0, 1, (I15), dbg, t_dbg),
15026 TUF(dmb, 57ff050, f3bf8f50, 1, (oBARRIER), barrier, t_barrier),
15027 TUF(dsb, 57ff040, f3bf8f40, 1, (oBARRIER), barrier, t_barrier),
15028 TUF(isb, 57ff060, f3bf8f60, 1, (oBARRIER), barrier, t_barrier),
15029
c19d1205 15030#undef ARM_VARIANT
e74cfd16 15031#define ARM_VARIANT &fpu_fpa_ext_v1 /* Core FPA instruction set (V1). */
8f06b2d8
PB
15032 cCE(wfs, e200110, 1, (RR), rd),
15033 cCE(rfs, e300110, 1, (RR), rd),
15034 cCE(wfc, e400110, 1, (RR), rd),
15035 cCE(rfc, e500110, 1, (RR), rd),
15036
4962c51a
MS
15037 cCL(ldfs, c100100, 2, (RF, ADDRGLDC), rd_cpaddr),
15038 cCL(ldfd, c108100, 2, (RF, ADDRGLDC), rd_cpaddr),
15039 cCL(ldfe, c500100, 2, (RF, ADDRGLDC), rd_cpaddr),
15040 cCL(ldfp, c508100, 2, (RF, ADDRGLDC), rd_cpaddr),
e3cb604e 15041
4962c51a
MS
15042 cCL(stfs, c000100, 2, (RF, ADDRGLDC), rd_cpaddr),
15043 cCL(stfd, c008100, 2, (RF, ADDRGLDC), rd_cpaddr),
15044 cCL(stfe, c400100, 2, (RF, ADDRGLDC), rd_cpaddr),
15045 cCL(stfp, c408100, 2, (RF, ADDRGLDC), rd_cpaddr),
e3cb604e
PB
15046
15047 cCL(mvfs, e008100, 2, (RF, RF_IF), rd_rm),
15048 cCL(mvfsp, e008120, 2, (RF, RF_IF), rd_rm),
15049 cCL(mvfsm, e008140, 2, (RF, RF_IF), rd_rm),
15050 cCL(mvfsz, e008160, 2, (RF, RF_IF), rd_rm),
15051 cCL(mvfd, e008180, 2, (RF, RF_IF), rd_rm),
15052 cCL(mvfdp, e0081a0, 2, (RF, RF_IF), rd_rm),
15053 cCL(mvfdm, e0081c0, 2, (RF, RF_IF), rd_rm),
15054 cCL(mvfdz, e0081e0, 2, (RF, RF_IF), rd_rm),
15055 cCL(mvfe, e088100, 2, (RF, RF_IF), rd_rm),
15056 cCL(mvfep, e088120, 2, (RF, RF_IF), rd_rm),
15057 cCL(mvfem, e088140, 2, (RF, RF_IF), rd_rm),
15058 cCL(mvfez, e088160, 2, (RF, RF_IF), rd_rm),
15059
15060 cCL(mnfs, e108100, 2, (RF, RF_IF), rd_rm),
15061 cCL(mnfsp, e108120, 2, (RF, RF_IF), rd_rm),
15062 cCL(mnfsm, e108140, 2, (RF, RF_IF), rd_rm),
15063 cCL(mnfsz, e108160, 2, (RF, RF_IF), rd_rm),
15064 cCL(mnfd, e108180, 2, (RF, RF_IF), rd_rm),
15065 cCL(mnfdp, e1081a0, 2, (RF, RF_IF), rd_rm),
15066 cCL(mnfdm, e1081c0, 2, (RF, RF_IF), rd_rm),
15067 cCL(mnfdz, e1081e0, 2, (RF, RF_IF), rd_rm),
15068 cCL(mnfe, e188100, 2, (RF, RF_IF), rd_rm),
15069 cCL(mnfep, e188120, 2, (RF, RF_IF), rd_rm),
15070 cCL(mnfem, e188140, 2, (RF, RF_IF), rd_rm),
15071 cCL(mnfez, e188160, 2, (RF, RF_IF), rd_rm),
15072
15073 cCL(abss, e208100, 2, (RF, RF_IF), rd_rm),
15074 cCL(abssp, e208120, 2, (RF, RF_IF), rd_rm),
15075 cCL(abssm, e208140, 2, (RF, RF_IF), rd_rm),
15076 cCL(abssz, e208160, 2, (RF, RF_IF), rd_rm),
15077 cCL(absd, e208180, 2, (RF, RF_IF), rd_rm),
15078 cCL(absdp, e2081a0, 2, (RF, RF_IF), rd_rm),
15079 cCL(absdm, e2081c0, 2, (RF, RF_IF), rd_rm),
15080 cCL(absdz, e2081e0, 2, (RF, RF_IF), rd_rm),
15081 cCL(abse, e288100, 2, (RF, RF_IF), rd_rm),
15082 cCL(absep, e288120, 2, (RF, RF_IF), rd_rm),
15083 cCL(absem, e288140, 2, (RF, RF_IF), rd_rm),
15084 cCL(absez, e288160, 2, (RF, RF_IF), rd_rm),
15085
15086 cCL(rnds, e308100, 2, (RF, RF_IF), rd_rm),
15087 cCL(rndsp, e308120, 2, (RF, RF_IF), rd_rm),
15088 cCL(rndsm, e308140, 2, (RF, RF_IF), rd_rm),
15089 cCL(rndsz, e308160, 2, (RF, RF_IF), rd_rm),
15090 cCL(rndd, e308180, 2, (RF, RF_IF), rd_rm),
15091 cCL(rnddp, e3081a0, 2, (RF, RF_IF), rd_rm),
15092 cCL(rnddm, e3081c0, 2, (RF, RF_IF), rd_rm),
15093 cCL(rnddz, e3081e0, 2, (RF, RF_IF), rd_rm),
15094 cCL(rnde, e388100, 2, (RF, RF_IF), rd_rm),
15095 cCL(rndep, e388120, 2, (RF, RF_IF), rd_rm),
15096 cCL(rndem, e388140, 2, (RF, RF_IF), rd_rm),
15097 cCL(rndez, e388160, 2, (RF, RF_IF), rd_rm),
15098
15099 cCL(sqts, e408100, 2, (RF, RF_IF), rd_rm),
15100 cCL(sqtsp, e408120, 2, (RF, RF_IF), rd_rm),
15101 cCL(sqtsm, e408140, 2, (RF, RF_IF), rd_rm),
15102 cCL(sqtsz, e408160, 2, (RF, RF_IF), rd_rm),
15103 cCL(sqtd, e408180, 2, (RF, RF_IF), rd_rm),
15104 cCL(sqtdp, e4081a0, 2, (RF, RF_IF), rd_rm),
15105 cCL(sqtdm, e4081c0, 2, (RF, RF_IF), rd_rm),
15106 cCL(sqtdz, e4081e0, 2, (RF, RF_IF), rd_rm),
15107 cCL(sqte, e488100, 2, (RF, RF_IF), rd_rm),
15108 cCL(sqtep, e488120, 2, (RF, RF_IF), rd_rm),
15109 cCL(sqtem, e488140, 2, (RF, RF_IF), rd_rm),
15110 cCL(sqtez, e488160, 2, (RF, RF_IF), rd_rm),
15111
15112 cCL(logs, e508100, 2, (RF, RF_IF), rd_rm),
15113 cCL(logsp, e508120, 2, (RF, RF_IF), rd_rm),
15114 cCL(logsm, e508140, 2, (RF, RF_IF), rd_rm),
15115 cCL(logsz, e508160, 2, (RF, RF_IF), rd_rm),
15116 cCL(logd, e508180, 2, (RF, RF_IF), rd_rm),
15117 cCL(logdp, e5081a0, 2, (RF, RF_IF), rd_rm),
15118 cCL(logdm, e5081c0, 2, (RF, RF_IF), rd_rm),
15119 cCL(logdz, e5081e0, 2, (RF, RF_IF), rd_rm),
15120 cCL(loge, e588100, 2, (RF, RF_IF), rd_rm),
15121 cCL(logep, e588120, 2, (RF, RF_IF), rd_rm),
15122 cCL(logem, e588140, 2, (RF, RF_IF), rd_rm),
15123 cCL(logez, e588160, 2, (RF, RF_IF), rd_rm),
15124
15125 cCL(lgns, e608100, 2, (RF, RF_IF), rd_rm),
15126 cCL(lgnsp, e608120, 2, (RF, RF_IF), rd_rm),
15127 cCL(lgnsm, e608140, 2, (RF, RF_IF), rd_rm),
15128 cCL(lgnsz, e608160, 2, (RF, RF_IF), rd_rm),
15129 cCL(lgnd, e608180, 2, (RF, RF_IF), rd_rm),
15130 cCL(lgndp, e6081a0, 2, (RF, RF_IF), rd_rm),
15131 cCL(lgndm, e6081c0, 2, (RF, RF_IF), rd_rm),
15132 cCL(lgndz, e6081e0, 2, (RF, RF_IF), rd_rm),
15133 cCL(lgne, e688100, 2, (RF, RF_IF), rd_rm),
15134 cCL(lgnep, e688120, 2, (RF, RF_IF), rd_rm),
15135 cCL(lgnem, e688140, 2, (RF, RF_IF), rd_rm),
15136 cCL(lgnez, e688160, 2, (RF, RF_IF), rd_rm),
15137
15138 cCL(exps, e708100, 2, (RF, RF_IF), rd_rm),
15139 cCL(expsp, e708120, 2, (RF, RF_IF), rd_rm),
15140 cCL(expsm, e708140, 2, (RF, RF_IF), rd_rm),
15141 cCL(expsz, e708160, 2, (RF, RF_IF), rd_rm),
15142 cCL(expd, e708180, 2, (RF, RF_IF), rd_rm),
15143 cCL(expdp, e7081a0, 2, (RF, RF_IF), rd_rm),
15144 cCL(expdm, e7081c0, 2, (RF, RF_IF), rd_rm),
15145 cCL(expdz, e7081e0, 2, (RF, RF_IF), rd_rm),
15146 cCL(expe, e788100, 2, (RF, RF_IF), rd_rm),
15147 cCL(expep, e788120, 2, (RF, RF_IF), rd_rm),
15148 cCL(expem, e788140, 2, (RF, RF_IF), rd_rm),
15149 cCL(expdz, e788160, 2, (RF, RF_IF), rd_rm),
15150
15151 cCL(sins, e808100, 2, (RF, RF_IF), rd_rm),
15152 cCL(sinsp, e808120, 2, (RF, RF_IF), rd_rm),
15153 cCL(sinsm, e808140, 2, (RF, RF_IF), rd_rm),
15154 cCL(sinsz, e808160, 2, (RF, RF_IF), rd_rm),
15155 cCL(sind, e808180, 2, (RF, RF_IF), rd_rm),
15156 cCL(sindp, e8081a0, 2, (RF, RF_IF), rd_rm),
15157 cCL(sindm, e8081c0, 2, (RF, RF_IF), rd_rm),
15158 cCL(sindz, e8081e0, 2, (RF, RF_IF), rd_rm),
15159 cCL(sine, e888100, 2, (RF, RF_IF), rd_rm),
15160 cCL(sinep, e888120, 2, (RF, RF_IF), rd_rm),
15161 cCL(sinem, e888140, 2, (RF, RF_IF), rd_rm),
15162 cCL(sinez, e888160, 2, (RF, RF_IF), rd_rm),
15163
15164 cCL(coss, e908100, 2, (RF, RF_IF), rd_rm),
15165 cCL(cossp, e908120, 2, (RF, RF_IF), rd_rm),
15166 cCL(cossm, e908140, 2, (RF, RF_IF), rd_rm),
15167 cCL(cossz, e908160, 2, (RF, RF_IF), rd_rm),
15168 cCL(cosd, e908180, 2, (RF, RF_IF), rd_rm),
15169 cCL(cosdp, e9081a0, 2, (RF, RF_IF), rd_rm),
15170 cCL(cosdm, e9081c0, 2, (RF, RF_IF), rd_rm),
15171 cCL(cosdz, e9081e0, 2, (RF, RF_IF), rd_rm),
15172 cCL(cose, e988100, 2, (RF, RF_IF), rd_rm),
15173 cCL(cosep, e988120, 2, (RF, RF_IF), rd_rm),
15174 cCL(cosem, e988140, 2, (RF, RF_IF), rd_rm),
15175 cCL(cosez, e988160, 2, (RF, RF_IF), rd_rm),
15176
15177 cCL(tans, ea08100, 2, (RF, RF_IF), rd_rm),
15178 cCL(tansp, ea08120, 2, (RF, RF_IF), rd_rm),
15179 cCL(tansm, ea08140, 2, (RF, RF_IF), rd_rm),
15180 cCL(tansz, ea08160, 2, (RF, RF_IF), rd_rm),
15181 cCL(tand, ea08180, 2, (RF, RF_IF), rd_rm),
15182 cCL(tandp, ea081a0, 2, (RF, RF_IF), rd_rm),
15183 cCL(tandm, ea081c0, 2, (RF, RF_IF), rd_rm),
15184 cCL(tandz, ea081e0, 2, (RF, RF_IF), rd_rm),
15185 cCL(tane, ea88100, 2, (RF, RF_IF), rd_rm),
15186 cCL(tanep, ea88120, 2, (RF, RF_IF), rd_rm),
15187 cCL(tanem, ea88140, 2, (RF, RF_IF), rd_rm),
15188 cCL(tanez, ea88160, 2, (RF, RF_IF), rd_rm),
15189
15190 cCL(asns, eb08100, 2, (RF, RF_IF), rd_rm),
15191 cCL(asnsp, eb08120, 2, (RF, RF_IF), rd_rm),
15192 cCL(asnsm, eb08140, 2, (RF, RF_IF), rd_rm),
15193 cCL(asnsz, eb08160, 2, (RF, RF_IF), rd_rm),
15194 cCL(asnd, eb08180, 2, (RF, RF_IF), rd_rm),
15195 cCL(asndp, eb081a0, 2, (RF, RF_IF), rd_rm),
15196 cCL(asndm, eb081c0, 2, (RF, RF_IF), rd_rm),
15197 cCL(asndz, eb081e0, 2, (RF, RF_IF), rd_rm),
15198 cCL(asne, eb88100, 2, (RF, RF_IF), rd_rm),
15199 cCL(asnep, eb88120, 2, (RF, RF_IF), rd_rm),
15200 cCL(asnem, eb88140, 2, (RF, RF_IF), rd_rm),
15201 cCL(asnez, eb88160, 2, (RF, RF_IF), rd_rm),
15202
15203 cCL(acss, ec08100, 2, (RF, RF_IF), rd_rm),
15204 cCL(acssp, ec08120, 2, (RF, RF_IF), rd_rm),
15205 cCL(acssm, ec08140, 2, (RF, RF_IF), rd_rm),
15206 cCL(acssz, ec08160, 2, (RF, RF_IF), rd_rm),
15207 cCL(acsd, ec08180, 2, (RF, RF_IF), rd_rm),
15208 cCL(acsdp, ec081a0, 2, (RF, RF_IF), rd_rm),
15209 cCL(acsdm, ec081c0, 2, (RF, RF_IF), rd_rm),
15210 cCL(acsdz, ec081e0, 2, (RF, RF_IF), rd_rm),
15211 cCL(acse, ec88100, 2, (RF, RF_IF), rd_rm),
15212 cCL(acsep, ec88120, 2, (RF, RF_IF), rd_rm),
15213 cCL(acsem, ec88140, 2, (RF, RF_IF), rd_rm),
15214 cCL(acsez, ec88160, 2, (RF, RF_IF), rd_rm),
15215
15216 cCL(atns, ed08100, 2, (RF, RF_IF), rd_rm),
15217 cCL(atnsp, ed08120, 2, (RF, RF_IF), rd_rm),
15218 cCL(atnsm, ed08140, 2, (RF, RF_IF), rd_rm),
15219 cCL(atnsz, ed08160, 2, (RF, RF_IF), rd_rm),
15220 cCL(atnd, ed08180, 2, (RF, RF_IF), rd_rm),
15221 cCL(atndp, ed081a0, 2, (RF, RF_IF), rd_rm),
15222 cCL(atndm, ed081c0, 2, (RF, RF_IF), rd_rm),
15223 cCL(atndz, ed081e0, 2, (RF, RF_IF), rd_rm),
15224 cCL(atne, ed88100, 2, (RF, RF_IF), rd_rm),
15225 cCL(atnep, ed88120, 2, (RF, RF_IF), rd_rm),
15226 cCL(atnem, ed88140, 2, (RF, RF_IF), rd_rm),
15227 cCL(atnez, ed88160, 2, (RF, RF_IF), rd_rm),
15228
15229 cCL(urds, ee08100, 2, (RF, RF_IF), rd_rm),
15230 cCL(urdsp, ee08120, 2, (RF, RF_IF), rd_rm),
15231 cCL(urdsm, ee08140, 2, (RF, RF_IF), rd_rm),
15232 cCL(urdsz, ee08160, 2, (RF, RF_IF), rd_rm),
15233 cCL(urdd, ee08180, 2, (RF, RF_IF), rd_rm),
15234 cCL(urddp, ee081a0, 2, (RF, RF_IF), rd_rm),
15235 cCL(urddm, ee081c0, 2, (RF, RF_IF), rd_rm),
15236 cCL(urddz, ee081e0, 2, (RF, RF_IF), rd_rm),
15237 cCL(urde, ee88100, 2, (RF, RF_IF), rd_rm),
15238 cCL(urdep, ee88120, 2, (RF, RF_IF), rd_rm),
15239 cCL(urdem, ee88140, 2, (RF, RF_IF), rd_rm),
15240 cCL(urdez, ee88160, 2, (RF, RF_IF), rd_rm),
15241
15242 cCL(nrms, ef08100, 2, (RF, RF_IF), rd_rm),
15243 cCL(nrmsp, ef08120, 2, (RF, RF_IF), rd_rm),
15244 cCL(nrmsm, ef08140, 2, (RF, RF_IF), rd_rm),
15245 cCL(nrmsz, ef08160, 2, (RF, RF_IF), rd_rm),
15246 cCL(nrmd, ef08180, 2, (RF, RF_IF), rd_rm),
15247 cCL(nrmdp, ef081a0, 2, (RF, RF_IF), rd_rm),
15248 cCL(nrmdm, ef081c0, 2, (RF, RF_IF), rd_rm),
15249 cCL(nrmdz, ef081e0, 2, (RF, RF_IF), rd_rm),
15250 cCL(nrme, ef88100, 2, (RF, RF_IF), rd_rm),
15251 cCL(nrmep, ef88120, 2, (RF, RF_IF), rd_rm),
15252 cCL(nrmem, ef88140, 2, (RF, RF_IF), rd_rm),
15253 cCL(nrmez, ef88160, 2, (RF, RF_IF), rd_rm),
15254
15255 cCL(adfs, e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
15256 cCL(adfsp, e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
15257 cCL(adfsm, e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
15258 cCL(adfsz, e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
15259 cCL(adfd, e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
15260 cCL(adfdp, e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15261 cCL(adfdm, e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15262 cCL(adfdz, e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15263 cCL(adfe, e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
15264 cCL(adfep, e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
15265 cCL(adfem, e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
15266 cCL(adfez, e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
15267
15268 cCL(sufs, e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
15269 cCL(sufsp, e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
15270 cCL(sufsm, e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
15271 cCL(sufsz, e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
15272 cCL(sufd, e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
15273 cCL(sufdp, e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15274 cCL(sufdm, e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15275 cCL(sufdz, e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15276 cCL(sufe, e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
15277 cCL(sufep, e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
15278 cCL(sufem, e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
15279 cCL(sufez, e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
15280
15281 cCL(rsfs, e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
15282 cCL(rsfsp, e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
15283 cCL(rsfsm, e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
15284 cCL(rsfsz, e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
15285 cCL(rsfd, e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
15286 cCL(rsfdp, e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15287 cCL(rsfdm, e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15288 cCL(rsfdz, e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15289 cCL(rsfe, e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
15290 cCL(rsfep, e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
15291 cCL(rsfem, e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
15292 cCL(rsfez, e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
15293
15294 cCL(mufs, e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
15295 cCL(mufsp, e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
15296 cCL(mufsm, e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
15297 cCL(mufsz, e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
15298 cCL(mufd, e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
15299 cCL(mufdp, e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15300 cCL(mufdm, e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15301 cCL(mufdz, e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15302 cCL(mufe, e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
15303 cCL(mufep, e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
15304 cCL(mufem, e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
15305 cCL(mufez, e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
15306
15307 cCL(dvfs, e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
15308 cCL(dvfsp, e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
15309 cCL(dvfsm, e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
15310 cCL(dvfsz, e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
15311 cCL(dvfd, e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
15312 cCL(dvfdp, e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15313 cCL(dvfdm, e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15314 cCL(dvfdz, e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15315 cCL(dvfe, e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
15316 cCL(dvfep, e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
15317 cCL(dvfem, e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
15318 cCL(dvfez, e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
15319
15320 cCL(rdfs, e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
15321 cCL(rdfsp, e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
15322 cCL(rdfsm, e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
15323 cCL(rdfsz, e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
15324 cCL(rdfd, e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
15325 cCL(rdfdp, e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15326 cCL(rdfdm, e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15327 cCL(rdfdz, e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15328 cCL(rdfe, e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
15329 cCL(rdfep, e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
15330 cCL(rdfem, e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
15331 cCL(rdfez, e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
15332
15333 cCL(pows, e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
15334 cCL(powsp, e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
15335 cCL(powsm, e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
15336 cCL(powsz, e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
15337 cCL(powd, e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
15338 cCL(powdp, e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15339 cCL(powdm, e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15340 cCL(powdz, e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15341 cCL(powe, e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
15342 cCL(powep, e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
15343 cCL(powem, e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
15344 cCL(powez, e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
15345
15346 cCL(rpws, e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
15347 cCL(rpwsp, e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
15348 cCL(rpwsm, e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
15349 cCL(rpwsz, e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
15350 cCL(rpwd, e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
15351 cCL(rpwdp, e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15352 cCL(rpwdm, e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15353 cCL(rpwdz, e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15354 cCL(rpwe, e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
15355 cCL(rpwep, e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
15356 cCL(rpwem, e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
15357 cCL(rpwez, e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
15358
15359 cCL(rmfs, e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
15360 cCL(rmfsp, e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
15361 cCL(rmfsm, e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
15362 cCL(rmfsz, e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
15363 cCL(rmfd, e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
15364 cCL(rmfdp, e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15365 cCL(rmfdm, e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15366 cCL(rmfdz, e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15367 cCL(rmfe, e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
15368 cCL(rmfep, e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
15369 cCL(rmfem, e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
15370 cCL(rmfez, e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
15371
15372 cCL(fmls, e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
15373 cCL(fmlsp, e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
15374 cCL(fmlsm, e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
15375 cCL(fmlsz, e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
15376 cCL(fmld, e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
15377 cCL(fmldp, e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15378 cCL(fmldm, e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15379 cCL(fmldz, e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15380 cCL(fmle, e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
15381 cCL(fmlep, e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
15382 cCL(fmlem, e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
15383 cCL(fmlez, e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
15384
15385 cCL(fdvs, ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
15386 cCL(fdvsp, ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
15387 cCL(fdvsm, ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
15388 cCL(fdvsz, ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
15389 cCL(fdvd, ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
15390 cCL(fdvdp, ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15391 cCL(fdvdm, ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15392 cCL(fdvdz, ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15393 cCL(fdve, ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
15394 cCL(fdvep, ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
15395 cCL(fdvem, ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
15396 cCL(fdvez, ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
15397
15398 cCL(frds, eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
15399 cCL(frdsp, eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
15400 cCL(frdsm, eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
15401 cCL(frdsz, eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
15402 cCL(frdd, eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
15403 cCL(frddp, eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15404 cCL(frddm, eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15405 cCL(frddz, eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15406 cCL(frde, eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
15407 cCL(frdep, eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
15408 cCL(frdem, eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
15409 cCL(frdez, eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
15410
15411 cCL(pols, ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
15412 cCL(polsp, ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
15413 cCL(polsm, ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
15414 cCL(polsz, ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
15415 cCL(pold, ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
15416 cCL(poldp, ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
15417 cCL(poldm, ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
15418 cCL(poldz, ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
15419 cCL(pole, ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
15420 cCL(polep, ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
15421 cCL(polem, ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
15422 cCL(polez, ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
8f06b2d8
PB
15423
15424 cCE(cmf, e90f110, 2, (RF, RF_IF), fpa_cmp),
c19d1205 15425 C3E(cmfe, ed0f110, 2, (RF, RF_IF), fpa_cmp),
8f06b2d8 15426 cCE(cnf, eb0f110, 2, (RF, RF_IF), fpa_cmp),
c19d1205
ZW
15427 C3E(cnfe, ef0f110, 2, (RF, RF_IF), fpa_cmp),
15428
e3cb604e
PB
15429 cCL(flts, e000110, 2, (RF, RR), rn_rd),
15430 cCL(fltsp, e000130, 2, (RF, RR), rn_rd),
15431 cCL(fltsm, e000150, 2, (RF, RR), rn_rd),
15432 cCL(fltsz, e000170, 2, (RF, RR), rn_rd),
15433 cCL(fltd, e000190, 2, (RF, RR), rn_rd),
15434 cCL(fltdp, e0001b0, 2, (RF, RR), rn_rd),
15435 cCL(fltdm, e0001d0, 2, (RF, RR), rn_rd),
15436 cCL(fltdz, e0001f0, 2, (RF, RR), rn_rd),
15437 cCL(flte, e080110, 2, (RF, RR), rn_rd),
15438 cCL(fltep, e080130, 2, (RF, RR), rn_rd),
15439 cCL(fltem, e080150, 2, (RF, RR), rn_rd),
15440 cCL(fltez, e080170, 2, (RF, RR), rn_rd),
b99bd4ef 15441
c19d1205
ZW
15442 /* The implementation of the FIX instruction is broken on some
15443 assemblers, in that it accepts a precision specifier as well as a
15444 rounding specifier, despite the fact that this is meaningless.
15445 To be more compatible, we accept it as well, though of course it
15446 does not set any bits. */
8f06b2d8 15447 cCE(fix, e100110, 2, (RR, RF), rd_rm),
e3cb604e
PB
15448 cCL(fixp, e100130, 2, (RR, RF), rd_rm),
15449 cCL(fixm, e100150, 2, (RR, RF), rd_rm),
15450 cCL(fixz, e100170, 2, (RR, RF), rd_rm),
15451 cCL(fixsp, e100130, 2, (RR, RF), rd_rm),
15452 cCL(fixsm, e100150, 2, (RR, RF), rd_rm),
15453 cCL(fixsz, e100170, 2, (RR, RF), rd_rm),
15454 cCL(fixdp, e100130, 2, (RR, RF), rd_rm),
15455 cCL(fixdm, e100150, 2, (RR, RF), rd_rm),
15456 cCL(fixdz, e100170, 2, (RR, RF), rd_rm),
15457 cCL(fixep, e100130, 2, (RR, RF), rd_rm),
15458 cCL(fixem, e100150, 2, (RR, RF), rd_rm),
15459 cCL(fixez, e100170, 2, (RR, RF), rd_rm),
bfae80f2 15460
c19d1205
ZW
15461 /* Instructions that were new with the real FPA, call them V2. */
15462#undef ARM_VARIANT
e74cfd16 15463#define ARM_VARIANT &fpu_fpa_ext_v2
8f06b2d8 15464 cCE(lfm, c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
e3cb604e
PB
15465 cCL(lfmfd, c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
15466 cCL(lfmea, d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
8f06b2d8 15467 cCE(sfm, c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
e3cb604e
PB
15468 cCL(sfmfd, d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
15469 cCL(sfmea, c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
c19d1205
ZW
15470
15471#undef ARM_VARIANT
e74cfd16 15472#define ARM_VARIANT &fpu_vfp_ext_v1xd /* VFP V1xD (single precision). */
c19d1205 15473 /* Moves and type conversions. */
8f06b2d8
PB
15474 cCE(fcpys, eb00a40, 2, (RVS, RVS), vfp_sp_monadic),
15475 cCE(fmrs, e100a10, 2, (RR, RVS), vfp_reg_from_sp),
15476 cCE(fmsr, e000a10, 2, (RVS, RR), vfp_sp_from_reg),
15477 cCE(fmstat, ef1fa10, 0, (), noargs),
15478 cCE(fsitos, eb80ac0, 2, (RVS, RVS), vfp_sp_monadic),
15479 cCE(fuitos, eb80a40, 2, (RVS, RVS), vfp_sp_monadic),
15480 cCE(ftosis, ebd0a40, 2, (RVS, RVS), vfp_sp_monadic),
15481 cCE(ftosizs, ebd0ac0, 2, (RVS, RVS), vfp_sp_monadic),
15482 cCE(ftouis, ebc0a40, 2, (RVS, RVS), vfp_sp_monadic),
15483 cCE(ftouizs, ebc0ac0, 2, (RVS, RVS), vfp_sp_monadic),
15484 cCE(fmrx, ef00a10, 2, (RR, RVC), rd_rn),
15485 cCE(fmxr, ee00a10, 2, (RVC, RR), rn_rd),
c19d1205
ZW
15486
15487 /* Memory operations. */
4962c51a
MS
15488 cCE(flds, d100a00, 2, (RVS, ADDRGLDC), vfp_sp_ldst),
15489 cCE(fsts, d000a00, 2, (RVS, ADDRGLDC), vfp_sp_ldst),
8f06b2d8
PB
15490 cCE(fldmias, c900a00, 2, (RRw, VRSLST), vfp_sp_ldstmia),
15491 cCE(fldmfds, c900a00, 2, (RRw, VRSLST), vfp_sp_ldstmia),
15492 cCE(fldmdbs, d300a00, 2, (RRw, VRSLST), vfp_sp_ldstmdb),
15493 cCE(fldmeas, d300a00, 2, (RRw, VRSLST), vfp_sp_ldstmdb),
15494 cCE(fldmiax, c900b00, 2, (RRw, VRDLST), vfp_xp_ldstmia),
15495 cCE(fldmfdx, c900b00, 2, (RRw, VRDLST), vfp_xp_ldstmia),
15496 cCE(fldmdbx, d300b00, 2, (RRw, VRDLST), vfp_xp_ldstmdb),
15497 cCE(fldmeax, d300b00, 2, (RRw, VRDLST), vfp_xp_ldstmdb),
15498 cCE(fstmias, c800a00, 2, (RRw, VRSLST), vfp_sp_ldstmia),
15499 cCE(fstmeas, c800a00, 2, (RRw, VRSLST), vfp_sp_ldstmia),
15500 cCE(fstmdbs, d200a00, 2, (RRw, VRSLST), vfp_sp_ldstmdb),
15501 cCE(fstmfds, d200a00, 2, (RRw, VRSLST), vfp_sp_ldstmdb),
15502 cCE(fstmiax, c800b00, 2, (RRw, VRDLST), vfp_xp_ldstmia),
15503 cCE(fstmeax, c800b00, 2, (RRw, VRDLST), vfp_xp_ldstmia),
15504 cCE(fstmdbx, d200b00, 2, (RRw, VRDLST), vfp_xp_ldstmdb),
15505 cCE(fstmfdx, d200b00, 2, (RRw, VRDLST), vfp_xp_ldstmdb),
bfae80f2 15506
c19d1205 15507 /* Monadic operations. */
8f06b2d8
PB
15508 cCE(fabss, eb00ac0, 2, (RVS, RVS), vfp_sp_monadic),
15509 cCE(fnegs, eb10a40, 2, (RVS, RVS), vfp_sp_monadic),
15510 cCE(fsqrts, eb10ac0, 2, (RVS, RVS), vfp_sp_monadic),
c19d1205
ZW
15511
15512 /* Dyadic operations. */
8f06b2d8
PB
15513 cCE(fadds, e300a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
15514 cCE(fsubs, e300a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
15515 cCE(fmuls, e200a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
15516 cCE(fdivs, e800a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
15517 cCE(fmacs, e000a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
15518 cCE(fmscs, e100a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
15519 cCE(fnmuls, e200a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
15520 cCE(fnmacs, e000a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
15521 cCE(fnmscs, e100a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
b99bd4ef 15522
c19d1205 15523 /* Comparisons. */
8f06b2d8
PB
15524 cCE(fcmps, eb40a40, 2, (RVS, RVS), vfp_sp_monadic),
15525 cCE(fcmpzs, eb50a40, 1, (RVS), vfp_sp_compare_z),
15526 cCE(fcmpes, eb40ac0, 2, (RVS, RVS), vfp_sp_monadic),
15527 cCE(fcmpezs, eb50ac0, 1, (RVS), vfp_sp_compare_z),
b99bd4ef 15528
c19d1205 15529#undef ARM_VARIANT
e74cfd16 15530#define ARM_VARIANT &fpu_vfp_ext_v1 /* VFP V1 (Double precision). */
c19d1205 15531 /* Moves and type conversions. */
5287ad62 15532 cCE(fcpyd, eb00b40, 2, (RVD, RVD), vfp_dp_rd_rm),
8f06b2d8
PB
15533 cCE(fcvtds, eb70ac0, 2, (RVD, RVS), vfp_dp_sp_cvt),
15534 cCE(fcvtsd, eb70bc0, 2, (RVS, RVD), vfp_sp_dp_cvt),
5287ad62
JB
15535 cCE(fmdhr, e200b10, 2, (RVD, RR), vfp_dp_rn_rd),
15536 cCE(fmdlr, e000b10, 2, (RVD, RR), vfp_dp_rn_rd),
15537 cCE(fmrdh, e300b10, 2, (RR, RVD), vfp_dp_rd_rn),
15538 cCE(fmrdl, e100b10, 2, (RR, RVD), vfp_dp_rd_rn),
8f06b2d8
PB
15539 cCE(fsitod, eb80bc0, 2, (RVD, RVS), vfp_dp_sp_cvt),
15540 cCE(fuitod, eb80b40, 2, (RVD, RVS), vfp_dp_sp_cvt),
15541 cCE(ftosid, ebd0b40, 2, (RVS, RVD), vfp_sp_dp_cvt),
15542 cCE(ftosizd, ebd0bc0, 2, (RVS, RVD), vfp_sp_dp_cvt),
15543 cCE(ftouid, ebc0b40, 2, (RVS, RVD), vfp_sp_dp_cvt),
15544 cCE(ftouizd, ebc0bc0, 2, (RVS, RVD), vfp_sp_dp_cvt),
c19d1205
ZW
15545
15546 /* Memory operations. */
4962c51a
MS
15547 cCE(fldd, d100b00, 2, (RVD, ADDRGLDC), vfp_dp_ldst),
15548 cCE(fstd, d000b00, 2, (RVD, ADDRGLDC), vfp_dp_ldst),
8f06b2d8
PB
15549 cCE(fldmiad, c900b00, 2, (RRw, VRDLST), vfp_dp_ldstmia),
15550 cCE(fldmfdd, c900b00, 2, (RRw, VRDLST), vfp_dp_ldstmia),
15551 cCE(fldmdbd, d300b00, 2, (RRw, VRDLST), vfp_dp_ldstmdb),
15552 cCE(fldmead, d300b00, 2, (RRw, VRDLST), vfp_dp_ldstmdb),
15553 cCE(fstmiad, c800b00, 2, (RRw, VRDLST), vfp_dp_ldstmia),
15554 cCE(fstmead, c800b00, 2, (RRw, VRDLST), vfp_dp_ldstmia),
15555 cCE(fstmdbd, d200b00, 2, (RRw, VRDLST), vfp_dp_ldstmdb),
15556 cCE(fstmfdd, d200b00, 2, (RRw, VRDLST), vfp_dp_ldstmdb),
b99bd4ef 15557
c19d1205 15558 /* Monadic operations. */
5287ad62
JB
15559 cCE(fabsd, eb00bc0, 2, (RVD, RVD), vfp_dp_rd_rm),
15560 cCE(fnegd, eb10b40, 2, (RVD, RVD), vfp_dp_rd_rm),
15561 cCE(fsqrtd, eb10bc0, 2, (RVD, RVD), vfp_dp_rd_rm),
c19d1205
ZW
15562
15563 /* Dyadic operations. */
5287ad62
JB
15564 cCE(faddd, e300b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
15565 cCE(fsubd, e300b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
15566 cCE(fmuld, e200b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
15567 cCE(fdivd, e800b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
15568 cCE(fmacd, e000b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
15569 cCE(fmscd, e100b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
15570 cCE(fnmuld, e200b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
15571 cCE(fnmacd, e000b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
15572 cCE(fnmscd, e100b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
b99bd4ef 15573
c19d1205 15574 /* Comparisons. */
5287ad62
JB
15575 cCE(fcmpd, eb40b40, 2, (RVD, RVD), vfp_dp_rd_rm),
15576 cCE(fcmpzd, eb50b40, 1, (RVD), vfp_dp_rd),
15577 cCE(fcmped, eb40bc0, 2, (RVD, RVD), vfp_dp_rd_rm),
15578 cCE(fcmpezd, eb50bc0, 1, (RVD), vfp_dp_rd),
c19d1205
ZW
15579
15580#undef ARM_VARIANT
e74cfd16 15581#define ARM_VARIANT &fpu_vfp_ext_v2
8f06b2d8
PB
15582 cCE(fmsrr, c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
15583 cCE(fmrrs, c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
5287ad62
JB
15584 cCE(fmdrr, c400b10, 3, (RVD, RR, RR), vfp_dp_rm_rd_rn),
15585 cCE(fmrrd, c500b10, 3, (RR, RR, RVD), vfp_dp_rd_rn_rm),
15586
037e8744
JB
15587/* Instructions which may belong to either the Neon or VFP instruction sets.
15588 Individual encoder functions perform additional architecture checks. */
15589#undef ARM_VARIANT
15590#define ARM_VARIANT &fpu_vfp_ext_v1xd
15591#undef THUMB_VARIANT
15592#define THUMB_VARIANT &fpu_vfp_ext_v1xd
15593 /* These mnemonics are unique to VFP. */
15594 NCE(vsqrt, 0, 2, (RVSD, RVSD), vfp_nsyn_sqrt),
15595 NCE(vdiv, 0, 3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
15596 nCE(vnmul, vnmul, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
15597 nCE(vnmla, vnmla, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
15598 nCE(vnmls, vnmls, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
15599 nCE(vcmp, vcmp, 2, (RVSD, RVSD_I0), vfp_nsyn_cmp),
15600 nCE(vcmpe, vcmpe, 2, (RVSD, RVSD_I0), vfp_nsyn_cmp),
15601 NCE(vpush, 0, 1, (VRSDLST), vfp_nsyn_push),
15602 NCE(vpop, 0, 1, (VRSDLST), vfp_nsyn_pop),
15603 NCE(vcvtz, 0, 2, (RVSD, RVSD), vfp_nsyn_cvtz),
15604
15605 /* Mnemonics shared by Neon and VFP. */
15606 nCEF(vmul, vmul, 3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
15607 nCEF(vmla, vmla, 3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
15608 nCEF(vmls, vmls, 3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
15609
15610 nCEF(vadd, vadd, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
15611 nCEF(vsub, vsub, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
15612
15613 NCEF(vabs, 1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
15614 NCEF(vneg, 1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
15615
15616 NCE(vldm, c900b00, 2, (RRw, VRSDLST), neon_ldm_stm),
15617 NCE(vldmia, c900b00, 2, (RRw, VRSDLST), neon_ldm_stm),
15618 NCE(vldmdb, d100b00, 2, (RRw, VRSDLST), neon_ldm_stm),
15619 NCE(vstm, c800b00, 2, (RRw, VRSDLST), neon_ldm_stm),
15620 NCE(vstmia, c800b00, 2, (RRw, VRSDLST), neon_ldm_stm),
15621 NCE(vstmdb, d000b00, 2, (RRw, VRSDLST), neon_ldm_stm),
4962c51a
MS
15622 NCE(vldr, d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
15623 NCE(vstr, d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
037e8744
JB
15624
15625 nCEF(vcvt, vcvt, 3, (RNSDQ, RNSDQ, oI32b), neon_cvt),
15626
15627 /* NOTE: All VMOV encoding is special-cased! */
15628 NCE(vmov, 0, 1, (VMOV), neon_mov),
15629 NCE(vmovq, 0, 1, (VMOV), neon_mov),
15630
5287ad62
JB
15631#undef THUMB_VARIANT
15632#define THUMB_VARIANT &fpu_neon_ext_v1
15633#undef ARM_VARIANT
15634#define ARM_VARIANT &fpu_neon_ext_v1
15635 /* Data processing with three registers of the same length. */
15636 /* integer ops, valid types S8 S16 S32 U8 U16 U32. */
15637 NUF(vaba, 0000710, 3, (RNDQ, RNDQ, RNDQ), neon_dyadic_i_su),
15638 NUF(vabaq, 0000710, 3, (RNQ, RNQ, RNQ), neon_dyadic_i_su),
15639 NUF(vhadd, 0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
15640 NUF(vhaddq, 0000000, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i_su),
15641 NUF(vrhadd, 0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
15642 NUF(vrhaddq, 0000100, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i_su),
15643 NUF(vhsub, 0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
15644 NUF(vhsubq, 0000200, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i_su),
15645 /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64. */
15646 NUF(vqadd, 0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
15647 NUF(vqaddq, 0000010, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i64_su),
15648 NUF(vqsub, 0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
15649 NUF(vqsubq, 0000210, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i64_su),
15650 NUF(vrshl, 0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
15651 NUF(vrshlq, 0000500, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i64_su),
15652 NUF(vqrshl, 0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
15653 NUF(vqrshlq, 0000510, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i64_su),
15654 /* If not immediate, fall back to neon_dyadic_i64_su.
15655 shl_imm should accept I8 I16 I32 I64,
15656 qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64. */
15657 nUF(vshl, vshl, 3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
15658 nUF(vshlq, vshl, 3, (RNQ, oRNQ, RNDQ_I63b), neon_shl_imm),
15659 nUF(vqshl, vqshl, 3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
15660 nUF(vqshlq, vqshl, 3, (RNQ, oRNQ, RNDQ_I63b), neon_qshl_imm),
15661 /* Logic ops, types optional & ignored. */
15662 nUF(vand, vand, 2, (RNDQ, NILO), neon_logic),
15663 nUF(vandq, vand, 2, (RNQ, NILO), neon_logic),
15664 nUF(vbic, vbic, 2, (RNDQ, NILO), neon_logic),
15665 nUF(vbicq, vbic, 2, (RNQ, NILO), neon_logic),
15666 nUF(vorr, vorr, 2, (RNDQ, NILO), neon_logic),
15667 nUF(vorrq, vorr, 2, (RNQ, NILO), neon_logic),
15668 nUF(vorn, vorn, 2, (RNDQ, NILO), neon_logic),
15669 nUF(vornq, vorn, 2, (RNQ, NILO), neon_logic),
15670 nUF(veor, veor, 3, (RNDQ, oRNDQ, RNDQ), neon_logic),
15671 nUF(veorq, veor, 3, (RNQ, oRNQ, RNQ), neon_logic),
15672 /* Bitfield ops, untyped. */
15673 NUF(vbsl, 1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
15674 NUF(vbslq, 1100110, 3, (RNQ, RNQ, RNQ), neon_bitfield),
15675 NUF(vbit, 1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
15676 NUF(vbitq, 1200110, 3, (RNQ, RNQ, RNQ), neon_bitfield),
15677 NUF(vbif, 1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
15678 NUF(vbifq, 1300110, 3, (RNQ, RNQ, RNQ), neon_bitfield),
15679 /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32. */
15680 nUF(vabd, vabd, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
15681 nUF(vabdq, vabd, 3, (RNQ, oRNQ, RNQ), neon_dyadic_if_su),
15682 nUF(vmax, vmax, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
15683 nUF(vmaxq, vmax, 3, (RNQ, oRNQ, RNQ), neon_dyadic_if_su),
15684 nUF(vmin, vmin, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
15685 nUF(vminq, vmin, 3, (RNQ, oRNQ, RNQ), neon_dyadic_if_su),
15686 /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
15687 back to neon_dyadic_if_su. */
15688 nUF(vcge, vcge, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
15689 nUF(vcgeq, vcge, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp),
15690 nUF(vcgt, vcgt, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
15691 nUF(vcgtq, vcgt, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp),
15692 nUF(vclt, vclt, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
15693 nUF(vcltq, vclt, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp_inv),
15694 nUF(vcle, vcle, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
15695 nUF(vcleq, vcle, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp_inv),
428e3f1f 15696 /* Comparison. Type I8 I16 I32 F32. */
5287ad62
JB
15697 nUF(vceq, vceq, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
15698 nUF(vceqq, vceq, 3, (RNQ, oRNQ, RNDQ_I0), neon_ceq),
15699 /* As above, D registers only. */
15700 nUF(vpmax, vpmax, 3, (RND, oRND, RND), neon_dyadic_if_su_d),
15701 nUF(vpmin, vpmin, 3, (RND, oRND, RND), neon_dyadic_if_su_d),
15702 /* Int and float variants, signedness unimportant. */
5287ad62 15703 nUF(vmlaq, vmla, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_mac_maybe_scalar),
5287ad62
JB
15704 nUF(vmlsq, vmls, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_mac_maybe_scalar),
15705 nUF(vpadd, vpadd, 3, (RND, oRND, RND), neon_dyadic_if_i_d),
15706 /* Add/sub take types I8 I16 I32 I64 F32. */
5287ad62 15707 nUF(vaddq, vadd, 3, (RNQ, oRNQ, RNQ), neon_addsub_if_i),
5287ad62
JB
15708 nUF(vsubq, vsub, 3, (RNQ, oRNQ, RNQ), neon_addsub_if_i),
15709 /* vtst takes sizes 8, 16, 32. */
15710 NUF(vtst, 0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
15711 NUF(vtstq, 0000810, 3, (RNQ, oRNQ, RNQ), neon_tst),
15712 /* VMUL takes I8 I16 I32 F32 P8. */
037e8744 15713 nUF(vmulq, vmul, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_mul),
5287ad62
JB
15714 /* VQD{R}MULH takes S16 S32. */
15715 nUF(vqdmulh, vqdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
15716 nUF(vqdmulhq, vqdmulh, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_qdmulh),
15717 nUF(vqrdmulh, vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
15718 nUF(vqrdmulhq, vqrdmulh, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_qdmulh),
15719 NUF(vacge, 0000e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
15720 NUF(vacgeq, 0000e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute),
15721 NUF(vacgt, 0200e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
15722 NUF(vacgtq, 0200e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute),
15723 NUF(vaclt, 0000e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
15724 NUF(vacltq, 0000e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute_inv),
15725 NUF(vacle, 0200e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
15726 NUF(vacleq, 0200e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute_inv),
15727 NUF(vrecps, 0000f10, 3, (RNDQ, oRNDQ, RNDQ), neon_step),
15728 NUF(vrecpsq, 0000f10, 3, (RNQ, oRNQ, RNQ), neon_step),
15729 NUF(vrsqrts, 0200f10, 3, (RNDQ, oRNDQ, RNDQ), neon_step),
15730 NUF(vrsqrtsq, 0200f10, 3, (RNQ, oRNQ, RNQ), neon_step),
15731
15732 /* Two address, int/float. Types S8 S16 S32 F32. */
5287ad62 15733 NUF(vabsq, 1b10300, 2, (RNQ, RNQ), neon_abs_neg),
5287ad62
JB
15734 NUF(vnegq, 1b10380, 2, (RNQ, RNQ), neon_abs_neg),
15735
15736 /* Data processing with two registers and a shift amount. */
15737 /* Right shifts, and variants with rounding.
15738 Types accepted S8 S16 S32 S64 U8 U16 U32 U64. */
15739 NUF(vshr, 0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
15740 NUF(vshrq, 0800010, 3, (RNQ, oRNQ, I64z), neon_rshift_round_imm),
15741 NUF(vrshr, 0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
15742 NUF(vrshrq, 0800210, 3, (RNQ, oRNQ, I64z), neon_rshift_round_imm),
15743 NUF(vsra, 0800110, 3, (RNDQ, oRNDQ, I64), neon_rshift_round_imm),
15744 NUF(vsraq, 0800110, 3, (RNQ, oRNQ, I64), neon_rshift_round_imm),
15745 NUF(vrsra, 0800310, 3, (RNDQ, oRNDQ, I64), neon_rshift_round_imm),
15746 NUF(vrsraq, 0800310, 3, (RNQ, oRNQ, I64), neon_rshift_round_imm),
15747 /* Shift and insert. Sizes accepted 8 16 32 64. */
15748 NUF(vsli, 1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
15749 NUF(vsliq, 1800510, 3, (RNQ, oRNQ, I63), neon_sli),
15750 NUF(vsri, 1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
15751 NUF(vsriq, 1800410, 3, (RNQ, oRNQ, I64), neon_sri),
15752 /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64. */
15753 NUF(vqshlu, 1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
15754 NUF(vqshluq, 1800610, 3, (RNQ, oRNQ, I63), neon_qshlu_imm),
15755 /* Right shift immediate, saturating & narrowing, with rounding variants.
15756 Types accepted S16 S32 S64 U16 U32 U64. */
15757 NUF(vqshrn, 0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
15758 NUF(vqrshrn, 0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
15759 /* As above, unsigned. Types accepted S16 S32 S64. */
15760 NUF(vqshrun, 0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
15761 NUF(vqrshrun, 0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
15762 /* Right shift narrowing. Types accepted I16 I32 I64. */
15763 NUF(vshrn, 0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
15764 NUF(vrshrn, 0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
15765 /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant. */
15766 nUF(vshll, vshll, 3, (RNQ, RND, I32), neon_shll),
15767 /* CVT with optional immediate for fixed-point variant. */
037e8744 15768 nUF(vcvtq, vcvt, 3, (RNQ, RNQ, oI32b), neon_cvt),
b7fc2769 15769
5287ad62
JB
15770 nUF(vmvn, vmvn, 2, (RNDQ, RNDQ_IMVNb), neon_mvn),
15771 nUF(vmvnq, vmvn, 2, (RNQ, RNDQ_IMVNb), neon_mvn),
15772
15773 /* Data processing, three registers of different lengths. */
15774 /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32. */
15775 NUF(vabal, 0800500, 3, (RNQ, RND, RND), neon_abal),
15776 NUF(vabdl, 0800700, 3, (RNQ, RND, RND), neon_dyadic_long),
15777 NUF(vaddl, 0800000, 3, (RNQ, RND, RND), neon_dyadic_long),
15778 NUF(vsubl, 0800200, 3, (RNQ, RND, RND), neon_dyadic_long),
15779 /* If not scalar, fall back to neon_dyadic_long.
15780 Vector types as above, scalar types S16 S32 U16 U32. */
15781 nUF(vmlal, vmlal, 3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
15782 nUF(vmlsl, vmlsl, 3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
15783 /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32. */
15784 NUF(vaddw, 0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
15785 NUF(vsubw, 0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
15786 /* Dyadic, narrowing insns. Types I16 I32 I64. */
15787 NUF(vaddhn, 0800400, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
15788 NUF(vraddhn, 1800400, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
15789 NUF(vsubhn, 0800600, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
15790 NUF(vrsubhn, 1800600, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
15791 /* Saturating doubling multiplies. Types S16 S32. */
15792 nUF(vqdmlal, vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
15793 nUF(vqdmlsl, vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
15794 nUF(vqdmull, vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
15795 /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
15796 S16 S32 U16 U32. */
15797 nUF(vmull, vmull, 3, (RNQ, RND, RND_RNSC), neon_vmull),
15798
15799 /* Extract. Size 8. */
15800 NUF(vext, 0b00000, 4, (RNDQ, oRNDQ, RNDQ, I7), neon_ext),
15801 NUF(vextq, 0b00000, 4, (RNQ, oRNQ, RNQ, I7), neon_ext),
15802
15803 /* Two registers, miscellaneous. */
15804 /* Reverse. Sizes 8 16 32 (must be < size in opcode). */
15805 NUF(vrev64, 1b00000, 2, (RNDQ, RNDQ), neon_rev),
15806 NUF(vrev64q, 1b00000, 2, (RNQ, RNQ), neon_rev),
15807 NUF(vrev32, 1b00080, 2, (RNDQ, RNDQ), neon_rev),
15808 NUF(vrev32q, 1b00080, 2, (RNQ, RNQ), neon_rev),
15809 NUF(vrev16, 1b00100, 2, (RNDQ, RNDQ), neon_rev),
15810 NUF(vrev16q, 1b00100, 2, (RNQ, RNQ), neon_rev),
15811 /* Vector replicate. Sizes 8 16 32. */
15812 nCE(vdup, vdup, 2, (RNDQ, RR_RNSC), neon_dup),
15813 nCE(vdupq, vdup, 2, (RNQ, RR_RNSC), neon_dup),
15814 /* VMOVL. Types S8 S16 S32 U8 U16 U32. */
15815 NUF(vmovl, 0800a10, 2, (RNQ, RND), neon_movl),
15816 /* VMOVN. Types I16 I32 I64. */
15817 nUF(vmovn, vmovn, 2, (RND, RNQ), neon_movn),
15818 /* VQMOVN. Types S16 S32 S64 U16 U32 U64. */
15819 nUF(vqmovn, vqmovn, 2, (RND, RNQ), neon_qmovn),
15820 /* VQMOVUN. Types S16 S32 S64. */
15821 nUF(vqmovun, vqmovun, 2, (RND, RNQ), neon_qmovun),
15822 /* VZIP / VUZP. Sizes 8 16 32. */
15823 NUF(vzip, 1b20180, 2, (RNDQ, RNDQ), neon_zip_uzp),
15824 NUF(vzipq, 1b20180, 2, (RNQ, RNQ), neon_zip_uzp),
15825 NUF(vuzp, 1b20100, 2, (RNDQ, RNDQ), neon_zip_uzp),
15826 NUF(vuzpq, 1b20100, 2, (RNQ, RNQ), neon_zip_uzp),
15827 /* VQABS / VQNEG. Types S8 S16 S32. */
15828 NUF(vqabs, 1b00700, 2, (RNDQ, RNDQ), neon_sat_abs_neg),
15829 NUF(vqabsq, 1b00700, 2, (RNQ, RNQ), neon_sat_abs_neg),
15830 NUF(vqneg, 1b00780, 2, (RNDQ, RNDQ), neon_sat_abs_neg),
15831 NUF(vqnegq, 1b00780, 2, (RNQ, RNQ), neon_sat_abs_neg),
15832 /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32. */
15833 NUF(vpadal, 1b00600, 2, (RNDQ, RNDQ), neon_pair_long),
15834 NUF(vpadalq, 1b00600, 2, (RNQ, RNQ), neon_pair_long),
15835 NUF(vpaddl, 1b00200, 2, (RNDQ, RNDQ), neon_pair_long),
15836 NUF(vpaddlq, 1b00200, 2, (RNQ, RNQ), neon_pair_long),
15837 /* Reciprocal estimates. Types U32 F32. */
15838 NUF(vrecpe, 1b30400, 2, (RNDQ, RNDQ), neon_recip_est),
15839 NUF(vrecpeq, 1b30400, 2, (RNQ, RNQ), neon_recip_est),
15840 NUF(vrsqrte, 1b30480, 2, (RNDQ, RNDQ), neon_recip_est),
15841 NUF(vrsqrteq, 1b30480, 2, (RNQ, RNQ), neon_recip_est),
15842 /* VCLS. Types S8 S16 S32. */
15843 NUF(vcls, 1b00400, 2, (RNDQ, RNDQ), neon_cls),
15844 NUF(vclsq, 1b00400, 2, (RNQ, RNQ), neon_cls),
15845 /* VCLZ. Types I8 I16 I32. */
15846 NUF(vclz, 1b00480, 2, (RNDQ, RNDQ), neon_clz),
15847 NUF(vclzq, 1b00480, 2, (RNQ, RNQ), neon_clz),
15848 /* VCNT. Size 8. */
15849 NUF(vcnt, 1b00500, 2, (RNDQ, RNDQ), neon_cnt),
15850 NUF(vcntq, 1b00500, 2, (RNQ, RNQ), neon_cnt),
15851 /* Two address, untyped. */
15852 NUF(vswp, 1b20000, 2, (RNDQ, RNDQ), neon_swp),
15853 NUF(vswpq, 1b20000, 2, (RNQ, RNQ), neon_swp),
15854 /* VTRN. Sizes 8 16 32. */
15855 nUF(vtrn, vtrn, 2, (RNDQ, RNDQ), neon_trn),
15856 nUF(vtrnq, vtrn, 2, (RNQ, RNQ), neon_trn),
15857
15858 /* Table lookup. Size 8. */
15859 NUF(vtbl, 1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
15860 NUF(vtbx, 1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
15861
b7fc2769
JB
15862#undef THUMB_VARIANT
15863#define THUMB_VARIANT &fpu_vfp_v3_or_neon_ext
15864#undef ARM_VARIANT
15865#define ARM_VARIANT &fpu_vfp_v3_or_neon_ext
5287ad62
JB
15866 /* Neon element/structure load/store. */
15867 nUF(vld1, vld1, 2, (NSTRLST, ADDR), neon_ldx_stx),
15868 nUF(vst1, vst1, 2, (NSTRLST, ADDR), neon_ldx_stx),
15869 nUF(vld2, vld2, 2, (NSTRLST, ADDR), neon_ldx_stx),
15870 nUF(vst2, vst2, 2, (NSTRLST, ADDR), neon_ldx_stx),
15871 nUF(vld3, vld3, 2, (NSTRLST, ADDR), neon_ldx_stx),
15872 nUF(vst3, vst3, 2, (NSTRLST, ADDR), neon_ldx_stx),
15873 nUF(vld4, vld4, 2, (NSTRLST, ADDR), neon_ldx_stx),
15874 nUF(vst4, vst4, 2, (NSTRLST, ADDR), neon_ldx_stx),
15875
15876#undef THUMB_VARIANT
15877#define THUMB_VARIANT &fpu_vfp_ext_v3
15878#undef ARM_VARIANT
15879#define ARM_VARIANT &fpu_vfp_ext_v3
5287ad62
JB
15880 cCE(fconsts, eb00a00, 2, (RVS, I255), vfp_sp_const),
15881 cCE(fconstd, eb00b00, 2, (RVD, I255), vfp_dp_const),
15882 cCE(fshtos, eba0a40, 2, (RVS, I16z), vfp_sp_conv_16),
15883 cCE(fshtod, eba0b40, 2, (RVD, I16z), vfp_dp_conv_16),
15884 cCE(fsltos, eba0ac0, 2, (RVS, I32), vfp_sp_conv_32),
15885 cCE(fsltod, eba0bc0, 2, (RVD, I32), vfp_dp_conv_32),
15886 cCE(fuhtos, ebb0a40, 2, (RVS, I16z), vfp_sp_conv_16),
15887 cCE(fuhtod, ebb0b40, 2, (RVD, I16z), vfp_dp_conv_16),
15888 cCE(fultos, ebb0ac0, 2, (RVS, I32), vfp_sp_conv_32),
15889 cCE(fultod, ebb0bc0, 2, (RVD, I32), vfp_dp_conv_32),
15890 cCE(ftoshs, ebe0a40, 2, (RVS, I16z), vfp_sp_conv_16),
15891 cCE(ftoshd, ebe0b40, 2, (RVD, I16z), vfp_dp_conv_16),
15892 cCE(ftosls, ebe0ac0, 2, (RVS, I32), vfp_sp_conv_32),
15893 cCE(ftosld, ebe0bc0, 2, (RVD, I32), vfp_dp_conv_32),
15894 cCE(ftouhs, ebf0a40, 2, (RVS, I16z), vfp_sp_conv_16),
15895 cCE(ftouhd, ebf0b40, 2, (RVD, I16z), vfp_dp_conv_16),
15896 cCE(ftouls, ebf0ac0, 2, (RVS, I32), vfp_sp_conv_32),
15897 cCE(ftould, ebf0bc0, 2, (RVD, I32), vfp_dp_conv_32),
c19d1205 15898
5287ad62 15899#undef THUMB_VARIANT
c19d1205 15900#undef ARM_VARIANT
e74cfd16 15901#define ARM_VARIANT &arm_cext_xscale /* Intel XScale extensions. */
8f06b2d8
PB
15902 cCE(mia, e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
15903 cCE(miaph, e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
15904 cCE(miabb, e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
15905 cCE(miabt, e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
15906 cCE(miatb, e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
15907 cCE(miatt, e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
15908 cCE(mar, c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
15909 cCE(mra, c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
c19d1205
ZW
15910
15911#undef ARM_VARIANT
e74cfd16 15912#define ARM_VARIANT &arm_cext_iwmmxt /* Intel Wireless MMX technology. */
8f06b2d8
PB
15913 cCE(tandcb, e13f130, 1, (RR), iwmmxt_tandorc),
15914 cCE(tandch, e53f130, 1, (RR), iwmmxt_tandorc),
15915 cCE(tandcw, e93f130, 1, (RR), iwmmxt_tandorc),
15916 cCE(tbcstb, e400010, 2, (RIWR, RR), rn_rd),
15917 cCE(tbcsth, e400050, 2, (RIWR, RR), rn_rd),
15918 cCE(tbcstw, e400090, 2, (RIWR, RR), rn_rd),
15919 cCE(textrcb, e130170, 2, (RR, I7), iwmmxt_textrc),
15920 cCE(textrch, e530170, 2, (RR, I7), iwmmxt_textrc),
15921 cCE(textrcw, e930170, 2, (RR, I7), iwmmxt_textrc),
15922 cCE(textrmub, e100070, 3, (RR, RIWR, I7), iwmmxt_textrm),
15923 cCE(textrmuh, e500070, 3, (RR, RIWR, I7), iwmmxt_textrm),
15924 cCE(textrmuw, e900070, 3, (RR, RIWR, I7), iwmmxt_textrm),
15925 cCE(textrmsb, e100078, 3, (RR, RIWR, I7), iwmmxt_textrm),
15926 cCE(textrmsh, e500078, 3, (RR, RIWR, I7), iwmmxt_textrm),
15927 cCE(textrmsw, e900078, 3, (RR, RIWR, I7), iwmmxt_textrm),
15928 cCE(tinsrb, e600010, 3, (RIWR, RR, I7), iwmmxt_tinsr),
15929 cCE(tinsrh, e600050, 3, (RIWR, RR, I7), iwmmxt_tinsr),
15930 cCE(tinsrw, e600090, 3, (RIWR, RR, I7), iwmmxt_tinsr),
41adaa5c 15931 cCE(tmcr, e000110, 2, (RIWC_RIWG, RR), rn_rd),
8f06b2d8
PB
15932 cCE(tmcrr, c400000, 3, (RIWR, RR, RR), rm_rd_rn),
15933 cCE(tmia, e200010, 3, (RIWR, RR, RR), iwmmxt_tmia),
15934 cCE(tmiaph, e280010, 3, (RIWR, RR, RR), iwmmxt_tmia),
15935 cCE(tmiabb, e2c0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
15936 cCE(tmiabt, e2d0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
15937 cCE(tmiatb, e2e0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
15938 cCE(tmiatt, e2f0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
15939 cCE(tmovmskb, e100030, 2, (RR, RIWR), rd_rn),
15940 cCE(tmovmskh, e500030, 2, (RR, RIWR), rd_rn),
15941 cCE(tmovmskw, e900030, 2, (RR, RIWR), rd_rn),
41adaa5c 15942 cCE(tmrc, e100110, 2, (RR, RIWC_RIWG), rd_rn),
8f06b2d8
PB
15943 cCE(tmrrc, c500000, 3, (RR, RR, RIWR), rd_rn_rm),
15944 cCE(torcb, e13f150, 1, (RR), iwmmxt_tandorc),
15945 cCE(torch, e53f150, 1, (RR), iwmmxt_tandorc),
15946 cCE(torcw, e93f150, 1, (RR), iwmmxt_tandorc),
15947 cCE(waccb, e0001c0, 2, (RIWR, RIWR), rd_rn),
15948 cCE(wacch, e4001c0, 2, (RIWR, RIWR), rd_rn),
15949 cCE(waccw, e8001c0, 2, (RIWR, RIWR), rd_rn),
15950 cCE(waddbss, e300180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15951 cCE(waddb, e000180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15952 cCE(waddbus, e100180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15953 cCE(waddhss, e700180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15954 cCE(waddh, e400180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15955 cCE(waddhus, e500180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15956 cCE(waddwss, eb00180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15957 cCE(waddw, e800180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15958 cCE(waddwus, e900180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15959 cCE(waligni, e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
15960 cCE(walignr0, e800020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15961 cCE(walignr1, e900020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15962 cCE(walignr2, ea00020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15963 cCE(walignr3, eb00020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15964 cCE(wand, e200000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15965 cCE(wandn, e300000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15966 cCE(wavg2b, e800000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15967 cCE(wavg2br, e900000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15968 cCE(wavg2h, ec00000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15969 cCE(wavg2hr, ed00000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15970 cCE(wcmpeqb, e000060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15971 cCE(wcmpeqh, e400060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15972 cCE(wcmpeqw, e800060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15973 cCE(wcmpgtub, e100060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15974 cCE(wcmpgtuh, e500060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15975 cCE(wcmpgtuw, e900060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15976 cCE(wcmpgtsb, e300060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15977 cCE(wcmpgtsh, e700060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15978 cCE(wcmpgtsw, eb00060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15979 cCE(wldrb, c100000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
15980 cCE(wldrh, c500000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
15981 cCE(wldrw, c100100, 2, (RIWR_RIWC, ADDR), iwmmxt_wldstw),
15982 cCE(wldrd, c500100, 2, (RIWR, ADDR), iwmmxt_wldstd),
15983 cCE(wmacs, e600100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15984 cCE(wmacsz, e700100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15985 cCE(wmacu, e400100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15986 cCE(wmacuz, e500100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15987 cCE(wmadds, ea00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15988 cCE(wmaddu, e800100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15989 cCE(wmaxsb, e200160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15990 cCE(wmaxsh, e600160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15991 cCE(wmaxsw, ea00160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15992 cCE(wmaxub, e000160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15993 cCE(wmaxuh, e400160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15994 cCE(wmaxuw, e800160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15995 cCE(wminsb, e300160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15996 cCE(wminsh, e700160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15997 cCE(wminsw, eb00160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15998 cCE(wminub, e100160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
15999 cCE(wminuh, e500160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16000 cCE(wminuw, e900160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16001 cCE(wmov, e000000, 2, (RIWR, RIWR), iwmmxt_wmov),
16002 cCE(wmulsm, e300100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16003 cCE(wmulsl, e200100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16004 cCE(wmulum, e100100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16005 cCE(wmulul, e000100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16006 cCE(wor, e000000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16007 cCE(wpackhss, e700080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16008 cCE(wpackhus, e500080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16009 cCE(wpackwss, eb00080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16010 cCE(wpackwus, e900080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16011 cCE(wpackdss, ef00080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16012 cCE(wpackdus, ed00080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
2d447fca 16013 cCE(wrorh, e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
8f06b2d8 16014 cCE(wrorhg, e700148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
2d447fca 16015 cCE(wrorw, eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
8f06b2d8 16016 cCE(wrorwg, eb00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
2d447fca 16017 cCE(wrord, ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
8f06b2d8
PB
16018 cCE(wrordg, ef00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
16019 cCE(wsadb, e000120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16020 cCE(wsadbz, e100120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16021 cCE(wsadh, e400120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16022 cCE(wsadhz, e500120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16023 cCE(wshufh, e0001e0, 3, (RIWR, RIWR, I255), iwmmxt_wshufh),
2d447fca 16024 cCE(wsllh, e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
8f06b2d8 16025 cCE(wsllhg, e500148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
2d447fca 16026 cCE(wsllw, e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
8f06b2d8 16027 cCE(wsllwg, e900148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
2d447fca 16028 cCE(wslld, ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
8f06b2d8 16029 cCE(wslldg, ed00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
2d447fca 16030 cCE(wsrah, e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
8f06b2d8 16031 cCE(wsrahg, e400148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
2d447fca 16032 cCE(wsraw, e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
8f06b2d8 16033 cCE(wsrawg, e800148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
2d447fca 16034 cCE(wsrad, ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
8f06b2d8 16035 cCE(wsradg, ec00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
2d447fca 16036 cCE(wsrlh, e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
8f06b2d8 16037 cCE(wsrlhg, e600148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
2d447fca 16038 cCE(wsrlw, ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
8f06b2d8 16039 cCE(wsrlwg, ea00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
2d447fca 16040 cCE(wsrld, ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
8f06b2d8
PB
16041 cCE(wsrldg, ee00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
16042 cCE(wstrb, c000000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
16043 cCE(wstrh, c400000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
16044 cCE(wstrw, c000100, 2, (RIWR_RIWC, ADDR), iwmmxt_wldstw),
16045 cCE(wstrd, c400100, 2, (RIWR, ADDR), iwmmxt_wldstd),
16046 cCE(wsubbss, e3001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16047 cCE(wsubb, e0001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16048 cCE(wsubbus, e1001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16049 cCE(wsubhss, e7001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16050 cCE(wsubh, e4001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16051 cCE(wsubhus, e5001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16052 cCE(wsubwss, eb001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16053 cCE(wsubw, e8001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16054 cCE(wsubwus, e9001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16055 cCE(wunpckehub,e0000c0, 2, (RIWR, RIWR), rd_rn),
16056 cCE(wunpckehuh,e4000c0, 2, (RIWR, RIWR), rd_rn),
16057 cCE(wunpckehuw,e8000c0, 2, (RIWR, RIWR), rd_rn),
16058 cCE(wunpckehsb,e2000c0, 2, (RIWR, RIWR), rd_rn),
16059 cCE(wunpckehsh,e6000c0, 2, (RIWR, RIWR), rd_rn),
16060 cCE(wunpckehsw,ea000c0, 2, (RIWR, RIWR), rd_rn),
16061 cCE(wunpckihb, e1000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16062 cCE(wunpckihh, e5000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16063 cCE(wunpckihw, e9000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16064 cCE(wunpckelub,e0000e0, 2, (RIWR, RIWR), rd_rn),
16065 cCE(wunpckeluh,e4000e0, 2, (RIWR, RIWR), rd_rn),
16066 cCE(wunpckeluw,e8000e0, 2, (RIWR, RIWR), rd_rn),
16067 cCE(wunpckelsb,e2000e0, 2, (RIWR, RIWR), rd_rn),
16068 cCE(wunpckelsh,e6000e0, 2, (RIWR, RIWR), rd_rn),
16069 cCE(wunpckelsw,ea000e0, 2, (RIWR, RIWR), rd_rn),
16070 cCE(wunpckilb, e1000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16071 cCE(wunpckilh, e5000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16072 cCE(wunpckilw, e9000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16073 cCE(wxor, e100000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16074 cCE(wzero, e300000, 1, (RIWR), iwmmxt_wzero),
c19d1205 16075
2d447fca
JM
16076#undef ARM_VARIANT
16077#define ARM_VARIANT &arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2. */
16078 cCE(torvscb, e13f190, 1, (RR), iwmmxt_tandorc),
16079 cCE(torvsch, e53f190, 1, (RR), iwmmxt_tandorc),
16080 cCE(torvscw, e93f190, 1, (RR), iwmmxt_tandorc),
16081 cCE(wabsb, e2001c0, 2, (RIWR, RIWR), rd_rn),
16082 cCE(wabsh, e6001c0, 2, (RIWR, RIWR), rd_rn),
16083 cCE(wabsw, ea001c0, 2, (RIWR, RIWR), rd_rn),
16084 cCE(wabsdiffb, e1001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16085 cCE(wabsdiffh, e5001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16086 cCE(wabsdiffw, e9001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16087 cCE(waddbhusl, e2001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16088 cCE(waddbhusm, e6001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16089 cCE(waddhc, e600180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16090 cCE(waddwc, ea00180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16091 cCE(waddsubhx, ea001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16092 cCE(wavg4, e400000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16093 cCE(wavg4r, e500000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16094 cCE(wmaddsn, ee00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16095 cCE(wmaddsx, eb00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16096 cCE(wmaddun, ec00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16097 cCE(wmaddux, e900100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16098 cCE(wmerge, e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
16099 cCE(wmiabb, e0000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16100 cCE(wmiabt, e1000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16101 cCE(wmiatb, e2000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16102 cCE(wmiatt, e3000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16103 cCE(wmiabbn, e4000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16104 cCE(wmiabtn, e5000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16105 cCE(wmiatbn, e6000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16106 cCE(wmiattn, e7000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16107 cCE(wmiawbb, e800120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16108 cCE(wmiawbt, e900120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16109 cCE(wmiawtb, ea00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16110 cCE(wmiawtt, eb00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16111 cCE(wmiawbbn, ec00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16112 cCE(wmiawbtn, ed00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16113 cCE(wmiawtbn, ee00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16114 cCE(wmiawttn, ef00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16115 cCE(wmulsmr, ef00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16116 cCE(wmulumr, ed00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16117 cCE(wmulwumr, ec000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16118 cCE(wmulwsmr, ee000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16119 cCE(wmulwum, ed000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16120 cCE(wmulwsm, ef000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16121 cCE(wmulwl, eb000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16122 cCE(wqmiabb, e8000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16123 cCE(wqmiabt, e9000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16124 cCE(wqmiatb, ea000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16125 cCE(wqmiatt, eb000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16126 cCE(wqmiabbn, ec000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16127 cCE(wqmiabtn, ed000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16128 cCE(wqmiatbn, ee000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16129 cCE(wqmiattn, ef000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16130 cCE(wqmulm, e100080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16131 cCE(wqmulmr, e300080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16132 cCE(wqmulwm, ec000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16133 cCE(wqmulwmr, ee000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16134 cCE(wsubaddhx, ed001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
16135
c19d1205 16136#undef ARM_VARIANT
e74cfd16 16137#define ARM_VARIANT &arm_cext_maverick /* Cirrus Maverick instructions. */
4962c51a
MS
16138 cCE(cfldrs, c100400, 2, (RMF, ADDRGLDC), rd_cpaddr),
16139 cCE(cfldrd, c500400, 2, (RMD, ADDRGLDC), rd_cpaddr),
16140 cCE(cfldr32, c100500, 2, (RMFX, ADDRGLDC), rd_cpaddr),
16141 cCE(cfldr64, c500500, 2, (RMDX, ADDRGLDC), rd_cpaddr),
16142 cCE(cfstrs, c000400, 2, (RMF, ADDRGLDC), rd_cpaddr),
16143 cCE(cfstrd, c400400, 2, (RMD, ADDRGLDC), rd_cpaddr),
16144 cCE(cfstr32, c000500, 2, (RMFX, ADDRGLDC), rd_cpaddr),
16145 cCE(cfstr64, c400500, 2, (RMDX, ADDRGLDC), rd_cpaddr),
8f06b2d8
PB
16146 cCE(cfmvsr, e000450, 2, (RMF, RR), rn_rd),
16147 cCE(cfmvrs, e100450, 2, (RR, RMF), rd_rn),
16148 cCE(cfmvdlr, e000410, 2, (RMD, RR), rn_rd),
16149 cCE(cfmvrdl, e100410, 2, (RR, RMD), rd_rn),
16150 cCE(cfmvdhr, e000430, 2, (RMD, RR), rn_rd),
16151 cCE(cfmvrdh, e100430, 2, (RR, RMD), rd_rn),
16152 cCE(cfmv64lr, e000510, 2, (RMDX, RR), rn_rd),
16153 cCE(cfmvr64l, e100510, 2, (RR, RMDX), rd_rn),
16154 cCE(cfmv64hr, e000530, 2, (RMDX, RR), rn_rd),
16155 cCE(cfmvr64h, e100530, 2, (RR, RMDX), rd_rn),
16156 cCE(cfmval32, e200440, 2, (RMAX, RMFX), rd_rn),
16157 cCE(cfmv32al, e100440, 2, (RMFX, RMAX), rd_rn),
16158 cCE(cfmvam32, e200460, 2, (RMAX, RMFX), rd_rn),
16159 cCE(cfmv32am, e100460, 2, (RMFX, RMAX), rd_rn),
16160 cCE(cfmvah32, e200480, 2, (RMAX, RMFX), rd_rn),
16161 cCE(cfmv32ah, e100480, 2, (RMFX, RMAX), rd_rn),
16162 cCE(cfmva32, e2004a0, 2, (RMAX, RMFX), rd_rn),
16163 cCE(cfmv32a, e1004a0, 2, (RMFX, RMAX), rd_rn),
16164 cCE(cfmva64, e2004c0, 2, (RMAX, RMDX), rd_rn),
16165 cCE(cfmv64a, e1004c0, 2, (RMDX, RMAX), rd_rn),
16166 cCE(cfmvsc32, e2004e0, 2, (RMDS, RMDX), mav_dspsc),
16167 cCE(cfmv32sc, e1004e0, 2, (RMDX, RMDS), rd),
16168 cCE(cfcpys, e000400, 2, (RMF, RMF), rd_rn),
16169 cCE(cfcpyd, e000420, 2, (RMD, RMD), rd_rn),
16170 cCE(cfcvtsd, e000460, 2, (RMD, RMF), rd_rn),
16171 cCE(cfcvtds, e000440, 2, (RMF, RMD), rd_rn),
16172 cCE(cfcvt32s, e000480, 2, (RMF, RMFX), rd_rn),
16173 cCE(cfcvt32d, e0004a0, 2, (RMD, RMFX), rd_rn),
16174 cCE(cfcvt64s, e0004c0, 2, (RMF, RMDX), rd_rn),
16175 cCE(cfcvt64d, e0004e0, 2, (RMD, RMDX), rd_rn),
16176 cCE(cfcvts32, e100580, 2, (RMFX, RMF), rd_rn),
16177 cCE(cfcvtd32, e1005a0, 2, (RMFX, RMD), rd_rn),
16178 cCE(cftruncs32,e1005c0, 2, (RMFX, RMF), rd_rn),
16179 cCE(cftruncd32,e1005e0, 2, (RMFX, RMD), rd_rn),
16180 cCE(cfrshl32, e000550, 3, (RMFX, RMFX, RR), mav_triple),
16181 cCE(cfrshl64, e000570, 3, (RMDX, RMDX, RR), mav_triple),
16182 cCE(cfsh32, e000500, 3, (RMFX, RMFX, I63s), mav_shift),
16183 cCE(cfsh64, e200500, 3, (RMDX, RMDX, I63s), mav_shift),
16184 cCE(cfcmps, e100490, 3, (RR, RMF, RMF), rd_rn_rm),
16185 cCE(cfcmpd, e1004b0, 3, (RR, RMD, RMD), rd_rn_rm),
16186 cCE(cfcmp32, e100590, 3, (RR, RMFX, RMFX), rd_rn_rm),
16187 cCE(cfcmp64, e1005b0, 3, (RR, RMDX, RMDX), rd_rn_rm),
16188 cCE(cfabss, e300400, 2, (RMF, RMF), rd_rn),
16189 cCE(cfabsd, e300420, 2, (RMD, RMD), rd_rn),
16190 cCE(cfnegs, e300440, 2, (RMF, RMF), rd_rn),
16191 cCE(cfnegd, e300460, 2, (RMD, RMD), rd_rn),
16192 cCE(cfadds, e300480, 3, (RMF, RMF, RMF), rd_rn_rm),
16193 cCE(cfaddd, e3004a0, 3, (RMD, RMD, RMD), rd_rn_rm),
16194 cCE(cfsubs, e3004c0, 3, (RMF, RMF, RMF), rd_rn_rm),
16195 cCE(cfsubd, e3004e0, 3, (RMD, RMD, RMD), rd_rn_rm),
16196 cCE(cfmuls, e100400, 3, (RMF, RMF, RMF), rd_rn_rm),
16197 cCE(cfmuld, e100420, 3, (RMD, RMD, RMD), rd_rn_rm),
16198 cCE(cfabs32, e300500, 2, (RMFX, RMFX), rd_rn),
16199 cCE(cfabs64, e300520, 2, (RMDX, RMDX), rd_rn),
16200 cCE(cfneg32, e300540, 2, (RMFX, RMFX), rd_rn),
16201 cCE(cfneg64, e300560, 2, (RMDX, RMDX), rd_rn),
16202 cCE(cfadd32, e300580, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
16203 cCE(cfadd64, e3005a0, 3, (RMDX, RMDX, RMDX), rd_rn_rm),
16204 cCE(cfsub32, e3005c0, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
16205 cCE(cfsub64, e3005e0, 3, (RMDX, RMDX, RMDX), rd_rn_rm),
16206 cCE(cfmul32, e100500, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
16207 cCE(cfmul64, e100520, 3, (RMDX, RMDX, RMDX), rd_rn_rm),
16208 cCE(cfmac32, e100540, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
16209 cCE(cfmsc32, e100560, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
16210 cCE(cfmadd32, e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
16211 cCE(cfmsub32, e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
16212 cCE(cfmadda32, e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
16213 cCE(cfmsuba32, e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
c19d1205
ZW
16214};
16215#undef ARM_VARIANT
16216#undef THUMB_VARIANT
16217#undef TCE
16218#undef TCM
16219#undef TUE
16220#undef TUF
16221#undef TCC
8f06b2d8 16222#undef cCE
e3cb604e
PB
16223#undef cCL
16224#undef C3E
c19d1205
ZW
16225#undef CE
16226#undef CM
16227#undef UE
16228#undef UF
16229#undef UT
5287ad62
JB
16230#undef NUF
16231#undef nUF
16232#undef NCE
16233#undef nCE
c19d1205
ZW
16234#undef OPS0
16235#undef OPS1
16236#undef OPS2
16237#undef OPS3
16238#undef OPS4
16239#undef OPS5
16240#undef OPS6
16241#undef do_0
16242\f
16243/* MD interface: bits in the object file. */
bfae80f2 16244
c19d1205
ZW
16245/* Turn an integer of n bytes (in val) into a stream of bytes appropriate
16246 for use in the a.out file, and stores them in the array pointed to by buf.
16247 This knows about the endian-ness of the target machine and does
16248 THE RIGHT THING, whatever it is. Possible values for n are 1 (byte)
16249 2 (short) and 4 (long) Floating numbers are put out as a series of
16250 LITTLENUMS (shorts, here at least). */
b99bd4ef 16251
c19d1205
ZW
16252void
16253md_number_to_chars (char * buf, valueT val, int n)
16254{
16255 if (target_big_endian)
16256 number_to_chars_bigendian (buf, val, n);
16257 else
16258 number_to_chars_littleendian (buf, val, n);
bfae80f2
RE
16259}
16260
c19d1205
ZW
16261static valueT
16262md_chars_to_number (char * buf, int n)
bfae80f2 16263{
c19d1205
ZW
16264 valueT result = 0;
16265 unsigned char * where = (unsigned char *) buf;
bfae80f2 16266
c19d1205 16267 if (target_big_endian)
b99bd4ef 16268 {
c19d1205
ZW
16269 while (n--)
16270 {
16271 result <<= 8;
16272 result |= (*where++ & 255);
16273 }
b99bd4ef 16274 }
c19d1205 16275 else
b99bd4ef 16276 {
c19d1205
ZW
16277 while (n--)
16278 {
16279 result <<= 8;
16280 result |= (where[n] & 255);
16281 }
bfae80f2 16282 }
b99bd4ef 16283
c19d1205 16284 return result;
bfae80f2 16285}
b99bd4ef 16286
c19d1205 16287/* MD interface: Sections. */
b99bd4ef 16288
0110f2b8
PB
16289/* Estimate the size of a frag before relaxing. Assume everything fits in
16290 2 bytes. */
16291
c19d1205 16292int
0110f2b8 16293md_estimate_size_before_relax (fragS * fragp,
c19d1205
ZW
16294 segT segtype ATTRIBUTE_UNUSED)
16295{
0110f2b8
PB
16296 fragp->fr_var = 2;
16297 return 2;
16298}
16299
16300/* Convert a machine dependent frag. */
16301
16302void
16303md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
16304{
16305 unsigned long insn;
16306 unsigned long old_op;
16307 char *buf;
16308 expressionS exp;
16309 fixS *fixp;
16310 int reloc_type;
16311 int pc_rel;
16312 int opcode;
16313
16314 buf = fragp->fr_literal + fragp->fr_fix;
16315
16316 old_op = bfd_get_16(abfd, buf);
16317 if (fragp->fr_symbol) {
16318 exp.X_op = O_symbol;
16319 exp.X_add_symbol = fragp->fr_symbol;
16320 } else {
16321 exp.X_op = O_constant;
16322 }
16323 exp.X_add_number = fragp->fr_offset;
16324 opcode = fragp->fr_subtype;
16325 switch (opcode)
16326 {
16327 case T_MNEM_ldr_pc:
16328 case T_MNEM_ldr_pc2:
16329 case T_MNEM_ldr_sp:
16330 case T_MNEM_str_sp:
16331 case T_MNEM_ldr:
16332 case T_MNEM_ldrb:
16333 case T_MNEM_ldrh:
16334 case T_MNEM_str:
16335 case T_MNEM_strb:
16336 case T_MNEM_strh:
16337 if (fragp->fr_var == 4)
16338 {
16339 insn = THUMB_OP32(opcode);
16340 if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
16341 {
16342 insn |= (old_op & 0x700) << 4;
16343 }
16344 else
16345 {
16346 insn |= (old_op & 7) << 12;
16347 insn |= (old_op & 0x38) << 13;
16348 }
16349 insn |= 0x00000c00;
16350 put_thumb32_insn (buf, insn);
16351 reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
16352 }
16353 else
16354 {
16355 reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
16356 }
16357 pc_rel = (opcode == T_MNEM_ldr_pc2);
16358 break;
16359 case T_MNEM_adr:
16360 if (fragp->fr_var == 4)
16361 {
16362 insn = THUMB_OP32 (opcode);
16363 insn |= (old_op & 0xf0) << 4;
16364 put_thumb32_insn (buf, insn);
16365 reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
16366 }
16367 else
16368 {
16369 reloc_type = BFD_RELOC_ARM_THUMB_ADD;
16370 exp.X_add_number -= 4;
16371 }
16372 pc_rel = 1;
16373 break;
16374 case T_MNEM_mov:
16375 case T_MNEM_movs:
16376 case T_MNEM_cmp:
16377 case T_MNEM_cmn:
16378 if (fragp->fr_var == 4)
16379 {
16380 int r0off = (opcode == T_MNEM_mov
16381 || opcode == T_MNEM_movs) ? 0 : 8;
16382 insn = THUMB_OP32 (opcode);
16383 insn = (insn & 0xe1ffffff) | 0x10000000;
16384 insn |= (old_op & 0x700) << r0off;
16385 put_thumb32_insn (buf, insn);
16386 reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
16387 }
16388 else
16389 {
16390 reloc_type = BFD_RELOC_ARM_THUMB_IMM;
16391 }
16392 pc_rel = 0;
16393 break;
16394 case T_MNEM_b:
16395 if (fragp->fr_var == 4)
16396 {
16397 insn = THUMB_OP32(opcode);
16398 put_thumb32_insn (buf, insn);
16399 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
16400 }
16401 else
16402 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
16403 pc_rel = 1;
16404 break;
16405 case T_MNEM_bcond:
16406 if (fragp->fr_var == 4)
16407 {
16408 insn = THUMB_OP32(opcode);
16409 insn |= (old_op & 0xf00) << 14;
16410 put_thumb32_insn (buf, insn);
16411 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
16412 }
16413 else
16414 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
16415 pc_rel = 1;
16416 break;
16417 case T_MNEM_add_sp:
16418 case T_MNEM_add_pc:
16419 case T_MNEM_inc_sp:
16420 case T_MNEM_dec_sp:
16421 if (fragp->fr_var == 4)
16422 {
16423 /* ??? Choose between add and addw. */
16424 insn = THUMB_OP32 (opcode);
16425 insn |= (old_op & 0xf0) << 4;
16426 put_thumb32_insn (buf, insn);
16805f35
PB
16427 if (opcode == T_MNEM_add_pc)
16428 reloc_type = BFD_RELOC_ARM_T32_IMM12;
16429 else
16430 reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
0110f2b8
PB
16431 }
16432 else
16433 reloc_type = BFD_RELOC_ARM_THUMB_ADD;
16434 pc_rel = 0;
16435 break;
16436
16437 case T_MNEM_addi:
16438 case T_MNEM_addis:
16439 case T_MNEM_subi:
16440 case T_MNEM_subis:
16441 if (fragp->fr_var == 4)
16442 {
16443 insn = THUMB_OP32 (opcode);
16444 insn |= (old_op & 0xf0) << 4;
16445 insn |= (old_op & 0xf) << 16;
16446 put_thumb32_insn (buf, insn);
16805f35
PB
16447 if (insn & (1 << 20))
16448 reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
16449 else
16450 reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
0110f2b8
PB
16451 }
16452 else
16453 reloc_type = BFD_RELOC_ARM_THUMB_ADD;
16454 pc_rel = 0;
16455 break;
16456 default:
16457 abort();
16458 }
16459 fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
16460 reloc_type);
16461 fixp->fx_file = fragp->fr_file;
16462 fixp->fx_line = fragp->fr_line;
16463 fragp->fr_fix += fragp->fr_var;
16464}
16465
16466/* Return the size of a relaxable immediate operand instruction.
16467 SHIFT and SIZE specify the form of the allowable immediate. */
16468static int
16469relax_immediate (fragS *fragp, int size, int shift)
16470{
16471 offsetT offset;
16472 offsetT mask;
16473 offsetT low;
16474
16475 /* ??? Should be able to do better than this. */
16476 if (fragp->fr_symbol)
16477 return 4;
16478
16479 low = (1 << shift) - 1;
16480 mask = (1 << (shift + size)) - (1 << shift);
16481 offset = fragp->fr_offset;
16482 /* Force misaligned offsets to 32-bit variant. */
16483 if (offset & low)
16484 return -4;
16485 if (offset & ~mask)
16486 return 4;
16487 return 2;
16488}
16489
16490/* Return the size of a relaxable adr pseudo-instruction or PC-relative
16491 load. */
16492static int
16493relax_adr (fragS *fragp, asection *sec)
16494{
16495 addressT addr;
16496 offsetT val;
16497
16498 /* Assume worst case for symbols not known to be in the same section. */
16499 if (!S_IS_DEFINED(fragp->fr_symbol)
16500 || sec != S_GET_SEGMENT (fragp->fr_symbol))
16501 return 4;
16502
16503 val = S_GET_VALUE(fragp->fr_symbol) + fragp->fr_offset;
16504 addr = fragp->fr_address + fragp->fr_fix;
16505 addr = (addr + 4) & ~3;
16506 /* Fix the insn as the 4-byte version if the target address is not
16507 sufficiently aligned. This is prevents an infinite loop when two
16508 instructions have contradictory range/alignment requirements. */
16509 if (val & 3)
16510 return -4;
16511 val -= addr;
16512 if (val < 0 || val > 1020)
16513 return 4;
16514 return 2;
16515}
16516
16517/* Return the size of a relaxable add/sub immediate instruction. */
16518static int
16519relax_addsub (fragS *fragp, asection *sec)
16520{
16521 char *buf;
16522 int op;
16523
16524 buf = fragp->fr_literal + fragp->fr_fix;
16525 op = bfd_get_16(sec->owner, buf);
16526 if ((op & 0xf) == ((op >> 4) & 0xf))
16527 return relax_immediate (fragp, 8, 0);
16528 else
16529 return relax_immediate (fragp, 3, 0);
16530}
16531
16532
16533/* Return the size of a relaxable branch instruction. BITS is the
16534 size of the offset field in the narrow instruction. */
16535
16536static int
16537relax_branch (fragS *fragp, asection *sec, int bits)
16538{
16539 addressT addr;
16540 offsetT val;
16541 offsetT limit;
16542
16543 /* Assume worst case for symbols not known to be in the same section. */
16544 if (!S_IS_DEFINED(fragp->fr_symbol)
16545 || sec != S_GET_SEGMENT (fragp->fr_symbol))
16546 return 4;
16547
16548 val = S_GET_VALUE(fragp->fr_symbol) + fragp->fr_offset;
16549 addr = fragp->fr_address + fragp->fr_fix + 4;
16550 val -= addr;
16551
16552 /* Offset is a signed value *2 */
16553 limit = 1 << bits;
16554 if (val >= limit || val < -limit)
16555 return 4;
16556 return 2;
16557}
16558
16559
16560/* Relax a machine dependent frag. This returns the amount by which
16561 the current size of the frag should change. */
16562
16563int
16564arm_relax_frag (asection *sec, fragS *fragp, long stretch ATTRIBUTE_UNUSED)
16565{
16566 int oldsize;
16567 int newsize;
16568
16569 oldsize = fragp->fr_var;
16570 switch (fragp->fr_subtype)
16571 {
16572 case T_MNEM_ldr_pc2:
16573 newsize = relax_adr(fragp, sec);
16574 break;
16575 case T_MNEM_ldr_pc:
16576 case T_MNEM_ldr_sp:
16577 case T_MNEM_str_sp:
16578 newsize = relax_immediate(fragp, 8, 2);
16579 break;
16580 case T_MNEM_ldr:
16581 case T_MNEM_str:
16582 newsize = relax_immediate(fragp, 5, 2);
16583 break;
16584 case T_MNEM_ldrh:
16585 case T_MNEM_strh:
16586 newsize = relax_immediate(fragp, 5, 1);
16587 break;
16588 case T_MNEM_ldrb:
16589 case T_MNEM_strb:
16590 newsize = relax_immediate(fragp, 5, 0);
16591 break;
16592 case T_MNEM_adr:
16593 newsize = relax_adr(fragp, sec);
16594 break;
16595 case T_MNEM_mov:
16596 case T_MNEM_movs:
16597 case T_MNEM_cmp:
16598 case T_MNEM_cmn:
16599 newsize = relax_immediate(fragp, 8, 0);
16600 break;
16601 case T_MNEM_b:
16602 newsize = relax_branch(fragp, sec, 11);
16603 break;
16604 case T_MNEM_bcond:
16605 newsize = relax_branch(fragp, sec, 8);
16606 break;
16607 case T_MNEM_add_sp:
16608 case T_MNEM_add_pc:
16609 newsize = relax_immediate (fragp, 8, 2);
16610 break;
16611 case T_MNEM_inc_sp:
16612 case T_MNEM_dec_sp:
16613 newsize = relax_immediate (fragp, 7, 2);
16614 break;
16615 case T_MNEM_addi:
16616 case T_MNEM_addis:
16617 case T_MNEM_subi:
16618 case T_MNEM_subis:
16619 newsize = relax_addsub (fragp, sec);
16620 break;
16621 default:
16622 abort();
16623 }
16624 if (newsize < 0)
16625 {
16626 fragp->fr_var = -newsize;
16627 md_convert_frag (sec->owner, sec, fragp);
16628 frag_wane(fragp);
16629 return -(newsize + oldsize);
16630 }
16631 fragp->fr_var = newsize;
16632 return newsize - oldsize;
c19d1205 16633}
b99bd4ef 16634
c19d1205 16635/* Round up a section size to the appropriate boundary. */
b99bd4ef 16636
c19d1205
ZW
16637valueT
16638md_section_align (segT segment ATTRIBUTE_UNUSED,
16639 valueT size)
16640{
f0927246
NC
16641#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
16642 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
16643 {
16644 /* For a.out, force the section size to be aligned. If we don't do
16645 this, BFD will align it for us, but it will not write out the
16646 final bytes of the section. This may be a bug in BFD, but it is
16647 easier to fix it here since that is how the other a.out targets
16648 work. */
16649 int align;
16650
16651 align = bfd_get_section_alignment (stdoutput, segment);
16652 size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
16653 }
c19d1205 16654#endif
f0927246
NC
16655
16656 return size;
bfae80f2 16657}
b99bd4ef 16658
c19d1205
ZW
16659/* This is called from HANDLE_ALIGN in write.c. Fill in the contents
16660 of an rs_align_code fragment. */
16661
16662void
16663arm_handle_align (fragS * fragP)
bfae80f2 16664{
c19d1205
ZW
16665 static char const arm_noop[4] = { 0x00, 0x00, 0xa0, 0xe1 };
16666 static char const thumb_noop[2] = { 0xc0, 0x46 };
16667 static char const arm_bigend_noop[4] = { 0xe1, 0xa0, 0x00, 0x00 };
16668 static char const thumb_bigend_noop[2] = { 0x46, 0xc0 };
16669
16670 int bytes, fix, noop_size;
16671 char * p;
16672 const char * noop;
bfae80f2 16673
c19d1205 16674 if (fragP->fr_type != rs_align_code)
bfae80f2
RE
16675 return;
16676
c19d1205
ZW
16677 bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
16678 p = fragP->fr_literal + fragP->fr_fix;
16679 fix = 0;
bfae80f2 16680
c19d1205
ZW
16681 if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
16682 bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
bfae80f2 16683
c19d1205 16684 if (fragP->tc_frag_data)
a737bd4d 16685 {
c19d1205
ZW
16686 if (target_big_endian)
16687 noop = thumb_bigend_noop;
16688 else
16689 noop = thumb_noop;
16690 noop_size = sizeof (thumb_noop);
7ed4c4c5
NC
16691 }
16692 else
16693 {
c19d1205
ZW
16694 if (target_big_endian)
16695 noop = arm_bigend_noop;
16696 else
16697 noop = arm_noop;
16698 noop_size = sizeof (arm_noop);
7ed4c4c5 16699 }
a737bd4d 16700
c19d1205 16701 if (bytes & (noop_size - 1))
7ed4c4c5 16702 {
c19d1205
ZW
16703 fix = bytes & (noop_size - 1);
16704 memset (p, 0, fix);
16705 p += fix;
16706 bytes -= fix;
a737bd4d 16707 }
a737bd4d 16708
c19d1205 16709 while (bytes >= noop_size)
a737bd4d 16710 {
c19d1205
ZW
16711 memcpy (p, noop, noop_size);
16712 p += noop_size;
16713 bytes -= noop_size;
16714 fix += noop_size;
a737bd4d
NC
16715 }
16716
c19d1205
ZW
16717 fragP->fr_fix += fix;
16718 fragP->fr_var = noop_size;
a737bd4d
NC
16719}
16720
c19d1205
ZW
16721/* Called from md_do_align. Used to create an alignment
16722 frag in a code section. */
16723
16724void
16725arm_frag_align_code (int n, int max)
bfae80f2 16726{
c19d1205 16727 char * p;
7ed4c4c5 16728
c19d1205
ZW
16729 /* We assume that there will never be a requirement
16730 to support alignments greater than 32 bytes. */
16731 if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
16732 as_fatal (_("alignments greater than 32 bytes not supported in .text sections."));
bfae80f2 16733
c19d1205
ZW
16734 p = frag_var (rs_align_code,
16735 MAX_MEM_FOR_RS_ALIGN_CODE,
16736 1,
16737 (relax_substateT) max,
16738 (symbolS *) NULL,
16739 (offsetT) n,
16740 (char *) NULL);
16741 *p = 0;
16742}
bfae80f2 16743
c19d1205 16744/* Perform target specific initialisation of a frag. */
bfae80f2 16745
c19d1205
ZW
16746void
16747arm_init_frag (fragS * fragP)
16748{
16749 /* Record whether this frag is in an ARM or a THUMB area. */
16750 fragP->tc_frag_data = thumb_mode;
bfae80f2
RE
16751}
16752
c19d1205
ZW
16753#ifdef OBJ_ELF
16754/* When we change sections we need to issue a new mapping symbol. */
16755
16756void
16757arm_elf_change_section (void)
bfae80f2 16758{
c19d1205
ZW
16759 flagword flags;
16760 segment_info_type *seginfo;
bfae80f2 16761
c19d1205
ZW
16762 /* Link an unlinked unwind index table section to the .text section. */
16763 if (elf_section_type (now_seg) == SHT_ARM_EXIDX
16764 && elf_linked_to_section (now_seg) == NULL)
16765 elf_linked_to_section (now_seg) = text_section;
16766
16767 if (!SEG_NORMAL (now_seg))
bfae80f2
RE
16768 return;
16769
c19d1205
ZW
16770 flags = bfd_get_section_flags (stdoutput, now_seg);
16771
16772 /* We can ignore sections that only contain debug info. */
16773 if ((flags & SEC_ALLOC) == 0)
16774 return;
bfae80f2 16775
c19d1205
ZW
16776 seginfo = seg_info (now_seg);
16777 mapstate = seginfo->tc_segment_info_data.mapstate;
16778 marked_pr_dependency = seginfo->tc_segment_info_data.marked_pr_dependency;
bfae80f2
RE
16779}
16780
c19d1205
ZW
16781int
16782arm_elf_section_type (const char * str, size_t len)
e45d0630 16783{
c19d1205
ZW
16784 if (len == 5 && strncmp (str, "exidx", 5) == 0)
16785 return SHT_ARM_EXIDX;
e45d0630 16786
c19d1205
ZW
16787 return -1;
16788}
16789\f
16790/* Code to deal with unwinding tables. */
e45d0630 16791
c19d1205 16792static void add_unwind_adjustsp (offsetT);
e45d0630 16793
c19d1205 16794/* Cenerate and deferred unwind frame offset. */
e45d0630 16795
bfae80f2 16796static void
c19d1205 16797flush_pending_unwind (void)
bfae80f2 16798{
c19d1205 16799 offsetT offset;
bfae80f2 16800
c19d1205
ZW
16801 offset = unwind.pending_offset;
16802 unwind.pending_offset = 0;
16803 if (offset != 0)
16804 add_unwind_adjustsp (offset);
bfae80f2
RE
16805}
16806
c19d1205
ZW
16807/* Add an opcode to this list for this function. Two-byte opcodes should
16808 be passed as op[0] << 8 | op[1]. The list of opcodes is built in reverse
16809 order. */
16810
bfae80f2 16811static void
c19d1205 16812add_unwind_opcode (valueT op, int length)
bfae80f2 16813{
c19d1205
ZW
16814 /* Add any deferred stack adjustment. */
16815 if (unwind.pending_offset)
16816 flush_pending_unwind ();
bfae80f2 16817
c19d1205 16818 unwind.sp_restored = 0;
bfae80f2 16819
c19d1205 16820 if (unwind.opcode_count + length > unwind.opcode_alloc)
bfae80f2 16821 {
c19d1205
ZW
16822 unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
16823 if (unwind.opcodes)
16824 unwind.opcodes = xrealloc (unwind.opcodes,
16825 unwind.opcode_alloc);
16826 else
16827 unwind.opcodes = xmalloc (unwind.opcode_alloc);
bfae80f2 16828 }
c19d1205 16829 while (length > 0)
bfae80f2 16830 {
c19d1205
ZW
16831 length--;
16832 unwind.opcodes[unwind.opcode_count] = op & 0xff;
16833 op >>= 8;
16834 unwind.opcode_count++;
bfae80f2 16835 }
bfae80f2
RE
16836}
16837
c19d1205
ZW
16838/* Add unwind opcodes to adjust the stack pointer. */
16839
bfae80f2 16840static void
c19d1205 16841add_unwind_adjustsp (offsetT offset)
bfae80f2 16842{
c19d1205 16843 valueT op;
bfae80f2 16844
c19d1205 16845 if (offset > 0x200)
bfae80f2 16846 {
c19d1205
ZW
16847 /* We need at most 5 bytes to hold a 32-bit value in a uleb128. */
16848 char bytes[5];
16849 int n;
16850 valueT o;
bfae80f2 16851
c19d1205
ZW
16852 /* Long form: 0xb2, uleb128. */
16853 /* This might not fit in a word so add the individual bytes,
16854 remembering the list is built in reverse order. */
16855 o = (valueT) ((offset - 0x204) >> 2);
16856 if (o == 0)
16857 add_unwind_opcode (0, 1);
bfae80f2 16858
c19d1205
ZW
16859 /* Calculate the uleb128 encoding of the offset. */
16860 n = 0;
16861 while (o)
16862 {
16863 bytes[n] = o & 0x7f;
16864 o >>= 7;
16865 if (o)
16866 bytes[n] |= 0x80;
16867 n++;
16868 }
16869 /* Add the insn. */
16870 for (; n; n--)
16871 add_unwind_opcode (bytes[n - 1], 1);
16872 add_unwind_opcode (0xb2, 1);
16873 }
16874 else if (offset > 0x100)
bfae80f2 16875 {
c19d1205
ZW
16876 /* Two short opcodes. */
16877 add_unwind_opcode (0x3f, 1);
16878 op = (offset - 0x104) >> 2;
16879 add_unwind_opcode (op, 1);
bfae80f2 16880 }
c19d1205
ZW
16881 else if (offset > 0)
16882 {
16883 /* Short opcode. */
16884 op = (offset - 4) >> 2;
16885 add_unwind_opcode (op, 1);
16886 }
16887 else if (offset < 0)
bfae80f2 16888 {
c19d1205
ZW
16889 offset = -offset;
16890 while (offset > 0x100)
bfae80f2 16891 {
c19d1205
ZW
16892 add_unwind_opcode (0x7f, 1);
16893 offset -= 0x100;
bfae80f2 16894 }
c19d1205
ZW
16895 op = ((offset - 4) >> 2) | 0x40;
16896 add_unwind_opcode (op, 1);
bfae80f2 16897 }
bfae80f2
RE
16898}
16899
c19d1205
ZW
16900/* Finish the list of unwind opcodes for this function. */
16901static void
16902finish_unwind_opcodes (void)
bfae80f2 16903{
c19d1205 16904 valueT op;
bfae80f2 16905
c19d1205 16906 if (unwind.fp_used)
bfae80f2 16907 {
708587a4 16908 /* Adjust sp as necessary. */
c19d1205
ZW
16909 unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
16910 flush_pending_unwind ();
bfae80f2 16911
c19d1205
ZW
16912 /* After restoring sp from the frame pointer. */
16913 op = 0x90 | unwind.fp_reg;
16914 add_unwind_opcode (op, 1);
16915 }
16916 else
16917 flush_pending_unwind ();
bfae80f2
RE
16918}
16919
bfae80f2 16920
c19d1205
ZW
16921/* Start an exception table entry. If idx is nonzero this is an index table
16922 entry. */
bfae80f2
RE
16923
16924static void
c19d1205 16925start_unwind_section (const segT text_seg, int idx)
bfae80f2 16926{
c19d1205
ZW
16927 const char * text_name;
16928 const char * prefix;
16929 const char * prefix_once;
16930 const char * group_name;
16931 size_t prefix_len;
16932 size_t text_len;
16933 char * sec_name;
16934 size_t sec_name_len;
16935 int type;
16936 int flags;
16937 int linkonce;
bfae80f2 16938
c19d1205 16939 if (idx)
bfae80f2 16940 {
c19d1205
ZW
16941 prefix = ELF_STRING_ARM_unwind;
16942 prefix_once = ELF_STRING_ARM_unwind_once;
16943 type = SHT_ARM_EXIDX;
bfae80f2 16944 }
c19d1205 16945 else
bfae80f2 16946 {
c19d1205
ZW
16947 prefix = ELF_STRING_ARM_unwind_info;
16948 prefix_once = ELF_STRING_ARM_unwind_info_once;
16949 type = SHT_PROGBITS;
bfae80f2
RE
16950 }
16951
c19d1205
ZW
16952 text_name = segment_name (text_seg);
16953 if (streq (text_name, ".text"))
16954 text_name = "";
16955
16956 if (strncmp (text_name, ".gnu.linkonce.t.",
16957 strlen (".gnu.linkonce.t.")) == 0)
bfae80f2 16958 {
c19d1205
ZW
16959 prefix = prefix_once;
16960 text_name += strlen (".gnu.linkonce.t.");
bfae80f2
RE
16961 }
16962
c19d1205
ZW
16963 prefix_len = strlen (prefix);
16964 text_len = strlen (text_name);
16965 sec_name_len = prefix_len + text_len;
16966 sec_name = xmalloc (sec_name_len + 1);
16967 memcpy (sec_name, prefix, prefix_len);
16968 memcpy (sec_name + prefix_len, text_name, text_len);
16969 sec_name[prefix_len + text_len] = '\0';
bfae80f2 16970
c19d1205
ZW
16971 flags = SHF_ALLOC;
16972 linkonce = 0;
16973 group_name = 0;
bfae80f2 16974
c19d1205
ZW
16975 /* Handle COMDAT group. */
16976 if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
bfae80f2 16977 {
c19d1205
ZW
16978 group_name = elf_group_name (text_seg);
16979 if (group_name == NULL)
16980 {
16981 as_bad ("Group section `%s' has no group signature",
16982 segment_name (text_seg));
16983 ignore_rest_of_line ();
16984 return;
16985 }
16986 flags |= SHF_GROUP;
16987 linkonce = 1;
bfae80f2
RE
16988 }
16989
c19d1205 16990 obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
bfae80f2 16991
c19d1205
ZW
16992 /* Set the setion link for index tables. */
16993 if (idx)
16994 elf_linked_to_section (now_seg) = text_seg;
bfae80f2
RE
16995}
16996
bfae80f2 16997
c19d1205
ZW
16998/* Start an unwind table entry. HAVE_DATA is nonzero if we have additional
16999 personality routine data. Returns zero, or the index table value for
17000 and inline entry. */
17001
17002static valueT
17003create_unwind_entry (int have_data)
bfae80f2 17004{
c19d1205
ZW
17005 int size;
17006 addressT where;
17007 char *ptr;
17008 /* The current word of data. */
17009 valueT data;
17010 /* The number of bytes left in this word. */
17011 int n;
bfae80f2 17012
c19d1205 17013 finish_unwind_opcodes ();
bfae80f2 17014
c19d1205
ZW
17015 /* Remember the current text section. */
17016 unwind.saved_seg = now_seg;
17017 unwind.saved_subseg = now_subseg;
bfae80f2 17018
c19d1205 17019 start_unwind_section (now_seg, 0);
bfae80f2 17020
c19d1205 17021 if (unwind.personality_routine == NULL)
bfae80f2 17022 {
c19d1205
ZW
17023 if (unwind.personality_index == -2)
17024 {
17025 if (have_data)
17026 as_bad (_("handerdata in cantunwind frame"));
17027 return 1; /* EXIDX_CANTUNWIND. */
17028 }
bfae80f2 17029
c19d1205
ZW
17030 /* Use a default personality routine if none is specified. */
17031 if (unwind.personality_index == -1)
17032 {
17033 if (unwind.opcode_count > 3)
17034 unwind.personality_index = 1;
17035 else
17036 unwind.personality_index = 0;
17037 }
bfae80f2 17038
c19d1205
ZW
17039 /* Space for the personality routine entry. */
17040 if (unwind.personality_index == 0)
17041 {
17042 if (unwind.opcode_count > 3)
17043 as_bad (_("too many unwind opcodes for personality routine 0"));
bfae80f2 17044
c19d1205
ZW
17045 if (!have_data)
17046 {
17047 /* All the data is inline in the index table. */
17048 data = 0x80;
17049 n = 3;
17050 while (unwind.opcode_count > 0)
17051 {
17052 unwind.opcode_count--;
17053 data = (data << 8) | unwind.opcodes[unwind.opcode_count];
17054 n--;
17055 }
bfae80f2 17056
c19d1205
ZW
17057 /* Pad with "finish" opcodes. */
17058 while (n--)
17059 data = (data << 8) | 0xb0;
bfae80f2 17060
c19d1205
ZW
17061 return data;
17062 }
17063 size = 0;
17064 }
17065 else
17066 /* We get two opcodes "free" in the first word. */
17067 size = unwind.opcode_count - 2;
17068 }
17069 else
17070 /* An extra byte is required for the opcode count. */
17071 size = unwind.opcode_count + 1;
bfae80f2 17072
c19d1205
ZW
17073 size = (size + 3) >> 2;
17074 if (size > 0xff)
17075 as_bad (_("too many unwind opcodes"));
bfae80f2 17076
c19d1205
ZW
17077 frag_align (2, 0, 0);
17078 record_alignment (now_seg, 2);
17079 unwind.table_entry = expr_build_dot ();
17080
17081 /* Allocate the table entry. */
17082 ptr = frag_more ((size << 2) + 4);
17083 where = frag_now_fix () - ((size << 2) + 4);
bfae80f2 17084
c19d1205 17085 switch (unwind.personality_index)
bfae80f2 17086 {
c19d1205
ZW
17087 case -1:
17088 /* ??? Should this be a PLT generating relocation? */
17089 /* Custom personality routine. */
17090 fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
17091 BFD_RELOC_ARM_PREL31);
bfae80f2 17092
c19d1205
ZW
17093 where += 4;
17094 ptr += 4;
bfae80f2 17095
c19d1205
ZW
17096 /* Set the first byte to the number of additional words. */
17097 data = size - 1;
17098 n = 3;
17099 break;
bfae80f2 17100
c19d1205
ZW
17101 /* ABI defined personality routines. */
17102 case 0:
17103 /* Three opcodes bytes are packed into the first word. */
17104 data = 0x80;
17105 n = 3;
17106 break;
bfae80f2 17107
c19d1205
ZW
17108 case 1:
17109 case 2:
17110 /* The size and first two opcode bytes go in the first word. */
17111 data = ((0x80 + unwind.personality_index) << 8) | size;
17112 n = 2;
17113 break;
bfae80f2 17114
c19d1205
ZW
17115 default:
17116 /* Should never happen. */
17117 abort ();
17118 }
bfae80f2 17119
c19d1205
ZW
17120 /* Pack the opcodes into words (MSB first), reversing the list at the same
17121 time. */
17122 while (unwind.opcode_count > 0)
17123 {
17124 if (n == 0)
17125 {
17126 md_number_to_chars (ptr, data, 4);
17127 ptr += 4;
17128 n = 4;
17129 data = 0;
17130 }
17131 unwind.opcode_count--;
17132 n--;
17133 data = (data << 8) | unwind.opcodes[unwind.opcode_count];
17134 }
17135
17136 /* Finish off the last word. */
17137 if (n < 4)
17138 {
17139 /* Pad with "finish" opcodes. */
17140 while (n--)
17141 data = (data << 8) | 0xb0;
17142
17143 md_number_to_chars (ptr, data, 4);
17144 }
17145
17146 if (!have_data)
17147 {
17148 /* Add an empty descriptor if there is no user-specified data. */
17149 ptr = frag_more (4);
17150 md_number_to_chars (ptr, 0, 4);
17151 }
17152
17153 return 0;
bfae80f2
RE
17154}
17155
f0927246
NC
17156
17157/* Initialize the DWARF-2 unwind information for this procedure. */
17158
17159void
17160tc_arm_frame_initial_instructions (void)
17161{
17162 cfi_add_CFA_def_cfa (REG_SP, 0);
17163}
17164#endif /* OBJ_ELF */
17165
c19d1205
ZW
17166/* Convert REGNAME to a DWARF-2 register number. */
17167
17168int
1df69f4f 17169tc_arm_regname_to_dw2regnum (char *regname)
bfae80f2 17170{
1df69f4f 17171 int reg = arm_reg_parse (&regname, REG_TYPE_RN);
c19d1205
ZW
17172
17173 if (reg == FAIL)
17174 return -1;
17175
17176 return reg;
bfae80f2
RE
17177}
17178
f0927246 17179#ifdef TE_PE
c19d1205 17180void
f0927246 17181tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
bfae80f2 17182{
f0927246 17183 expressionS expr;
bfae80f2 17184
f0927246
NC
17185 expr.X_op = O_secrel;
17186 expr.X_add_symbol = symbol;
17187 expr.X_add_number = 0;
17188 emit_expr (&expr, size);
17189}
17190#endif
bfae80f2 17191
c19d1205 17192/* MD interface: Symbol and relocation handling. */
bfae80f2 17193
2fc8bdac
ZW
17194/* Return the address within the segment that a PC-relative fixup is
17195 relative to. For ARM, PC-relative fixups applied to instructions
17196 are generally relative to the location of the fixup plus 8 bytes.
17197 Thumb branches are offset by 4, and Thumb loads relative to PC
17198 require special handling. */
bfae80f2 17199
c19d1205 17200long
2fc8bdac 17201md_pcrel_from_section (fixS * fixP, segT seg)
bfae80f2 17202{
2fc8bdac
ZW
17203 offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
17204
17205 /* If this is pc-relative and we are going to emit a relocation
17206 then we just want to put out any pipeline compensation that the linker
53baae48
NC
17207 will need. Otherwise we want to use the calculated base.
17208 For WinCE we skip the bias for externals as well, since this
17209 is how the MS ARM-CE assembler behaves and we want to be compatible. */
2fc8bdac
ZW
17210 if (fixP->fx_pcrel
17211 && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
53baae48
NC
17212 || (arm_force_relocation (fixP)
17213#ifdef TE_WINCE
17214 && !S_IS_EXTERNAL (fixP->fx_addsy)
17215#endif
17216 )))
2fc8bdac 17217 base = 0;
bfae80f2 17218
c19d1205 17219 switch (fixP->fx_r_type)
bfae80f2 17220 {
2fc8bdac
ZW
17221 /* PC relative addressing on the Thumb is slightly odd as the
17222 bottom two bits of the PC are forced to zero for the
17223 calculation. This happens *after* application of the
17224 pipeline offset. However, Thumb adrl already adjusts for
17225 this, so we need not do it again. */
c19d1205 17226 case BFD_RELOC_ARM_THUMB_ADD:
2fc8bdac 17227 return base & ~3;
c19d1205
ZW
17228
17229 case BFD_RELOC_ARM_THUMB_OFFSET:
17230 case BFD_RELOC_ARM_T32_OFFSET_IMM:
e9f89963 17231 case BFD_RELOC_ARM_T32_ADD_PC12:
8f06b2d8 17232 case BFD_RELOC_ARM_T32_CP_OFF_IMM:
2fc8bdac 17233 return (base + 4) & ~3;
c19d1205 17234
2fc8bdac
ZW
17235 /* Thumb branches are simply offset by +4. */
17236 case BFD_RELOC_THUMB_PCREL_BRANCH7:
17237 case BFD_RELOC_THUMB_PCREL_BRANCH9:
17238 case BFD_RELOC_THUMB_PCREL_BRANCH12:
17239 case BFD_RELOC_THUMB_PCREL_BRANCH20:
17240 case BFD_RELOC_THUMB_PCREL_BRANCH23:
17241 case BFD_RELOC_THUMB_PCREL_BRANCH25:
17242 case BFD_RELOC_THUMB_PCREL_BLX:
17243 return base + 4;
bfae80f2 17244
2fc8bdac
ZW
17245 /* ARM mode branches are offset by +8. However, the Windows CE
17246 loader expects the relocation not to take this into account. */
17247 case BFD_RELOC_ARM_PCREL_BRANCH:
39b41c9c
PB
17248 case BFD_RELOC_ARM_PCREL_CALL:
17249 case BFD_RELOC_ARM_PCREL_JUMP:
2fc8bdac
ZW
17250 case BFD_RELOC_ARM_PCREL_BLX:
17251 case BFD_RELOC_ARM_PLT32:
c19d1205 17252#ifdef TE_WINCE
53baae48
NC
17253 /* When handling fixups immediately, because we have already
17254 discovered the value of a symbol, or the address of the frag involved
17255 we must account for the offset by +8, as the OS loader will never see the reloc.
17256 see fixup_segment() in write.c
17257 The S_IS_EXTERNAL test handles the case of global symbols.
17258 Those need the calculated base, not just the pipe compensation the linker will need. */
17259 if (fixP->fx_pcrel
17260 && fixP->fx_addsy != NULL
17261 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
17262 && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
17263 return base + 8;
2fc8bdac 17264 return base;
c19d1205 17265#else
2fc8bdac 17266 return base + 8;
c19d1205 17267#endif
2fc8bdac
ZW
17268
17269 /* ARM mode loads relative to PC are also offset by +8. Unlike
17270 branches, the Windows CE loader *does* expect the relocation
17271 to take this into account. */
17272 case BFD_RELOC_ARM_OFFSET_IMM:
17273 case BFD_RELOC_ARM_OFFSET_IMM8:
17274 case BFD_RELOC_ARM_HWLITERAL:
17275 case BFD_RELOC_ARM_LITERAL:
17276 case BFD_RELOC_ARM_CP_OFF_IMM:
17277 return base + 8;
17278
17279
17280 /* Other PC-relative relocations are un-offset. */
17281 default:
17282 return base;
17283 }
bfae80f2
RE
17284}
17285
c19d1205
ZW
17286/* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
17287 Otherwise we have no need to default values of symbols. */
17288
17289symbolS *
17290md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
bfae80f2 17291{
c19d1205
ZW
17292#ifdef OBJ_ELF
17293 if (name[0] == '_' && name[1] == 'G'
17294 && streq (name, GLOBAL_OFFSET_TABLE_NAME))
17295 {
17296 if (!GOT_symbol)
17297 {
17298 if (symbol_find (name))
17299 as_bad ("GOT already in the symbol table");
bfae80f2 17300
c19d1205
ZW
17301 GOT_symbol = symbol_new (name, undefined_section,
17302 (valueT) 0, & zero_address_frag);
17303 }
bfae80f2 17304
c19d1205 17305 return GOT_symbol;
bfae80f2 17306 }
c19d1205 17307#endif
bfae80f2 17308
c19d1205 17309 return 0;
bfae80f2
RE
17310}
17311
55cf6793 17312/* Subroutine of md_apply_fix. Check to see if an immediate can be
c19d1205
ZW
17313 computed as two separate immediate values, added together. We
17314 already know that this value cannot be computed by just one ARM
17315 instruction. */
17316
17317static unsigned int
17318validate_immediate_twopart (unsigned int val,
17319 unsigned int * highpart)
bfae80f2 17320{
c19d1205
ZW
17321 unsigned int a;
17322 unsigned int i;
bfae80f2 17323
c19d1205
ZW
17324 for (i = 0; i < 32; i += 2)
17325 if (((a = rotate_left (val, i)) & 0xff) != 0)
17326 {
17327 if (a & 0xff00)
17328 {
17329 if (a & ~ 0xffff)
17330 continue;
17331 * highpart = (a >> 8) | ((i + 24) << 7);
17332 }
17333 else if (a & 0xff0000)
17334 {
17335 if (a & 0xff000000)
17336 continue;
17337 * highpart = (a >> 16) | ((i + 16) << 7);
17338 }
17339 else
17340 {
17341 assert (a & 0xff000000);
17342 * highpart = (a >> 24) | ((i + 8) << 7);
17343 }
bfae80f2 17344
c19d1205
ZW
17345 return (a & 0xff) | (i << 7);
17346 }
bfae80f2 17347
c19d1205 17348 return FAIL;
bfae80f2
RE
17349}
17350
c19d1205
ZW
17351static int
17352validate_offset_imm (unsigned int val, int hwse)
17353{
17354 if ((hwse && val > 255) || val > 4095)
17355 return FAIL;
17356 return val;
17357}
bfae80f2 17358
55cf6793 17359/* Subroutine of md_apply_fix. Do those data_ops which can take a
c19d1205
ZW
17360 negative immediate constant by altering the instruction. A bit of
17361 a hack really.
17362 MOV <-> MVN
17363 AND <-> BIC
17364 ADC <-> SBC
17365 by inverting the second operand, and
17366 ADD <-> SUB
17367 CMP <-> CMN
17368 by negating the second operand. */
bfae80f2 17369
c19d1205
ZW
17370static int
17371negate_data_op (unsigned long * instruction,
17372 unsigned long value)
bfae80f2 17373{
c19d1205
ZW
17374 int op, new_inst;
17375 unsigned long negated, inverted;
bfae80f2 17376
c19d1205
ZW
17377 negated = encode_arm_immediate (-value);
17378 inverted = encode_arm_immediate (~value);
bfae80f2 17379
c19d1205
ZW
17380 op = (*instruction >> DATA_OP_SHIFT) & 0xf;
17381 switch (op)
bfae80f2 17382 {
c19d1205
ZW
17383 /* First negates. */
17384 case OPCODE_SUB: /* ADD <-> SUB */
17385 new_inst = OPCODE_ADD;
17386 value = negated;
17387 break;
bfae80f2 17388
c19d1205
ZW
17389 case OPCODE_ADD:
17390 new_inst = OPCODE_SUB;
17391 value = negated;
17392 break;
bfae80f2 17393
c19d1205
ZW
17394 case OPCODE_CMP: /* CMP <-> CMN */
17395 new_inst = OPCODE_CMN;
17396 value = negated;
17397 break;
bfae80f2 17398
c19d1205
ZW
17399 case OPCODE_CMN:
17400 new_inst = OPCODE_CMP;
17401 value = negated;
17402 break;
bfae80f2 17403
c19d1205
ZW
17404 /* Now Inverted ops. */
17405 case OPCODE_MOV: /* MOV <-> MVN */
17406 new_inst = OPCODE_MVN;
17407 value = inverted;
17408 break;
bfae80f2 17409
c19d1205
ZW
17410 case OPCODE_MVN:
17411 new_inst = OPCODE_MOV;
17412 value = inverted;
17413 break;
bfae80f2 17414
c19d1205
ZW
17415 case OPCODE_AND: /* AND <-> BIC */
17416 new_inst = OPCODE_BIC;
17417 value = inverted;
17418 break;
bfae80f2 17419
c19d1205
ZW
17420 case OPCODE_BIC:
17421 new_inst = OPCODE_AND;
17422 value = inverted;
17423 break;
bfae80f2 17424
c19d1205
ZW
17425 case OPCODE_ADC: /* ADC <-> SBC */
17426 new_inst = OPCODE_SBC;
17427 value = inverted;
17428 break;
bfae80f2 17429
c19d1205
ZW
17430 case OPCODE_SBC:
17431 new_inst = OPCODE_ADC;
17432 value = inverted;
17433 break;
bfae80f2 17434
c19d1205
ZW
17435 /* We cannot do anything. */
17436 default:
17437 return FAIL;
b99bd4ef
NC
17438 }
17439
c19d1205
ZW
17440 if (value == (unsigned) FAIL)
17441 return FAIL;
17442
17443 *instruction &= OPCODE_MASK;
17444 *instruction |= new_inst << DATA_OP_SHIFT;
17445 return value;
b99bd4ef
NC
17446}
17447
ef8d22e6
PB
17448/* Like negate_data_op, but for Thumb-2. */
17449
17450static unsigned int
16dd5e42 17451thumb32_negate_data_op (offsetT *instruction, unsigned int value)
ef8d22e6
PB
17452{
17453 int op, new_inst;
17454 int rd;
16dd5e42 17455 unsigned int negated, inverted;
ef8d22e6
PB
17456
17457 negated = encode_thumb32_immediate (-value);
17458 inverted = encode_thumb32_immediate (~value);
17459
17460 rd = (*instruction >> 8) & 0xf;
17461 op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
17462 switch (op)
17463 {
17464 /* ADD <-> SUB. Includes CMP <-> CMN. */
17465 case T2_OPCODE_SUB:
17466 new_inst = T2_OPCODE_ADD;
17467 value = negated;
17468 break;
17469
17470 case T2_OPCODE_ADD:
17471 new_inst = T2_OPCODE_SUB;
17472 value = negated;
17473 break;
17474
17475 /* ORR <-> ORN. Includes MOV <-> MVN. */
17476 case T2_OPCODE_ORR:
17477 new_inst = T2_OPCODE_ORN;
17478 value = inverted;
17479 break;
17480
17481 case T2_OPCODE_ORN:
17482 new_inst = T2_OPCODE_ORR;
17483 value = inverted;
17484 break;
17485
17486 /* AND <-> BIC. TST has no inverted equivalent. */
17487 case T2_OPCODE_AND:
17488 new_inst = T2_OPCODE_BIC;
17489 if (rd == 15)
17490 value = FAIL;
17491 else
17492 value = inverted;
17493 break;
17494
17495 case T2_OPCODE_BIC:
17496 new_inst = T2_OPCODE_AND;
17497 value = inverted;
17498 break;
17499
17500 /* ADC <-> SBC */
17501 case T2_OPCODE_ADC:
17502 new_inst = T2_OPCODE_SBC;
17503 value = inverted;
17504 break;
17505
17506 case T2_OPCODE_SBC:
17507 new_inst = T2_OPCODE_ADC;
17508 value = inverted;
17509 break;
17510
17511 /* We cannot do anything. */
17512 default:
17513 return FAIL;
17514 }
17515
16dd5e42 17516 if (value == (unsigned int)FAIL)
ef8d22e6
PB
17517 return FAIL;
17518
17519 *instruction &= T2_OPCODE_MASK;
17520 *instruction |= new_inst << T2_DATA_OP_SHIFT;
17521 return value;
17522}
17523
8f06b2d8
PB
17524/* Read a 32-bit thumb instruction from buf. */
17525static unsigned long
17526get_thumb32_insn (char * buf)
17527{
17528 unsigned long insn;
17529 insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
17530 insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
17531
17532 return insn;
17533}
17534
a8bc6c78
PB
17535
17536/* We usually want to set the low bit on the address of thumb function
17537 symbols. In particular .word foo - . should have the low bit set.
17538 Generic code tries to fold the difference of two symbols to
17539 a constant. Prevent this and force a relocation when the first symbols
17540 is a thumb function. */
17541int
17542arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
17543{
17544 if (op == O_subtract
17545 && l->X_op == O_symbol
17546 && r->X_op == O_symbol
17547 && THUMB_IS_FUNC (l->X_add_symbol))
17548 {
17549 l->X_op = O_subtract;
17550 l->X_op_symbol = r->X_add_symbol;
17551 l->X_add_number -= r->X_add_number;
17552 return 1;
17553 }
17554 /* Process as normal. */
17555 return 0;
17556}
17557
c19d1205 17558void
55cf6793 17559md_apply_fix (fixS * fixP,
c19d1205
ZW
17560 valueT * valP,
17561 segT seg)
17562{
17563 offsetT value = * valP;
17564 offsetT newval;
17565 unsigned int newimm;
17566 unsigned long temp;
17567 int sign;
17568 char * buf = fixP->fx_where + fixP->fx_frag->fr_literal;
b99bd4ef 17569
c19d1205 17570 assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
b99bd4ef 17571
c19d1205 17572 /* Note whether this will delete the relocation. */
4962c51a 17573
c19d1205
ZW
17574 if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
17575 fixP->fx_done = 1;
b99bd4ef 17576
adbaf948
ZW
17577 /* On a 64-bit host, silently truncate 'value' to 32 bits for
17578 consistency with the behavior on 32-bit hosts. Remember value
17579 for emit_reloc. */
17580 value &= 0xffffffff;
17581 value ^= 0x80000000;
17582 value -= 0x80000000;
17583
17584 *valP = value;
c19d1205 17585 fixP->fx_addnumber = value;
b99bd4ef 17586
adbaf948
ZW
17587 /* Same treatment for fixP->fx_offset. */
17588 fixP->fx_offset &= 0xffffffff;
17589 fixP->fx_offset ^= 0x80000000;
17590 fixP->fx_offset -= 0x80000000;
17591
c19d1205 17592 switch (fixP->fx_r_type)
b99bd4ef 17593 {
c19d1205
ZW
17594 case BFD_RELOC_NONE:
17595 /* This will need to go in the object file. */
17596 fixP->fx_done = 0;
17597 break;
b99bd4ef 17598
c19d1205
ZW
17599 case BFD_RELOC_ARM_IMMEDIATE:
17600 /* We claim that this fixup has been processed here,
17601 even if in fact we generate an error because we do
17602 not have a reloc for it, so tc_gen_reloc will reject it. */
17603 fixP->fx_done = 1;
b99bd4ef 17604
c19d1205
ZW
17605 if (fixP->fx_addsy
17606 && ! S_IS_DEFINED (fixP->fx_addsy))
b99bd4ef 17607 {
c19d1205
ZW
17608 as_bad_where (fixP->fx_file, fixP->fx_line,
17609 _("undefined symbol %s used as an immediate value"),
17610 S_GET_NAME (fixP->fx_addsy));
17611 break;
b99bd4ef
NC
17612 }
17613
c19d1205
ZW
17614 newimm = encode_arm_immediate (value);
17615 temp = md_chars_to_number (buf, INSN_SIZE);
17616
17617 /* If the instruction will fail, see if we can fix things up by
17618 changing the opcode. */
17619 if (newimm == (unsigned int) FAIL
17620 && (newimm = negate_data_op (&temp, value)) == (unsigned int) FAIL)
b99bd4ef 17621 {
c19d1205
ZW
17622 as_bad_where (fixP->fx_file, fixP->fx_line,
17623 _("invalid constant (%lx) after fixup"),
17624 (unsigned long) value);
17625 break;
b99bd4ef 17626 }
b99bd4ef 17627
c19d1205
ZW
17628 newimm |= (temp & 0xfffff000);
17629 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
17630 break;
b99bd4ef 17631
c19d1205
ZW
17632 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
17633 {
17634 unsigned int highpart = 0;
17635 unsigned int newinsn = 0xe1a00000; /* nop. */
b99bd4ef 17636
c19d1205
ZW
17637 newimm = encode_arm_immediate (value);
17638 temp = md_chars_to_number (buf, INSN_SIZE);
b99bd4ef 17639
c19d1205
ZW
17640 /* If the instruction will fail, see if we can fix things up by
17641 changing the opcode. */
17642 if (newimm == (unsigned int) FAIL
17643 && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
17644 {
17645 /* No ? OK - try using two ADD instructions to generate
17646 the value. */
17647 newimm = validate_immediate_twopart (value, & highpart);
b99bd4ef 17648
c19d1205
ZW
17649 /* Yes - then make sure that the second instruction is
17650 also an add. */
17651 if (newimm != (unsigned int) FAIL)
17652 newinsn = temp;
17653 /* Still No ? Try using a negated value. */
17654 else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
17655 temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
17656 /* Otherwise - give up. */
17657 else
17658 {
17659 as_bad_where (fixP->fx_file, fixP->fx_line,
17660 _("unable to compute ADRL instructions for PC offset of 0x%lx"),
17661 (long) value);
17662 break;
17663 }
b99bd4ef 17664
c19d1205
ZW
17665 /* Replace the first operand in the 2nd instruction (which
17666 is the PC) with the destination register. We have
17667 already added in the PC in the first instruction and we
17668 do not want to do it again. */
17669 newinsn &= ~ 0xf0000;
17670 newinsn |= ((newinsn & 0x0f000) << 4);
17671 }
b99bd4ef 17672
c19d1205
ZW
17673 newimm |= (temp & 0xfffff000);
17674 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
b99bd4ef 17675
c19d1205
ZW
17676 highpart |= (newinsn & 0xfffff000);
17677 md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
17678 }
17679 break;
b99bd4ef 17680
c19d1205 17681 case BFD_RELOC_ARM_OFFSET_IMM:
00a97672
RS
17682 if (!fixP->fx_done && seg->use_rela_p)
17683 value = 0;
17684
c19d1205
ZW
17685 case BFD_RELOC_ARM_LITERAL:
17686 sign = value >= 0;
b99bd4ef 17687
c19d1205
ZW
17688 if (value < 0)
17689 value = - value;
b99bd4ef 17690
c19d1205 17691 if (validate_offset_imm (value, 0) == FAIL)
f03698e6 17692 {
c19d1205
ZW
17693 if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
17694 as_bad_where (fixP->fx_file, fixP->fx_line,
17695 _("invalid literal constant: pool needs to be closer"));
17696 else
17697 as_bad_where (fixP->fx_file, fixP->fx_line,
17698 _("bad immediate value for offset (%ld)"),
17699 (long) value);
17700 break;
f03698e6
RE
17701 }
17702
c19d1205
ZW
17703 newval = md_chars_to_number (buf, INSN_SIZE);
17704 newval &= 0xff7ff000;
17705 newval |= value | (sign ? INDEX_UP : 0);
17706 md_number_to_chars (buf, newval, INSN_SIZE);
17707 break;
b99bd4ef 17708
c19d1205
ZW
17709 case BFD_RELOC_ARM_OFFSET_IMM8:
17710 case BFD_RELOC_ARM_HWLITERAL:
17711 sign = value >= 0;
b99bd4ef 17712
c19d1205
ZW
17713 if (value < 0)
17714 value = - value;
b99bd4ef 17715
c19d1205 17716 if (validate_offset_imm (value, 1) == FAIL)
b99bd4ef 17717 {
c19d1205
ZW
17718 if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
17719 as_bad_where (fixP->fx_file, fixP->fx_line,
17720 _("invalid literal constant: pool needs to be closer"));
17721 else
17722 as_bad (_("bad immediate value for half-word offset (%ld)"),
17723 (long) value);
17724 break;
b99bd4ef
NC
17725 }
17726
c19d1205
ZW
17727 newval = md_chars_to_number (buf, INSN_SIZE);
17728 newval &= 0xff7ff0f0;
17729 newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
17730 md_number_to_chars (buf, newval, INSN_SIZE);
17731 break;
b99bd4ef 17732
c19d1205
ZW
17733 case BFD_RELOC_ARM_T32_OFFSET_U8:
17734 if (value < 0 || value > 1020 || value % 4 != 0)
17735 as_bad_where (fixP->fx_file, fixP->fx_line,
17736 _("bad immediate value for offset (%ld)"), (long) value);
17737 value /= 4;
b99bd4ef 17738
c19d1205 17739 newval = md_chars_to_number (buf+2, THUMB_SIZE);
c19d1205
ZW
17740 newval |= value;
17741 md_number_to_chars (buf+2, newval, THUMB_SIZE);
17742 break;
b99bd4ef 17743
c19d1205
ZW
17744 case BFD_RELOC_ARM_T32_OFFSET_IMM:
17745 /* This is a complicated relocation used for all varieties of Thumb32
17746 load/store instruction with immediate offset:
17747
17748 1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
17749 *4, optional writeback(W)
17750 (doubleword load/store)
17751
17752 1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
17753 1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
17754 1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
17755 1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
17756 1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
17757
17758 Uppercase letters indicate bits that are already encoded at
17759 this point. Lowercase letters are our problem. For the
17760 second block of instructions, the secondary opcode nybble
17761 (bits 8..11) is present, and bit 23 is zero, even if this is
17762 a PC-relative operation. */
17763 newval = md_chars_to_number (buf, THUMB_SIZE);
17764 newval <<= 16;
17765 newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
b99bd4ef 17766
c19d1205 17767 if ((newval & 0xf0000000) == 0xe0000000)
b99bd4ef 17768 {
c19d1205
ZW
17769 /* Doubleword load/store: 8-bit offset, scaled by 4. */
17770 if (value >= 0)
17771 newval |= (1 << 23);
17772 else
17773 value = -value;
17774 if (value % 4 != 0)
17775 {
17776 as_bad_where (fixP->fx_file, fixP->fx_line,
17777 _("offset not a multiple of 4"));
17778 break;
17779 }
17780 value /= 4;
216d22bc 17781 if (value > 0xff)
c19d1205
ZW
17782 {
17783 as_bad_where (fixP->fx_file, fixP->fx_line,
17784 _("offset out of range"));
17785 break;
17786 }
17787 newval &= ~0xff;
b99bd4ef 17788 }
c19d1205 17789 else if ((newval & 0x000f0000) == 0x000f0000)
b99bd4ef 17790 {
c19d1205
ZW
17791 /* PC-relative, 12-bit offset. */
17792 if (value >= 0)
17793 newval |= (1 << 23);
17794 else
17795 value = -value;
216d22bc 17796 if (value > 0xfff)
c19d1205
ZW
17797 {
17798 as_bad_where (fixP->fx_file, fixP->fx_line,
17799 _("offset out of range"));
17800 break;
17801 }
17802 newval &= ~0xfff;
b99bd4ef 17803 }
c19d1205 17804 else if ((newval & 0x00000100) == 0x00000100)
b99bd4ef 17805 {
c19d1205
ZW
17806 /* Writeback: 8-bit, +/- offset. */
17807 if (value >= 0)
17808 newval |= (1 << 9);
17809 else
17810 value = -value;
216d22bc 17811 if (value > 0xff)
c19d1205
ZW
17812 {
17813 as_bad_where (fixP->fx_file, fixP->fx_line,
17814 _("offset out of range"));
17815 break;
17816 }
17817 newval &= ~0xff;
b99bd4ef 17818 }
c19d1205 17819 else if ((newval & 0x00000f00) == 0x00000e00)
b99bd4ef 17820 {
c19d1205 17821 /* T-instruction: positive 8-bit offset. */
216d22bc 17822 if (value < 0 || value > 0xff)
b99bd4ef 17823 {
c19d1205
ZW
17824 as_bad_where (fixP->fx_file, fixP->fx_line,
17825 _("offset out of range"));
17826 break;
b99bd4ef 17827 }
c19d1205
ZW
17828 newval &= ~0xff;
17829 newval |= value;
b99bd4ef
NC
17830 }
17831 else
b99bd4ef 17832 {
c19d1205
ZW
17833 /* Positive 12-bit or negative 8-bit offset. */
17834 int limit;
17835 if (value >= 0)
b99bd4ef 17836 {
c19d1205
ZW
17837 newval |= (1 << 23);
17838 limit = 0xfff;
17839 }
17840 else
17841 {
17842 value = -value;
17843 limit = 0xff;
17844 }
17845 if (value > limit)
17846 {
17847 as_bad_where (fixP->fx_file, fixP->fx_line,
17848 _("offset out of range"));
17849 break;
b99bd4ef 17850 }
c19d1205 17851 newval &= ~limit;
b99bd4ef 17852 }
b99bd4ef 17853
c19d1205
ZW
17854 newval |= value;
17855 md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
17856 md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
17857 break;
404ff6b5 17858
c19d1205
ZW
17859 case BFD_RELOC_ARM_SHIFT_IMM:
17860 newval = md_chars_to_number (buf, INSN_SIZE);
17861 if (((unsigned long) value) > 32
17862 || (value == 32
17863 && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
17864 {
17865 as_bad_where (fixP->fx_file, fixP->fx_line,
17866 _("shift expression is too large"));
17867 break;
17868 }
404ff6b5 17869
c19d1205
ZW
17870 if (value == 0)
17871 /* Shifts of zero must be done as lsl. */
17872 newval &= ~0x60;
17873 else if (value == 32)
17874 value = 0;
17875 newval &= 0xfffff07f;
17876 newval |= (value & 0x1f) << 7;
17877 md_number_to_chars (buf, newval, INSN_SIZE);
17878 break;
404ff6b5 17879
c19d1205 17880 case BFD_RELOC_ARM_T32_IMMEDIATE:
16805f35 17881 case BFD_RELOC_ARM_T32_ADD_IMM:
92e90b6e 17882 case BFD_RELOC_ARM_T32_IMM12:
e9f89963 17883 case BFD_RELOC_ARM_T32_ADD_PC12:
c19d1205
ZW
17884 /* We claim that this fixup has been processed here,
17885 even if in fact we generate an error because we do
17886 not have a reloc for it, so tc_gen_reloc will reject it. */
17887 fixP->fx_done = 1;
404ff6b5 17888
c19d1205
ZW
17889 if (fixP->fx_addsy
17890 && ! S_IS_DEFINED (fixP->fx_addsy))
17891 {
17892 as_bad_where (fixP->fx_file, fixP->fx_line,
17893 _("undefined symbol %s used as an immediate value"),
17894 S_GET_NAME (fixP->fx_addsy));
17895 break;
17896 }
404ff6b5 17897
c19d1205
ZW
17898 newval = md_chars_to_number (buf, THUMB_SIZE);
17899 newval <<= 16;
17900 newval |= md_chars_to_number (buf+2, THUMB_SIZE);
404ff6b5 17901
16805f35
PB
17902 newimm = FAIL;
17903 if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
17904 || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
ef8d22e6
PB
17905 {
17906 newimm = encode_thumb32_immediate (value);
17907 if (newimm == (unsigned int) FAIL)
17908 newimm = thumb32_negate_data_op (&newval, value);
17909 }
16805f35
PB
17910 if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
17911 && newimm == (unsigned int) FAIL)
92e90b6e 17912 {
16805f35
PB
17913 /* Turn add/sum into addw/subw. */
17914 if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
17915 newval = (newval & 0xfeffffff) | 0x02000000;
17916
e9f89963
PB
17917 /* 12 bit immediate for addw/subw. */
17918 if (value < 0)
17919 {
17920 value = -value;
17921 newval ^= 0x00a00000;
17922 }
92e90b6e
PB
17923 if (value > 0xfff)
17924 newimm = (unsigned int) FAIL;
17925 else
17926 newimm = value;
17927 }
cc8a6dd0 17928
c19d1205 17929 if (newimm == (unsigned int)FAIL)
3631a3c8 17930 {
c19d1205
ZW
17931 as_bad_where (fixP->fx_file, fixP->fx_line,
17932 _("invalid constant (%lx) after fixup"),
17933 (unsigned long) value);
17934 break;
3631a3c8
NC
17935 }
17936
c19d1205
ZW
17937 newval |= (newimm & 0x800) << 15;
17938 newval |= (newimm & 0x700) << 4;
17939 newval |= (newimm & 0x0ff);
cc8a6dd0 17940
c19d1205
ZW
17941 md_number_to_chars (buf, (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
17942 md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
17943 break;
a737bd4d 17944
3eb17e6b 17945 case BFD_RELOC_ARM_SMC:
c19d1205
ZW
17946 if (((unsigned long) value) > 0xffff)
17947 as_bad_where (fixP->fx_file, fixP->fx_line,
3eb17e6b 17948 _("invalid smc expression"));
2fc8bdac 17949 newval = md_chars_to_number (buf, INSN_SIZE);
c19d1205
ZW
17950 newval |= (value & 0xf) | ((value & 0xfff0) << 4);
17951 md_number_to_chars (buf, newval, INSN_SIZE);
17952 break;
a737bd4d 17953
c19d1205 17954 case BFD_RELOC_ARM_SWI:
adbaf948 17955 if (fixP->tc_fix_data != 0)
c19d1205
ZW
17956 {
17957 if (((unsigned long) value) > 0xff)
17958 as_bad_where (fixP->fx_file, fixP->fx_line,
17959 _("invalid swi expression"));
2fc8bdac 17960 newval = md_chars_to_number (buf, THUMB_SIZE);
c19d1205
ZW
17961 newval |= value;
17962 md_number_to_chars (buf, newval, THUMB_SIZE);
17963 }
17964 else
17965 {
17966 if (((unsigned long) value) > 0x00ffffff)
17967 as_bad_where (fixP->fx_file, fixP->fx_line,
17968 _("invalid swi expression"));
2fc8bdac 17969 newval = md_chars_to_number (buf, INSN_SIZE);
c19d1205
ZW
17970 newval |= value;
17971 md_number_to_chars (buf, newval, INSN_SIZE);
17972 }
17973 break;
a737bd4d 17974
c19d1205
ZW
17975 case BFD_RELOC_ARM_MULTI:
17976 if (((unsigned long) value) > 0xffff)
17977 as_bad_where (fixP->fx_file, fixP->fx_line,
17978 _("invalid expression in load/store multiple"));
17979 newval = value | md_chars_to_number (buf, INSN_SIZE);
17980 md_number_to_chars (buf, newval, INSN_SIZE);
17981 break;
a737bd4d 17982
c19d1205 17983#ifdef OBJ_ELF
39b41c9c
PB
17984 case BFD_RELOC_ARM_PCREL_CALL:
17985 newval = md_chars_to_number (buf, INSN_SIZE);
17986 if ((newval & 0xf0000000) == 0xf0000000)
17987 temp = 1;
17988 else
17989 temp = 3;
17990 goto arm_branch_common;
17991
17992 case BFD_RELOC_ARM_PCREL_JUMP:
2fc8bdac 17993 case BFD_RELOC_ARM_PLT32:
c19d1205 17994#endif
39b41c9c
PB
17995 case BFD_RELOC_ARM_PCREL_BRANCH:
17996 temp = 3;
17997 goto arm_branch_common;
a737bd4d 17998
39b41c9c
PB
17999 case BFD_RELOC_ARM_PCREL_BLX:
18000 temp = 1;
18001 arm_branch_common:
c19d1205 18002 /* We are going to store value (shifted right by two) in the
39b41c9c
PB
18003 instruction, in a 24 bit, signed field. Bits 26 through 32 either
18004 all clear or all set and bit 0 must be clear. For B/BL bit 1 must
18005 also be be clear. */
18006 if (value & temp)
c19d1205 18007 as_bad_where (fixP->fx_file, fixP->fx_line,
2fc8bdac
ZW
18008 _("misaligned branch destination"));
18009 if ((value & (offsetT)0xfe000000) != (offsetT)0
18010 && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
18011 as_bad_where (fixP->fx_file, fixP->fx_line,
18012 _("branch out of range"));
a737bd4d 18013
2fc8bdac 18014 if (fixP->fx_done || !seg->use_rela_p)
c19d1205 18015 {
2fc8bdac
ZW
18016 newval = md_chars_to_number (buf, INSN_SIZE);
18017 newval |= (value >> 2) & 0x00ffffff;
7ae2971b
PB
18018 /* Set the H bit on BLX instructions. */
18019 if (temp == 1)
18020 {
18021 if (value & 2)
18022 newval |= 0x01000000;
18023 else
18024 newval &= ~0x01000000;
18025 }
2fc8bdac 18026 md_number_to_chars (buf, newval, INSN_SIZE);
c19d1205 18027 }
c19d1205 18028 break;
a737bd4d 18029
c19d1205 18030 case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CZB */
2fc8bdac
ZW
18031 /* CZB can only branch forward. */
18032 if (value & ~0x7e)
18033 as_bad_where (fixP->fx_file, fixP->fx_line,
18034 _("branch out of range"));
a737bd4d 18035
2fc8bdac
ZW
18036 if (fixP->fx_done || !seg->use_rela_p)
18037 {
18038 newval = md_chars_to_number (buf, THUMB_SIZE);
080eb7fe 18039 newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
2fc8bdac
ZW
18040 md_number_to_chars (buf, newval, THUMB_SIZE);
18041 }
c19d1205 18042 break;
a737bd4d 18043
c19d1205 18044 case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch. */
2fc8bdac
ZW
18045 if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
18046 as_bad_where (fixP->fx_file, fixP->fx_line,
18047 _("branch out of range"));
a737bd4d 18048
2fc8bdac
ZW
18049 if (fixP->fx_done || !seg->use_rela_p)
18050 {
18051 newval = md_chars_to_number (buf, THUMB_SIZE);
18052 newval |= (value & 0x1ff) >> 1;
18053 md_number_to_chars (buf, newval, THUMB_SIZE);
18054 }
c19d1205 18055 break;
a737bd4d 18056
c19d1205 18057 case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch. */
2fc8bdac
ZW
18058 if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
18059 as_bad_where (fixP->fx_file, fixP->fx_line,
18060 _("branch out of range"));
a737bd4d 18061
2fc8bdac
ZW
18062 if (fixP->fx_done || !seg->use_rela_p)
18063 {
18064 newval = md_chars_to_number (buf, THUMB_SIZE);
18065 newval |= (value & 0xfff) >> 1;
18066 md_number_to_chars (buf, newval, THUMB_SIZE);
18067 }
c19d1205 18068 break;
a737bd4d 18069
c19d1205 18070 case BFD_RELOC_THUMB_PCREL_BRANCH20:
2fc8bdac
ZW
18071 if ((value & ~0x1fffff) && ((value & ~0x1fffff) != ~0x1fffff))
18072 as_bad_where (fixP->fx_file, fixP->fx_line,
18073 _("conditional branch out of range"));
404ff6b5 18074
2fc8bdac
ZW
18075 if (fixP->fx_done || !seg->use_rela_p)
18076 {
18077 offsetT newval2;
18078 addressT S, J1, J2, lo, hi;
404ff6b5 18079
2fc8bdac
ZW
18080 S = (value & 0x00100000) >> 20;
18081 J2 = (value & 0x00080000) >> 19;
18082 J1 = (value & 0x00040000) >> 18;
18083 hi = (value & 0x0003f000) >> 12;
18084 lo = (value & 0x00000ffe) >> 1;
6c43fab6 18085
2fc8bdac
ZW
18086 newval = md_chars_to_number (buf, THUMB_SIZE);
18087 newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
18088 newval |= (S << 10) | hi;
18089 newval2 |= (J1 << 13) | (J2 << 11) | lo;
18090 md_number_to_chars (buf, newval, THUMB_SIZE);
18091 md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
18092 }
c19d1205 18093 break;
6c43fab6 18094
c19d1205
ZW
18095 case BFD_RELOC_THUMB_PCREL_BLX:
18096 case BFD_RELOC_THUMB_PCREL_BRANCH23:
2fc8bdac
ZW
18097 if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
18098 as_bad_where (fixP->fx_file, fixP->fx_line,
18099 _("branch out of range"));
404ff6b5 18100
2fc8bdac
ZW
18101 if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
18102 /* For a BLX instruction, make sure that the relocation is rounded up
18103 to a word boundary. This follows the semantics of the instruction
18104 which specifies that bit 1 of the target address will come from bit
18105 1 of the base address. */
18106 value = (value + 1) & ~ 1;
404ff6b5 18107
2fc8bdac 18108 if (fixP->fx_done || !seg->use_rela_p)
c19d1205 18109 {
2fc8bdac
ZW
18110 offsetT newval2;
18111
18112 newval = md_chars_to_number (buf, THUMB_SIZE);
18113 newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
18114 newval |= (value & 0x7fffff) >> 12;
18115 newval2 |= (value & 0xfff) >> 1;
18116 md_number_to_chars (buf, newval, THUMB_SIZE);
18117 md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
c19d1205 18118 }
c19d1205 18119 break;
404ff6b5 18120
c19d1205 18121 case BFD_RELOC_THUMB_PCREL_BRANCH25:
2fc8bdac
ZW
18122 if ((value & ~0x1ffffff) && ((value & ~0x1ffffff) != ~0x1ffffff))
18123 as_bad_where (fixP->fx_file, fixP->fx_line,
18124 _("branch out of range"));
6c43fab6 18125
2fc8bdac
ZW
18126 if (fixP->fx_done || !seg->use_rela_p)
18127 {
18128 offsetT newval2;
18129 addressT S, I1, I2, lo, hi;
6c43fab6 18130
2fc8bdac
ZW
18131 S = (value & 0x01000000) >> 24;
18132 I1 = (value & 0x00800000) >> 23;
18133 I2 = (value & 0x00400000) >> 22;
18134 hi = (value & 0x003ff000) >> 12;
18135 lo = (value & 0x00000ffe) >> 1;
6c43fab6 18136
2fc8bdac
ZW
18137 I1 = !(I1 ^ S);
18138 I2 = !(I2 ^ S);
a737bd4d 18139
2fc8bdac
ZW
18140 newval = md_chars_to_number (buf, THUMB_SIZE);
18141 newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
18142 newval |= (S << 10) | hi;
18143 newval2 |= (I1 << 13) | (I2 << 11) | lo;
18144 md_number_to_chars (buf, newval, THUMB_SIZE);
18145 md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
18146 }
18147 break;
a737bd4d 18148
2fc8bdac
ZW
18149 case BFD_RELOC_8:
18150 if (fixP->fx_done || !seg->use_rela_p)
18151 md_number_to_chars (buf, value, 1);
c19d1205 18152 break;
a737bd4d 18153
c19d1205 18154 case BFD_RELOC_16:
2fc8bdac 18155 if (fixP->fx_done || !seg->use_rela_p)
c19d1205 18156 md_number_to_chars (buf, value, 2);
c19d1205 18157 break;
a737bd4d 18158
c19d1205
ZW
18159#ifdef OBJ_ELF
18160 case BFD_RELOC_ARM_TLS_GD32:
18161 case BFD_RELOC_ARM_TLS_LE32:
18162 case BFD_RELOC_ARM_TLS_IE32:
18163 case BFD_RELOC_ARM_TLS_LDM32:
18164 case BFD_RELOC_ARM_TLS_LDO32:
18165 S_SET_THREAD_LOCAL (fixP->fx_addsy);
18166 /* fall through */
6c43fab6 18167
c19d1205
ZW
18168 case BFD_RELOC_ARM_GOT32:
18169 case BFD_RELOC_ARM_GOTOFF:
18170 case BFD_RELOC_ARM_TARGET2:
2fc8bdac
ZW
18171 if (fixP->fx_done || !seg->use_rela_p)
18172 md_number_to_chars (buf, 0, 4);
c19d1205
ZW
18173 break;
18174#endif
6c43fab6 18175
c19d1205
ZW
18176 case BFD_RELOC_RVA:
18177 case BFD_RELOC_32:
18178 case BFD_RELOC_ARM_TARGET1:
18179 case BFD_RELOC_ARM_ROSEGREL32:
18180 case BFD_RELOC_ARM_SBREL32:
18181 case BFD_RELOC_32_PCREL:
f0927246
NC
18182#ifdef TE_PE
18183 case BFD_RELOC_32_SECREL:
18184#endif
2fc8bdac 18185 if (fixP->fx_done || !seg->use_rela_p)
53baae48
NC
18186#ifdef TE_WINCE
18187 /* For WinCE we only do this for pcrel fixups. */
18188 if (fixP->fx_done || fixP->fx_pcrel)
18189#endif
18190 md_number_to_chars (buf, value, 4);
c19d1205 18191 break;
6c43fab6 18192
c19d1205
ZW
18193#ifdef OBJ_ELF
18194 case BFD_RELOC_ARM_PREL31:
2fc8bdac 18195 if (fixP->fx_done || !seg->use_rela_p)
c19d1205
ZW
18196 {
18197 newval = md_chars_to_number (buf, 4) & 0x80000000;
18198 if ((value ^ (value >> 1)) & 0x40000000)
18199 {
18200 as_bad_where (fixP->fx_file, fixP->fx_line,
18201 _("rel31 relocation overflow"));
18202 }
18203 newval |= value & 0x7fffffff;
18204 md_number_to_chars (buf, newval, 4);
18205 }
18206 break;
c19d1205 18207#endif
a737bd4d 18208
c19d1205 18209 case BFD_RELOC_ARM_CP_OFF_IMM:
8f06b2d8 18210 case BFD_RELOC_ARM_T32_CP_OFF_IMM:
c19d1205
ZW
18211 if (value < -1023 || value > 1023 || (value & 3))
18212 as_bad_where (fixP->fx_file, fixP->fx_line,
18213 _("co-processor offset out of range"));
18214 cp_off_common:
18215 sign = value >= 0;
18216 if (value < 0)
18217 value = -value;
8f06b2d8
PB
18218 if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
18219 || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
18220 newval = md_chars_to_number (buf, INSN_SIZE);
18221 else
18222 newval = get_thumb32_insn (buf);
18223 newval &= 0xff7fff00;
c19d1205 18224 newval |= (value >> 2) | (sign ? INDEX_UP : 0);
8f06b2d8
PB
18225 if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
18226 || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
18227 md_number_to_chars (buf, newval, INSN_SIZE);
18228 else
18229 put_thumb32_insn (buf, newval);
c19d1205 18230 break;
a737bd4d 18231
c19d1205 18232 case BFD_RELOC_ARM_CP_OFF_IMM_S2:
8f06b2d8 18233 case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
c19d1205
ZW
18234 if (value < -255 || value > 255)
18235 as_bad_where (fixP->fx_file, fixP->fx_line,
18236 _("co-processor offset out of range"));
df7849c5 18237 value *= 4;
c19d1205 18238 goto cp_off_common;
6c43fab6 18239
c19d1205
ZW
18240 case BFD_RELOC_ARM_THUMB_OFFSET:
18241 newval = md_chars_to_number (buf, THUMB_SIZE);
18242 /* Exactly what ranges, and where the offset is inserted depends
18243 on the type of instruction, we can establish this from the
18244 top 4 bits. */
18245 switch (newval >> 12)
18246 {
18247 case 4: /* PC load. */
18248 /* Thumb PC loads are somewhat odd, bit 1 of the PC is
18249 forced to zero for these loads; md_pcrel_from has already
18250 compensated for this. */
18251 if (value & 3)
18252 as_bad_where (fixP->fx_file, fixP->fx_line,
18253 _("invalid offset, target not word aligned (0x%08lX)"),
0359e808
NC
18254 (((unsigned long) fixP->fx_frag->fr_address
18255 + (unsigned long) fixP->fx_where) & ~3)
18256 + (unsigned long) value);
a737bd4d 18257
c19d1205
ZW
18258 if (value & ~0x3fc)
18259 as_bad_where (fixP->fx_file, fixP->fx_line,
18260 _("invalid offset, value too big (0x%08lX)"),
18261 (long) value);
a737bd4d 18262
c19d1205
ZW
18263 newval |= value >> 2;
18264 break;
a737bd4d 18265
c19d1205
ZW
18266 case 9: /* SP load/store. */
18267 if (value & ~0x3fc)
18268 as_bad_where (fixP->fx_file, fixP->fx_line,
18269 _("invalid offset, value too big (0x%08lX)"),
18270 (long) value);
18271 newval |= value >> 2;
18272 break;
6c43fab6 18273
c19d1205
ZW
18274 case 6: /* Word load/store. */
18275 if (value & ~0x7c)
18276 as_bad_where (fixP->fx_file, fixP->fx_line,
18277 _("invalid offset, value too big (0x%08lX)"),
18278 (long) value);
18279 newval |= value << 4; /* 6 - 2. */
18280 break;
a737bd4d 18281
c19d1205
ZW
18282 case 7: /* Byte load/store. */
18283 if (value & ~0x1f)
18284 as_bad_where (fixP->fx_file, fixP->fx_line,
18285 _("invalid offset, value too big (0x%08lX)"),
18286 (long) value);
18287 newval |= value << 6;
18288 break;
a737bd4d 18289
c19d1205
ZW
18290 case 8: /* Halfword load/store. */
18291 if (value & ~0x3e)
18292 as_bad_where (fixP->fx_file, fixP->fx_line,
18293 _("invalid offset, value too big (0x%08lX)"),
18294 (long) value);
18295 newval |= value << 5; /* 6 - 1. */
18296 break;
a737bd4d 18297
c19d1205
ZW
18298 default:
18299 as_bad_where (fixP->fx_file, fixP->fx_line,
18300 "Unable to process relocation for thumb opcode: %lx",
18301 (unsigned long) newval);
18302 break;
18303 }
18304 md_number_to_chars (buf, newval, THUMB_SIZE);
18305 break;
a737bd4d 18306
c19d1205
ZW
18307 case BFD_RELOC_ARM_THUMB_ADD:
18308 /* This is a complicated relocation, since we use it for all of
18309 the following immediate relocations:
a737bd4d 18310
c19d1205
ZW
18311 3bit ADD/SUB
18312 8bit ADD/SUB
18313 9bit ADD/SUB SP word-aligned
18314 10bit ADD PC/SP word-aligned
a737bd4d 18315
c19d1205
ZW
18316 The type of instruction being processed is encoded in the
18317 instruction field:
a737bd4d 18318
c19d1205
ZW
18319 0x8000 SUB
18320 0x00F0 Rd
18321 0x000F Rs
18322 */
18323 newval = md_chars_to_number (buf, THUMB_SIZE);
18324 {
18325 int rd = (newval >> 4) & 0xf;
18326 int rs = newval & 0xf;
18327 int subtract = !!(newval & 0x8000);
a737bd4d 18328
c19d1205
ZW
18329 /* Check for HI regs, only very restricted cases allowed:
18330 Adjusting SP, and using PC or SP to get an address. */
18331 if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
18332 || (rs > 7 && rs != REG_SP && rs != REG_PC))
18333 as_bad_where (fixP->fx_file, fixP->fx_line,
18334 _("invalid Hi register with immediate"));
a737bd4d 18335
c19d1205
ZW
18336 /* If value is negative, choose the opposite instruction. */
18337 if (value < 0)
18338 {
18339 value = -value;
18340 subtract = !subtract;
18341 if (value < 0)
18342 as_bad_where (fixP->fx_file, fixP->fx_line,
18343 _("immediate value out of range"));
18344 }
a737bd4d 18345
c19d1205
ZW
18346 if (rd == REG_SP)
18347 {
18348 if (value & ~0x1fc)
18349 as_bad_where (fixP->fx_file, fixP->fx_line,
18350 _("invalid immediate for stack address calculation"));
18351 newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
18352 newval |= value >> 2;
18353 }
18354 else if (rs == REG_PC || rs == REG_SP)
18355 {
18356 if (subtract || value & ~0x3fc)
18357 as_bad_where (fixP->fx_file, fixP->fx_line,
18358 _("invalid immediate for address calculation (value = 0x%08lX)"),
18359 (unsigned long) value);
18360 newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
18361 newval |= rd << 8;
18362 newval |= value >> 2;
18363 }
18364 else if (rs == rd)
18365 {
18366 if (value & ~0xff)
18367 as_bad_where (fixP->fx_file, fixP->fx_line,
18368 _("immediate value out of range"));
18369 newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
18370 newval |= (rd << 8) | value;
18371 }
18372 else
18373 {
18374 if (value & ~0x7)
18375 as_bad_where (fixP->fx_file, fixP->fx_line,
18376 _("immediate value out of range"));
18377 newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
18378 newval |= rd | (rs << 3) | (value << 6);
18379 }
18380 }
18381 md_number_to_chars (buf, newval, THUMB_SIZE);
18382 break;
a737bd4d 18383
c19d1205
ZW
18384 case BFD_RELOC_ARM_THUMB_IMM:
18385 newval = md_chars_to_number (buf, THUMB_SIZE);
18386 if (value < 0 || value > 255)
18387 as_bad_where (fixP->fx_file, fixP->fx_line,
18388 _("invalid immediate: %ld is too large"),
18389 (long) value);
18390 newval |= value;
18391 md_number_to_chars (buf, newval, THUMB_SIZE);
18392 break;
a737bd4d 18393
c19d1205
ZW
18394 case BFD_RELOC_ARM_THUMB_SHIFT:
18395 /* 5bit shift value (0..32). LSL cannot take 32. */
18396 newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
18397 temp = newval & 0xf800;
18398 if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
18399 as_bad_where (fixP->fx_file, fixP->fx_line,
18400 _("invalid shift value: %ld"), (long) value);
18401 /* Shifts of zero must be encoded as LSL. */
18402 if (value == 0)
18403 newval = (newval & 0x003f) | T_OPCODE_LSL_I;
18404 /* Shifts of 32 are encoded as zero. */
18405 else if (value == 32)
18406 value = 0;
18407 newval |= value << 6;
18408 md_number_to_chars (buf, newval, THUMB_SIZE);
18409 break;
a737bd4d 18410
c19d1205
ZW
18411 case BFD_RELOC_VTABLE_INHERIT:
18412 case BFD_RELOC_VTABLE_ENTRY:
18413 fixP->fx_done = 0;
18414 return;
6c43fab6 18415
b6895b4f
PB
18416 case BFD_RELOC_ARM_MOVW:
18417 case BFD_RELOC_ARM_MOVT:
18418 case BFD_RELOC_ARM_THUMB_MOVW:
18419 case BFD_RELOC_ARM_THUMB_MOVT:
18420 if (fixP->fx_done || !seg->use_rela_p)
18421 {
18422 /* REL format relocations are limited to a 16-bit addend. */
18423 if (!fixP->fx_done)
18424 {
18425 if (value < -0x1000 || value > 0xffff)
18426 as_bad_where (fixP->fx_file, fixP->fx_line,
18427 _("offset too big"));
18428 }
18429 else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
18430 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
18431 {
18432 value >>= 16;
18433 }
18434
18435 if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
18436 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
18437 {
18438 newval = get_thumb32_insn (buf);
18439 newval &= 0xfbf08f00;
18440 newval |= (value & 0xf000) << 4;
18441 newval |= (value & 0x0800) << 15;
18442 newval |= (value & 0x0700) << 4;
18443 newval |= (value & 0x00ff);
18444 put_thumb32_insn (buf, newval);
18445 }
18446 else
18447 {
18448 newval = md_chars_to_number (buf, 4);
18449 newval &= 0xfff0f000;
18450 newval |= value & 0x0fff;
18451 newval |= (value & 0xf000) << 4;
18452 md_number_to_chars (buf, newval, 4);
18453 }
18454 }
18455 return;
18456
4962c51a
MS
18457 case BFD_RELOC_ARM_ALU_PC_G0_NC:
18458 case BFD_RELOC_ARM_ALU_PC_G0:
18459 case BFD_RELOC_ARM_ALU_PC_G1_NC:
18460 case BFD_RELOC_ARM_ALU_PC_G1:
18461 case BFD_RELOC_ARM_ALU_PC_G2:
18462 case BFD_RELOC_ARM_ALU_SB_G0_NC:
18463 case BFD_RELOC_ARM_ALU_SB_G0:
18464 case BFD_RELOC_ARM_ALU_SB_G1_NC:
18465 case BFD_RELOC_ARM_ALU_SB_G1:
18466 case BFD_RELOC_ARM_ALU_SB_G2:
18467 assert (!fixP->fx_done);
18468 if (!seg->use_rela_p)
18469 {
18470 bfd_vma insn;
18471 bfd_vma encoded_addend;
18472 bfd_vma addend_abs = abs (value);
18473
18474 /* Check that the absolute value of the addend can be
18475 expressed as an 8-bit constant plus a rotation. */
18476 encoded_addend = encode_arm_immediate (addend_abs);
18477 if (encoded_addend == (unsigned int) FAIL)
18478 as_bad_where (fixP->fx_file, fixP->fx_line,
18479 _("the offset 0x%08lX is not representable"),
18480 addend_abs);
18481
18482 /* Extract the instruction. */
18483 insn = md_chars_to_number (buf, INSN_SIZE);
18484
18485 /* If the addend is positive, use an ADD instruction.
18486 Otherwise use a SUB. Take care not to destroy the S bit. */
18487 insn &= 0xff1fffff;
18488 if (value < 0)
18489 insn |= 1 << 22;
18490 else
18491 insn |= 1 << 23;
18492
18493 /* Place the encoded addend into the first 12 bits of the
18494 instruction. */
18495 insn &= 0xfffff000;
18496 insn |= encoded_addend;
18497
18498 /* Update the instruction. */
18499 md_number_to_chars (buf, insn, INSN_SIZE);
18500 }
18501 break;
18502
18503 case BFD_RELOC_ARM_LDR_PC_G0:
18504 case BFD_RELOC_ARM_LDR_PC_G1:
18505 case BFD_RELOC_ARM_LDR_PC_G2:
18506 case BFD_RELOC_ARM_LDR_SB_G0:
18507 case BFD_RELOC_ARM_LDR_SB_G1:
18508 case BFD_RELOC_ARM_LDR_SB_G2:
18509 assert (!fixP->fx_done);
18510 if (!seg->use_rela_p)
18511 {
18512 bfd_vma insn;
18513 bfd_vma addend_abs = abs (value);
18514
18515 /* Check that the absolute value of the addend can be
18516 encoded in 12 bits. */
18517 if (addend_abs >= 0x1000)
18518 as_bad_where (fixP->fx_file, fixP->fx_line,
18519 _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
18520 addend_abs);
18521
18522 /* Extract the instruction. */
18523 insn = md_chars_to_number (buf, INSN_SIZE);
18524
18525 /* If the addend is negative, clear bit 23 of the instruction.
18526 Otherwise set it. */
18527 if (value < 0)
18528 insn &= ~(1 << 23);
18529 else
18530 insn |= 1 << 23;
18531
18532 /* Place the absolute value of the addend into the first 12 bits
18533 of the instruction. */
18534 insn &= 0xfffff000;
18535 insn |= addend_abs;
18536
18537 /* Update the instruction. */
18538 md_number_to_chars (buf, insn, INSN_SIZE);
18539 }
18540 break;
18541
18542 case BFD_RELOC_ARM_LDRS_PC_G0:
18543 case BFD_RELOC_ARM_LDRS_PC_G1:
18544 case BFD_RELOC_ARM_LDRS_PC_G2:
18545 case BFD_RELOC_ARM_LDRS_SB_G0:
18546 case BFD_RELOC_ARM_LDRS_SB_G1:
18547 case BFD_RELOC_ARM_LDRS_SB_G2:
18548 assert (!fixP->fx_done);
18549 if (!seg->use_rela_p)
18550 {
18551 bfd_vma insn;
18552 bfd_vma addend_abs = abs (value);
18553
18554 /* Check that the absolute value of the addend can be
18555 encoded in 8 bits. */
18556 if (addend_abs >= 0x100)
18557 as_bad_where (fixP->fx_file, fixP->fx_line,
18558 _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
18559 addend_abs);
18560
18561 /* Extract the instruction. */
18562 insn = md_chars_to_number (buf, INSN_SIZE);
18563
18564 /* If the addend is negative, clear bit 23 of the instruction.
18565 Otherwise set it. */
18566 if (value < 0)
18567 insn &= ~(1 << 23);
18568 else
18569 insn |= 1 << 23;
18570
18571 /* Place the first four bits of the absolute value of the addend
18572 into the first 4 bits of the instruction, and the remaining
18573 four into bits 8 .. 11. */
18574 insn &= 0xfffff0f0;
18575 insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
18576
18577 /* Update the instruction. */
18578 md_number_to_chars (buf, insn, INSN_SIZE);
18579 }
18580 break;
18581
18582 case BFD_RELOC_ARM_LDC_PC_G0:
18583 case BFD_RELOC_ARM_LDC_PC_G1:
18584 case BFD_RELOC_ARM_LDC_PC_G2:
18585 case BFD_RELOC_ARM_LDC_SB_G0:
18586 case BFD_RELOC_ARM_LDC_SB_G1:
18587 case BFD_RELOC_ARM_LDC_SB_G2:
18588 assert (!fixP->fx_done);
18589 if (!seg->use_rela_p)
18590 {
18591 bfd_vma insn;
18592 bfd_vma addend_abs = abs (value);
18593
18594 /* Check that the absolute value of the addend is a multiple of
18595 four and, when divided by four, fits in 8 bits. */
18596 if (addend_abs & 0x3)
18597 as_bad_where (fixP->fx_file, fixP->fx_line,
18598 _("bad offset 0x%08lX (must be word-aligned)"),
18599 addend_abs);
18600
18601 if ((addend_abs >> 2) > 0xff)
18602 as_bad_where (fixP->fx_file, fixP->fx_line,
18603 _("bad offset 0x%08lX (must be an 8-bit number of words)"),
18604 addend_abs);
18605
18606 /* Extract the instruction. */
18607 insn = md_chars_to_number (buf, INSN_SIZE);
18608
18609 /* If the addend is negative, clear bit 23 of the instruction.
18610 Otherwise set it. */
18611 if (value < 0)
18612 insn &= ~(1 << 23);
18613 else
18614 insn |= 1 << 23;
18615
18616 /* Place the addend (divided by four) into the first eight
18617 bits of the instruction. */
18618 insn &= 0xfffffff0;
18619 insn |= addend_abs >> 2;
18620
18621 /* Update the instruction. */
18622 md_number_to_chars (buf, insn, INSN_SIZE);
18623 }
18624 break;
18625
c19d1205
ZW
18626 case BFD_RELOC_UNUSED:
18627 default:
18628 as_bad_where (fixP->fx_file, fixP->fx_line,
18629 _("bad relocation fixup type (%d)"), fixP->fx_r_type);
18630 }
6c43fab6
RE
18631}
18632
c19d1205
ZW
18633/* Translate internal representation of relocation info to BFD target
18634 format. */
a737bd4d 18635
c19d1205 18636arelent *
00a97672 18637tc_gen_reloc (asection *section, fixS *fixp)
a737bd4d 18638{
c19d1205
ZW
18639 arelent * reloc;
18640 bfd_reloc_code_real_type code;
a737bd4d 18641
c19d1205 18642 reloc = xmalloc (sizeof (arelent));
a737bd4d 18643
c19d1205
ZW
18644 reloc->sym_ptr_ptr = xmalloc (sizeof (asymbol *));
18645 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
18646 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
a737bd4d 18647
2fc8bdac 18648 if (fixp->fx_pcrel)
00a97672
RS
18649 {
18650 if (section->use_rela_p)
18651 fixp->fx_offset -= md_pcrel_from_section (fixp, section);
18652 else
18653 fixp->fx_offset = reloc->address;
18654 }
c19d1205 18655 reloc->addend = fixp->fx_offset;
a737bd4d 18656
c19d1205 18657 switch (fixp->fx_r_type)
a737bd4d 18658 {
c19d1205
ZW
18659 case BFD_RELOC_8:
18660 if (fixp->fx_pcrel)
18661 {
18662 code = BFD_RELOC_8_PCREL;
18663 break;
18664 }
a737bd4d 18665
c19d1205
ZW
18666 case BFD_RELOC_16:
18667 if (fixp->fx_pcrel)
18668 {
18669 code = BFD_RELOC_16_PCREL;
18670 break;
18671 }
6c43fab6 18672
c19d1205
ZW
18673 case BFD_RELOC_32:
18674 if (fixp->fx_pcrel)
18675 {
18676 code = BFD_RELOC_32_PCREL;
18677 break;
18678 }
a737bd4d 18679
b6895b4f
PB
18680 case BFD_RELOC_ARM_MOVW:
18681 if (fixp->fx_pcrel)
18682 {
18683 code = BFD_RELOC_ARM_MOVW_PCREL;
18684 break;
18685 }
18686
18687 case BFD_RELOC_ARM_MOVT:
18688 if (fixp->fx_pcrel)
18689 {
18690 code = BFD_RELOC_ARM_MOVT_PCREL;
18691 break;
18692 }
18693
18694 case BFD_RELOC_ARM_THUMB_MOVW:
18695 if (fixp->fx_pcrel)
18696 {
18697 code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
18698 break;
18699 }
18700
18701 case BFD_RELOC_ARM_THUMB_MOVT:
18702 if (fixp->fx_pcrel)
18703 {
18704 code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
18705 break;
18706 }
18707
c19d1205
ZW
18708 case BFD_RELOC_NONE:
18709 case BFD_RELOC_ARM_PCREL_BRANCH:
18710 case BFD_RELOC_ARM_PCREL_BLX:
18711 case BFD_RELOC_RVA:
18712 case BFD_RELOC_THUMB_PCREL_BRANCH7:
18713 case BFD_RELOC_THUMB_PCREL_BRANCH9:
18714 case BFD_RELOC_THUMB_PCREL_BRANCH12:
18715 case BFD_RELOC_THUMB_PCREL_BRANCH20:
18716 case BFD_RELOC_THUMB_PCREL_BRANCH23:
18717 case BFD_RELOC_THUMB_PCREL_BRANCH25:
18718 case BFD_RELOC_THUMB_PCREL_BLX:
18719 case BFD_RELOC_VTABLE_ENTRY:
18720 case BFD_RELOC_VTABLE_INHERIT:
f0927246
NC
18721#ifdef TE_PE
18722 case BFD_RELOC_32_SECREL:
18723#endif
c19d1205
ZW
18724 code = fixp->fx_r_type;
18725 break;
a737bd4d 18726
c19d1205
ZW
18727 case BFD_RELOC_ARM_LITERAL:
18728 case BFD_RELOC_ARM_HWLITERAL:
18729 /* If this is called then the a literal has
18730 been referenced across a section boundary. */
18731 as_bad_where (fixp->fx_file, fixp->fx_line,
18732 _("literal referenced across section boundary"));
18733 return NULL;
a737bd4d 18734
c19d1205
ZW
18735#ifdef OBJ_ELF
18736 case BFD_RELOC_ARM_GOT32:
18737 case BFD_RELOC_ARM_GOTOFF:
18738 case BFD_RELOC_ARM_PLT32:
18739 case BFD_RELOC_ARM_TARGET1:
18740 case BFD_RELOC_ARM_ROSEGREL32:
18741 case BFD_RELOC_ARM_SBREL32:
18742 case BFD_RELOC_ARM_PREL31:
18743 case BFD_RELOC_ARM_TARGET2:
18744 case BFD_RELOC_ARM_TLS_LE32:
18745 case BFD_RELOC_ARM_TLS_LDO32:
39b41c9c
PB
18746 case BFD_RELOC_ARM_PCREL_CALL:
18747 case BFD_RELOC_ARM_PCREL_JUMP:
4962c51a
MS
18748 case BFD_RELOC_ARM_ALU_PC_G0_NC:
18749 case BFD_RELOC_ARM_ALU_PC_G0:
18750 case BFD_RELOC_ARM_ALU_PC_G1_NC:
18751 case BFD_RELOC_ARM_ALU_PC_G1:
18752 case BFD_RELOC_ARM_ALU_PC_G2:
18753 case BFD_RELOC_ARM_LDR_PC_G0:
18754 case BFD_RELOC_ARM_LDR_PC_G1:
18755 case BFD_RELOC_ARM_LDR_PC_G2:
18756 case BFD_RELOC_ARM_LDRS_PC_G0:
18757 case BFD_RELOC_ARM_LDRS_PC_G1:
18758 case BFD_RELOC_ARM_LDRS_PC_G2:
18759 case BFD_RELOC_ARM_LDC_PC_G0:
18760 case BFD_RELOC_ARM_LDC_PC_G1:
18761 case BFD_RELOC_ARM_LDC_PC_G2:
18762 case BFD_RELOC_ARM_ALU_SB_G0_NC:
18763 case BFD_RELOC_ARM_ALU_SB_G0:
18764 case BFD_RELOC_ARM_ALU_SB_G1_NC:
18765 case BFD_RELOC_ARM_ALU_SB_G1:
18766 case BFD_RELOC_ARM_ALU_SB_G2:
18767 case BFD_RELOC_ARM_LDR_SB_G0:
18768 case BFD_RELOC_ARM_LDR_SB_G1:
18769 case BFD_RELOC_ARM_LDR_SB_G2:
18770 case BFD_RELOC_ARM_LDRS_SB_G0:
18771 case BFD_RELOC_ARM_LDRS_SB_G1:
18772 case BFD_RELOC_ARM_LDRS_SB_G2:
18773 case BFD_RELOC_ARM_LDC_SB_G0:
18774 case BFD_RELOC_ARM_LDC_SB_G1:
18775 case BFD_RELOC_ARM_LDC_SB_G2:
c19d1205
ZW
18776 code = fixp->fx_r_type;
18777 break;
a737bd4d 18778
c19d1205
ZW
18779 case BFD_RELOC_ARM_TLS_GD32:
18780 case BFD_RELOC_ARM_TLS_IE32:
18781 case BFD_RELOC_ARM_TLS_LDM32:
18782 /* BFD will include the symbol's address in the addend.
18783 But we don't want that, so subtract it out again here. */
18784 if (!S_IS_COMMON (fixp->fx_addsy))
18785 reloc->addend -= (*reloc->sym_ptr_ptr)->value;
18786 code = fixp->fx_r_type;
18787 break;
18788#endif
a737bd4d 18789
c19d1205
ZW
18790 case BFD_RELOC_ARM_IMMEDIATE:
18791 as_bad_where (fixp->fx_file, fixp->fx_line,
18792 _("internal relocation (type: IMMEDIATE) not fixed up"));
18793 return NULL;
a737bd4d 18794
c19d1205
ZW
18795 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
18796 as_bad_where (fixp->fx_file, fixp->fx_line,
18797 _("ADRL used for a symbol not defined in the same file"));
18798 return NULL;
a737bd4d 18799
c19d1205 18800 case BFD_RELOC_ARM_OFFSET_IMM:
00a97672
RS
18801 if (section->use_rela_p)
18802 {
18803 code = fixp->fx_r_type;
18804 break;
18805 }
18806
c19d1205
ZW
18807 if (fixp->fx_addsy != NULL
18808 && !S_IS_DEFINED (fixp->fx_addsy)
18809 && S_IS_LOCAL (fixp->fx_addsy))
a737bd4d 18810 {
c19d1205
ZW
18811 as_bad_where (fixp->fx_file, fixp->fx_line,
18812 _("undefined local label `%s'"),
18813 S_GET_NAME (fixp->fx_addsy));
18814 return NULL;
a737bd4d
NC
18815 }
18816
c19d1205
ZW
18817 as_bad_where (fixp->fx_file, fixp->fx_line,
18818 _("internal_relocation (type: OFFSET_IMM) not fixed up"));
18819 return NULL;
a737bd4d 18820
c19d1205
ZW
18821 default:
18822 {
18823 char * type;
6c43fab6 18824
c19d1205
ZW
18825 switch (fixp->fx_r_type)
18826 {
18827 case BFD_RELOC_NONE: type = "NONE"; break;
18828 case BFD_RELOC_ARM_OFFSET_IMM8: type = "OFFSET_IMM8"; break;
18829 case BFD_RELOC_ARM_SHIFT_IMM: type = "SHIFT_IMM"; break;
3eb17e6b 18830 case BFD_RELOC_ARM_SMC: type = "SMC"; break;
c19d1205
ZW
18831 case BFD_RELOC_ARM_SWI: type = "SWI"; break;
18832 case BFD_RELOC_ARM_MULTI: type = "MULTI"; break;
18833 case BFD_RELOC_ARM_CP_OFF_IMM: type = "CP_OFF_IMM"; break;
8f06b2d8 18834 case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
c19d1205
ZW
18835 case BFD_RELOC_ARM_THUMB_ADD: type = "THUMB_ADD"; break;
18836 case BFD_RELOC_ARM_THUMB_SHIFT: type = "THUMB_SHIFT"; break;
18837 case BFD_RELOC_ARM_THUMB_IMM: type = "THUMB_IMM"; break;
18838 case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
18839 default: type = _("<unknown>"); break;
18840 }
18841 as_bad_where (fixp->fx_file, fixp->fx_line,
18842 _("cannot represent %s relocation in this object file format"),
18843 type);
18844 return NULL;
18845 }
a737bd4d 18846 }
6c43fab6 18847
c19d1205
ZW
18848#ifdef OBJ_ELF
18849 if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
18850 && GOT_symbol
18851 && fixp->fx_addsy == GOT_symbol)
18852 {
18853 code = BFD_RELOC_ARM_GOTPC;
18854 reloc->addend = fixp->fx_offset = reloc->address;
18855 }
18856#endif
6c43fab6 18857
c19d1205 18858 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
6c43fab6 18859
c19d1205
ZW
18860 if (reloc->howto == NULL)
18861 {
18862 as_bad_where (fixp->fx_file, fixp->fx_line,
18863 _("cannot represent %s relocation in this object file format"),
18864 bfd_get_reloc_code_name (code));
18865 return NULL;
18866 }
6c43fab6 18867
c19d1205
ZW
18868 /* HACK: Since arm ELF uses Rel instead of Rela, encode the
18869 vtable entry to be used in the relocation's section offset. */
18870 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
18871 reloc->address = fixp->fx_offset;
6c43fab6 18872
c19d1205 18873 return reloc;
6c43fab6
RE
18874}
18875
c19d1205 18876/* This fix_new is called by cons via TC_CONS_FIX_NEW. */
6c43fab6 18877
c19d1205
ZW
18878void
18879cons_fix_new_arm (fragS * frag,
18880 int where,
18881 int size,
18882 expressionS * exp)
6c43fab6 18883{
c19d1205
ZW
18884 bfd_reloc_code_real_type type;
18885 int pcrel = 0;
6c43fab6 18886
c19d1205
ZW
18887 /* Pick a reloc.
18888 FIXME: @@ Should look at CPU word size. */
18889 switch (size)
18890 {
18891 case 1:
18892 type = BFD_RELOC_8;
18893 break;
18894 case 2:
18895 type = BFD_RELOC_16;
18896 break;
18897 case 4:
18898 default:
18899 type = BFD_RELOC_32;
18900 break;
18901 case 8:
18902 type = BFD_RELOC_64;
18903 break;
18904 }
6c43fab6 18905
f0927246
NC
18906#ifdef TE_PE
18907 if (exp->X_op == O_secrel)
18908 {
18909 exp->X_op = O_symbol;
18910 type = BFD_RELOC_32_SECREL;
18911 }
18912#endif
18913
c19d1205
ZW
18914 fix_new_exp (frag, where, (int) size, exp, pcrel, type);
18915}
6c43fab6 18916
c19d1205
ZW
18917#if defined OBJ_COFF || defined OBJ_ELF
18918void
18919arm_validate_fix (fixS * fixP)
6c43fab6 18920{
c19d1205
ZW
18921 /* If the destination of the branch is a defined symbol which does not have
18922 the THUMB_FUNC attribute, then we must be calling a function which has
18923 the (interfacearm) attribute. We look for the Thumb entry point to that
18924 function and change the branch to refer to that function instead. */
18925 if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
18926 && fixP->fx_addsy != NULL
18927 && S_IS_DEFINED (fixP->fx_addsy)
18928 && ! THUMB_IS_FUNC (fixP->fx_addsy))
6c43fab6 18929 {
c19d1205 18930 fixP->fx_addsy = find_real_start (fixP->fx_addsy);
6c43fab6 18931 }
c19d1205
ZW
18932}
18933#endif
6c43fab6 18934
c19d1205
ZW
18935int
18936arm_force_relocation (struct fix * fixp)
18937{
18938#if defined (OBJ_COFF) && defined (TE_PE)
18939 if (fixp->fx_r_type == BFD_RELOC_RVA)
18940 return 1;
18941#endif
6c43fab6 18942
c19d1205
ZW
18943 /* Resolve these relocations even if the symbol is extern or weak. */
18944 if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
18945 || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
0110f2b8 18946 || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
16805f35 18947 || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
0110f2b8
PB
18948 || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
18949 || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
18950 || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12)
c19d1205 18951 return 0;
a737bd4d 18952
4962c51a
MS
18953 /* Always leave these relocations for the linker. */
18954 if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
18955 && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
18956 || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
18957 return 1;
18958
c19d1205 18959 return generic_force_reloc (fixp);
404ff6b5
AH
18960}
18961
c19d1205 18962#ifdef OBJ_COFF
c19d1205
ZW
18963bfd_boolean
18964arm_fix_adjustable (fixS * fixP)
404ff6b5 18965{
337ff0a5
NC
18966 /* This is a little hack to help the gas/arm/adrl.s test. It prevents
18967 local labels from being added to the output symbol table when they
18968 are used with the ADRL pseudo op. The ADRL relocation should always
18969 be resolved before the binbary is emitted, so it is safe to say that
18970 it is adjustable. */
c19d1205
ZW
18971 if (fixP->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE)
18972 return 1;
337ff0a5
NC
18973
18974 /* This is a hack for the gas/all/redef2.s test. This test causes symbols
18975 to be cloned, and without this test relocs would still be generated
6e0080dd 18976 against the original, pre-cloned symbol. Such symbols would not appear
337ff0a5
NC
18977 in the symbol table however, and so a valid reloc could not be
18978 generated. So check to see if the fixup is against a symbol which has
18979 been removed from the symbol chain, and if it is, then allow it to be
18980 adjusted into a reloc against a section symbol. */
6e0080dd
NC
18981 if (fixP->fx_addsy != NULL
18982 && ! S_IS_LOCAL (fixP->fx_addsy)
18983 && symbol_next (fixP->fx_addsy) == NULL
18984 && symbol_next (fixP->fx_addsy) == symbol_previous (fixP->fx_addsy))
18985 return 1;
337ff0a5 18986
c19d1205 18987 return 0;
404ff6b5 18988}
c19d1205 18989#endif
404ff6b5 18990
c19d1205 18991#ifdef OBJ_ELF
e28387c3
PB
18992/* Relocations against function names must be left unadjusted,
18993 so that the linker can use this information to generate interworking
18994 stubs. The MIPS version of this function
c19d1205
ZW
18995 also prevents relocations that are mips-16 specific, but I do not
18996 know why it does this.
404ff6b5 18997
c19d1205
ZW
18998 FIXME:
18999 There is one other problem that ought to be addressed here, but
19000 which currently is not: Taking the address of a label (rather
19001 than a function) and then later jumping to that address. Such
19002 addresses also ought to have their bottom bit set (assuming that
19003 they reside in Thumb code), but at the moment they will not. */
404ff6b5 19004
c19d1205
ZW
19005bfd_boolean
19006arm_fix_adjustable (fixS * fixP)
404ff6b5 19007{
c19d1205
ZW
19008 if (fixP->fx_addsy == NULL)
19009 return 1;
404ff6b5 19010
e28387c3
PB
19011 /* Preserve relocations against symbols with function type. */
19012 if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
19013 return 0;
19014
c19d1205
ZW
19015 if (THUMB_IS_FUNC (fixP->fx_addsy)
19016 && fixP->fx_subsy == NULL)
19017 return 0;
a737bd4d 19018
c19d1205
ZW
19019 /* We need the symbol name for the VTABLE entries. */
19020 if ( fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
19021 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
19022 return 0;
404ff6b5 19023
c19d1205
ZW
19024 /* Don't allow symbols to be discarded on GOT related relocs. */
19025 if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
19026 || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
19027 || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
19028 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
19029 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
19030 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
19031 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
19032 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
19033 || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
19034 return 0;
a737bd4d 19035
4962c51a
MS
19036 /* Similarly for group relocations. */
19037 if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
19038 && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
19039 || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
19040 return 0;
19041
c19d1205 19042 return 1;
a737bd4d 19043}
404ff6b5 19044
c19d1205
ZW
19045const char *
19046elf32_arm_target_format (void)
404ff6b5 19047{
c19d1205
ZW
19048#ifdef TE_SYMBIAN
19049 return (target_big_endian
19050 ? "elf32-bigarm-symbian"
19051 : "elf32-littlearm-symbian");
19052#elif defined (TE_VXWORKS)
19053 return (target_big_endian
19054 ? "elf32-bigarm-vxworks"
19055 : "elf32-littlearm-vxworks");
19056#else
19057 if (target_big_endian)
19058 return "elf32-bigarm";
19059 else
19060 return "elf32-littlearm";
19061#endif
404ff6b5
AH
19062}
19063
c19d1205
ZW
19064void
19065armelf_frob_symbol (symbolS * symp,
19066 int * puntp)
404ff6b5 19067{
c19d1205
ZW
19068 elf_frob_symbol (symp, puntp);
19069}
19070#endif
404ff6b5 19071
c19d1205 19072/* MD interface: Finalization. */
a737bd4d 19073
c19d1205
ZW
19074/* A good place to do this, although this was probably not intended
19075 for this kind of use. We need to dump the literal pool before
19076 references are made to a null symbol pointer. */
a737bd4d 19077
c19d1205
ZW
19078void
19079arm_cleanup (void)
19080{
19081 literal_pool * pool;
a737bd4d 19082
c19d1205
ZW
19083 for (pool = list_of_pools; pool; pool = pool->next)
19084 {
19085 /* Put it at the end of the relevent section. */
19086 subseg_set (pool->section, pool->sub_section);
19087#ifdef OBJ_ELF
19088 arm_elf_change_section ();
19089#endif
19090 s_ltorg (0);
19091 }
404ff6b5
AH
19092}
19093
c19d1205
ZW
19094/* Adjust the symbol table. This marks Thumb symbols as distinct from
19095 ARM ones. */
404ff6b5 19096
c19d1205
ZW
19097void
19098arm_adjust_symtab (void)
404ff6b5 19099{
c19d1205
ZW
19100#ifdef OBJ_COFF
19101 symbolS * sym;
404ff6b5 19102
c19d1205
ZW
19103 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
19104 {
19105 if (ARM_IS_THUMB (sym))
19106 {
19107 if (THUMB_IS_FUNC (sym))
19108 {
19109 /* Mark the symbol as a Thumb function. */
19110 if ( S_GET_STORAGE_CLASS (sym) == C_STAT
19111 || S_GET_STORAGE_CLASS (sym) == C_LABEL) /* This can happen! */
19112 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
404ff6b5 19113
c19d1205
ZW
19114 else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
19115 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
19116 else
19117 as_bad (_("%s: unexpected function type: %d"),
19118 S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
19119 }
19120 else switch (S_GET_STORAGE_CLASS (sym))
19121 {
19122 case C_EXT:
19123 S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
19124 break;
19125 case C_STAT:
19126 S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
19127 break;
19128 case C_LABEL:
19129 S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
19130 break;
19131 default:
19132 /* Do nothing. */
19133 break;
19134 }
19135 }
a737bd4d 19136
c19d1205
ZW
19137 if (ARM_IS_INTERWORK (sym))
19138 coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
404ff6b5 19139 }
c19d1205
ZW
19140#endif
19141#ifdef OBJ_ELF
19142 symbolS * sym;
19143 char bind;
404ff6b5 19144
c19d1205 19145 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
404ff6b5 19146 {
c19d1205
ZW
19147 if (ARM_IS_THUMB (sym))
19148 {
19149 elf_symbol_type * elf_sym;
404ff6b5 19150
c19d1205
ZW
19151 elf_sym = elf_symbol (symbol_get_bfdsym (sym));
19152 bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
404ff6b5 19153
b0796911
PB
19154 if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
19155 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
c19d1205
ZW
19156 {
19157 /* If it's a .thumb_func, declare it as so,
19158 otherwise tag label as .code 16. */
19159 if (THUMB_IS_FUNC (sym))
19160 elf_sym->internal_elf_sym.st_info =
19161 ELF_ST_INFO (bind, STT_ARM_TFUNC);
3ba67470 19162 else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
c19d1205
ZW
19163 elf_sym->internal_elf_sym.st_info =
19164 ELF_ST_INFO (bind, STT_ARM_16BIT);
19165 }
19166 }
19167 }
19168#endif
404ff6b5
AH
19169}
19170
c19d1205 19171/* MD interface: Initialization. */
404ff6b5 19172
a737bd4d 19173static void
c19d1205 19174set_constant_flonums (void)
a737bd4d 19175{
c19d1205 19176 int i;
404ff6b5 19177
c19d1205
ZW
19178 for (i = 0; i < NUM_FLOAT_VALS; i++)
19179 if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
19180 abort ();
a737bd4d 19181}
404ff6b5 19182
3e9e4fcf
JB
19183/* Auto-select Thumb mode if it's the only available instruction set for the
19184 given architecture. */
19185
19186static void
19187autoselect_thumb_from_cpu_variant (void)
19188{
19189 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
19190 opcode_select (16);
19191}
19192
c19d1205
ZW
19193void
19194md_begin (void)
a737bd4d 19195{
c19d1205
ZW
19196 unsigned mach;
19197 unsigned int i;
404ff6b5 19198
c19d1205
ZW
19199 if ( (arm_ops_hsh = hash_new ()) == NULL
19200 || (arm_cond_hsh = hash_new ()) == NULL
19201 || (arm_shift_hsh = hash_new ()) == NULL
19202 || (arm_psr_hsh = hash_new ()) == NULL
62b3e311 19203 || (arm_v7m_psr_hsh = hash_new ()) == NULL
c19d1205 19204 || (arm_reg_hsh = hash_new ()) == NULL
62b3e311
PB
19205 || (arm_reloc_hsh = hash_new ()) == NULL
19206 || (arm_barrier_opt_hsh = hash_new ()) == NULL)
c19d1205
ZW
19207 as_fatal (_("virtual memory exhausted"));
19208
19209 for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
19210 hash_insert (arm_ops_hsh, insns[i].template, (PTR) (insns + i));
19211 for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
19212 hash_insert (arm_cond_hsh, conds[i].template, (PTR) (conds + i));
19213 for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
19214 hash_insert (arm_shift_hsh, shift_names[i].name, (PTR) (shift_names + i));
19215 for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
19216 hash_insert (arm_psr_hsh, psrs[i].template, (PTR) (psrs + i));
62b3e311
PB
19217 for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
19218 hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template, (PTR) (v7m_psrs + i));
c19d1205
ZW
19219 for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
19220 hash_insert (arm_reg_hsh, reg_names[i].name, (PTR) (reg_names + i));
62b3e311
PB
19221 for (i = 0;
19222 i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
19223 i++)
19224 hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template,
19225 (PTR) (barrier_opt_names + i));
c19d1205
ZW
19226#ifdef OBJ_ELF
19227 for (i = 0; i < sizeof (reloc_names) / sizeof (struct reloc_entry); i++)
19228 hash_insert (arm_reloc_hsh, reloc_names[i].name, (PTR) (reloc_names + i));
19229#endif
19230
19231 set_constant_flonums ();
404ff6b5 19232
c19d1205
ZW
19233 /* Set the cpu variant based on the command-line options. We prefer
19234 -mcpu= over -march= if both are set (as for GCC); and we prefer
19235 -mfpu= over any other way of setting the floating point unit.
19236 Use of legacy options with new options are faulted. */
e74cfd16 19237 if (legacy_cpu)
404ff6b5 19238 {
e74cfd16 19239 if (mcpu_cpu_opt || march_cpu_opt)
c19d1205
ZW
19240 as_bad (_("use of old and new-style options to set CPU type"));
19241
19242 mcpu_cpu_opt = legacy_cpu;
404ff6b5 19243 }
e74cfd16 19244 else if (!mcpu_cpu_opt)
c19d1205 19245 mcpu_cpu_opt = march_cpu_opt;
404ff6b5 19246
e74cfd16 19247 if (legacy_fpu)
c19d1205 19248 {
e74cfd16 19249 if (mfpu_opt)
c19d1205 19250 as_bad (_("use of old and new-style options to set FPU type"));
03b1477f
RE
19251
19252 mfpu_opt = legacy_fpu;
19253 }
e74cfd16 19254 else if (!mfpu_opt)
03b1477f 19255 {
c19d1205 19256#if !(defined (TE_LINUX) || defined (TE_NetBSD) || defined (TE_VXWORKS))
39c2da32
RE
19257 /* Some environments specify a default FPU. If they don't, infer it
19258 from the processor. */
e74cfd16 19259 if (mcpu_fpu_opt)
03b1477f
RE
19260 mfpu_opt = mcpu_fpu_opt;
19261 else
19262 mfpu_opt = march_fpu_opt;
39c2da32 19263#else
e74cfd16 19264 mfpu_opt = &fpu_default;
39c2da32 19265#endif
03b1477f
RE
19266 }
19267
e74cfd16 19268 if (!mfpu_opt)
03b1477f 19269 {
e74cfd16
PB
19270 if (!mcpu_cpu_opt)
19271 mfpu_opt = &fpu_default;
19272 else if (ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
19273 mfpu_opt = &fpu_arch_vfp_v2;
03b1477f 19274 else
e74cfd16 19275 mfpu_opt = &fpu_arch_fpa;
03b1477f
RE
19276 }
19277
ee065d83 19278#ifdef CPU_DEFAULT
e74cfd16 19279 if (!mcpu_cpu_opt)
ee065d83 19280 {
e74cfd16
PB
19281 mcpu_cpu_opt = &cpu_default;
19282 selected_cpu = cpu_default;
ee065d83 19283 }
e74cfd16
PB
19284#else
19285 if (mcpu_cpu_opt)
19286 selected_cpu = *mcpu_cpu_opt;
ee065d83 19287 else
e74cfd16 19288 mcpu_cpu_opt = &arm_arch_any;
ee065d83 19289#endif
03b1477f 19290
e74cfd16 19291 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
03b1477f 19292
3e9e4fcf
JB
19293 autoselect_thumb_from_cpu_variant ();
19294
e74cfd16 19295 arm_arch_used = thumb_arch_used = arm_arch_none;
ee065d83 19296
f17c130b 19297#if defined OBJ_COFF || defined OBJ_ELF
b99bd4ef 19298 {
7cc69913
NC
19299 unsigned int flags = 0;
19300
19301#if defined OBJ_ELF
19302 flags = meabi_flags;
d507cf36
PB
19303
19304 switch (meabi_flags)
33a392fb 19305 {
d507cf36 19306 case EF_ARM_EABI_UNKNOWN:
7cc69913 19307#endif
d507cf36
PB
19308 /* Set the flags in the private structure. */
19309 if (uses_apcs_26) flags |= F_APCS26;
19310 if (support_interwork) flags |= F_INTERWORK;
19311 if (uses_apcs_float) flags |= F_APCS_FLOAT;
c19d1205 19312 if (pic_code) flags |= F_PIC;
e74cfd16 19313 if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
7cc69913
NC
19314 flags |= F_SOFT_FLOAT;
19315
d507cf36
PB
19316 switch (mfloat_abi_opt)
19317 {
19318 case ARM_FLOAT_ABI_SOFT:
19319 case ARM_FLOAT_ABI_SOFTFP:
19320 flags |= F_SOFT_FLOAT;
19321 break;
33a392fb 19322
d507cf36
PB
19323 case ARM_FLOAT_ABI_HARD:
19324 if (flags & F_SOFT_FLOAT)
19325 as_bad (_("hard-float conflicts with specified fpu"));
19326 break;
19327 }
03b1477f 19328
e74cfd16
PB
19329 /* Using pure-endian doubles (even if soft-float). */
19330 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
7cc69913 19331 flags |= F_VFP_FLOAT;
f17c130b 19332
fde78edd 19333#if defined OBJ_ELF
e74cfd16 19334 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
d507cf36 19335 flags |= EF_ARM_MAVERICK_FLOAT;
d507cf36
PB
19336 break;
19337
8cb51566 19338 case EF_ARM_EABI_VER4:
3a4a14e9 19339 case EF_ARM_EABI_VER5:
c19d1205 19340 /* No additional flags to set. */
d507cf36
PB
19341 break;
19342
19343 default:
19344 abort ();
19345 }
7cc69913 19346#endif
b99bd4ef
NC
19347 bfd_set_private_flags (stdoutput, flags);
19348
19349 /* We have run out flags in the COFF header to encode the
19350 status of ATPCS support, so instead we create a dummy,
c19d1205 19351 empty, debug section called .arm.atpcs. */
b99bd4ef
NC
19352 if (atpcs)
19353 {
19354 asection * sec;
19355
19356 sec = bfd_make_section (stdoutput, ".arm.atpcs");
19357
19358 if (sec != NULL)
19359 {
19360 bfd_set_section_flags
19361 (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
19362 bfd_set_section_size (stdoutput, sec, 0);
19363 bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
19364 }
19365 }
7cc69913 19366 }
f17c130b 19367#endif
b99bd4ef
NC
19368
19369 /* Record the CPU type as well. */
2d447fca
JM
19370 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
19371 mach = bfd_mach_arm_iWMMXt2;
19372 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
e16bb312 19373 mach = bfd_mach_arm_iWMMXt;
e74cfd16 19374 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
b99bd4ef 19375 mach = bfd_mach_arm_XScale;
e74cfd16 19376 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
fde78edd 19377 mach = bfd_mach_arm_ep9312;
e74cfd16 19378 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
b99bd4ef 19379 mach = bfd_mach_arm_5TE;
e74cfd16 19380 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
b99bd4ef 19381 {
e74cfd16 19382 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
b99bd4ef
NC
19383 mach = bfd_mach_arm_5T;
19384 else
19385 mach = bfd_mach_arm_5;
19386 }
e74cfd16 19387 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
b99bd4ef 19388 {
e74cfd16 19389 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
b99bd4ef
NC
19390 mach = bfd_mach_arm_4T;
19391 else
19392 mach = bfd_mach_arm_4;
19393 }
e74cfd16 19394 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
b99bd4ef 19395 mach = bfd_mach_arm_3M;
e74cfd16
PB
19396 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
19397 mach = bfd_mach_arm_3;
19398 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
19399 mach = bfd_mach_arm_2a;
19400 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
19401 mach = bfd_mach_arm_2;
19402 else
19403 mach = bfd_mach_arm_unknown;
b99bd4ef
NC
19404
19405 bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
19406}
19407
c19d1205 19408/* Command line processing. */
b99bd4ef 19409
c19d1205
ZW
19410/* md_parse_option
19411 Invocation line includes a switch not recognized by the base assembler.
19412 See if it's a processor-specific option.
b99bd4ef 19413
c19d1205
ZW
19414 This routine is somewhat complicated by the need for backwards
19415 compatibility (since older releases of gcc can't be changed).
19416 The new options try to make the interface as compatible as
19417 possible with GCC.
b99bd4ef 19418
c19d1205 19419 New options (supported) are:
b99bd4ef 19420
c19d1205
ZW
19421 -mcpu=<cpu name> Assemble for selected processor
19422 -march=<architecture name> Assemble for selected architecture
19423 -mfpu=<fpu architecture> Assemble for selected FPU.
19424 -EB/-mbig-endian Big-endian
19425 -EL/-mlittle-endian Little-endian
19426 -k Generate PIC code
19427 -mthumb Start in Thumb mode
19428 -mthumb-interwork Code supports ARM/Thumb interworking
b99bd4ef 19429
c19d1205 19430 For now we will also provide support for:
b99bd4ef 19431
c19d1205
ZW
19432 -mapcs-32 32-bit Program counter
19433 -mapcs-26 26-bit Program counter
19434 -macps-float Floats passed in FP registers
19435 -mapcs-reentrant Reentrant code
19436 -matpcs
19437 (sometime these will probably be replaced with -mapcs=<list of options>
19438 and -matpcs=<list of options>)
b99bd4ef 19439
c19d1205
ZW
19440 The remaining options are only supported for back-wards compatibility.
19441 Cpu variants, the arm part is optional:
19442 -m[arm]1 Currently not supported.
19443 -m[arm]2, -m[arm]250 Arm 2 and Arm 250 processor
19444 -m[arm]3 Arm 3 processor
19445 -m[arm]6[xx], Arm 6 processors
19446 -m[arm]7[xx][t][[d]m] Arm 7 processors
19447 -m[arm]8[10] Arm 8 processors
19448 -m[arm]9[20][tdmi] Arm 9 processors
19449 -mstrongarm[110[0]] StrongARM processors
19450 -mxscale XScale processors
19451 -m[arm]v[2345[t[e]]] Arm architectures
19452 -mall All (except the ARM1)
19453 FP variants:
19454 -mfpa10, -mfpa11 FPA10 and 11 co-processor instructions
19455 -mfpe-old (No float load/store multiples)
19456 -mvfpxd VFP Single precision
19457 -mvfp All VFP
19458 -mno-fpu Disable all floating point instructions
b99bd4ef 19459
c19d1205
ZW
19460 The following CPU names are recognized:
19461 arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
19462 arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
19463 arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
19464 arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
19465 arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
19466 arm10t arm10e, arm1020t, arm1020e, arm10200e,
19467 strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
b99bd4ef 19468
c19d1205 19469 */
b99bd4ef 19470
c19d1205 19471const char * md_shortopts = "m:k";
b99bd4ef 19472
c19d1205
ZW
19473#ifdef ARM_BI_ENDIAN
19474#define OPTION_EB (OPTION_MD_BASE + 0)
19475#define OPTION_EL (OPTION_MD_BASE + 1)
b99bd4ef 19476#else
c19d1205
ZW
19477#if TARGET_BYTES_BIG_ENDIAN
19478#define OPTION_EB (OPTION_MD_BASE + 0)
b99bd4ef 19479#else
c19d1205
ZW
19480#define OPTION_EL (OPTION_MD_BASE + 1)
19481#endif
b99bd4ef 19482#endif
b99bd4ef 19483
c19d1205 19484struct option md_longopts[] =
b99bd4ef 19485{
c19d1205
ZW
19486#ifdef OPTION_EB
19487 {"EB", no_argument, NULL, OPTION_EB},
19488#endif
19489#ifdef OPTION_EL
19490 {"EL", no_argument, NULL, OPTION_EL},
b99bd4ef 19491#endif
c19d1205
ZW
19492 {NULL, no_argument, NULL, 0}
19493};
b99bd4ef 19494
c19d1205 19495size_t md_longopts_size = sizeof (md_longopts);
b99bd4ef 19496
c19d1205 19497struct arm_option_table
b99bd4ef 19498{
c19d1205
ZW
19499 char *option; /* Option name to match. */
19500 char *help; /* Help information. */
19501 int *var; /* Variable to change. */
19502 int value; /* What to change it to. */
19503 char *deprecated; /* If non-null, print this message. */
19504};
b99bd4ef 19505
c19d1205
ZW
19506struct arm_option_table arm_opts[] =
19507{
19508 {"k", N_("generate PIC code"), &pic_code, 1, NULL},
19509 {"mthumb", N_("assemble Thumb code"), &thumb_mode, 1, NULL},
19510 {"mthumb-interwork", N_("support ARM/Thumb interworking"),
19511 &support_interwork, 1, NULL},
19512 {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
19513 {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
19514 {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
19515 1, NULL},
19516 {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
19517 {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
19518 {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
19519 {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
19520 NULL},
b99bd4ef 19521
c19d1205
ZW
19522 /* These are recognized by the assembler, but have no affect on code. */
19523 {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
19524 {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
e74cfd16
PB
19525 {NULL, NULL, NULL, 0, NULL}
19526};
19527
19528struct arm_legacy_option_table
19529{
19530 char *option; /* Option name to match. */
19531 const arm_feature_set **var; /* Variable to change. */
19532 const arm_feature_set value; /* What to change it to. */
19533 char *deprecated; /* If non-null, print this message. */
19534};
b99bd4ef 19535
e74cfd16
PB
19536const struct arm_legacy_option_table arm_legacy_opts[] =
19537{
c19d1205
ZW
19538 /* DON'T add any new processors to this list -- we want the whole list
19539 to go away... Add them to the processors table instead. */
e74cfd16
PB
19540 {"marm1", &legacy_cpu, ARM_ARCH_V1, N_("use -mcpu=arm1")},
19541 {"m1", &legacy_cpu, ARM_ARCH_V1, N_("use -mcpu=arm1")},
19542 {"marm2", &legacy_cpu, ARM_ARCH_V2, N_("use -mcpu=arm2")},
19543 {"m2", &legacy_cpu, ARM_ARCH_V2, N_("use -mcpu=arm2")},
19544 {"marm250", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
19545 {"m250", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
19546 {"marm3", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
19547 {"m3", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
19548 {"marm6", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm6")},
19549 {"m6", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm6")},
19550 {"marm600", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm600")},
19551 {"m600", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm600")},
19552 {"marm610", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm610")},
19553 {"m610", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm610")},
19554 {"marm620", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm620")},
19555 {"m620", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm620")},
19556 {"marm7", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7")},
19557 {"m7", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7")},
19558 {"marm70", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm70")},
19559 {"m70", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm70")},
19560 {"marm700", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700")},
19561 {"m700", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700")},
19562 {"marm700i", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700i")},
19563 {"m700i", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700i")},
19564 {"marm710", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710")},
19565 {"m710", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710")},
19566 {"marm710c", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710c")},
19567 {"m710c", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710c")},
19568 {"marm720", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm720")},
19569 {"m720", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm720")},
19570 {"marm7d", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7d")},
19571 {"m7d", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7d")},
19572 {"marm7di", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7di")},
19573 {"m7di", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7di")},
19574 {"marm7m", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
19575 {"m7m", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
19576 {"marm7dm", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
19577 {"m7dm", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
19578 {"marm7dmi", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
19579 {"m7dmi", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
19580 {"marm7100", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7100")},
19581 {"m7100", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7100")},
19582 {"marm7500", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500")},
19583 {"m7500", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500")},
19584 {"marm7500fe", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500fe")},
19585 {"m7500fe", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500fe")},
19586 {"marm7t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
19587 {"m7t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
19588 {"marm7tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
19589 {"m7tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
19590 {"marm710t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
19591 {"m710t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
19592 {"marm720t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
19593 {"m720t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
19594 {"marm740t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
19595 {"m740t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
19596 {"marm8", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm8")},
19597 {"m8", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm8")},
19598 {"marm810", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm810")},
19599 {"m810", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm810")},
19600 {"marm9", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
19601 {"m9", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
19602 {"marm9tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
19603 {"m9tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
19604 {"marm920", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
19605 {"m920", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
19606 {"marm940", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
19607 {"m940", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
19608 {"mstrongarm", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=strongarm")},
19609 {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
c19d1205 19610 N_("use -mcpu=strongarm110")},
e74cfd16 19611 {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
c19d1205 19612 N_("use -mcpu=strongarm1100")},
e74cfd16 19613 {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
c19d1205 19614 N_("use -mcpu=strongarm1110")},
e74cfd16
PB
19615 {"mxscale", &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
19616 {"miwmmxt", &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
19617 {"mall", &legacy_cpu, ARM_ANY, N_("use -mcpu=all")},
7ed4c4c5 19618
c19d1205 19619 /* Architecture variants -- don't add any more to this list either. */
e74cfd16
PB
19620 {"mv2", &legacy_cpu, ARM_ARCH_V2, N_("use -march=armv2")},
19621 {"marmv2", &legacy_cpu, ARM_ARCH_V2, N_("use -march=armv2")},
19622 {"mv2a", &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
19623 {"marmv2a", &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
19624 {"mv3", &legacy_cpu, ARM_ARCH_V3, N_("use -march=armv3")},
19625 {"marmv3", &legacy_cpu, ARM_ARCH_V3, N_("use -march=armv3")},
19626 {"mv3m", &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
19627 {"marmv3m", &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
19628 {"mv4", &legacy_cpu, ARM_ARCH_V4, N_("use -march=armv4")},
19629 {"marmv4", &legacy_cpu, ARM_ARCH_V4, N_("use -march=armv4")},
19630 {"mv4t", &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
19631 {"marmv4t", &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
19632 {"mv5", &legacy_cpu, ARM_ARCH_V5, N_("use -march=armv5")},
19633 {"marmv5", &legacy_cpu, ARM_ARCH_V5, N_("use -march=armv5")},
19634 {"mv5t", &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
19635 {"marmv5t", &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
19636 {"mv5e", &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
19637 {"marmv5e", &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
7ed4c4c5 19638
c19d1205 19639 /* Floating point variants -- don't add any more to this list either. */
e74cfd16
PB
19640 {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
19641 {"mfpa10", &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
19642 {"mfpa11", &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
19643 {"mno-fpu", &legacy_fpu, ARM_ARCH_NONE,
c19d1205 19644 N_("use either -mfpu=softfpa or -mfpu=softvfp")},
7ed4c4c5 19645
e74cfd16 19646 {NULL, NULL, ARM_ARCH_NONE, NULL}
c19d1205 19647};
7ed4c4c5 19648
c19d1205 19649struct arm_cpu_option_table
7ed4c4c5 19650{
c19d1205 19651 char *name;
e74cfd16 19652 const arm_feature_set value;
c19d1205
ZW
19653 /* For some CPUs we assume an FPU unless the user explicitly sets
19654 -mfpu=... */
e74cfd16 19655 const arm_feature_set default_fpu;
ee065d83
PB
19656 /* The canonical name of the CPU, or NULL to use NAME converted to upper
19657 case. */
19658 const char *canonical_name;
c19d1205 19659};
7ed4c4c5 19660
c19d1205
ZW
19661/* This list should, at a minimum, contain all the cpu names
19662 recognized by GCC. */
e74cfd16 19663static const struct arm_cpu_option_table arm_cpus[] =
c19d1205 19664{
ee065d83
PB
19665 {"all", ARM_ANY, FPU_ARCH_FPA, NULL},
19666 {"arm1", ARM_ARCH_V1, FPU_ARCH_FPA, NULL},
19667 {"arm2", ARM_ARCH_V2, FPU_ARCH_FPA, NULL},
19668 {"arm250", ARM_ARCH_V2S, FPU_ARCH_FPA, NULL},
19669 {"arm3", ARM_ARCH_V2S, FPU_ARCH_FPA, NULL},
19670 {"arm6", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19671 {"arm60", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19672 {"arm600", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19673 {"arm610", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19674 {"arm620", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19675 {"arm7", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19676 {"arm7m", ARM_ARCH_V3M, FPU_ARCH_FPA, NULL},
19677 {"arm7d", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19678 {"arm7dm", ARM_ARCH_V3M, FPU_ARCH_FPA, NULL},
19679 {"arm7di", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19680 {"arm7dmi", ARM_ARCH_V3M, FPU_ARCH_FPA, NULL},
19681 {"arm70", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19682 {"arm700", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19683 {"arm700i", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19684 {"arm710", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19685 {"arm710t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
19686 {"arm720", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19687 {"arm720t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
19688 {"arm740t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
19689 {"arm710c", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19690 {"arm7100", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19691 {"arm7500", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19692 {"arm7500fe", ARM_ARCH_V3, FPU_ARCH_FPA, NULL},
19693 {"arm7t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
19694 {"arm7tdmi", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
19695 {"arm7tdmi-s", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
19696 {"arm8", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
19697 {"arm810", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
19698 {"strongarm", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
19699 {"strongarm1", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
19700 {"strongarm110", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
19701 {"strongarm1100", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
19702 {"strongarm1110", ARM_ARCH_V4, FPU_ARCH_FPA, NULL},
19703 {"arm9", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
19704 {"arm920", ARM_ARCH_V4T, FPU_ARCH_FPA, "ARM920T"},
19705 {"arm920t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
19706 {"arm922t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
19707 {"arm940t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
19708 {"arm9tdmi", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL},
c19d1205
ZW
19709 /* For V5 or later processors we default to using VFP; but the user
19710 should really set the FPU type explicitly. */
ee065d83
PB
19711 {"arm9e-r0", ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
19712 {"arm9e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
19713 {"arm926ej", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, "ARM926EJ-S"},
19714 {"arm926ejs", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, "ARM926EJ-S"},
19715 {"arm926ej-s", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, NULL},
19716 {"arm946e-r0", ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
19717 {"arm946e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM946E-S"},
19718 {"arm946e-s", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
19719 {"arm966e-r0", ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL},
19720 {"arm966e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM966E-S"},
19721 {"arm966e-s", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
19722 {"arm968e-s", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
19723 {"arm10t", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL},
19724 {"arm10tdmi", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL},
19725 {"arm10e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
19726 {"arm1020", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM1020E"},
19727 {"arm1020t", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL},
19728 {"arm1020e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
19729 {"arm1022e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL},
19730 {"arm1026ejs", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, "ARM1026EJ-S"},
19731 {"arm1026ej-s", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, NULL},
19732 {"arm1136js", ARM_ARCH_V6, FPU_NONE, "ARM1136J-S"},
19733 {"arm1136j-s", ARM_ARCH_V6, FPU_NONE, NULL},
19734 {"arm1136jfs", ARM_ARCH_V6, FPU_ARCH_VFP_V2, "ARM1136JF-S"},
19735 {"arm1136jf-s", ARM_ARCH_V6, FPU_ARCH_VFP_V2, NULL},
19736 {"mpcore", ARM_ARCH_V6K, FPU_ARCH_VFP_V2, NULL},
19737 {"mpcorenovfp", ARM_ARCH_V6K, FPU_NONE, NULL},
19738 {"arm1156t2-s", ARM_ARCH_V6T2, FPU_NONE, NULL},
19739 {"arm1156t2f-s", ARM_ARCH_V6T2, FPU_ARCH_VFP_V2, NULL},
19740 {"arm1176jz-s", ARM_ARCH_V6ZK, FPU_NONE, NULL},
19741 {"arm1176jzf-s", ARM_ARCH_V6ZK, FPU_ARCH_VFP_V2, NULL},
5287ad62
JB
19742 {"cortex-a8", ARM_ARCH_V7A, ARM_FEATURE(0, FPU_VFP_V3
19743 | FPU_NEON_EXT_V1),
19744 NULL},
62b3e311
PB
19745 {"cortex-r4", ARM_ARCH_V7R, FPU_NONE, NULL},
19746 {"cortex-m3", ARM_ARCH_V7M, FPU_NONE, NULL},
c19d1205 19747 /* ??? XSCALE is really an architecture. */
ee065d83 19748 {"xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL},
c19d1205 19749 /* ??? iwmmxt is not a processor. */
ee065d83 19750 {"iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL},
2d447fca 19751 {"iwmmxt2", ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL},
ee065d83 19752 {"i80200", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL},
c19d1205 19753 /* Maverick */
e74cfd16
PB
19754 {"ep9312", ARM_FEATURE(ARM_AEXT_V4T, ARM_CEXT_MAVERICK), FPU_ARCH_MAVERICK, "ARM920T"},
19755 {NULL, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL}
c19d1205 19756};
7ed4c4c5 19757
c19d1205 19758struct arm_arch_option_table
7ed4c4c5 19759{
c19d1205 19760 char *name;
e74cfd16
PB
19761 const arm_feature_set value;
19762 const arm_feature_set default_fpu;
c19d1205 19763};
7ed4c4c5 19764
c19d1205
ZW
19765/* This list should, at a minimum, contain all the architecture names
19766 recognized by GCC. */
e74cfd16 19767static const struct arm_arch_option_table arm_archs[] =
c19d1205
ZW
19768{
19769 {"all", ARM_ANY, FPU_ARCH_FPA},
19770 {"armv1", ARM_ARCH_V1, FPU_ARCH_FPA},
19771 {"armv2", ARM_ARCH_V2, FPU_ARCH_FPA},
19772 {"armv2a", ARM_ARCH_V2S, FPU_ARCH_FPA},
19773 {"armv2s", ARM_ARCH_V2S, FPU_ARCH_FPA},
19774 {"armv3", ARM_ARCH_V3, FPU_ARCH_FPA},
19775 {"armv3m", ARM_ARCH_V3M, FPU_ARCH_FPA},
19776 {"armv4", ARM_ARCH_V4, FPU_ARCH_FPA},
19777 {"armv4xm", ARM_ARCH_V4xM, FPU_ARCH_FPA},
19778 {"armv4t", ARM_ARCH_V4T, FPU_ARCH_FPA},
19779 {"armv4txm", ARM_ARCH_V4TxM, FPU_ARCH_FPA},
19780 {"armv5", ARM_ARCH_V5, FPU_ARCH_VFP},
19781 {"armv5t", ARM_ARCH_V5T, FPU_ARCH_VFP},
19782 {"armv5txm", ARM_ARCH_V5TxM, FPU_ARCH_VFP},
19783 {"armv5te", ARM_ARCH_V5TE, FPU_ARCH_VFP},
19784 {"armv5texp", ARM_ARCH_V5TExP, FPU_ARCH_VFP},
19785 {"armv5tej", ARM_ARCH_V5TEJ, FPU_ARCH_VFP},
19786 {"armv6", ARM_ARCH_V6, FPU_ARCH_VFP},
19787 {"armv6j", ARM_ARCH_V6, FPU_ARCH_VFP},
19788 {"armv6k", ARM_ARCH_V6K, FPU_ARCH_VFP},
19789 {"armv6z", ARM_ARCH_V6Z, FPU_ARCH_VFP},
19790 {"armv6zk", ARM_ARCH_V6ZK, FPU_ARCH_VFP},
19791 {"armv6t2", ARM_ARCH_V6T2, FPU_ARCH_VFP},
19792 {"armv6kt2", ARM_ARCH_V6KT2, FPU_ARCH_VFP},
19793 {"armv6zt2", ARM_ARCH_V6ZT2, FPU_ARCH_VFP},
19794 {"armv6zkt2", ARM_ARCH_V6ZKT2, FPU_ARCH_VFP},
62b3e311
PB
19795 {"armv7", ARM_ARCH_V7, FPU_ARCH_VFP},
19796 {"armv7a", ARM_ARCH_V7A, FPU_ARCH_VFP},
19797 {"armv7r", ARM_ARCH_V7R, FPU_ARCH_VFP},
19798 {"armv7m", ARM_ARCH_V7M, FPU_ARCH_VFP},
c19d1205
ZW
19799 {"xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP},
19800 {"iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP},
2d447fca 19801 {"iwmmxt2", ARM_ARCH_IWMMXT2,FPU_ARCH_VFP},
e74cfd16 19802 {NULL, ARM_ARCH_NONE, ARM_ARCH_NONE}
c19d1205 19803};
7ed4c4c5 19804
c19d1205 19805/* ISA extensions in the co-processor space. */
e74cfd16 19806struct arm_option_cpu_value_table
c19d1205
ZW
19807{
19808 char *name;
e74cfd16 19809 const arm_feature_set value;
c19d1205 19810};
7ed4c4c5 19811
e74cfd16 19812static const struct arm_option_cpu_value_table arm_extensions[] =
c19d1205 19813{
e74cfd16
PB
19814 {"maverick", ARM_FEATURE (0, ARM_CEXT_MAVERICK)},
19815 {"xscale", ARM_FEATURE (0, ARM_CEXT_XSCALE)},
19816 {"iwmmxt", ARM_FEATURE (0, ARM_CEXT_IWMMXT)},
2d447fca 19817 {"iwmmxt2", ARM_FEATURE (0, ARM_CEXT_IWMMXT2)},
e74cfd16 19818 {NULL, ARM_ARCH_NONE}
c19d1205 19819};
7ed4c4c5 19820
c19d1205
ZW
19821/* This list should, at a minimum, contain all the fpu names
19822 recognized by GCC. */
e74cfd16 19823static const struct arm_option_cpu_value_table arm_fpus[] =
c19d1205
ZW
19824{
19825 {"softfpa", FPU_NONE},
19826 {"fpe", FPU_ARCH_FPE},
19827 {"fpe2", FPU_ARCH_FPE},
19828 {"fpe3", FPU_ARCH_FPA}, /* Third release supports LFM/SFM. */
19829 {"fpa", FPU_ARCH_FPA},
19830 {"fpa10", FPU_ARCH_FPA},
19831 {"fpa11", FPU_ARCH_FPA},
19832 {"arm7500fe", FPU_ARCH_FPA},
19833 {"softvfp", FPU_ARCH_VFP},
19834 {"softvfp+vfp", FPU_ARCH_VFP_V2},
19835 {"vfp", FPU_ARCH_VFP_V2},
19836 {"vfp9", FPU_ARCH_VFP_V2},
5287ad62 19837 {"vfp3", FPU_ARCH_VFP_V3},
c19d1205
ZW
19838 {"vfp10", FPU_ARCH_VFP_V2},
19839 {"vfp10-r0", FPU_ARCH_VFP_V1},
19840 {"vfpxd", FPU_ARCH_VFP_V1xD},
19841 {"arm1020t", FPU_ARCH_VFP_V1},
19842 {"arm1020e", FPU_ARCH_VFP_V2},
19843 {"arm1136jfs", FPU_ARCH_VFP_V2},
19844 {"arm1136jf-s", FPU_ARCH_VFP_V2},
19845 {"maverick", FPU_ARCH_MAVERICK},
5287ad62 19846 {"neon", FPU_ARCH_VFP_V3_PLUS_NEON_V1},
e74cfd16
PB
19847 {NULL, ARM_ARCH_NONE}
19848};
19849
19850struct arm_option_value_table
19851{
19852 char *name;
19853 long value;
c19d1205 19854};
7ed4c4c5 19855
e74cfd16 19856static const struct arm_option_value_table arm_float_abis[] =
c19d1205
ZW
19857{
19858 {"hard", ARM_FLOAT_ABI_HARD},
19859 {"softfp", ARM_FLOAT_ABI_SOFTFP},
19860 {"soft", ARM_FLOAT_ABI_SOFT},
e74cfd16 19861 {NULL, 0}
c19d1205 19862};
7ed4c4c5 19863
c19d1205 19864#ifdef OBJ_ELF
3a4a14e9 19865/* We only know how to output GNU and ver 4/5 (AAELF) formats. */
e74cfd16 19866static const struct arm_option_value_table arm_eabis[] =
c19d1205
ZW
19867{
19868 {"gnu", EF_ARM_EABI_UNKNOWN},
19869 {"4", EF_ARM_EABI_VER4},
3a4a14e9 19870 {"5", EF_ARM_EABI_VER5},
e74cfd16 19871 {NULL, 0}
c19d1205
ZW
19872};
19873#endif
7ed4c4c5 19874
c19d1205
ZW
19875struct arm_long_option_table
19876{
19877 char * option; /* Substring to match. */
19878 char * help; /* Help information. */
19879 int (* func) (char * subopt); /* Function to decode sub-option. */
19880 char * deprecated; /* If non-null, print this message. */
19881};
7ed4c4c5
NC
19882
19883static int
e74cfd16 19884arm_parse_extension (char * str, const arm_feature_set **opt_p)
7ed4c4c5 19885{
e74cfd16
PB
19886 arm_feature_set *ext_set = xmalloc (sizeof (arm_feature_set));
19887
19888 /* Copy the feature set, so that we can modify it. */
19889 *ext_set = **opt_p;
19890 *opt_p = ext_set;
19891
c19d1205 19892 while (str != NULL && *str != 0)
7ed4c4c5 19893 {
e74cfd16 19894 const struct arm_option_cpu_value_table * opt;
c19d1205
ZW
19895 char * ext;
19896 int optlen;
7ed4c4c5 19897
c19d1205
ZW
19898 if (*str != '+')
19899 {
19900 as_bad (_("invalid architectural extension"));
19901 return 0;
19902 }
7ed4c4c5 19903
c19d1205
ZW
19904 str++;
19905 ext = strchr (str, '+');
7ed4c4c5 19906
c19d1205
ZW
19907 if (ext != NULL)
19908 optlen = ext - str;
19909 else
19910 optlen = strlen (str);
7ed4c4c5 19911
c19d1205
ZW
19912 if (optlen == 0)
19913 {
19914 as_bad (_("missing architectural extension"));
19915 return 0;
19916 }
7ed4c4c5 19917
c19d1205
ZW
19918 for (opt = arm_extensions; opt->name != NULL; opt++)
19919 if (strncmp (opt->name, str, optlen) == 0)
19920 {
e74cfd16 19921 ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
c19d1205
ZW
19922 break;
19923 }
7ed4c4c5 19924
c19d1205
ZW
19925 if (opt->name == NULL)
19926 {
19927 as_bad (_("unknown architectural extnsion `%s'"), str);
19928 return 0;
19929 }
7ed4c4c5 19930
c19d1205
ZW
19931 str = ext;
19932 };
7ed4c4c5 19933
c19d1205
ZW
19934 return 1;
19935}
7ed4c4c5 19936
c19d1205
ZW
19937static int
19938arm_parse_cpu (char * str)
7ed4c4c5 19939{
e74cfd16 19940 const struct arm_cpu_option_table * opt;
c19d1205
ZW
19941 char * ext = strchr (str, '+');
19942 int optlen;
7ed4c4c5 19943
c19d1205
ZW
19944 if (ext != NULL)
19945 optlen = ext - str;
7ed4c4c5 19946 else
c19d1205 19947 optlen = strlen (str);
7ed4c4c5 19948
c19d1205 19949 if (optlen == 0)
7ed4c4c5 19950 {
c19d1205
ZW
19951 as_bad (_("missing cpu name `%s'"), str);
19952 return 0;
7ed4c4c5
NC
19953 }
19954
c19d1205
ZW
19955 for (opt = arm_cpus; opt->name != NULL; opt++)
19956 if (strncmp (opt->name, str, optlen) == 0)
19957 {
e74cfd16
PB
19958 mcpu_cpu_opt = &opt->value;
19959 mcpu_fpu_opt = &opt->default_fpu;
ee065d83
PB
19960 if (opt->canonical_name)
19961 strcpy(selected_cpu_name, opt->canonical_name);
19962 else
19963 {
19964 int i;
19965 for (i = 0; i < optlen; i++)
19966 selected_cpu_name[i] = TOUPPER (opt->name[i]);
19967 selected_cpu_name[i] = 0;
19968 }
7ed4c4c5 19969
c19d1205
ZW
19970 if (ext != NULL)
19971 return arm_parse_extension (ext, &mcpu_cpu_opt);
7ed4c4c5 19972
c19d1205
ZW
19973 return 1;
19974 }
7ed4c4c5 19975
c19d1205
ZW
19976 as_bad (_("unknown cpu `%s'"), str);
19977 return 0;
7ed4c4c5
NC
19978}
19979
c19d1205
ZW
19980static int
19981arm_parse_arch (char * str)
7ed4c4c5 19982{
e74cfd16 19983 const struct arm_arch_option_table *opt;
c19d1205
ZW
19984 char *ext = strchr (str, '+');
19985 int optlen;
7ed4c4c5 19986
c19d1205
ZW
19987 if (ext != NULL)
19988 optlen = ext - str;
7ed4c4c5 19989 else
c19d1205 19990 optlen = strlen (str);
7ed4c4c5 19991
c19d1205 19992 if (optlen == 0)
7ed4c4c5 19993 {
c19d1205
ZW
19994 as_bad (_("missing architecture name `%s'"), str);
19995 return 0;
7ed4c4c5
NC
19996 }
19997
c19d1205
ZW
19998 for (opt = arm_archs; opt->name != NULL; opt++)
19999 if (streq (opt->name, str))
20000 {
e74cfd16
PB
20001 march_cpu_opt = &opt->value;
20002 march_fpu_opt = &opt->default_fpu;
ee065d83 20003 strcpy(selected_cpu_name, opt->name);
7ed4c4c5 20004
c19d1205
ZW
20005 if (ext != NULL)
20006 return arm_parse_extension (ext, &march_cpu_opt);
7ed4c4c5 20007
c19d1205
ZW
20008 return 1;
20009 }
20010
20011 as_bad (_("unknown architecture `%s'\n"), str);
20012 return 0;
7ed4c4c5 20013}
eb043451 20014
c19d1205
ZW
20015static int
20016arm_parse_fpu (char * str)
20017{
e74cfd16 20018 const struct arm_option_cpu_value_table * opt;
b99bd4ef 20019
c19d1205
ZW
20020 for (opt = arm_fpus; opt->name != NULL; opt++)
20021 if (streq (opt->name, str))
20022 {
e74cfd16 20023 mfpu_opt = &opt->value;
c19d1205
ZW
20024 return 1;
20025 }
b99bd4ef 20026
c19d1205
ZW
20027 as_bad (_("unknown floating point format `%s'\n"), str);
20028 return 0;
20029}
20030
20031static int
20032arm_parse_float_abi (char * str)
b99bd4ef 20033{
e74cfd16 20034 const struct arm_option_value_table * opt;
b99bd4ef 20035
c19d1205
ZW
20036 for (opt = arm_float_abis; opt->name != NULL; opt++)
20037 if (streq (opt->name, str))
20038 {
20039 mfloat_abi_opt = opt->value;
20040 return 1;
20041 }
cc8a6dd0 20042
c19d1205
ZW
20043 as_bad (_("unknown floating point abi `%s'\n"), str);
20044 return 0;
20045}
b99bd4ef 20046
c19d1205
ZW
20047#ifdef OBJ_ELF
20048static int
20049arm_parse_eabi (char * str)
20050{
e74cfd16 20051 const struct arm_option_value_table *opt;
cc8a6dd0 20052
c19d1205
ZW
20053 for (opt = arm_eabis; opt->name != NULL; opt++)
20054 if (streq (opt->name, str))
20055 {
20056 meabi_flags = opt->value;
20057 return 1;
20058 }
20059 as_bad (_("unknown EABI `%s'\n"), str);
20060 return 0;
20061}
20062#endif
cc8a6dd0 20063
c19d1205
ZW
20064struct arm_long_option_table arm_long_opts[] =
20065{
20066 {"mcpu=", N_("<cpu name>\t assemble for CPU <cpu name>"),
20067 arm_parse_cpu, NULL},
20068 {"march=", N_("<arch name>\t assemble for architecture <arch name>"),
20069 arm_parse_arch, NULL},
20070 {"mfpu=", N_("<fpu name>\t assemble for FPU architecture <fpu name>"),
20071 arm_parse_fpu, NULL},
20072 {"mfloat-abi=", N_("<abi>\t assemble for floating point ABI <abi>"),
20073 arm_parse_float_abi, NULL},
20074#ifdef OBJ_ELF
20075 {"meabi=", N_("<ver>\t assemble for eabi version <ver>"),
20076 arm_parse_eabi, NULL},
20077#endif
20078 {NULL, NULL, 0, NULL}
20079};
cc8a6dd0 20080
c19d1205
ZW
20081int
20082md_parse_option (int c, char * arg)
20083{
20084 struct arm_option_table *opt;
e74cfd16 20085 const struct arm_legacy_option_table *fopt;
c19d1205 20086 struct arm_long_option_table *lopt;
b99bd4ef 20087
c19d1205 20088 switch (c)
b99bd4ef 20089 {
c19d1205
ZW
20090#ifdef OPTION_EB
20091 case OPTION_EB:
20092 target_big_endian = 1;
20093 break;
20094#endif
cc8a6dd0 20095
c19d1205
ZW
20096#ifdef OPTION_EL
20097 case OPTION_EL:
20098 target_big_endian = 0;
20099 break;
20100#endif
b99bd4ef 20101
c19d1205
ZW
20102 case 'a':
20103 /* Listing option. Just ignore these, we don't support additional
20104 ones. */
20105 return 0;
b99bd4ef 20106
c19d1205
ZW
20107 default:
20108 for (opt = arm_opts; opt->option != NULL; opt++)
20109 {
20110 if (c == opt->option[0]
20111 && ((arg == NULL && opt->option[1] == 0)
20112 || streq (arg, opt->option + 1)))
20113 {
20114#if WARN_DEPRECATED
20115 /* If the option is deprecated, tell the user. */
20116 if (opt->deprecated != NULL)
20117 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
20118 arg ? arg : "", _(opt->deprecated));
20119#endif
b99bd4ef 20120
c19d1205
ZW
20121 if (opt->var != NULL)
20122 *opt->var = opt->value;
cc8a6dd0 20123
c19d1205
ZW
20124 return 1;
20125 }
20126 }
b99bd4ef 20127
e74cfd16
PB
20128 for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
20129 {
20130 if (c == fopt->option[0]
20131 && ((arg == NULL && fopt->option[1] == 0)
20132 || streq (arg, fopt->option + 1)))
20133 {
20134#if WARN_DEPRECATED
20135 /* If the option is deprecated, tell the user. */
20136 if (fopt->deprecated != NULL)
20137 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
20138 arg ? arg : "", _(fopt->deprecated));
20139#endif
20140
20141 if (fopt->var != NULL)
20142 *fopt->var = &fopt->value;
20143
20144 return 1;
20145 }
20146 }
20147
c19d1205
ZW
20148 for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
20149 {
20150 /* These options are expected to have an argument. */
20151 if (c == lopt->option[0]
20152 && arg != NULL
20153 && strncmp (arg, lopt->option + 1,
20154 strlen (lopt->option + 1)) == 0)
20155 {
20156#if WARN_DEPRECATED
20157 /* If the option is deprecated, tell the user. */
20158 if (lopt->deprecated != NULL)
20159 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
20160 _(lopt->deprecated));
20161#endif
b99bd4ef 20162
c19d1205
ZW
20163 /* Call the sup-option parser. */
20164 return lopt->func (arg + strlen (lopt->option) - 1);
20165 }
20166 }
a737bd4d 20167
c19d1205
ZW
20168 return 0;
20169 }
a394c00f 20170
c19d1205
ZW
20171 return 1;
20172}
a394c00f 20173
c19d1205
ZW
20174void
20175md_show_usage (FILE * fp)
a394c00f 20176{
c19d1205
ZW
20177 struct arm_option_table *opt;
20178 struct arm_long_option_table *lopt;
a394c00f 20179
c19d1205 20180 fprintf (fp, _(" ARM-specific assembler options:\n"));
a394c00f 20181
c19d1205
ZW
20182 for (opt = arm_opts; opt->option != NULL; opt++)
20183 if (opt->help != NULL)
20184 fprintf (fp, " -%-23s%s\n", opt->option, _(opt->help));
a394c00f 20185
c19d1205
ZW
20186 for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
20187 if (lopt->help != NULL)
20188 fprintf (fp, " -%s%s\n", lopt->option, _(lopt->help));
a394c00f 20189
c19d1205
ZW
20190#ifdef OPTION_EB
20191 fprintf (fp, _("\
20192 -EB assemble code for a big-endian cpu\n"));
a394c00f
NC
20193#endif
20194
c19d1205
ZW
20195#ifdef OPTION_EL
20196 fprintf (fp, _("\
20197 -EL assemble code for a little-endian cpu\n"));
a737bd4d 20198#endif
c19d1205 20199}
ee065d83
PB
20200
20201
20202#ifdef OBJ_ELF
62b3e311
PB
20203typedef struct
20204{
20205 int val;
20206 arm_feature_set flags;
20207} cpu_arch_ver_table;
20208
20209/* Mapping from CPU features to EABI CPU arch values. Table must be sorted
20210 least features first. */
20211static const cpu_arch_ver_table cpu_arch_ver[] =
20212{
20213 {1, ARM_ARCH_V4},
20214 {2, ARM_ARCH_V4T},
20215 {3, ARM_ARCH_V5},
20216 {4, ARM_ARCH_V5TE},
20217 {5, ARM_ARCH_V5TEJ},
20218 {6, ARM_ARCH_V6},
20219 {7, ARM_ARCH_V6Z},
20220 {8, ARM_ARCH_V6K},
20221 {9, ARM_ARCH_V6T2},
20222 {10, ARM_ARCH_V7A},
20223 {10, ARM_ARCH_V7R},
20224 {10, ARM_ARCH_V7M},
20225 {0, ARM_ARCH_NONE}
20226};
20227
ee065d83
PB
20228/* Set the public EABI object attributes. */
20229static void
20230aeabi_set_public_attributes (void)
20231{
20232 int arch;
e74cfd16 20233 arm_feature_set flags;
62b3e311
PB
20234 arm_feature_set tmp;
20235 const cpu_arch_ver_table *p;
ee065d83
PB
20236
20237 /* Choose the architecture based on the capabilities of the requested cpu
20238 (if any) and/or the instructions actually used. */
e74cfd16
PB
20239 ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
20240 ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
20241 ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
7a1d4c38
PB
20242 /*Allow the user to override the reported architecture. */
20243 if (object_arch)
20244 {
20245 ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
20246 ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
20247 }
20248
62b3e311
PB
20249 tmp = flags;
20250 arch = 0;
20251 for (p = cpu_arch_ver; p->val; p++)
20252 {
20253 if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
20254 {
20255 arch = p->val;
20256 ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
20257 }
20258 }
ee065d83
PB
20259
20260 /* Tag_CPU_name. */
20261 if (selected_cpu_name[0])
20262 {
20263 char *p;
20264
20265 p = selected_cpu_name;
20266 if (strncmp(p, "armv", 4) == 0)
20267 {
20268 int i;
20269
20270 p += 4;
20271 for (i = 0; p[i]; i++)
20272 p[i] = TOUPPER (p[i]);
20273 }
20274 elf32_arm_add_eabi_attr_string (stdoutput, 5, p);
20275 }
20276 /* Tag_CPU_arch. */
20277 elf32_arm_add_eabi_attr_int (stdoutput, 6, arch);
62b3e311
PB
20278 /* Tag_CPU_arch_profile. */
20279 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
20280 elf32_arm_add_eabi_attr_int (stdoutput, 7, 'A');
20281 else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
20282 elf32_arm_add_eabi_attr_int (stdoutput, 7, 'R');
20283 else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m))
20284 elf32_arm_add_eabi_attr_int (stdoutput, 7, 'M');
ee065d83 20285 /* Tag_ARM_ISA_use. */
e74cfd16 20286 if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_full))
ee065d83
PB
20287 elf32_arm_add_eabi_attr_int (stdoutput, 8, 1);
20288 /* Tag_THUMB_ISA_use. */
e74cfd16 20289 if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_full))
ee065d83 20290 elf32_arm_add_eabi_attr_int (stdoutput, 9,
e74cfd16 20291 ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_t2) ? 2 : 1);
ee065d83 20292 /* Tag_VFP_arch. */
5287ad62
JB
20293 if (ARM_CPU_HAS_FEATURE (thumb_arch_used, fpu_vfp_ext_v3)
20294 || ARM_CPU_HAS_FEATURE (arm_arch_used, fpu_vfp_ext_v3))
20295 elf32_arm_add_eabi_attr_int (stdoutput, 10, 3);
20296 else if (ARM_CPU_HAS_FEATURE (thumb_arch_used, fpu_vfp_ext_v2)
20297 || ARM_CPU_HAS_FEATURE (arm_arch_used, fpu_vfp_ext_v2))
ee065d83 20298 elf32_arm_add_eabi_attr_int (stdoutput, 10, 2);
5287ad62
JB
20299 else if (ARM_CPU_HAS_FEATURE (thumb_arch_used, fpu_vfp_ext_v1)
20300 || ARM_CPU_HAS_FEATURE (arm_arch_used, fpu_vfp_ext_v1)
20301 || ARM_CPU_HAS_FEATURE (thumb_arch_used, fpu_vfp_ext_v1xd)
20302 || ARM_CPU_HAS_FEATURE (arm_arch_used, fpu_vfp_ext_v1xd))
ee065d83
PB
20303 elf32_arm_add_eabi_attr_int (stdoutput, 10, 1);
20304 /* Tag_WMMX_arch. */
e74cfd16
PB
20305 if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_cext_iwmmxt)
20306 || ARM_CPU_HAS_FEATURE (arm_arch_used, arm_cext_iwmmxt))
ee065d83 20307 elf32_arm_add_eabi_attr_int (stdoutput, 11, 1);
5287ad62
JB
20308 /* Tag_NEON_arch. */
20309 if (ARM_CPU_HAS_FEATURE (thumb_arch_used, fpu_neon_ext_v1)
20310 || ARM_CPU_HAS_FEATURE (arm_arch_used, fpu_neon_ext_v1))
20311 elf32_arm_add_eabi_attr_int (stdoutput, 12, 1);
ee065d83
PB
20312}
20313
20314/* Add the .ARM.attributes section. */
20315void
20316arm_md_end (void)
20317{
20318 segT s;
20319 char *p;
20320 addressT addr;
20321 offsetT size;
20322
20323 if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
20324 return;
20325
20326 aeabi_set_public_attributes ();
20327 size = elf32_arm_eabi_attr_size (stdoutput);
20328 s = subseg_new (".ARM.attributes", 0);
20329 bfd_set_section_flags (stdoutput, s, SEC_READONLY | SEC_DATA);
20330 addr = frag_now_fix ();
20331 p = frag_more (size);
20332 elf32_arm_set_eabi_attr_contents (stdoutput, (bfd_byte *)p, size);
20333}
8463be01 20334#endif /* OBJ_ELF */
ee065d83
PB
20335
20336
20337/* Parse a .cpu directive. */
20338
20339static void
20340s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
20341{
e74cfd16 20342 const struct arm_cpu_option_table *opt;
ee065d83
PB
20343 char *name;
20344 char saved_char;
20345
20346 name = input_line_pointer;
20347 while (*input_line_pointer && !ISSPACE(*input_line_pointer))
20348 input_line_pointer++;
20349 saved_char = *input_line_pointer;
20350 *input_line_pointer = 0;
20351
20352 /* Skip the first "all" entry. */
20353 for (opt = arm_cpus + 1; opt->name != NULL; opt++)
20354 if (streq (opt->name, name))
20355 {
e74cfd16
PB
20356 mcpu_cpu_opt = &opt->value;
20357 selected_cpu = opt->value;
ee065d83
PB
20358 if (opt->canonical_name)
20359 strcpy(selected_cpu_name, opt->canonical_name);
20360 else
20361 {
20362 int i;
20363 for (i = 0; opt->name[i]; i++)
20364 selected_cpu_name[i] = TOUPPER (opt->name[i]);
20365 selected_cpu_name[i] = 0;
20366 }
e74cfd16 20367 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
ee065d83
PB
20368 *input_line_pointer = saved_char;
20369 demand_empty_rest_of_line ();
20370 return;
20371 }
20372 as_bad (_("unknown cpu `%s'"), name);
20373 *input_line_pointer = saved_char;
20374 ignore_rest_of_line ();
20375}
20376
20377
20378/* Parse a .arch directive. */
20379
20380static void
20381s_arm_arch (int ignored ATTRIBUTE_UNUSED)
20382{
e74cfd16 20383 const struct arm_arch_option_table *opt;
ee065d83
PB
20384 char saved_char;
20385 char *name;
20386
20387 name = input_line_pointer;
20388 while (*input_line_pointer && !ISSPACE(*input_line_pointer))
20389 input_line_pointer++;
20390 saved_char = *input_line_pointer;
20391 *input_line_pointer = 0;
20392
20393 /* Skip the first "all" entry. */
20394 for (opt = arm_archs + 1; opt->name != NULL; opt++)
20395 if (streq (opt->name, name))
20396 {
e74cfd16
PB
20397 mcpu_cpu_opt = &opt->value;
20398 selected_cpu = opt->value;
ee065d83 20399 strcpy(selected_cpu_name, opt->name);
e74cfd16 20400 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
ee065d83
PB
20401 *input_line_pointer = saved_char;
20402 demand_empty_rest_of_line ();
20403 return;
20404 }
20405
20406 as_bad (_("unknown architecture `%s'\n"), name);
20407 *input_line_pointer = saved_char;
20408 ignore_rest_of_line ();
20409}
20410
20411
7a1d4c38
PB
20412/* Parse a .object_arch directive. */
20413
20414static void
20415s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
20416{
20417 const struct arm_arch_option_table *opt;
20418 char saved_char;
20419 char *name;
20420
20421 name = input_line_pointer;
20422 while (*input_line_pointer && !ISSPACE(*input_line_pointer))
20423 input_line_pointer++;
20424 saved_char = *input_line_pointer;
20425 *input_line_pointer = 0;
20426
20427 /* Skip the first "all" entry. */
20428 for (opt = arm_archs + 1; opt->name != NULL; opt++)
20429 if (streq (opt->name, name))
20430 {
20431 object_arch = &opt->value;
20432 *input_line_pointer = saved_char;
20433 demand_empty_rest_of_line ();
20434 return;
20435 }
20436
20437 as_bad (_("unknown architecture `%s'\n"), name);
20438 *input_line_pointer = saved_char;
20439 ignore_rest_of_line ();
20440}
20441
20442
ee065d83
PB
20443/* Parse a .fpu directive. */
20444
20445static void
20446s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
20447{
e74cfd16 20448 const struct arm_option_cpu_value_table *opt;
ee065d83
PB
20449 char saved_char;
20450 char *name;
20451
20452 name = input_line_pointer;
20453 while (*input_line_pointer && !ISSPACE(*input_line_pointer))
20454 input_line_pointer++;
20455 saved_char = *input_line_pointer;
20456 *input_line_pointer = 0;
20457
20458 for (opt = arm_fpus; opt->name != NULL; opt++)
20459 if (streq (opt->name, name))
20460 {
e74cfd16
PB
20461 mfpu_opt = &opt->value;
20462 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
ee065d83
PB
20463 *input_line_pointer = saved_char;
20464 demand_empty_rest_of_line ();
20465 return;
20466 }
20467
20468 as_bad (_("unknown floating point format `%s'\n"), name);
20469 *input_line_pointer = saved_char;
20470 ignore_rest_of_line ();
20471}
ee065d83 20472