]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-arm.c
* opcodes/arm-dis.c (COND_UNCOND): New constant.
[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,
fa94de6b 3 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
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
ec2655a6 15 the Free Software Foundation; either version 3, or (at your option)
b99bd4ef
NC
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
42a68e18 28#include "as.h"
5287ad62 29#include <limits.h>
037e8744 30#include <stdarg.h>
c19d1205 31#define NO_RELOC 0
3882b010 32#include "safe-ctype.h"
b99bd4ef
NC
33#include "subsegs.h"
34#include "obstack.h"
3da1d841 35#include "libiberty.h"
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
7ed4c4c5
NC
45#ifdef OBJ_ELF
46/* Must be at least the size of the largest unwind opcode (currently two). */
47#define ARM_OPCODE_CHUNK_SIZE 8
48
49/* This structure holds the unwinding state. */
50
51static struct
52{
c19d1205
ZW
53 symbolS * proc_start;
54 symbolS * table_entry;
55 symbolS * personality_routine;
56 int personality_index;
7ed4c4c5 57 /* The segment containing the function. */
c19d1205
ZW
58 segT saved_seg;
59 subsegT saved_subseg;
7ed4c4c5
NC
60 /* Opcodes generated from this function. */
61 unsigned char * opcodes;
c19d1205
ZW
62 int opcode_count;
63 int opcode_alloc;
7ed4c4c5 64 /* The number of bytes pushed to the stack. */
c19d1205 65 offsetT frame_size;
7ed4c4c5
NC
66 /* We don't add stack adjustment opcodes immediately so that we can merge
67 multiple adjustments. We can also omit the final adjustment
68 when using a frame pointer. */
c19d1205 69 offsetT pending_offset;
7ed4c4c5 70 /* These two fields are set by both unwind_movsp and unwind_setfp. They
c19d1205
ZW
71 hold the reg+offset to use when restoring sp from a frame pointer. */
72 offsetT fp_offset;
73 int fp_reg;
7ed4c4c5 74 /* Nonzero if an unwind_setfp directive has been seen. */
c19d1205 75 unsigned fp_used:1;
7ed4c4c5 76 /* Nonzero if the last opcode restores sp from fp_reg. */
c19d1205 77 unsigned sp_restored:1;
7ed4c4c5
NC
78} unwind;
79
8b1ad454
NC
80#endif /* OBJ_ELF */
81
4962c51a
MS
82/* Results from operand parsing worker functions. */
83
84typedef enum
85{
86 PARSE_OPERAND_SUCCESS,
87 PARSE_OPERAND_FAIL,
88 PARSE_OPERAND_FAIL_NO_BACKTRACK
89} parse_operand_result;
90
33a392fb
PB
91enum arm_float_abi
92{
93 ARM_FLOAT_ABI_HARD,
94 ARM_FLOAT_ABI_SOFTFP,
95 ARM_FLOAT_ABI_SOFT
96};
97
c19d1205 98/* Types of processor to assemble for. */
b99bd4ef 99#ifndef CPU_DEFAULT
8a59fff3 100/* The code that was here used to select a default CPU depending on compiler
fa94de6b 101 pre-defines which were only present when doing native builds, thus
8a59fff3
MGD
102 changing gas' default behaviour depending upon the build host.
103
104 If you have a target that requires a default CPU option then the you
105 should define CPU_DEFAULT here. */
b99bd4ef
NC
106#endif
107
108#ifndef FPU_DEFAULT
c820d418
MM
109# ifdef TE_LINUX
110# define FPU_DEFAULT FPU_ARCH_FPA
111# elif defined (TE_NetBSD)
112# ifdef OBJ_ELF
113# define FPU_DEFAULT FPU_ARCH_VFP /* Soft-float, but VFP order. */
114# else
115 /* Legacy a.out format. */
116# define FPU_DEFAULT FPU_ARCH_FPA /* Soft-float, but FPA order. */
117# endif
4e7fd91e
PB
118# elif defined (TE_VXWORKS)
119# define FPU_DEFAULT FPU_ARCH_VFP /* Soft-float, VFP order. */
c820d418
MM
120# else
121 /* For backwards compatibility, default to FPA. */
122# define FPU_DEFAULT FPU_ARCH_FPA
123# endif
124#endif /* ifndef FPU_DEFAULT */
b99bd4ef 125
c19d1205 126#define streq(a, b) (strcmp (a, b) == 0)
b99bd4ef 127
e74cfd16
PB
128static arm_feature_set cpu_variant;
129static arm_feature_set arm_arch_used;
130static arm_feature_set thumb_arch_used;
b99bd4ef 131
b99bd4ef 132/* Flags stored in private area of BFD structure. */
c19d1205
ZW
133static int uses_apcs_26 = FALSE;
134static int atpcs = FALSE;
b34976b6
AM
135static int support_interwork = FALSE;
136static int uses_apcs_float = FALSE;
c19d1205 137static int pic_code = FALSE;
845b51d6 138static int fix_v4bx = FALSE;
278df34e
NS
139/* Warn on using deprecated features. */
140static int warn_on_deprecated = TRUE;
141
03b1477f
RE
142
143/* Variables that we set while parsing command-line options. Once all
144 options have been read we re-process these values to set the real
145 assembly flags. */
e74cfd16
PB
146static const arm_feature_set *legacy_cpu = NULL;
147static const arm_feature_set *legacy_fpu = NULL;
148
149static const arm_feature_set *mcpu_cpu_opt = NULL;
150static const arm_feature_set *mcpu_fpu_opt = NULL;
151static const arm_feature_set *march_cpu_opt = NULL;
152static const arm_feature_set *march_fpu_opt = NULL;
153static const arm_feature_set *mfpu_opt = NULL;
7a1d4c38 154static const arm_feature_set *object_arch = NULL;
e74cfd16
PB
155
156/* Constants for known architecture features. */
157static const arm_feature_set fpu_default = FPU_DEFAULT;
158static const arm_feature_set fpu_arch_vfp_v1 = FPU_ARCH_VFP_V1;
159static const arm_feature_set fpu_arch_vfp_v2 = FPU_ARCH_VFP_V2;
5287ad62
JB
160static const arm_feature_set fpu_arch_vfp_v3 = FPU_ARCH_VFP_V3;
161static const arm_feature_set fpu_arch_neon_v1 = FPU_ARCH_NEON_V1;
e74cfd16
PB
162static const arm_feature_set fpu_arch_fpa = FPU_ARCH_FPA;
163static const arm_feature_set fpu_any_hard = FPU_ANY_HARD;
164static const arm_feature_set fpu_arch_maverick = FPU_ARCH_MAVERICK;
165static const arm_feature_set fpu_endian_pure = FPU_ARCH_ENDIAN_PURE;
166
167#ifdef CPU_DEFAULT
168static const arm_feature_set cpu_default = CPU_DEFAULT;
169#endif
170
171static const arm_feature_set arm_ext_v1 = ARM_FEATURE (ARM_EXT_V1, 0);
172static const arm_feature_set arm_ext_v2 = ARM_FEATURE (ARM_EXT_V1, 0);
173static const arm_feature_set arm_ext_v2s = ARM_FEATURE (ARM_EXT_V2S, 0);
174static const arm_feature_set arm_ext_v3 = ARM_FEATURE (ARM_EXT_V3, 0);
175static const arm_feature_set arm_ext_v3m = ARM_FEATURE (ARM_EXT_V3M, 0);
176static const arm_feature_set arm_ext_v4 = ARM_FEATURE (ARM_EXT_V4, 0);
177static const arm_feature_set arm_ext_v4t = ARM_FEATURE (ARM_EXT_V4T, 0);
178static const arm_feature_set arm_ext_v5 = ARM_FEATURE (ARM_EXT_V5, 0);
179static const arm_feature_set arm_ext_v4t_5 =
180 ARM_FEATURE (ARM_EXT_V4T | ARM_EXT_V5, 0);
181static const arm_feature_set arm_ext_v5t = ARM_FEATURE (ARM_EXT_V5T, 0);
182static const arm_feature_set arm_ext_v5e = ARM_FEATURE (ARM_EXT_V5E, 0);
183static const arm_feature_set arm_ext_v5exp = ARM_FEATURE (ARM_EXT_V5ExP, 0);
184static const arm_feature_set arm_ext_v5j = ARM_FEATURE (ARM_EXT_V5J, 0);
185static const arm_feature_set arm_ext_v6 = ARM_FEATURE (ARM_EXT_V6, 0);
186static const arm_feature_set arm_ext_v6k = ARM_FEATURE (ARM_EXT_V6K, 0);
e74cfd16 187static const arm_feature_set arm_ext_v6t2 = ARM_FEATURE (ARM_EXT_V6T2, 0);
b2a5fbdc 188static const arm_feature_set arm_ext_v6m = ARM_FEATURE (ARM_EXT_V6M, 0);
62b3e311 189static const arm_feature_set arm_ext_v6_notm = ARM_FEATURE (ARM_EXT_V6_NOTM, 0);
9e3c6df6 190static const arm_feature_set arm_ext_v6_dsp = ARM_FEATURE (ARM_EXT_V6_DSP, 0);
7e806470
PB
191static const arm_feature_set arm_ext_barrier = ARM_FEATURE (ARM_EXT_BARRIER, 0);
192static const arm_feature_set arm_ext_msr = ARM_FEATURE (ARM_EXT_THUMB_MSR, 0);
62b3e311
PB
193static const arm_feature_set arm_ext_div = ARM_FEATURE (ARM_EXT_DIV, 0);
194static const arm_feature_set arm_ext_v7 = ARM_FEATURE (ARM_EXT_V7, 0);
195static const arm_feature_set arm_ext_v7a = ARM_FEATURE (ARM_EXT_V7A, 0);
196static const arm_feature_set arm_ext_v7r = ARM_FEATURE (ARM_EXT_V7R, 0);
9e3c6df6 197static const arm_feature_set arm_ext_v7m = ARM_FEATURE (ARM_EXT_V7M, 0);
bca38921 198static const arm_feature_set arm_ext_v8 = ARM_FEATURE (ARM_EXT_V8, 0);
7e806470 199static const arm_feature_set arm_ext_m =
b2a5fbdc 200 ARM_FEATURE (ARM_EXT_V6M | ARM_EXT_OS | ARM_EXT_V7M, 0);
60e5ef9f 201static const arm_feature_set arm_ext_mp = ARM_FEATURE (ARM_EXT_MP, 0);
f4c65163 202static const arm_feature_set arm_ext_sec = ARM_FEATURE (ARM_EXT_SEC, 0);
b2a5fbdc 203static const arm_feature_set arm_ext_os = ARM_FEATURE (ARM_EXT_OS, 0);
eea54501 204static const arm_feature_set arm_ext_adiv = ARM_FEATURE (ARM_EXT_ADIV, 0);
90ec0d68 205static const arm_feature_set arm_ext_virt = ARM_FEATURE (ARM_EXT_VIRT, 0);
e74cfd16
PB
206
207static const arm_feature_set arm_arch_any = ARM_ANY;
208static const arm_feature_set arm_arch_full = ARM_FEATURE (-1, -1);
209static const arm_feature_set arm_arch_t2 = ARM_ARCH_THUMB2;
210static const arm_feature_set arm_arch_none = ARM_ARCH_NONE;
251665fc 211static const arm_feature_set arm_arch_v6m_only = ARM_ARCH_V6M_ONLY;
e74cfd16 212
2d447fca
JM
213static const arm_feature_set arm_cext_iwmmxt2 =
214 ARM_FEATURE (0, ARM_CEXT_IWMMXT2);
e74cfd16
PB
215static const arm_feature_set arm_cext_iwmmxt =
216 ARM_FEATURE (0, ARM_CEXT_IWMMXT);
217static const arm_feature_set arm_cext_xscale =
218 ARM_FEATURE (0, ARM_CEXT_XSCALE);
219static const arm_feature_set arm_cext_maverick =
220 ARM_FEATURE (0, ARM_CEXT_MAVERICK);
221static const arm_feature_set fpu_fpa_ext_v1 = ARM_FEATURE (0, FPU_FPA_EXT_V1);
222static const arm_feature_set fpu_fpa_ext_v2 = ARM_FEATURE (0, FPU_FPA_EXT_V2);
223static const arm_feature_set fpu_vfp_ext_v1xd =
224 ARM_FEATURE (0, FPU_VFP_EXT_V1xD);
225static const arm_feature_set fpu_vfp_ext_v1 = ARM_FEATURE (0, FPU_VFP_EXT_V1);
226static const arm_feature_set fpu_vfp_ext_v2 = ARM_FEATURE (0, FPU_VFP_EXT_V2);
62f3b8c8 227static const arm_feature_set fpu_vfp_ext_v3xd = ARM_FEATURE (0, FPU_VFP_EXT_V3xD);
5287ad62 228static const arm_feature_set fpu_vfp_ext_v3 = ARM_FEATURE (0, FPU_VFP_EXT_V3);
b1cc4aeb
PB
229static const arm_feature_set fpu_vfp_ext_d32 =
230 ARM_FEATURE (0, FPU_VFP_EXT_D32);
5287ad62
JB
231static const arm_feature_set fpu_neon_ext_v1 = ARM_FEATURE (0, FPU_NEON_EXT_V1);
232static const arm_feature_set fpu_vfp_v3_or_neon_ext =
233 ARM_FEATURE (0, FPU_NEON_EXT_V1 | FPU_VFP_EXT_V3);
62f3b8c8
PB
234static const arm_feature_set fpu_vfp_fp16 = ARM_FEATURE (0, FPU_VFP_EXT_FP16);
235static const arm_feature_set fpu_neon_ext_fma = ARM_FEATURE (0, FPU_NEON_EXT_FMA);
236static const arm_feature_set fpu_vfp_ext_fma = ARM_FEATURE (0, FPU_VFP_EXT_FMA);
bca38921
MGD
237static const arm_feature_set fpu_vfp_ext_armv8 =
238 ARM_FEATURE (0, FPU_VFP_EXT_ARMV8);
239static const arm_feature_set fpu_neon_ext_armv8 =
240 ARM_FEATURE (0, FPU_NEON_EXT_ARMV8);
241static const arm_feature_set fpu_crypto_ext_armv8 =
242 ARM_FEATURE (0, FPU_CRYPTO_EXT_ARMV8);
e74cfd16 243
33a392fb 244static int mfloat_abi_opt = -1;
e74cfd16
PB
245/* Record user cpu selection for object attributes. */
246static arm_feature_set selected_cpu = ARM_ARCH_NONE;
ee065d83
PB
247/* Must be long enough to hold any of the names in arm_cpus. */
248static char selected_cpu_name[16];
8d67f500
NC
249
250/* Return if no cpu was selected on command-line. */
251static bfd_boolean
252no_cpu_selected (void)
253{
254 return selected_cpu.core == arm_arch_none.core
255 && selected_cpu.coproc == arm_arch_none.coproc;
256}
257
7cc69913 258#ifdef OBJ_ELF
deeaaff8
DJ
259# ifdef EABI_DEFAULT
260static int meabi_flags = EABI_DEFAULT;
261# else
d507cf36 262static int meabi_flags = EF_ARM_EABI_UNKNOWN;
deeaaff8 263# endif
e1da3f5b 264
ee3c0378
AS
265static int attributes_set_explicitly[NUM_KNOWN_OBJ_ATTRIBUTES];
266
e1da3f5b 267bfd_boolean
5f4273c7 268arm_is_eabi (void)
e1da3f5b
PB
269{
270 return (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4);
271}
7cc69913 272#endif
b99bd4ef 273
b99bd4ef 274#ifdef OBJ_ELF
c19d1205 275/* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
b99bd4ef
NC
276symbolS * GOT_symbol;
277#endif
278
b99bd4ef
NC
279/* 0: assemble for ARM,
280 1: assemble for Thumb,
281 2: assemble for Thumb even though target CPU does not support thumb
282 instructions. */
283static int thumb_mode = 0;
8dc2430f
NC
284/* A value distinct from the possible values for thumb_mode that we
285 can use to record whether thumb_mode has been copied into the
286 tc_frag_data field of a frag. */
287#define MODE_RECORDED (1 << 4)
b99bd4ef 288
e07e6e58
NC
289/* Specifies the intrinsic IT insn behavior mode. */
290enum implicit_it_mode
291{
292 IMPLICIT_IT_MODE_NEVER = 0x00,
293 IMPLICIT_IT_MODE_ARM = 0x01,
294 IMPLICIT_IT_MODE_THUMB = 0x02,
295 IMPLICIT_IT_MODE_ALWAYS = (IMPLICIT_IT_MODE_ARM | IMPLICIT_IT_MODE_THUMB)
296};
297static int implicit_it_mode = IMPLICIT_IT_MODE_ARM;
298
c19d1205
ZW
299/* If unified_syntax is true, we are processing the new unified
300 ARM/Thumb syntax. Important differences from the old ARM mode:
301
302 - Immediate operands do not require a # prefix.
303 - Conditional affixes always appear at the end of the
304 instruction. (For backward compatibility, those instructions
305 that formerly had them in the middle, continue to accept them
306 there.)
307 - The IT instruction may appear, and if it does is validated
308 against subsequent conditional affixes. It does not generate
309 machine code.
310
311 Important differences from the old Thumb mode:
312
313 - Immediate operands do not require a # prefix.
314 - Most of the V6T2 instructions are only available in unified mode.
315 - The .N and .W suffixes are recognized and honored (it is an error
316 if they cannot be honored).
317 - All instructions set the flags if and only if they have an 's' affix.
318 - Conditional affixes may be used. They are validated against
319 preceding IT instructions. Unlike ARM mode, you cannot use a
320 conditional affix except in the scope of an IT instruction. */
321
322static bfd_boolean unified_syntax = FALSE;
b99bd4ef 323
5287ad62
JB
324enum neon_el_type
325{
dcbf9037 326 NT_invtype,
5287ad62
JB
327 NT_untyped,
328 NT_integer,
329 NT_float,
330 NT_poly,
331 NT_signed,
dcbf9037 332 NT_unsigned
5287ad62
JB
333};
334
335struct neon_type_el
336{
337 enum neon_el_type type;
338 unsigned size;
339};
340
341#define NEON_MAX_TYPE_ELS 4
342
343struct neon_type
344{
345 struct neon_type_el el[NEON_MAX_TYPE_ELS];
346 unsigned elems;
347};
348
e07e6e58
NC
349enum it_instruction_type
350{
351 OUTSIDE_IT_INSN,
352 INSIDE_IT_INSN,
353 INSIDE_IT_LAST_INSN,
354 IF_INSIDE_IT_LAST_INSN, /* Either outside or inside;
355 if inside, should be the last one. */
356 NEUTRAL_IT_INSN, /* This could be either inside or outside,
357 i.e. BKPT and NOP. */
358 IT_INSN /* The IT insn has been parsed. */
359};
360
ad6cec43
MGD
361/* The maximum number of operands we need. */
362#define ARM_IT_MAX_OPERANDS 6
363
b99bd4ef
NC
364struct arm_it
365{
c19d1205 366 const char * error;
b99bd4ef 367 unsigned long instruction;
c19d1205
ZW
368 int size;
369 int size_req;
370 int cond;
037e8744
JB
371 /* "uncond_value" is set to the value in place of the conditional field in
372 unconditional versions of the instruction, or -1 if nothing is
373 appropriate. */
374 int uncond_value;
5287ad62 375 struct neon_type vectype;
88714cb8
DG
376 /* This does not indicate an actual NEON instruction, only that
377 the mnemonic accepts neon-style type suffixes. */
378 int is_neon;
0110f2b8
PB
379 /* Set to the opcode if the instruction needs relaxation.
380 Zero if the instruction is not relaxed. */
381 unsigned long relax;
b99bd4ef
NC
382 struct
383 {
384 bfd_reloc_code_real_type type;
c19d1205
ZW
385 expressionS exp;
386 int pc_rel;
b99bd4ef 387 } reloc;
b99bd4ef 388
e07e6e58
NC
389 enum it_instruction_type it_insn_type;
390
c19d1205
ZW
391 struct
392 {
393 unsigned reg;
ca3f61f7 394 signed int imm;
dcbf9037 395 struct neon_type_el vectype;
ca3f61f7
NC
396 unsigned present : 1; /* Operand present. */
397 unsigned isreg : 1; /* Operand was a register. */
398 unsigned immisreg : 1; /* .imm field is a second register. */
5287ad62
JB
399 unsigned isscalar : 1; /* Operand is a (Neon) scalar. */
400 unsigned immisalign : 1; /* Immediate is an alignment specifier. */
c96612cc 401 unsigned immisfloat : 1; /* Immediate was parsed as a float. */
5287ad62
JB
402 /* Note: we abuse "regisimm" to mean "is Neon register" in VMOV
403 instructions. This allows us to disambiguate ARM <-> vector insns. */
404 unsigned regisimm : 1; /* 64-bit immediate, reg forms high 32 bits. */
037e8744 405 unsigned isvec : 1; /* Is a single, double or quad VFP/Neon reg. */
5287ad62 406 unsigned isquad : 1; /* Operand is Neon quad-precision register. */
037e8744 407 unsigned issingle : 1; /* Operand is VFP single-precision register. */
ca3f61f7
NC
408 unsigned hasreloc : 1; /* Operand has relocation suffix. */
409 unsigned writeback : 1; /* Operand has trailing ! */
410 unsigned preind : 1; /* Preindexed address. */
411 unsigned postind : 1; /* Postindexed address. */
412 unsigned negative : 1; /* Index register was negated. */
413 unsigned shifted : 1; /* Shift applied to operation. */
414 unsigned shift_kind : 3; /* Shift operation (enum shift_kind). */
ad6cec43 415 } operands[ARM_IT_MAX_OPERANDS];
b99bd4ef
NC
416};
417
c19d1205 418static struct arm_it inst;
b99bd4ef
NC
419
420#define NUM_FLOAT_VALS 8
421
05d2d07e 422const char * fp_const[] =
b99bd4ef
NC
423{
424 "0.0", "1.0", "2.0", "3.0", "4.0", "5.0", "0.5", "10.0", 0
425};
426
c19d1205 427/* Number of littlenums required to hold an extended precision number. */
b99bd4ef
NC
428#define MAX_LITTLENUMS 6
429
430LITTLENUM_TYPE fp_values[NUM_FLOAT_VALS][MAX_LITTLENUMS];
431
432#define FAIL (-1)
433#define SUCCESS (0)
434
435#define SUFF_S 1
436#define SUFF_D 2
437#define SUFF_E 3
438#define SUFF_P 4
439
c19d1205
ZW
440#define CP_T_X 0x00008000
441#define CP_T_Y 0x00400000
b99bd4ef 442
c19d1205
ZW
443#define CONDS_BIT 0x00100000
444#define LOAD_BIT 0x00100000
b99bd4ef
NC
445
446#define DOUBLE_LOAD_FLAG 0x00000001
447
448struct asm_cond
449{
d3ce72d0 450 const char * template_name;
c921be7d 451 unsigned long value;
b99bd4ef
NC
452};
453
c19d1205 454#define COND_ALWAYS 0xE
b99bd4ef 455
b99bd4ef
NC
456struct asm_psr
457{
d3ce72d0 458 const char * template_name;
c921be7d 459 unsigned long field;
b99bd4ef
NC
460};
461
62b3e311
PB
462struct asm_barrier_opt
463{
d3ce72d0 464 const char * template_name;
c921be7d 465 unsigned long value;
62b3e311
PB
466};
467
2d2255b5 468/* The bit that distinguishes CPSR and SPSR. */
b99bd4ef
NC
469#define SPSR_BIT (1 << 22)
470
c19d1205
ZW
471/* The individual PSR flag bits. */
472#define PSR_c (1 << 16)
473#define PSR_x (1 << 17)
474#define PSR_s (1 << 18)
475#define PSR_f (1 << 19)
b99bd4ef 476
c19d1205 477struct reloc_entry
bfae80f2 478{
c921be7d
NC
479 char * name;
480 bfd_reloc_code_real_type reloc;
bfae80f2
RE
481};
482
5287ad62 483enum vfp_reg_pos
bfae80f2 484{
5287ad62
JB
485 VFP_REG_Sd, VFP_REG_Sm, VFP_REG_Sn,
486 VFP_REG_Dd, VFP_REG_Dm, VFP_REG_Dn
bfae80f2
RE
487};
488
489enum vfp_ldstm_type
490{
491 VFP_LDSTMIA, VFP_LDSTMDB, VFP_LDSTMIAX, VFP_LDSTMDBX
492};
493
dcbf9037
JB
494/* Bits for DEFINED field in neon_typed_alias. */
495#define NTA_HASTYPE 1
496#define NTA_HASINDEX 2
497
498struct neon_typed_alias
499{
c921be7d
NC
500 unsigned char defined;
501 unsigned char index;
502 struct neon_type_el eltype;
dcbf9037
JB
503};
504
c19d1205
ZW
505/* ARM register categories. This includes coprocessor numbers and various
506 architecture extensions' registers. */
507enum arm_reg_type
bfae80f2 508{
c19d1205
ZW
509 REG_TYPE_RN,
510 REG_TYPE_CP,
511 REG_TYPE_CN,
512 REG_TYPE_FN,
513 REG_TYPE_VFS,
514 REG_TYPE_VFD,
5287ad62 515 REG_TYPE_NQ,
037e8744 516 REG_TYPE_VFSD,
5287ad62 517 REG_TYPE_NDQ,
037e8744 518 REG_TYPE_NSDQ,
c19d1205
ZW
519 REG_TYPE_VFC,
520 REG_TYPE_MVF,
521 REG_TYPE_MVD,
522 REG_TYPE_MVFX,
523 REG_TYPE_MVDX,
524 REG_TYPE_MVAX,
525 REG_TYPE_DSPSC,
526 REG_TYPE_MMXWR,
527 REG_TYPE_MMXWC,
528 REG_TYPE_MMXWCG,
529 REG_TYPE_XSCALE,
90ec0d68 530 REG_TYPE_RNB
bfae80f2
RE
531};
532
dcbf9037
JB
533/* Structure for a hash table entry for a register.
534 If TYPE is REG_TYPE_VFD or REG_TYPE_NQ, the NEON field can point to extra
535 information which states whether a vector type or index is specified (for a
536 register alias created with .dn or .qn). Otherwise NEON should be NULL. */
6c43fab6
RE
537struct reg_entry
538{
c921be7d 539 const char * name;
90ec0d68 540 unsigned int number;
c921be7d
NC
541 unsigned char type;
542 unsigned char builtin;
543 struct neon_typed_alias * neon;
6c43fab6
RE
544};
545
c19d1205 546/* Diagnostics used when we don't get a register of the expected type. */
c921be7d 547const char * const reg_expected_msgs[] =
c19d1205
ZW
548{
549 N_("ARM register expected"),
550 N_("bad or missing co-processor number"),
551 N_("co-processor register expected"),
552 N_("FPA register expected"),
553 N_("VFP single precision register expected"),
5287ad62
JB
554 N_("VFP/Neon double precision register expected"),
555 N_("Neon quad precision register expected"),
037e8744 556 N_("VFP single or double precision register expected"),
5287ad62 557 N_("Neon double or quad precision register expected"),
037e8744 558 N_("VFP single, double or Neon quad precision register expected"),
c19d1205
ZW
559 N_("VFP system register expected"),
560 N_("Maverick MVF register expected"),
561 N_("Maverick MVD register expected"),
562 N_("Maverick MVFX register expected"),
563 N_("Maverick MVDX register expected"),
564 N_("Maverick MVAX register expected"),
565 N_("Maverick DSPSC register expected"),
566 N_("iWMMXt data register expected"),
567 N_("iWMMXt control register expected"),
568 N_("iWMMXt scalar register expected"),
569 N_("XScale accumulator register expected"),
6c43fab6
RE
570};
571
c19d1205 572/* Some well known registers that we refer to directly elsewhere. */
bd340a04 573#define REG_R12 12
c19d1205
ZW
574#define REG_SP 13
575#define REG_LR 14
576#define REG_PC 15
404ff6b5 577
b99bd4ef
NC
578/* ARM instructions take 4bytes in the object file, Thumb instructions
579 take 2: */
c19d1205 580#define INSN_SIZE 4
b99bd4ef
NC
581
582struct asm_opcode
583{
584 /* Basic string to match. */
d3ce72d0 585 const char * template_name;
c19d1205
ZW
586
587 /* Parameters to instruction. */
5be8be5d 588 unsigned int operands[8];
c19d1205
ZW
589
590 /* Conditional tag - see opcode_lookup. */
591 unsigned int tag : 4;
b99bd4ef
NC
592
593 /* Basic instruction code. */
c19d1205 594 unsigned int avalue : 28;
b99bd4ef 595
c19d1205
ZW
596 /* Thumb-format instruction code. */
597 unsigned int tvalue;
b99bd4ef 598
90e4755a 599 /* Which architecture variant provides this instruction. */
c921be7d
NC
600 const arm_feature_set * avariant;
601 const arm_feature_set * tvariant;
c19d1205
ZW
602
603 /* Function to call to encode instruction in ARM format. */
604 void (* aencode) (void);
b99bd4ef 605
c19d1205
ZW
606 /* Function to call to encode instruction in Thumb format. */
607 void (* tencode) (void);
b99bd4ef
NC
608};
609
a737bd4d
NC
610/* Defines for various bits that we will want to toggle. */
611#define INST_IMMEDIATE 0x02000000
612#define OFFSET_REG 0x02000000
c19d1205 613#define HWOFFSET_IMM 0x00400000
a737bd4d
NC
614#define SHIFT_BY_REG 0x00000010
615#define PRE_INDEX 0x01000000
616#define INDEX_UP 0x00800000
617#define WRITE_BACK 0x00200000
618#define LDM_TYPE_2_OR_3 0x00400000
a028a6f5 619#define CPSI_MMOD 0x00020000
90e4755a 620
a737bd4d
NC
621#define LITERAL_MASK 0xf000f000
622#define OPCODE_MASK 0xfe1fffff
623#define V4_STR_BIT 0x00000020
90e4755a 624
efd81785
PB
625#define T2_SUBS_PC_LR 0xf3de8f00
626
a737bd4d 627#define DATA_OP_SHIFT 21
90e4755a 628
ef8d22e6
PB
629#define T2_OPCODE_MASK 0xfe1fffff
630#define T2_DATA_OP_SHIFT 21
631
6530b175
NC
632#define A_COND_MASK 0xf0000000
633#define A_PUSH_POP_OP_MASK 0x0fff0000
634
635/* Opcodes for pushing/poping registers to/from the stack. */
636#define A1_OPCODE_PUSH 0x092d0000
637#define A2_OPCODE_PUSH 0x052d0004
638#define A2_OPCODE_POP 0x049d0004
639
a737bd4d
NC
640/* Codes to distinguish the arithmetic instructions. */
641#define OPCODE_AND 0
642#define OPCODE_EOR 1
643#define OPCODE_SUB 2
644#define OPCODE_RSB 3
645#define OPCODE_ADD 4
646#define OPCODE_ADC 5
647#define OPCODE_SBC 6
648#define OPCODE_RSC 7
649#define OPCODE_TST 8
650#define OPCODE_TEQ 9
651#define OPCODE_CMP 10
652#define OPCODE_CMN 11
653#define OPCODE_ORR 12
654#define OPCODE_MOV 13
655#define OPCODE_BIC 14
656#define OPCODE_MVN 15
90e4755a 657
ef8d22e6
PB
658#define T2_OPCODE_AND 0
659#define T2_OPCODE_BIC 1
660#define T2_OPCODE_ORR 2
661#define T2_OPCODE_ORN 3
662#define T2_OPCODE_EOR 4
663#define T2_OPCODE_ADD 8
664#define T2_OPCODE_ADC 10
665#define T2_OPCODE_SBC 11
666#define T2_OPCODE_SUB 13
667#define T2_OPCODE_RSB 14
668
a737bd4d
NC
669#define T_OPCODE_MUL 0x4340
670#define T_OPCODE_TST 0x4200
671#define T_OPCODE_CMN 0x42c0
672#define T_OPCODE_NEG 0x4240
673#define T_OPCODE_MVN 0x43c0
90e4755a 674
a737bd4d
NC
675#define T_OPCODE_ADD_R3 0x1800
676#define T_OPCODE_SUB_R3 0x1a00
677#define T_OPCODE_ADD_HI 0x4400
678#define T_OPCODE_ADD_ST 0xb000
679#define T_OPCODE_SUB_ST 0xb080
680#define T_OPCODE_ADD_SP 0xa800
681#define T_OPCODE_ADD_PC 0xa000
682#define T_OPCODE_ADD_I8 0x3000
683#define T_OPCODE_SUB_I8 0x3800
684#define T_OPCODE_ADD_I3 0x1c00
685#define T_OPCODE_SUB_I3 0x1e00
b99bd4ef 686
a737bd4d
NC
687#define T_OPCODE_ASR_R 0x4100
688#define T_OPCODE_LSL_R 0x4080
c19d1205
ZW
689#define T_OPCODE_LSR_R 0x40c0
690#define T_OPCODE_ROR_R 0x41c0
a737bd4d
NC
691#define T_OPCODE_ASR_I 0x1000
692#define T_OPCODE_LSL_I 0x0000
693#define T_OPCODE_LSR_I 0x0800
b99bd4ef 694
a737bd4d
NC
695#define T_OPCODE_MOV_I8 0x2000
696#define T_OPCODE_CMP_I8 0x2800
697#define T_OPCODE_CMP_LR 0x4280
698#define T_OPCODE_MOV_HR 0x4600
699#define T_OPCODE_CMP_HR 0x4500
b99bd4ef 700
a737bd4d
NC
701#define T_OPCODE_LDR_PC 0x4800
702#define T_OPCODE_LDR_SP 0x9800
703#define T_OPCODE_STR_SP 0x9000
704#define T_OPCODE_LDR_IW 0x6800
705#define T_OPCODE_STR_IW 0x6000
706#define T_OPCODE_LDR_IH 0x8800
707#define T_OPCODE_STR_IH 0x8000
708#define T_OPCODE_LDR_IB 0x7800
709#define T_OPCODE_STR_IB 0x7000
710#define T_OPCODE_LDR_RW 0x5800
711#define T_OPCODE_STR_RW 0x5000
712#define T_OPCODE_LDR_RH 0x5a00
713#define T_OPCODE_STR_RH 0x5200
714#define T_OPCODE_LDR_RB 0x5c00
715#define T_OPCODE_STR_RB 0x5400
c9b604bd 716
a737bd4d
NC
717#define T_OPCODE_PUSH 0xb400
718#define T_OPCODE_POP 0xbc00
b99bd4ef 719
2fc8bdac 720#define T_OPCODE_BRANCH 0xe000
b99bd4ef 721
a737bd4d 722#define THUMB_SIZE 2 /* Size of thumb instruction. */
a737bd4d 723#define THUMB_PP_PC_LR 0x0100
c19d1205 724#define THUMB_LOAD_BIT 0x0800
53365c0d 725#define THUMB2_LOAD_BIT 0x00100000
c19d1205
ZW
726
727#define BAD_ARGS _("bad arguments to instruction")
fdfde340 728#define BAD_SP _("r13 not allowed here")
c19d1205
ZW
729#define BAD_PC _("r15 not allowed here")
730#define BAD_COND _("instruction cannot be conditional")
731#define BAD_OVERLAP _("registers may not be the same")
732#define BAD_HIREG _("lo register required")
733#define BAD_THUMB32 _("instruction not supported in Thumb16 mode")
01cfc07f 734#define BAD_ADDR_MODE _("instruction does not accept this addressing mode");
dfa9f0d5
PB
735#define BAD_BRANCH _("branch must be last instruction in IT block")
736#define BAD_NOT_IT _("instruction not allowed in IT block")
037e8744 737#define BAD_FPU _("selected FPU does not support instruction")
e07e6e58
NC
738#define BAD_OUT_IT _("thumb conditional instruction should be in IT block")
739#define BAD_IT_COND _("incorrect condition in IT block")
740#define BAD_IT_IT _("IT falling in the range of a previous IT block")
921e5f0a 741#define MISSING_FNSTART _("missing .fnstart before unwinding directive")
5be8be5d
DG
742#define BAD_PC_ADDRESSING \
743 _("cannot use register index with PC-relative addressing")
744#define BAD_PC_WRITEBACK \
745 _("cannot use writeback with PC-relative addressing")
08f10d51 746#define BAD_RANGE _("branch out of range")
c19d1205 747
c921be7d
NC
748static struct hash_control * arm_ops_hsh;
749static struct hash_control * arm_cond_hsh;
750static struct hash_control * arm_shift_hsh;
751static struct hash_control * arm_psr_hsh;
752static struct hash_control * arm_v7m_psr_hsh;
753static struct hash_control * arm_reg_hsh;
754static struct hash_control * arm_reloc_hsh;
755static struct hash_control * arm_barrier_opt_hsh;
b99bd4ef 756
b99bd4ef
NC
757/* Stuff needed to resolve the label ambiguity
758 As:
759 ...
760 label: <insn>
761 may differ from:
762 ...
763 label:
5f4273c7 764 <insn> */
b99bd4ef
NC
765
766symbolS * last_label_seen;
b34976b6 767static int label_is_thumb_function_name = FALSE;
e07e6e58 768
3d0c9500
NC
769/* Literal pool structure. Held on a per-section
770 and per-sub-section basis. */
a737bd4d 771
c19d1205 772#define MAX_LITERAL_POOL_SIZE 1024
3d0c9500 773typedef struct literal_pool
b99bd4ef 774{
c921be7d
NC
775 expressionS literals [MAX_LITERAL_POOL_SIZE];
776 unsigned int next_free_entry;
777 unsigned int id;
778 symbolS * symbol;
779 segT section;
780 subsegT sub_section;
a8040cf2
NC
781#ifdef OBJ_ELF
782 struct dwarf2_line_info locs [MAX_LITERAL_POOL_SIZE];
783#endif
c921be7d 784 struct literal_pool * next;
3d0c9500 785} literal_pool;
b99bd4ef 786
3d0c9500
NC
787/* Pointer to a linked list of literal pools. */
788literal_pool * list_of_pools = NULL;
e27ec89e 789
e07e6e58
NC
790#ifdef OBJ_ELF
791# define now_it seg_info (now_seg)->tc_segment_info_data.current_it
792#else
793static struct current_it now_it;
794#endif
795
796static inline int
797now_it_compatible (int cond)
798{
799 return (cond & ~1) == (now_it.cc & ~1);
800}
801
802static inline int
803conditional_insn (void)
804{
805 return inst.cond != COND_ALWAYS;
806}
807
808static int in_it_block (void);
809
810static int handle_it_state (void);
811
812static void force_automatic_it_block_close (void);
813
c921be7d
NC
814static void it_fsm_post_encode (void);
815
e07e6e58
NC
816#define set_it_insn_type(type) \
817 do \
818 { \
819 inst.it_insn_type = type; \
820 if (handle_it_state () == FAIL) \
821 return; \
822 } \
823 while (0)
824
c921be7d
NC
825#define set_it_insn_type_nonvoid(type, failret) \
826 do \
827 { \
828 inst.it_insn_type = type; \
829 if (handle_it_state () == FAIL) \
830 return failret; \
831 } \
832 while(0)
833
e07e6e58
NC
834#define set_it_insn_type_last() \
835 do \
836 { \
837 if (inst.cond == COND_ALWAYS) \
838 set_it_insn_type (IF_INSIDE_IT_LAST_INSN); \
839 else \
840 set_it_insn_type (INSIDE_IT_LAST_INSN); \
841 } \
842 while (0)
843
c19d1205 844/* Pure syntax. */
b99bd4ef 845
c19d1205
ZW
846/* This array holds the chars that always start a comment. If the
847 pre-processor is disabled, these aren't very useful. */
848const char comment_chars[] = "@";
3d0c9500 849
c19d1205
ZW
850/* This array holds the chars that only start a comment at the beginning of
851 a line. If the line seems to have the form '# 123 filename'
852 .line and .file directives will appear in the pre-processed output. */
853/* Note that input_file.c hand checks for '#' at the beginning of the
854 first line of the input file. This is because the compiler outputs
855 #NO_APP at the beginning of its output. */
856/* Also note that comments like this one will always work. */
857const char line_comment_chars[] = "#";
3d0c9500 858
c19d1205 859const char line_separator_chars[] = ";";
b99bd4ef 860
c19d1205
ZW
861/* Chars that can be used to separate mant
862 from exp in floating point numbers. */
863const char EXP_CHARS[] = "eE";
3d0c9500 864
c19d1205
ZW
865/* Chars that mean this number is a floating point constant. */
866/* As in 0f12.456 */
867/* or 0d1.2345e12 */
b99bd4ef 868
c19d1205 869const char FLT_CHARS[] = "rRsSfFdDxXeEpP";
3d0c9500 870
c19d1205
ZW
871/* Prefix characters that indicate the start of an immediate
872 value. */
873#define is_immediate_prefix(C) ((C) == '#' || (C) == '$')
3d0c9500 874
c19d1205
ZW
875/* Separator character handling. */
876
877#define skip_whitespace(str) do { if (*(str) == ' ') ++(str); } while (0)
878
879static inline int
880skip_past_char (char ** str, char c)
881{
882 if (**str == c)
883 {
884 (*str)++;
885 return SUCCESS;
3d0c9500 886 }
c19d1205
ZW
887 else
888 return FAIL;
889}
c921be7d 890
c19d1205 891#define skip_past_comma(str) skip_past_char (str, ',')
3d0c9500 892
c19d1205
ZW
893/* Arithmetic expressions (possibly involving symbols). */
894
895/* Return TRUE if anything in the expression is a bignum. */
896
897static int
898walk_no_bignums (symbolS * sp)
899{
900 if (symbol_get_value_expression (sp)->X_op == O_big)
901 return 1;
902
903 if (symbol_get_value_expression (sp)->X_add_symbol)
3d0c9500 904 {
c19d1205
ZW
905 return (walk_no_bignums (symbol_get_value_expression (sp)->X_add_symbol)
906 || (symbol_get_value_expression (sp)->X_op_symbol
907 && walk_no_bignums (symbol_get_value_expression (sp)->X_op_symbol)));
3d0c9500
NC
908 }
909
c19d1205 910 return 0;
3d0c9500
NC
911}
912
c19d1205
ZW
913static int in_my_get_expression = 0;
914
915/* Third argument to my_get_expression. */
916#define GE_NO_PREFIX 0
917#define GE_IMM_PREFIX 1
918#define GE_OPT_PREFIX 2
5287ad62
JB
919/* This is a bit of a hack. Use an optional prefix, and also allow big (64-bit)
920 immediates, as can be used in Neon VMVN and VMOV immediate instructions. */
921#define GE_OPT_PREFIX_BIG 3
a737bd4d 922
b99bd4ef 923static int
c19d1205 924my_get_expression (expressionS * ep, char ** str, int prefix_mode)
b99bd4ef 925{
c19d1205
ZW
926 char * save_in;
927 segT seg;
b99bd4ef 928
c19d1205
ZW
929 /* In unified syntax, all prefixes are optional. */
930 if (unified_syntax)
5287ad62
JB
931 prefix_mode = (prefix_mode == GE_OPT_PREFIX_BIG) ? prefix_mode
932 : GE_OPT_PREFIX;
b99bd4ef 933
c19d1205 934 switch (prefix_mode)
b99bd4ef 935 {
c19d1205
ZW
936 case GE_NO_PREFIX: break;
937 case GE_IMM_PREFIX:
938 if (!is_immediate_prefix (**str))
939 {
940 inst.error = _("immediate expression requires a # prefix");
941 return FAIL;
942 }
943 (*str)++;
944 break;
945 case GE_OPT_PREFIX:
5287ad62 946 case GE_OPT_PREFIX_BIG:
c19d1205
ZW
947 if (is_immediate_prefix (**str))
948 (*str)++;
949 break;
950 default: abort ();
951 }
b99bd4ef 952
c19d1205 953 memset (ep, 0, sizeof (expressionS));
b99bd4ef 954
c19d1205
ZW
955 save_in = input_line_pointer;
956 input_line_pointer = *str;
957 in_my_get_expression = 1;
958 seg = expression (ep);
959 in_my_get_expression = 0;
960
f86adc07 961 if (ep->X_op == O_illegal || ep->X_op == O_absent)
b99bd4ef 962 {
f86adc07 963 /* We found a bad or missing expression in md_operand(). */
c19d1205
ZW
964 *str = input_line_pointer;
965 input_line_pointer = save_in;
966 if (inst.error == NULL)
f86adc07
NS
967 inst.error = (ep->X_op == O_absent
968 ? _("missing expression") :_("bad expression"));
c19d1205
ZW
969 return 1;
970 }
b99bd4ef 971
c19d1205
ZW
972#ifdef OBJ_AOUT
973 if (seg != absolute_section
974 && seg != text_section
975 && seg != data_section
976 && seg != bss_section
977 && seg != undefined_section)
978 {
979 inst.error = _("bad segment");
980 *str = input_line_pointer;
981 input_line_pointer = save_in;
982 return 1;
b99bd4ef 983 }
87975d2a
AM
984#else
985 (void) seg;
c19d1205 986#endif
b99bd4ef 987
c19d1205
ZW
988 /* Get rid of any bignums now, so that we don't generate an error for which
989 we can't establish a line number later on. Big numbers are never valid
990 in instructions, which is where this routine is always called. */
5287ad62
JB
991 if (prefix_mode != GE_OPT_PREFIX_BIG
992 && (ep->X_op == O_big
993 || (ep->X_add_symbol
994 && (walk_no_bignums (ep->X_add_symbol)
995 || (ep->X_op_symbol
996 && walk_no_bignums (ep->X_op_symbol))))))
c19d1205
ZW
997 {
998 inst.error = _("invalid constant");
999 *str = input_line_pointer;
1000 input_line_pointer = save_in;
1001 return 1;
1002 }
b99bd4ef 1003
c19d1205
ZW
1004 *str = input_line_pointer;
1005 input_line_pointer = save_in;
1006 return 0;
b99bd4ef
NC
1007}
1008
c19d1205
ZW
1009/* Turn a string in input_line_pointer into a floating point constant
1010 of type TYPE, and store the appropriate bytes in *LITP. The number
1011 of LITTLENUMS emitted is stored in *SIZEP. An error message is
1012 returned, or NULL on OK.
b99bd4ef 1013
c19d1205
ZW
1014 Note that fp constants aren't represent in the normal way on the ARM.
1015 In big endian mode, things are as expected. However, in little endian
1016 mode fp constants are big-endian word-wise, and little-endian byte-wise
1017 within the words. For example, (double) 1.1 in big endian mode is
1018 the byte sequence 3f f1 99 99 99 99 99 9a, and in little endian mode is
1019 the byte sequence 99 99 f1 3f 9a 99 99 99.
b99bd4ef 1020
c19d1205 1021 ??? The format of 12 byte floats is uncertain according to gcc's arm.h. */
b99bd4ef 1022
c19d1205
ZW
1023char *
1024md_atof (int type, char * litP, int * sizeP)
1025{
1026 int prec;
1027 LITTLENUM_TYPE words[MAX_LITTLENUMS];
1028 char *t;
1029 int i;
b99bd4ef 1030
c19d1205
ZW
1031 switch (type)
1032 {
1033 case 'f':
1034 case 'F':
1035 case 's':
1036 case 'S':
1037 prec = 2;
1038 break;
b99bd4ef 1039
c19d1205
ZW
1040 case 'd':
1041 case 'D':
1042 case 'r':
1043 case 'R':
1044 prec = 4;
1045 break;
b99bd4ef 1046
c19d1205
ZW
1047 case 'x':
1048 case 'X':
499ac353 1049 prec = 5;
c19d1205 1050 break;
b99bd4ef 1051
c19d1205
ZW
1052 case 'p':
1053 case 'P':
499ac353 1054 prec = 5;
c19d1205 1055 break;
a737bd4d 1056
c19d1205
ZW
1057 default:
1058 *sizeP = 0;
499ac353 1059 return _("Unrecognized or unsupported floating point constant");
c19d1205 1060 }
b99bd4ef 1061
c19d1205
ZW
1062 t = atof_ieee (input_line_pointer, type, words);
1063 if (t)
1064 input_line_pointer = t;
499ac353 1065 *sizeP = prec * sizeof (LITTLENUM_TYPE);
b99bd4ef 1066
c19d1205
ZW
1067 if (target_big_endian)
1068 {
1069 for (i = 0; i < prec; i++)
1070 {
499ac353
NC
1071 md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1072 litP += sizeof (LITTLENUM_TYPE);
c19d1205
ZW
1073 }
1074 }
1075 else
1076 {
e74cfd16 1077 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
c19d1205
ZW
1078 for (i = prec - 1; i >= 0; i--)
1079 {
499ac353
NC
1080 md_number_to_chars (litP, (valueT) words[i], sizeof (LITTLENUM_TYPE));
1081 litP += sizeof (LITTLENUM_TYPE);
c19d1205
ZW
1082 }
1083 else
1084 /* For a 4 byte float the order of elements in `words' is 1 0.
1085 For an 8 byte float the order is 1 0 3 2. */
1086 for (i = 0; i < prec; i += 2)
1087 {
499ac353
NC
1088 md_number_to_chars (litP, (valueT) words[i + 1],
1089 sizeof (LITTLENUM_TYPE));
1090 md_number_to_chars (litP + sizeof (LITTLENUM_TYPE),
1091 (valueT) words[i], sizeof (LITTLENUM_TYPE));
1092 litP += 2 * sizeof (LITTLENUM_TYPE);
c19d1205
ZW
1093 }
1094 }
b99bd4ef 1095
499ac353 1096 return NULL;
c19d1205 1097}
b99bd4ef 1098
c19d1205
ZW
1099/* We handle all bad expressions here, so that we can report the faulty
1100 instruction in the error message. */
1101void
91d6fa6a 1102md_operand (expressionS * exp)
c19d1205
ZW
1103{
1104 if (in_my_get_expression)
91d6fa6a 1105 exp->X_op = O_illegal;
b99bd4ef
NC
1106}
1107
c19d1205 1108/* Immediate values. */
b99bd4ef 1109
c19d1205
ZW
1110/* Generic immediate-value read function for use in directives.
1111 Accepts anything that 'expression' can fold to a constant.
1112 *val receives the number. */
1113#ifdef OBJ_ELF
1114static int
1115immediate_for_directive (int *val)
b99bd4ef 1116{
c19d1205
ZW
1117 expressionS exp;
1118 exp.X_op = O_illegal;
b99bd4ef 1119
c19d1205
ZW
1120 if (is_immediate_prefix (*input_line_pointer))
1121 {
1122 input_line_pointer++;
1123 expression (&exp);
1124 }
b99bd4ef 1125
c19d1205
ZW
1126 if (exp.X_op != O_constant)
1127 {
1128 as_bad (_("expected #constant"));
1129 ignore_rest_of_line ();
1130 return FAIL;
1131 }
1132 *val = exp.X_add_number;
1133 return SUCCESS;
b99bd4ef 1134}
c19d1205 1135#endif
b99bd4ef 1136
c19d1205 1137/* Register parsing. */
b99bd4ef 1138
c19d1205
ZW
1139/* Generic register parser. CCP points to what should be the
1140 beginning of a register name. If it is indeed a valid register
1141 name, advance CCP over it and return the reg_entry structure;
1142 otherwise return NULL. Does not issue diagnostics. */
1143
1144static struct reg_entry *
1145arm_reg_parse_multi (char **ccp)
b99bd4ef 1146{
c19d1205
ZW
1147 char *start = *ccp;
1148 char *p;
1149 struct reg_entry *reg;
b99bd4ef 1150
c19d1205
ZW
1151#ifdef REGISTER_PREFIX
1152 if (*start != REGISTER_PREFIX)
01cfc07f 1153 return NULL;
c19d1205
ZW
1154 start++;
1155#endif
1156#ifdef OPTIONAL_REGISTER_PREFIX
1157 if (*start == OPTIONAL_REGISTER_PREFIX)
1158 start++;
1159#endif
b99bd4ef 1160
c19d1205
ZW
1161 p = start;
1162 if (!ISALPHA (*p) || !is_name_beginner (*p))
1163 return NULL;
b99bd4ef 1164
c19d1205
ZW
1165 do
1166 p++;
1167 while (ISALPHA (*p) || ISDIGIT (*p) || *p == '_');
1168
1169 reg = (struct reg_entry *) hash_find_n (arm_reg_hsh, start, p - start);
1170
1171 if (!reg)
1172 return NULL;
1173
1174 *ccp = p;
1175 return reg;
b99bd4ef
NC
1176}
1177
1178static int
dcbf9037
JB
1179arm_reg_alt_syntax (char **ccp, char *start, struct reg_entry *reg,
1180 enum arm_reg_type type)
b99bd4ef 1181{
c19d1205
ZW
1182 /* Alternative syntaxes are accepted for a few register classes. */
1183 switch (type)
1184 {
1185 case REG_TYPE_MVF:
1186 case REG_TYPE_MVD:
1187 case REG_TYPE_MVFX:
1188 case REG_TYPE_MVDX:
1189 /* Generic coprocessor register names are allowed for these. */
79134647 1190 if (reg && reg->type == REG_TYPE_CN)
c19d1205
ZW
1191 return reg->number;
1192 break;
69b97547 1193
c19d1205
ZW
1194 case REG_TYPE_CP:
1195 /* For backward compatibility, a bare number is valid here. */
1196 {
1197 unsigned long processor = strtoul (start, ccp, 10);
1198 if (*ccp != start && processor <= 15)
1199 return processor;
1200 }
6057a28f 1201
c19d1205
ZW
1202 case REG_TYPE_MMXWC:
1203 /* WC includes WCG. ??? I'm not sure this is true for all
1204 instructions that take WC registers. */
79134647 1205 if (reg && reg->type == REG_TYPE_MMXWCG)
c19d1205 1206 return reg->number;
6057a28f 1207 break;
c19d1205 1208
6057a28f 1209 default:
c19d1205 1210 break;
6057a28f
NC
1211 }
1212
dcbf9037
JB
1213 return FAIL;
1214}
1215
1216/* As arm_reg_parse_multi, but the register must be of type TYPE, and the
1217 return value is the register number or FAIL. */
1218
1219static int
1220arm_reg_parse (char **ccp, enum arm_reg_type type)
1221{
1222 char *start = *ccp;
1223 struct reg_entry *reg = arm_reg_parse_multi (ccp);
1224 int ret;
1225
1226 /* Do not allow a scalar (reg+index) to parse as a register. */
1227 if (reg && reg->neon && (reg->neon->defined & NTA_HASINDEX))
1228 return FAIL;
1229
1230 if (reg && reg->type == type)
1231 return reg->number;
1232
1233 if ((ret = arm_reg_alt_syntax (ccp, start, reg, type)) != FAIL)
1234 return ret;
1235
c19d1205
ZW
1236 *ccp = start;
1237 return FAIL;
1238}
69b97547 1239
dcbf9037
JB
1240/* Parse a Neon type specifier. *STR should point at the leading '.'
1241 character. Does no verification at this stage that the type fits the opcode
1242 properly. E.g.,
1243
1244 .i32.i32.s16
1245 .s32.f32
1246 .u16
1247
1248 Can all be legally parsed by this function.
1249
1250 Fills in neon_type struct pointer with parsed information, and updates STR
1251 to point after the parsed type specifier. Returns SUCCESS if this was a legal
1252 type, FAIL if not. */
1253
1254static int
1255parse_neon_type (struct neon_type *type, char **str)
1256{
1257 char *ptr = *str;
1258
1259 if (type)
1260 type->elems = 0;
1261
1262 while (type->elems < NEON_MAX_TYPE_ELS)
1263 {
1264 enum neon_el_type thistype = NT_untyped;
1265 unsigned thissize = -1u;
1266
1267 if (*ptr != '.')
1268 break;
1269
1270 ptr++;
1271
1272 /* Just a size without an explicit type. */
1273 if (ISDIGIT (*ptr))
1274 goto parsesize;
1275
1276 switch (TOLOWER (*ptr))
1277 {
1278 case 'i': thistype = NT_integer; break;
1279 case 'f': thistype = NT_float; break;
1280 case 'p': thistype = NT_poly; break;
1281 case 's': thistype = NT_signed; break;
1282 case 'u': thistype = NT_unsigned; break;
037e8744
JB
1283 case 'd':
1284 thistype = NT_float;
1285 thissize = 64;
1286 ptr++;
1287 goto done;
dcbf9037
JB
1288 default:
1289 as_bad (_("unexpected character `%c' in type specifier"), *ptr);
1290 return FAIL;
1291 }
1292
1293 ptr++;
1294
1295 /* .f is an abbreviation for .f32. */
1296 if (thistype == NT_float && !ISDIGIT (*ptr))
1297 thissize = 32;
1298 else
1299 {
1300 parsesize:
1301 thissize = strtoul (ptr, &ptr, 10);
1302
1303 if (thissize != 8 && thissize != 16 && thissize != 32
1304 && thissize != 64)
1305 {
1306 as_bad (_("bad size %d in type specifier"), thissize);
1307 return FAIL;
1308 }
1309 }
1310
037e8744 1311 done:
dcbf9037
JB
1312 if (type)
1313 {
1314 type->el[type->elems].type = thistype;
1315 type->el[type->elems].size = thissize;
1316 type->elems++;
1317 }
1318 }
1319
1320 /* Empty/missing type is not a successful parse. */
1321 if (type->elems == 0)
1322 return FAIL;
1323
1324 *str = ptr;
1325
1326 return SUCCESS;
1327}
1328
1329/* Errors may be set multiple times during parsing or bit encoding
1330 (particularly in the Neon bits), but usually the earliest error which is set
1331 will be the most meaningful. Avoid overwriting it with later (cascading)
1332 errors by calling this function. */
1333
1334static void
1335first_error (const char *err)
1336{
1337 if (!inst.error)
1338 inst.error = err;
1339}
1340
1341/* Parse a single type, e.g. ".s32", leading period included. */
1342static int
1343parse_neon_operand_type (struct neon_type_el *vectype, char **ccp)
1344{
1345 char *str = *ccp;
1346 struct neon_type optype;
1347
1348 if (*str == '.')
1349 {
1350 if (parse_neon_type (&optype, &str) == SUCCESS)
1351 {
1352 if (optype.elems == 1)
1353 *vectype = optype.el[0];
1354 else
1355 {
1356 first_error (_("only one type should be specified for operand"));
1357 return FAIL;
1358 }
1359 }
1360 else
1361 {
1362 first_error (_("vector type expected"));
1363 return FAIL;
1364 }
1365 }
1366 else
1367 return FAIL;
5f4273c7 1368
dcbf9037 1369 *ccp = str;
5f4273c7 1370
dcbf9037
JB
1371 return SUCCESS;
1372}
1373
1374/* Special meanings for indices (which have a range of 0-7), which will fit into
1375 a 4-bit integer. */
1376
1377#define NEON_ALL_LANES 15
1378#define NEON_INTERLEAVE_LANES 14
1379
1380/* Parse either a register or a scalar, with an optional type. Return the
1381 register number, and optionally fill in the actual type of the register
1382 when multiple alternatives were given (NEON_TYPE_NDQ) in *RTYPE, and
1383 type/index information in *TYPEINFO. */
1384
1385static int
1386parse_typed_reg_or_scalar (char **ccp, enum arm_reg_type type,
1387 enum arm_reg_type *rtype,
1388 struct neon_typed_alias *typeinfo)
1389{
1390 char *str = *ccp;
1391 struct reg_entry *reg = arm_reg_parse_multi (&str);
1392 struct neon_typed_alias atype;
1393 struct neon_type_el parsetype;
1394
1395 atype.defined = 0;
1396 atype.index = -1;
1397 atype.eltype.type = NT_invtype;
1398 atype.eltype.size = -1;
1399
1400 /* Try alternate syntax for some types of register. Note these are mutually
1401 exclusive with the Neon syntax extensions. */
1402 if (reg == NULL)
1403 {
1404 int altreg = arm_reg_alt_syntax (&str, *ccp, reg, type);
1405 if (altreg != FAIL)
1406 *ccp = str;
1407 if (typeinfo)
1408 *typeinfo = atype;
1409 return altreg;
1410 }
1411
037e8744
JB
1412 /* Undo polymorphism when a set of register types may be accepted. */
1413 if ((type == REG_TYPE_NDQ
1414 && (reg->type == REG_TYPE_NQ || reg->type == REG_TYPE_VFD))
1415 || (type == REG_TYPE_VFSD
1416 && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD))
1417 || (type == REG_TYPE_NSDQ
1418 && (reg->type == REG_TYPE_VFS || reg->type == REG_TYPE_VFD
f512f76f
NC
1419 || reg->type == REG_TYPE_NQ))
1420 || (type == REG_TYPE_MMXWC
1421 && (reg->type == REG_TYPE_MMXWCG)))
21d799b5 1422 type = (enum arm_reg_type) reg->type;
dcbf9037
JB
1423
1424 if (type != reg->type)
1425 return FAIL;
1426
1427 if (reg->neon)
1428 atype = *reg->neon;
5f4273c7 1429
dcbf9037
JB
1430 if (parse_neon_operand_type (&parsetype, &str) == SUCCESS)
1431 {
1432 if ((atype.defined & NTA_HASTYPE) != 0)
1433 {
1434 first_error (_("can't redefine type for operand"));
1435 return FAIL;
1436 }
1437 atype.defined |= NTA_HASTYPE;
1438 atype.eltype = parsetype;
1439 }
5f4273c7 1440
dcbf9037
JB
1441 if (skip_past_char (&str, '[') == SUCCESS)
1442 {
1443 if (type != REG_TYPE_VFD)
1444 {
1445 first_error (_("only D registers may be indexed"));
1446 return FAIL;
1447 }
5f4273c7 1448
dcbf9037
JB
1449 if ((atype.defined & NTA_HASINDEX) != 0)
1450 {
1451 first_error (_("can't change index for operand"));
1452 return FAIL;
1453 }
1454
1455 atype.defined |= NTA_HASINDEX;
1456
1457 if (skip_past_char (&str, ']') == SUCCESS)
1458 atype.index = NEON_ALL_LANES;
1459 else
1460 {
1461 expressionS exp;
1462
1463 my_get_expression (&exp, &str, GE_NO_PREFIX);
1464
1465 if (exp.X_op != O_constant)
1466 {
1467 first_error (_("constant expression required"));
1468 return FAIL;
1469 }
1470
1471 if (skip_past_char (&str, ']') == FAIL)
1472 return FAIL;
1473
1474 atype.index = exp.X_add_number;
1475 }
1476 }
5f4273c7 1477
dcbf9037
JB
1478 if (typeinfo)
1479 *typeinfo = atype;
5f4273c7 1480
dcbf9037
JB
1481 if (rtype)
1482 *rtype = type;
5f4273c7 1483
dcbf9037 1484 *ccp = str;
5f4273c7 1485
dcbf9037
JB
1486 return reg->number;
1487}
1488
1489/* Like arm_reg_parse, but allow allow the following extra features:
1490 - If RTYPE is non-zero, return the (possibly restricted) type of the
1491 register (e.g. Neon double or quad reg when either has been requested).
1492 - If this is a Neon vector type with additional type information, fill
1493 in the struct pointed to by VECTYPE (if non-NULL).
5f4273c7 1494 This function will fault on encountering a scalar. */
dcbf9037
JB
1495
1496static int
1497arm_typed_reg_parse (char **ccp, enum arm_reg_type type,
1498 enum arm_reg_type *rtype, struct neon_type_el *vectype)
1499{
1500 struct neon_typed_alias atype;
1501 char *str = *ccp;
1502 int reg = parse_typed_reg_or_scalar (&str, type, rtype, &atype);
1503
1504 if (reg == FAIL)
1505 return FAIL;
1506
0855e32b
NS
1507 /* Do not allow regname(... to parse as a register. */
1508 if (*str == '(')
1509 return FAIL;
1510
dcbf9037
JB
1511 /* Do not allow a scalar (reg+index) to parse as a register. */
1512 if ((atype.defined & NTA_HASINDEX) != 0)
1513 {
1514 first_error (_("register operand expected, but got scalar"));
1515 return FAIL;
1516 }
1517
1518 if (vectype)
1519 *vectype = atype.eltype;
1520
1521 *ccp = str;
1522
1523 return reg;
1524}
1525
1526#define NEON_SCALAR_REG(X) ((X) >> 4)
1527#define NEON_SCALAR_INDEX(X) ((X) & 15)
1528
5287ad62
JB
1529/* Parse a Neon scalar. Most of the time when we're parsing a scalar, we don't
1530 have enough information to be able to do a good job bounds-checking. So, we
1531 just do easy checks here, and do further checks later. */
1532
1533static int
dcbf9037 1534parse_scalar (char **ccp, int elsize, struct neon_type_el *type)
5287ad62 1535{
dcbf9037 1536 int reg;
5287ad62 1537 char *str = *ccp;
dcbf9037 1538 struct neon_typed_alias atype;
5f4273c7 1539
dcbf9037 1540 reg = parse_typed_reg_or_scalar (&str, REG_TYPE_VFD, NULL, &atype);
5f4273c7 1541
dcbf9037 1542 if (reg == FAIL || (atype.defined & NTA_HASINDEX) == 0)
5287ad62 1543 return FAIL;
5f4273c7 1544
dcbf9037 1545 if (atype.index == NEON_ALL_LANES)
5287ad62 1546 {
dcbf9037 1547 first_error (_("scalar must have an index"));
5287ad62
JB
1548 return FAIL;
1549 }
dcbf9037 1550 else if (atype.index >= 64 / elsize)
5287ad62 1551 {
dcbf9037 1552 first_error (_("scalar index out of range"));
5287ad62
JB
1553 return FAIL;
1554 }
5f4273c7 1555
dcbf9037
JB
1556 if (type)
1557 *type = atype.eltype;
5f4273c7 1558
5287ad62 1559 *ccp = str;
5f4273c7 1560
dcbf9037 1561 return reg * 16 + atype.index;
5287ad62
JB
1562}
1563
c19d1205 1564/* Parse an ARM register list. Returns the bitmask, or FAIL. */
e07e6e58 1565
c19d1205
ZW
1566static long
1567parse_reg_list (char ** strp)
1568{
1569 char * str = * strp;
1570 long range = 0;
1571 int another_range;
a737bd4d 1572
c19d1205
ZW
1573 /* We come back here if we get ranges concatenated by '+' or '|'. */
1574 do
6057a28f 1575 {
c19d1205 1576 another_range = 0;
a737bd4d 1577
c19d1205
ZW
1578 if (*str == '{')
1579 {
1580 int in_range = 0;
1581 int cur_reg = -1;
a737bd4d 1582
c19d1205
ZW
1583 str++;
1584 do
1585 {
1586 int reg;
6057a28f 1587
dcbf9037 1588 if ((reg = arm_reg_parse (&str, REG_TYPE_RN)) == FAIL)
c19d1205 1589 {
dcbf9037 1590 first_error (_(reg_expected_msgs[REG_TYPE_RN]));
c19d1205
ZW
1591 return FAIL;
1592 }
a737bd4d 1593
c19d1205
ZW
1594 if (in_range)
1595 {
1596 int i;
a737bd4d 1597
c19d1205
ZW
1598 if (reg <= cur_reg)
1599 {
dcbf9037 1600 first_error (_("bad range in register list"));
c19d1205
ZW
1601 return FAIL;
1602 }
40a18ebd 1603
c19d1205
ZW
1604 for (i = cur_reg + 1; i < reg; i++)
1605 {
1606 if (range & (1 << i))
1607 as_tsktsk
1608 (_("Warning: duplicated register (r%d) in register list"),
1609 i);
1610 else
1611 range |= 1 << i;
1612 }
1613 in_range = 0;
1614 }
a737bd4d 1615
c19d1205
ZW
1616 if (range & (1 << reg))
1617 as_tsktsk (_("Warning: duplicated register (r%d) in register list"),
1618 reg);
1619 else if (reg <= cur_reg)
1620 as_tsktsk (_("Warning: register range not in ascending order"));
a737bd4d 1621
c19d1205
ZW
1622 range |= 1 << reg;
1623 cur_reg = reg;
1624 }
1625 while (skip_past_comma (&str) != FAIL
1626 || (in_range = 1, *str++ == '-'));
1627 str--;
a737bd4d 1628
c19d1205
ZW
1629 if (*str++ != '}')
1630 {
dcbf9037 1631 first_error (_("missing `}'"));
c19d1205
ZW
1632 return FAIL;
1633 }
1634 }
1635 else
1636 {
91d6fa6a 1637 expressionS exp;
40a18ebd 1638
91d6fa6a 1639 if (my_get_expression (&exp, &str, GE_NO_PREFIX))
c19d1205 1640 return FAIL;
40a18ebd 1641
91d6fa6a 1642 if (exp.X_op == O_constant)
c19d1205 1643 {
91d6fa6a
NC
1644 if (exp.X_add_number
1645 != (exp.X_add_number & 0x0000ffff))
c19d1205
ZW
1646 {
1647 inst.error = _("invalid register mask");
1648 return FAIL;
1649 }
a737bd4d 1650
91d6fa6a 1651 if ((range & exp.X_add_number) != 0)
c19d1205 1652 {
91d6fa6a 1653 int regno = range & exp.X_add_number;
a737bd4d 1654
c19d1205
ZW
1655 regno &= -regno;
1656 regno = (1 << regno) - 1;
1657 as_tsktsk
1658 (_("Warning: duplicated register (r%d) in register list"),
1659 regno);
1660 }
a737bd4d 1661
91d6fa6a 1662 range |= exp.X_add_number;
c19d1205
ZW
1663 }
1664 else
1665 {
1666 if (inst.reloc.type != 0)
1667 {
1668 inst.error = _("expression too complex");
1669 return FAIL;
1670 }
a737bd4d 1671
91d6fa6a 1672 memcpy (&inst.reloc.exp, &exp, sizeof (expressionS));
c19d1205
ZW
1673 inst.reloc.type = BFD_RELOC_ARM_MULTI;
1674 inst.reloc.pc_rel = 0;
1675 }
1676 }
a737bd4d 1677
c19d1205
ZW
1678 if (*str == '|' || *str == '+')
1679 {
1680 str++;
1681 another_range = 1;
1682 }
a737bd4d 1683 }
c19d1205 1684 while (another_range);
a737bd4d 1685
c19d1205
ZW
1686 *strp = str;
1687 return range;
a737bd4d
NC
1688}
1689
5287ad62
JB
1690/* Types of registers in a list. */
1691
1692enum reg_list_els
1693{
1694 REGLIST_VFP_S,
1695 REGLIST_VFP_D,
1696 REGLIST_NEON_D
1697};
1698
c19d1205
ZW
1699/* Parse a VFP register list. If the string is invalid return FAIL.
1700 Otherwise return the number of registers, and set PBASE to the first
5287ad62
JB
1701 register. Parses registers of type ETYPE.
1702 If REGLIST_NEON_D is used, several syntax enhancements are enabled:
1703 - Q registers can be used to specify pairs of D registers
1704 - { } can be omitted from around a singleton register list
1705 FIXME: This is not implemented, as it would require backtracking in
1706 some cases, e.g.:
1707 vtbl.8 d3,d4,d5
1708 This could be done (the meaning isn't really ambiguous), but doesn't
1709 fit in well with the current parsing framework.
dcbf9037
JB
1710 - 32 D registers may be used (also true for VFPv3).
1711 FIXME: Types are ignored in these register lists, which is probably a
1712 bug. */
6057a28f 1713
c19d1205 1714static int
037e8744 1715parse_vfp_reg_list (char **ccp, unsigned int *pbase, enum reg_list_els etype)
6057a28f 1716{
037e8744 1717 char *str = *ccp;
c19d1205
ZW
1718 int base_reg;
1719 int new_base;
21d799b5 1720 enum arm_reg_type regtype = (enum arm_reg_type) 0;
5287ad62 1721 int max_regs = 0;
c19d1205
ZW
1722 int count = 0;
1723 int warned = 0;
1724 unsigned long mask = 0;
a737bd4d 1725 int i;
6057a28f 1726
037e8744 1727 if (*str != '{')
5287ad62
JB
1728 {
1729 inst.error = _("expecting {");
1730 return FAIL;
1731 }
6057a28f 1732
037e8744 1733 str++;
6057a28f 1734
5287ad62 1735 switch (etype)
c19d1205 1736 {
5287ad62 1737 case REGLIST_VFP_S:
c19d1205
ZW
1738 regtype = REG_TYPE_VFS;
1739 max_regs = 32;
5287ad62 1740 break;
5f4273c7 1741
5287ad62
JB
1742 case REGLIST_VFP_D:
1743 regtype = REG_TYPE_VFD;
b7fc2769 1744 break;
5f4273c7 1745
b7fc2769
JB
1746 case REGLIST_NEON_D:
1747 regtype = REG_TYPE_NDQ;
1748 break;
1749 }
1750
1751 if (etype != REGLIST_VFP_S)
1752 {
b1cc4aeb
PB
1753 /* VFPv3 allows 32 D registers, except for the VFPv3-D16 variant. */
1754 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
5287ad62
JB
1755 {
1756 max_regs = 32;
1757 if (thumb_mode)
1758 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
b1cc4aeb 1759 fpu_vfp_ext_d32);
5287ad62
JB
1760 else
1761 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
b1cc4aeb 1762 fpu_vfp_ext_d32);
5287ad62
JB
1763 }
1764 else
1765 max_regs = 16;
c19d1205 1766 }
6057a28f 1767
c19d1205 1768 base_reg = max_regs;
a737bd4d 1769
c19d1205
ZW
1770 do
1771 {
5287ad62 1772 int setmask = 1, addregs = 1;
dcbf9037 1773
037e8744 1774 new_base = arm_typed_reg_parse (&str, regtype, &regtype, NULL);
dcbf9037 1775
c19d1205 1776 if (new_base == FAIL)
a737bd4d 1777 {
dcbf9037 1778 first_error (_(reg_expected_msgs[regtype]));
c19d1205
ZW
1779 return FAIL;
1780 }
5f4273c7 1781
b7fc2769
JB
1782 if (new_base >= max_regs)
1783 {
1784 first_error (_("register out of range in list"));
1785 return FAIL;
1786 }
5f4273c7 1787
5287ad62
JB
1788 /* Note: a value of 2 * n is returned for the register Q<n>. */
1789 if (regtype == REG_TYPE_NQ)
1790 {
1791 setmask = 3;
1792 addregs = 2;
1793 }
1794
c19d1205
ZW
1795 if (new_base < base_reg)
1796 base_reg = new_base;
a737bd4d 1797
5287ad62 1798 if (mask & (setmask << new_base))
c19d1205 1799 {
dcbf9037 1800 first_error (_("invalid register list"));
c19d1205 1801 return FAIL;
a737bd4d 1802 }
a737bd4d 1803
c19d1205
ZW
1804 if ((mask >> new_base) != 0 && ! warned)
1805 {
1806 as_tsktsk (_("register list not in ascending order"));
1807 warned = 1;
1808 }
0bbf2aa4 1809
5287ad62
JB
1810 mask |= setmask << new_base;
1811 count += addregs;
0bbf2aa4 1812
037e8744 1813 if (*str == '-') /* We have the start of a range expression */
c19d1205
ZW
1814 {
1815 int high_range;
0bbf2aa4 1816
037e8744 1817 str++;
0bbf2aa4 1818
037e8744 1819 if ((high_range = arm_typed_reg_parse (&str, regtype, NULL, NULL))
dcbf9037 1820 == FAIL)
c19d1205
ZW
1821 {
1822 inst.error = gettext (reg_expected_msgs[regtype]);
1823 return FAIL;
1824 }
0bbf2aa4 1825
b7fc2769
JB
1826 if (high_range >= max_regs)
1827 {
1828 first_error (_("register out of range in list"));
1829 return FAIL;
1830 }
1831
5287ad62
JB
1832 if (regtype == REG_TYPE_NQ)
1833 high_range = high_range + 1;
1834
c19d1205
ZW
1835 if (high_range <= new_base)
1836 {
1837 inst.error = _("register range not in ascending order");
1838 return FAIL;
1839 }
0bbf2aa4 1840
5287ad62 1841 for (new_base += addregs; new_base <= high_range; new_base += addregs)
0bbf2aa4 1842 {
5287ad62 1843 if (mask & (setmask << new_base))
0bbf2aa4 1844 {
c19d1205
ZW
1845 inst.error = _("invalid register list");
1846 return FAIL;
0bbf2aa4 1847 }
c19d1205 1848
5287ad62
JB
1849 mask |= setmask << new_base;
1850 count += addregs;
0bbf2aa4 1851 }
0bbf2aa4 1852 }
0bbf2aa4 1853 }
037e8744 1854 while (skip_past_comma (&str) != FAIL);
0bbf2aa4 1855
037e8744 1856 str++;
0bbf2aa4 1857
c19d1205
ZW
1858 /* Sanity check -- should have raised a parse error above. */
1859 if (count == 0 || count > max_regs)
1860 abort ();
1861
1862 *pbase = base_reg;
1863
1864 /* Final test -- the registers must be consecutive. */
1865 mask >>= base_reg;
1866 for (i = 0; i < count; i++)
1867 {
1868 if ((mask & (1u << i)) == 0)
1869 {
1870 inst.error = _("non-contiguous register range");
1871 return FAIL;
1872 }
1873 }
1874
037e8744
JB
1875 *ccp = str;
1876
c19d1205 1877 return count;
b99bd4ef
NC
1878}
1879
dcbf9037
JB
1880/* True if two alias types are the same. */
1881
c921be7d 1882static bfd_boolean
dcbf9037
JB
1883neon_alias_types_same (struct neon_typed_alias *a, struct neon_typed_alias *b)
1884{
1885 if (!a && !b)
c921be7d 1886 return TRUE;
5f4273c7 1887
dcbf9037 1888 if (!a || !b)
c921be7d 1889 return FALSE;
dcbf9037
JB
1890
1891 if (a->defined != b->defined)
c921be7d 1892 return FALSE;
5f4273c7 1893
dcbf9037
JB
1894 if ((a->defined & NTA_HASTYPE) != 0
1895 && (a->eltype.type != b->eltype.type
1896 || a->eltype.size != b->eltype.size))
c921be7d 1897 return FALSE;
dcbf9037
JB
1898
1899 if ((a->defined & NTA_HASINDEX) != 0
1900 && (a->index != b->index))
c921be7d 1901 return FALSE;
5f4273c7 1902
c921be7d 1903 return TRUE;
dcbf9037
JB
1904}
1905
5287ad62
JB
1906/* Parse element/structure lists for Neon VLD<n> and VST<n> instructions.
1907 The base register is put in *PBASE.
dcbf9037 1908 The lane (or one of the NEON_*_LANES constants) is placed in bits [3:0] of
5287ad62
JB
1909 the return value.
1910 The register stride (minus one) is put in bit 4 of the return value.
dcbf9037
JB
1911 Bits [6:5] encode the list length (minus one).
1912 The type of the list elements is put in *ELTYPE, if non-NULL. */
5287ad62 1913
5287ad62 1914#define NEON_LANE(X) ((X) & 0xf)
dcbf9037 1915#define NEON_REG_STRIDE(X) ((((X) >> 4) & 1) + 1)
5287ad62
JB
1916#define NEON_REGLIST_LENGTH(X) ((((X) >> 5) & 3) + 1)
1917
1918static int
dcbf9037
JB
1919parse_neon_el_struct_list (char **str, unsigned *pbase,
1920 struct neon_type_el *eltype)
5287ad62
JB
1921{
1922 char *ptr = *str;
1923 int base_reg = -1;
1924 int reg_incr = -1;
1925 int count = 0;
1926 int lane = -1;
1927 int leading_brace = 0;
1928 enum arm_reg_type rtype = REG_TYPE_NDQ;
20203fb9
NC
1929 const char *const incr_error = _("register stride must be 1 or 2");
1930 const char *const type_error = _("mismatched element/structure types in list");
dcbf9037 1931 struct neon_typed_alias firsttype;
5f4273c7 1932
5287ad62
JB
1933 if (skip_past_char (&ptr, '{') == SUCCESS)
1934 leading_brace = 1;
5f4273c7 1935
5287ad62
JB
1936 do
1937 {
dcbf9037
JB
1938 struct neon_typed_alias atype;
1939 int getreg = parse_typed_reg_or_scalar (&ptr, rtype, &rtype, &atype);
1940
5287ad62
JB
1941 if (getreg == FAIL)
1942 {
dcbf9037 1943 first_error (_(reg_expected_msgs[rtype]));
5287ad62
JB
1944 return FAIL;
1945 }
5f4273c7 1946
5287ad62
JB
1947 if (base_reg == -1)
1948 {
1949 base_reg = getreg;
1950 if (rtype == REG_TYPE_NQ)
1951 {
1952 reg_incr = 1;
5287ad62 1953 }
dcbf9037 1954 firsttype = atype;
5287ad62
JB
1955 }
1956 else if (reg_incr == -1)
1957 {
1958 reg_incr = getreg - base_reg;
1959 if (reg_incr < 1 || reg_incr > 2)
1960 {
dcbf9037 1961 first_error (_(incr_error));
5287ad62
JB
1962 return FAIL;
1963 }
1964 }
1965 else if (getreg != base_reg + reg_incr * count)
1966 {
dcbf9037
JB
1967 first_error (_(incr_error));
1968 return FAIL;
1969 }
1970
c921be7d 1971 if (! neon_alias_types_same (&atype, &firsttype))
dcbf9037
JB
1972 {
1973 first_error (_(type_error));
5287ad62
JB
1974 return FAIL;
1975 }
5f4273c7 1976
5287ad62
JB
1977 /* Handle Dn-Dm or Qn-Qm syntax. Can only be used with non-indexed list
1978 modes. */
1979 if (ptr[0] == '-')
1980 {
dcbf9037 1981 struct neon_typed_alias htype;
5287ad62
JB
1982 int hireg, dregs = (rtype == REG_TYPE_NQ) ? 2 : 1;
1983 if (lane == -1)
1984 lane = NEON_INTERLEAVE_LANES;
1985 else if (lane != NEON_INTERLEAVE_LANES)
1986 {
dcbf9037 1987 first_error (_(type_error));
5287ad62
JB
1988 return FAIL;
1989 }
1990 if (reg_incr == -1)
1991 reg_incr = 1;
1992 else if (reg_incr != 1)
1993 {
dcbf9037 1994 first_error (_("don't use Rn-Rm syntax with non-unit stride"));
5287ad62
JB
1995 return FAIL;
1996 }
1997 ptr++;
dcbf9037 1998 hireg = parse_typed_reg_or_scalar (&ptr, rtype, NULL, &htype);
5287ad62
JB
1999 if (hireg == FAIL)
2000 {
dcbf9037
JB
2001 first_error (_(reg_expected_msgs[rtype]));
2002 return FAIL;
2003 }
c921be7d 2004 if (! neon_alias_types_same (&htype, &firsttype))
dcbf9037
JB
2005 {
2006 first_error (_(type_error));
5287ad62
JB
2007 return FAIL;
2008 }
2009 count += hireg + dregs - getreg;
2010 continue;
2011 }
5f4273c7 2012
5287ad62
JB
2013 /* If we're using Q registers, we can't use [] or [n] syntax. */
2014 if (rtype == REG_TYPE_NQ)
2015 {
2016 count += 2;
2017 continue;
2018 }
5f4273c7 2019
dcbf9037 2020 if ((atype.defined & NTA_HASINDEX) != 0)
5287ad62 2021 {
dcbf9037
JB
2022 if (lane == -1)
2023 lane = atype.index;
2024 else if (lane != atype.index)
5287ad62 2025 {
dcbf9037
JB
2026 first_error (_(type_error));
2027 return FAIL;
5287ad62
JB
2028 }
2029 }
2030 else if (lane == -1)
2031 lane = NEON_INTERLEAVE_LANES;
2032 else if (lane != NEON_INTERLEAVE_LANES)
2033 {
dcbf9037 2034 first_error (_(type_error));
5287ad62
JB
2035 return FAIL;
2036 }
2037 count++;
2038 }
2039 while ((count != 1 || leading_brace) && skip_past_comma (&ptr) != FAIL);
5f4273c7 2040
5287ad62
JB
2041 /* No lane set by [x]. We must be interleaving structures. */
2042 if (lane == -1)
2043 lane = NEON_INTERLEAVE_LANES;
5f4273c7 2044
5287ad62
JB
2045 /* Sanity check. */
2046 if (lane == -1 || base_reg == -1 || count < 1 || count > 4
2047 || (count > 1 && reg_incr == -1))
2048 {
dcbf9037 2049 first_error (_("error parsing element/structure list"));
5287ad62
JB
2050 return FAIL;
2051 }
2052
2053 if ((count > 1 || leading_brace) && skip_past_char (&ptr, '}') == FAIL)
2054 {
dcbf9037 2055 first_error (_("expected }"));
5287ad62
JB
2056 return FAIL;
2057 }
5f4273c7 2058
5287ad62
JB
2059 if (reg_incr == -1)
2060 reg_incr = 1;
2061
dcbf9037
JB
2062 if (eltype)
2063 *eltype = firsttype.eltype;
2064
5287ad62
JB
2065 *pbase = base_reg;
2066 *str = ptr;
5f4273c7 2067
5287ad62
JB
2068 return lane | ((reg_incr - 1) << 4) | ((count - 1) << 5);
2069}
2070
c19d1205
ZW
2071/* Parse an explicit relocation suffix on an expression. This is
2072 either nothing, or a word in parentheses. Note that if !OBJ_ELF,
2073 arm_reloc_hsh contains no entries, so this function can only
2074 succeed if there is no () after the word. Returns -1 on error,
2075 BFD_RELOC_UNUSED if there wasn't any suffix. */
3da1d841 2076
c19d1205
ZW
2077static int
2078parse_reloc (char **str)
b99bd4ef 2079{
c19d1205
ZW
2080 struct reloc_entry *r;
2081 char *p, *q;
b99bd4ef 2082
c19d1205
ZW
2083 if (**str != '(')
2084 return BFD_RELOC_UNUSED;
b99bd4ef 2085
c19d1205
ZW
2086 p = *str + 1;
2087 q = p;
2088
2089 while (*q && *q != ')' && *q != ',')
2090 q++;
2091 if (*q != ')')
2092 return -1;
2093
21d799b5
NC
2094 if ((r = (struct reloc_entry *)
2095 hash_find_n (arm_reloc_hsh, p, q - p)) == NULL)
c19d1205
ZW
2096 return -1;
2097
2098 *str = q + 1;
2099 return r->reloc;
b99bd4ef
NC
2100}
2101
c19d1205
ZW
2102/* Directives: register aliases. */
2103
dcbf9037 2104static struct reg_entry *
90ec0d68 2105insert_reg_alias (char *str, unsigned number, int type)
b99bd4ef 2106{
d3ce72d0 2107 struct reg_entry *new_reg;
c19d1205 2108 const char *name;
b99bd4ef 2109
d3ce72d0 2110 if ((new_reg = (struct reg_entry *) hash_find (arm_reg_hsh, str)) != 0)
c19d1205 2111 {
d3ce72d0 2112 if (new_reg->builtin)
c19d1205 2113 as_warn (_("ignoring attempt to redefine built-in register '%s'"), str);
b99bd4ef 2114
c19d1205
ZW
2115 /* Only warn about a redefinition if it's not defined as the
2116 same register. */
d3ce72d0 2117 else if (new_reg->number != number || new_reg->type != type)
c19d1205 2118 as_warn (_("ignoring redefinition of register alias '%s'"), str);
69b97547 2119
d929913e 2120 return NULL;
c19d1205 2121 }
b99bd4ef 2122
c19d1205 2123 name = xstrdup (str);
d3ce72d0 2124 new_reg = (struct reg_entry *) xmalloc (sizeof (struct reg_entry));
b99bd4ef 2125
d3ce72d0
NC
2126 new_reg->name = name;
2127 new_reg->number = number;
2128 new_reg->type = type;
2129 new_reg->builtin = FALSE;
2130 new_reg->neon = NULL;
b99bd4ef 2131
d3ce72d0 2132 if (hash_insert (arm_reg_hsh, name, (void *) new_reg))
c19d1205 2133 abort ();
5f4273c7 2134
d3ce72d0 2135 return new_reg;
dcbf9037
JB
2136}
2137
2138static void
2139insert_neon_reg_alias (char *str, int number, int type,
2140 struct neon_typed_alias *atype)
2141{
2142 struct reg_entry *reg = insert_reg_alias (str, number, type);
5f4273c7 2143
dcbf9037
JB
2144 if (!reg)
2145 {
2146 first_error (_("attempt to redefine typed alias"));
2147 return;
2148 }
5f4273c7 2149
dcbf9037
JB
2150 if (atype)
2151 {
21d799b5
NC
2152 reg->neon = (struct neon_typed_alias *)
2153 xmalloc (sizeof (struct neon_typed_alias));
dcbf9037
JB
2154 *reg->neon = *atype;
2155 }
c19d1205 2156}
b99bd4ef 2157
c19d1205 2158/* Look for the .req directive. This is of the form:
b99bd4ef 2159
c19d1205 2160 new_register_name .req existing_register_name
b99bd4ef 2161
c19d1205 2162 If we find one, or if it looks sufficiently like one that we want to
d929913e 2163 handle any error here, return TRUE. Otherwise return FALSE. */
b99bd4ef 2164
d929913e 2165static bfd_boolean
c19d1205
ZW
2166create_register_alias (char * newname, char *p)
2167{
2168 struct reg_entry *old;
2169 char *oldname, *nbuf;
2170 size_t nlen;
b99bd4ef 2171
c19d1205
ZW
2172 /* The input scrubber ensures that whitespace after the mnemonic is
2173 collapsed to single spaces. */
2174 oldname = p;
2175 if (strncmp (oldname, " .req ", 6) != 0)
d929913e 2176 return FALSE;
b99bd4ef 2177
c19d1205
ZW
2178 oldname += 6;
2179 if (*oldname == '\0')
d929913e 2180 return FALSE;
b99bd4ef 2181
21d799b5 2182 old = (struct reg_entry *) hash_find (arm_reg_hsh, oldname);
c19d1205 2183 if (!old)
b99bd4ef 2184 {
c19d1205 2185 as_warn (_("unknown register '%s' -- .req ignored"), oldname);
d929913e 2186 return TRUE;
b99bd4ef
NC
2187 }
2188
c19d1205
ZW
2189 /* If TC_CASE_SENSITIVE is defined, then newname already points to
2190 the desired alias name, and p points to its end. If not, then
2191 the desired alias name is in the global original_case_string. */
2192#ifdef TC_CASE_SENSITIVE
2193 nlen = p - newname;
2194#else
2195 newname = original_case_string;
2196 nlen = strlen (newname);
2197#endif
b99bd4ef 2198
21d799b5 2199 nbuf = (char *) alloca (nlen + 1);
c19d1205
ZW
2200 memcpy (nbuf, newname, nlen);
2201 nbuf[nlen] = '\0';
b99bd4ef 2202
c19d1205
ZW
2203 /* Create aliases under the new name as stated; an all-lowercase
2204 version of the new name; and an all-uppercase version of the new
2205 name. */
d929913e
NC
2206 if (insert_reg_alias (nbuf, old->number, old->type) != NULL)
2207 {
2208 for (p = nbuf; *p; p++)
2209 *p = TOUPPER (*p);
c19d1205 2210
d929913e
NC
2211 if (strncmp (nbuf, newname, nlen))
2212 {
2213 /* If this attempt to create an additional alias fails, do not bother
2214 trying to create the all-lower case alias. We will fail and issue
2215 a second, duplicate error message. This situation arises when the
2216 programmer does something like:
2217 foo .req r0
2218 Foo .req r1
2219 The second .req creates the "Foo" alias but then fails to create
5f4273c7 2220 the artificial FOO alias because it has already been created by the
d929913e
NC
2221 first .req. */
2222 if (insert_reg_alias (nbuf, old->number, old->type) == NULL)
2223 return TRUE;
2224 }
c19d1205 2225
d929913e
NC
2226 for (p = nbuf; *p; p++)
2227 *p = TOLOWER (*p);
c19d1205 2228
d929913e
NC
2229 if (strncmp (nbuf, newname, nlen))
2230 insert_reg_alias (nbuf, old->number, old->type);
2231 }
c19d1205 2232
d929913e 2233 return TRUE;
b99bd4ef
NC
2234}
2235
dcbf9037
JB
2236/* Create a Neon typed/indexed register alias using directives, e.g.:
2237 X .dn d5.s32[1]
2238 Y .qn 6.s16
2239 Z .dn d7
2240 T .dn Z[0]
2241 These typed registers can be used instead of the types specified after the
2242 Neon mnemonic, so long as all operands given have types. Types can also be
2243 specified directly, e.g.:
5f4273c7 2244 vadd d0.s32, d1.s32, d2.s32 */
dcbf9037 2245
c921be7d 2246static bfd_boolean
dcbf9037
JB
2247create_neon_reg_alias (char *newname, char *p)
2248{
2249 enum arm_reg_type basetype;
2250 struct reg_entry *basereg;
2251 struct reg_entry mybasereg;
2252 struct neon_type ntype;
2253 struct neon_typed_alias typeinfo;
12d6b0b7 2254 char *namebuf, *nameend ATTRIBUTE_UNUSED;
dcbf9037 2255 int namelen;
5f4273c7 2256
dcbf9037
JB
2257 typeinfo.defined = 0;
2258 typeinfo.eltype.type = NT_invtype;
2259 typeinfo.eltype.size = -1;
2260 typeinfo.index = -1;
5f4273c7 2261
dcbf9037 2262 nameend = p;
5f4273c7 2263
dcbf9037
JB
2264 if (strncmp (p, " .dn ", 5) == 0)
2265 basetype = REG_TYPE_VFD;
2266 else if (strncmp (p, " .qn ", 5) == 0)
2267 basetype = REG_TYPE_NQ;
2268 else
c921be7d 2269 return FALSE;
5f4273c7 2270
dcbf9037 2271 p += 5;
5f4273c7 2272
dcbf9037 2273 if (*p == '\0')
c921be7d 2274 return FALSE;
5f4273c7 2275
dcbf9037
JB
2276 basereg = arm_reg_parse_multi (&p);
2277
2278 if (basereg && basereg->type != basetype)
2279 {
2280 as_bad (_("bad type for register"));
c921be7d 2281 return FALSE;
dcbf9037
JB
2282 }
2283
2284 if (basereg == NULL)
2285 {
2286 expressionS exp;
2287 /* Try parsing as an integer. */
2288 my_get_expression (&exp, &p, GE_NO_PREFIX);
2289 if (exp.X_op != O_constant)
2290 {
2291 as_bad (_("expression must be constant"));
c921be7d 2292 return FALSE;
dcbf9037
JB
2293 }
2294 basereg = &mybasereg;
2295 basereg->number = (basetype == REG_TYPE_NQ) ? exp.X_add_number * 2
2296 : exp.X_add_number;
2297 basereg->neon = 0;
2298 }
2299
2300 if (basereg->neon)
2301 typeinfo = *basereg->neon;
2302
2303 if (parse_neon_type (&ntype, &p) == SUCCESS)
2304 {
2305 /* We got a type. */
2306 if (typeinfo.defined & NTA_HASTYPE)
2307 {
2308 as_bad (_("can't redefine the type of a register alias"));
c921be7d 2309 return FALSE;
dcbf9037 2310 }
5f4273c7 2311
dcbf9037
JB
2312 typeinfo.defined |= NTA_HASTYPE;
2313 if (ntype.elems != 1)
2314 {
2315 as_bad (_("you must specify a single type only"));
c921be7d 2316 return FALSE;
dcbf9037
JB
2317 }
2318 typeinfo.eltype = ntype.el[0];
2319 }
5f4273c7 2320
dcbf9037
JB
2321 if (skip_past_char (&p, '[') == SUCCESS)
2322 {
2323 expressionS exp;
2324 /* We got a scalar index. */
5f4273c7 2325
dcbf9037
JB
2326 if (typeinfo.defined & NTA_HASINDEX)
2327 {
2328 as_bad (_("can't redefine the index of a scalar alias"));
c921be7d 2329 return FALSE;
dcbf9037 2330 }
5f4273c7 2331
dcbf9037 2332 my_get_expression (&exp, &p, GE_NO_PREFIX);
5f4273c7 2333
dcbf9037
JB
2334 if (exp.X_op != O_constant)
2335 {
2336 as_bad (_("scalar index must be constant"));
c921be7d 2337 return FALSE;
dcbf9037 2338 }
5f4273c7 2339
dcbf9037
JB
2340 typeinfo.defined |= NTA_HASINDEX;
2341 typeinfo.index = exp.X_add_number;
5f4273c7 2342
dcbf9037
JB
2343 if (skip_past_char (&p, ']') == FAIL)
2344 {
2345 as_bad (_("expecting ]"));
c921be7d 2346 return FALSE;
dcbf9037
JB
2347 }
2348 }
2349
15735687
NS
2350 /* If TC_CASE_SENSITIVE is defined, then newname already points to
2351 the desired alias name, and p points to its end. If not, then
2352 the desired alias name is in the global original_case_string. */
2353#ifdef TC_CASE_SENSITIVE
dcbf9037 2354 namelen = nameend - newname;
15735687
NS
2355#else
2356 newname = original_case_string;
2357 namelen = strlen (newname);
2358#endif
2359
21d799b5 2360 namebuf = (char *) alloca (namelen + 1);
dcbf9037
JB
2361 strncpy (namebuf, newname, namelen);
2362 namebuf[namelen] = '\0';
5f4273c7 2363
dcbf9037
JB
2364 insert_neon_reg_alias (namebuf, basereg->number, basetype,
2365 typeinfo.defined != 0 ? &typeinfo : NULL);
5f4273c7 2366
dcbf9037
JB
2367 /* Insert name in all uppercase. */
2368 for (p = namebuf; *p; p++)
2369 *p = TOUPPER (*p);
5f4273c7 2370
dcbf9037
JB
2371 if (strncmp (namebuf, newname, namelen))
2372 insert_neon_reg_alias (namebuf, basereg->number, basetype,
2373 typeinfo.defined != 0 ? &typeinfo : NULL);
5f4273c7 2374
dcbf9037
JB
2375 /* Insert name in all lowercase. */
2376 for (p = namebuf; *p; p++)
2377 *p = TOLOWER (*p);
5f4273c7 2378
dcbf9037
JB
2379 if (strncmp (namebuf, newname, namelen))
2380 insert_neon_reg_alias (namebuf, basereg->number, basetype,
2381 typeinfo.defined != 0 ? &typeinfo : NULL);
5f4273c7 2382
c921be7d 2383 return TRUE;
dcbf9037
JB
2384}
2385
c19d1205
ZW
2386/* Should never be called, as .req goes between the alias and the
2387 register name, not at the beginning of the line. */
c921be7d 2388
b99bd4ef 2389static void
c19d1205 2390s_req (int a ATTRIBUTE_UNUSED)
b99bd4ef 2391{
c19d1205
ZW
2392 as_bad (_("invalid syntax for .req directive"));
2393}
b99bd4ef 2394
dcbf9037
JB
2395static void
2396s_dn (int a ATTRIBUTE_UNUSED)
2397{
2398 as_bad (_("invalid syntax for .dn directive"));
2399}
2400
2401static void
2402s_qn (int a ATTRIBUTE_UNUSED)
2403{
2404 as_bad (_("invalid syntax for .qn directive"));
2405}
2406
c19d1205
ZW
2407/* The .unreq directive deletes an alias which was previously defined
2408 by .req. For example:
b99bd4ef 2409
c19d1205
ZW
2410 my_alias .req r11
2411 .unreq my_alias */
b99bd4ef
NC
2412
2413static void
c19d1205 2414s_unreq (int a ATTRIBUTE_UNUSED)
b99bd4ef 2415{
c19d1205
ZW
2416 char * name;
2417 char saved_char;
b99bd4ef 2418
c19d1205
ZW
2419 name = input_line_pointer;
2420
2421 while (*input_line_pointer != 0
2422 && *input_line_pointer != ' '
2423 && *input_line_pointer != '\n')
2424 ++input_line_pointer;
2425
2426 saved_char = *input_line_pointer;
2427 *input_line_pointer = 0;
2428
2429 if (!*name)
2430 as_bad (_("invalid syntax for .unreq directive"));
2431 else
2432 {
21d799b5
NC
2433 struct reg_entry *reg = (struct reg_entry *) hash_find (arm_reg_hsh,
2434 name);
c19d1205
ZW
2435
2436 if (!reg)
2437 as_bad (_("unknown register alias '%s'"), name);
2438 else if (reg->builtin)
a1727c1a 2439 as_warn (_("ignoring attempt to use .unreq on fixed register name: '%s'"),
c19d1205
ZW
2440 name);
2441 else
2442 {
d929913e
NC
2443 char * p;
2444 char * nbuf;
2445
db0bc284 2446 hash_delete (arm_reg_hsh, name, FALSE);
c19d1205 2447 free ((char *) reg->name);
dcbf9037
JB
2448 if (reg->neon)
2449 free (reg->neon);
c19d1205 2450 free (reg);
d929913e
NC
2451
2452 /* Also locate the all upper case and all lower case versions.
2453 Do not complain if we cannot find one or the other as it
2454 was probably deleted above. */
5f4273c7 2455
d929913e
NC
2456 nbuf = strdup (name);
2457 for (p = nbuf; *p; p++)
2458 *p = TOUPPER (*p);
21d799b5 2459 reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
d929913e
NC
2460 if (reg)
2461 {
db0bc284 2462 hash_delete (arm_reg_hsh, nbuf, FALSE);
d929913e
NC
2463 free ((char *) reg->name);
2464 if (reg->neon)
2465 free (reg->neon);
2466 free (reg);
2467 }
2468
2469 for (p = nbuf; *p; p++)
2470 *p = TOLOWER (*p);
21d799b5 2471 reg = (struct reg_entry *) hash_find (arm_reg_hsh, nbuf);
d929913e
NC
2472 if (reg)
2473 {
db0bc284 2474 hash_delete (arm_reg_hsh, nbuf, FALSE);
d929913e
NC
2475 free ((char *) reg->name);
2476 if (reg->neon)
2477 free (reg->neon);
2478 free (reg);
2479 }
2480
2481 free (nbuf);
c19d1205
ZW
2482 }
2483 }
b99bd4ef 2484
c19d1205 2485 *input_line_pointer = saved_char;
b99bd4ef
NC
2486 demand_empty_rest_of_line ();
2487}
2488
c19d1205
ZW
2489/* Directives: Instruction set selection. */
2490
2491#ifdef OBJ_ELF
2492/* This code is to handle mapping symbols as defined in the ARM ELF spec.
2493 (See "Mapping symbols", section 4.5.5, ARM AAELF version 1.0).
2494 Note that previously, $a and $t has type STT_FUNC (BSF_OBJECT flag),
2495 and $d has type STT_OBJECT (BSF_OBJECT flag). Now all three are untyped. */
2496
cd000bff
DJ
2497/* Create a new mapping symbol for the transition to STATE. */
2498
2499static void
2500make_mapping_symbol (enum mstate state, valueT value, fragS *frag)
b99bd4ef 2501{
a737bd4d 2502 symbolS * symbolP;
c19d1205
ZW
2503 const char * symname;
2504 int type;
b99bd4ef 2505
c19d1205 2506 switch (state)
b99bd4ef 2507 {
c19d1205
ZW
2508 case MAP_DATA:
2509 symname = "$d";
2510 type = BSF_NO_FLAGS;
2511 break;
2512 case MAP_ARM:
2513 symname = "$a";
2514 type = BSF_NO_FLAGS;
2515 break;
2516 case MAP_THUMB:
2517 symname = "$t";
2518 type = BSF_NO_FLAGS;
2519 break;
c19d1205
ZW
2520 default:
2521 abort ();
2522 }
2523
cd000bff 2524 symbolP = symbol_new (symname, now_seg, value, frag);
c19d1205
ZW
2525 symbol_get_bfdsym (symbolP)->flags |= type | BSF_LOCAL;
2526
2527 switch (state)
2528 {
2529 case MAP_ARM:
2530 THUMB_SET_FUNC (symbolP, 0);
2531 ARM_SET_THUMB (symbolP, 0);
2532 ARM_SET_INTERWORK (symbolP, support_interwork);
2533 break;
2534
2535 case MAP_THUMB:
2536 THUMB_SET_FUNC (symbolP, 1);
2537 ARM_SET_THUMB (symbolP, 1);
2538 ARM_SET_INTERWORK (symbolP, support_interwork);
2539 break;
2540
2541 case MAP_DATA:
2542 default:
cd000bff
DJ
2543 break;
2544 }
2545
2546 /* Save the mapping symbols for future reference. Also check that
2547 we do not place two mapping symbols at the same offset within a
2548 frag. We'll handle overlap between frags in
2de7820f
JZ
2549 check_mapping_symbols.
2550
2551 If .fill or other data filling directive generates zero sized data,
2552 the mapping symbol for the following code will have the same value
2553 as the one generated for the data filling directive. In this case,
2554 we replace the old symbol with the new one at the same address. */
cd000bff
DJ
2555 if (value == 0)
2556 {
2de7820f
JZ
2557 if (frag->tc_frag_data.first_map != NULL)
2558 {
2559 know (S_GET_VALUE (frag->tc_frag_data.first_map) == 0);
2560 symbol_remove (frag->tc_frag_data.first_map, &symbol_rootP, &symbol_lastP);
2561 }
cd000bff
DJ
2562 frag->tc_frag_data.first_map = symbolP;
2563 }
2564 if (frag->tc_frag_data.last_map != NULL)
0f020cef
JZ
2565 {
2566 know (S_GET_VALUE (frag->tc_frag_data.last_map) <= S_GET_VALUE (symbolP));
0f020cef
JZ
2567 if (S_GET_VALUE (frag->tc_frag_data.last_map) == S_GET_VALUE (symbolP))
2568 symbol_remove (frag->tc_frag_data.last_map, &symbol_rootP, &symbol_lastP);
2569 }
cd000bff
DJ
2570 frag->tc_frag_data.last_map = symbolP;
2571}
2572
2573/* We must sometimes convert a region marked as code to data during
2574 code alignment, if an odd number of bytes have to be padded. The
2575 code mapping symbol is pushed to an aligned address. */
2576
2577static void
2578insert_data_mapping_symbol (enum mstate state,
2579 valueT value, fragS *frag, offsetT bytes)
2580{
2581 /* If there was already a mapping symbol, remove it. */
2582 if (frag->tc_frag_data.last_map != NULL
2583 && S_GET_VALUE (frag->tc_frag_data.last_map) == frag->fr_address + value)
2584 {
2585 symbolS *symp = frag->tc_frag_data.last_map;
2586
2587 if (value == 0)
2588 {
2589 know (frag->tc_frag_data.first_map == symp);
2590 frag->tc_frag_data.first_map = NULL;
2591 }
2592 frag->tc_frag_data.last_map = NULL;
2593 symbol_remove (symp, &symbol_rootP, &symbol_lastP);
c19d1205 2594 }
cd000bff
DJ
2595
2596 make_mapping_symbol (MAP_DATA, value, frag);
2597 make_mapping_symbol (state, value + bytes, frag);
2598}
2599
2600static void mapping_state_2 (enum mstate state, int max_chars);
2601
2602/* Set the mapping state to STATE. Only call this when about to
2603 emit some STATE bytes to the file. */
2604
2605void
2606mapping_state (enum mstate state)
2607{
940b5ce0
DJ
2608 enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2609
cd000bff
DJ
2610#define TRANSITION(from, to) (mapstate == (from) && state == (to))
2611
2612 if (mapstate == state)
2613 /* The mapping symbol has already been emitted.
2614 There is nothing else to do. */
2615 return;
49c62a33
NC
2616
2617 if (state == MAP_ARM || state == MAP_THUMB)
2618 /* PR gas/12931
2619 All ARM instructions require 4-byte alignment.
2620 (Almost) all Thumb instructions require 2-byte alignment.
2621
2622 When emitting instructions into any section, mark the section
2623 appropriately.
2624
2625 Some Thumb instructions are alignment-sensitive modulo 4 bytes,
2626 but themselves require 2-byte alignment; this applies to some
2627 PC- relative forms. However, these cases will invovle implicit
2628 literal pool generation or an explicit .align >=2, both of
2629 which will cause the section to me marked with sufficient
2630 alignment. Thus, we don't handle those cases here. */
2631 record_alignment (now_seg, state == MAP_ARM ? 2 : 1);
2632
2633 if (TRANSITION (MAP_UNDEFINED, MAP_DATA))
cd000bff
DJ
2634 /* This case will be evaluated later in the next else. */
2635 return;
2636 else if (TRANSITION (MAP_UNDEFINED, MAP_ARM)
2637 || TRANSITION (MAP_UNDEFINED, MAP_THUMB))
2638 {
2639 /* Only add the symbol if the offset is > 0:
2640 if we're at the first frag, check it's size > 0;
2641 if we're not at the first frag, then for sure
2642 the offset is > 0. */
2643 struct frag * const frag_first = seg_info (now_seg)->frchainP->frch_root;
2644 const int add_symbol = (frag_now != frag_first) || (frag_now_fix () > 0);
2645
2646 if (add_symbol)
2647 make_mapping_symbol (MAP_DATA, (valueT) 0, frag_first);
2648 }
2649
2650 mapping_state_2 (state, 0);
2651#undef TRANSITION
2652}
2653
2654/* Same as mapping_state, but MAX_CHARS bytes have already been
2655 allocated. Put the mapping symbol that far back. */
2656
2657static void
2658mapping_state_2 (enum mstate state, int max_chars)
2659{
940b5ce0
DJ
2660 enum mstate mapstate = seg_info (now_seg)->tc_segment_info_data.mapstate;
2661
2662 if (!SEG_NORMAL (now_seg))
2663 return;
2664
cd000bff
DJ
2665 if (mapstate == state)
2666 /* The mapping symbol has already been emitted.
2667 There is nothing else to do. */
2668 return;
2669
cd000bff
DJ
2670 seg_info (now_seg)->tc_segment_info_data.mapstate = state;
2671 make_mapping_symbol (state, (valueT) frag_now_fix () - max_chars, frag_now);
c19d1205
ZW
2672}
2673#else
d3106081
NS
2674#define mapping_state(x) ((void)0)
2675#define mapping_state_2(x, y) ((void)0)
c19d1205
ZW
2676#endif
2677
2678/* Find the real, Thumb encoded start of a Thumb function. */
2679
4343666d 2680#ifdef OBJ_COFF
c19d1205
ZW
2681static symbolS *
2682find_real_start (symbolS * symbolP)
2683{
2684 char * real_start;
2685 const char * name = S_GET_NAME (symbolP);
2686 symbolS * new_target;
2687
2688 /* This definition must agree with the one in gcc/config/arm/thumb.c. */
2689#define STUB_NAME ".real_start_of"
2690
2691 if (name == NULL)
2692 abort ();
2693
37f6032b
ZW
2694 /* The compiler may generate BL instructions to local labels because
2695 it needs to perform a branch to a far away location. These labels
2696 do not have a corresponding ".real_start_of" label. We check
2697 both for S_IS_LOCAL and for a leading dot, to give a way to bypass
2698 the ".real_start_of" convention for nonlocal branches. */
2699 if (S_IS_LOCAL (symbolP) || name[0] == '.')
c19d1205
ZW
2700 return symbolP;
2701
37f6032b 2702 real_start = ACONCAT ((STUB_NAME, name, NULL));
c19d1205
ZW
2703 new_target = symbol_find (real_start);
2704
2705 if (new_target == NULL)
2706 {
bd3ba5d1 2707 as_warn (_("Failed to find real start of function: %s\n"), name);
c19d1205
ZW
2708 new_target = symbolP;
2709 }
2710
c19d1205
ZW
2711 return new_target;
2712}
4343666d 2713#endif
c19d1205
ZW
2714
2715static void
2716opcode_select (int width)
2717{
2718 switch (width)
2719 {
2720 case 16:
2721 if (! thumb_mode)
2722 {
e74cfd16 2723 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
c19d1205
ZW
2724 as_bad (_("selected processor does not support THUMB opcodes"));
2725
2726 thumb_mode = 1;
2727 /* No need to force the alignment, since we will have been
2728 coming from ARM mode, which is word-aligned. */
2729 record_alignment (now_seg, 1);
2730 }
c19d1205
ZW
2731 break;
2732
2733 case 32:
2734 if (thumb_mode)
2735 {
e74cfd16 2736 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
c19d1205
ZW
2737 as_bad (_("selected processor does not support ARM opcodes"));
2738
2739 thumb_mode = 0;
2740
2741 if (!need_pass_2)
2742 frag_align (2, 0, 0);
2743
2744 record_alignment (now_seg, 1);
2745 }
c19d1205
ZW
2746 break;
2747
2748 default:
2749 as_bad (_("invalid instruction size selected (%d)"), width);
2750 }
2751}
2752
2753static void
2754s_arm (int ignore ATTRIBUTE_UNUSED)
2755{
2756 opcode_select (32);
2757 demand_empty_rest_of_line ();
2758}
2759
2760static void
2761s_thumb (int ignore ATTRIBUTE_UNUSED)
2762{
2763 opcode_select (16);
2764 demand_empty_rest_of_line ();
2765}
2766
2767static void
2768s_code (int unused ATTRIBUTE_UNUSED)
2769{
2770 int temp;
2771
2772 temp = get_absolute_expression ();
2773 switch (temp)
2774 {
2775 case 16:
2776 case 32:
2777 opcode_select (temp);
2778 break;
2779
2780 default:
2781 as_bad (_("invalid operand to .code directive (%d) (expecting 16 or 32)"), temp);
2782 }
2783}
2784
2785static void
2786s_force_thumb (int ignore ATTRIBUTE_UNUSED)
2787{
2788 /* If we are not already in thumb mode go into it, EVEN if
2789 the target processor does not support thumb instructions.
2790 This is used by gcc/config/arm/lib1funcs.asm for example
2791 to compile interworking support functions even if the
2792 target processor should not support interworking. */
2793 if (! thumb_mode)
2794 {
2795 thumb_mode = 2;
2796 record_alignment (now_seg, 1);
2797 }
2798
2799 demand_empty_rest_of_line ();
2800}
2801
2802static void
2803s_thumb_func (int ignore ATTRIBUTE_UNUSED)
2804{
2805 s_thumb (0);
2806
2807 /* The following label is the name/address of the start of a Thumb function.
2808 We need to know this for the interworking support. */
2809 label_is_thumb_function_name = TRUE;
2810}
2811
2812/* Perform a .set directive, but also mark the alias as
2813 being a thumb function. */
2814
2815static void
2816s_thumb_set (int equiv)
2817{
2818 /* XXX the following is a duplicate of the code for s_set() in read.c
2819 We cannot just call that code as we need to get at the symbol that
2820 is created. */
2821 char * name;
2822 char delim;
2823 char * end_name;
2824 symbolS * symbolP;
2825
2826 /* Especial apologies for the random logic:
2827 This just grew, and could be parsed much more simply!
2828 Dean - in haste. */
2829 name = input_line_pointer;
2830 delim = get_symbol_end ();
2831 end_name = input_line_pointer;
2832 *end_name = delim;
2833
2834 if (*input_line_pointer != ',')
2835 {
2836 *end_name = 0;
2837 as_bad (_("expected comma after name \"%s\""), name);
b99bd4ef
NC
2838 *end_name = delim;
2839 ignore_rest_of_line ();
2840 return;
2841 }
2842
2843 input_line_pointer++;
2844 *end_name = 0;
2845
2846 if (name[0] == '.' && name[1] == '\0')
2847 {
2848 /* XXX - this should not happen to .thumb_set. */
2849 abort ();
2850 }
2851
2852 if ((symbolP = symbol_find (name)) == NULL
2853 && (symbolP = md_undefined_symbol (name)) == NULL)
2854 {
2855#ifndef NO_LISTING
2856 /* When doing symbol listings, play games with dummy fragments living
2857 outside the normal fragment chain to record the file and line info
c19d1205 2858 for this symbol. */
b99bd4ef
NC
2859 if (listing & LISTING_SYMBOLS)
2860 {
2861 extern struct list_info_struct * listing_tail;
21d799b5 2862 fragS * dummy_frag = (fragS * ) xmalloc (sizeof (fragS));
b99bd4ef
NC
2863
2864 memset (dummy_frag, 0, sizeof (fragS));
2865 dummy_frag->fr_type = rs_fill;
2866 dummy_frag->line = listing_tail;
2867 symbolP = symbol_new (name, undefined_section, 0, dummy_frag);
2868 dummy_frag->fr_symbol = symbolP;
2869 }
2870 else
2871#endif
2872 symbolP = symbol_new (name, undefined_section, 0, &zero_address_frag);
2873
2874#ifdef OBJ_COFF
2875 /* "set" symbols are local unless otherwise specified. */
2876 SF_SET_LOCAL (symbolP);
2877#endif /* OBJ_COFF */
2878 } /* Make a new symbol. */
2879
2880 symbol_table_insert (symbolP);
2881
2882 * end_name = delim;
2883
2884 if (equiv
2885 && S_IS_DEFINED (symbolP)
2886 && S_GET_SEGMENT (symbolP) != reg_section)
2887 as_bad (_("symbol `%s' already defined"), S_GET_NAME (symbolP));
2888
2889 pseudo_set (symbolP);
2890
2891 demand_empty_rest_of_line ();
2892
c19d1205 2893 /* XXX Now we come to the Thumb specific bit of code. */
b99bd4ef
NC
2894
2895 THUMB_SET_FUNC (symbolP, 1);
2896 ARM_SET_THUMB (symbolP, 1);
2897#if defined OBJ_ELF || defined OBJ_COFF
2898 ARM_SET_INTERWORK (symbolP, support_interwork);
2899#endif
2900}
2901
c19d1205 2902/* Directives: Mode selection. */
b99bd4ef 2903
c19d1205
ZW
2904/* .syntax [unified|divided] - choose the new unified syntax
2905 (same for Arm and Thumb encoding, modulo slight differences in what
2906 can be represented) or the old divergent syntax for each mode. */
b99bd4ef 2907static void
c19d1205 2908s_syntax (int unused ATTRIBUTE_UNUSED)
b99bd4ef 2909{
c19d1205
ZW
2910 char *name, delim;
2911
2912 name = input_line_pointer;
2913 delim = get_symbol_end ();
2914
2915 if (!strcasecmp (name, "unified"))
2916 unified_syntax = TRUE;
2917 else if (!strcasecmp (name, "divided"))
2918 unified_syntax = FALSE;
2919 else
2920 {
2921 as_bad (_("unrecognized syntax mode \"%s\""), name);
2922 return;
2923 }
2924 *input_line_pointer = delim;
b99bd4ef
NC
2925 demand_empty_rest_of_line ();
2926}
2927
c19d1205
ZW
2928/* Directives: sectioning and alignment. */
2929
2930/* Same as s_align_ptwo but align 0 => align 2. */
2931
b99bd4ef 2932static void
c19d1205 2933s_align (int unused ATTRIBUTE_UNUSED)
b99bd4ef 2934{
a737bd4d 2935 int temp;
dce323d1 2936 bfd_boolean fill_p;
c19d1205
ZW
2937 long temp_fill;
2938 long max_alignment = 15;
b99bd4ef
NC
2939
2940 temp = get_absolute_expression ();
c19d1205
ZW
2941 if (temp > max_alignment)
2942 as_bad (_("alignment too large: %d assumed"), temp = max_alignment);
2943 else if (temp < 0)
b99bd4ef 2944 {
c19d1205
ZW
2945 as_bad (_("alignment negative. 0 assumed."));
2946 temp = 0;
2947 }
b99bd4ef 2948
c19d1205
ZW
2949 if (*input_line_pointer == ',')
2950 {
2951 input_line_pointer++;
2952 temp_fill = get_absolute_expression ();
dce323d1 2953 fill_p = TRUE;
b99bd4ef 2954 }
c19d1205 2955 else
dce323d1
PB
2956 {
2957 fill_p = FALSE;
2958 temp_fill = 0;
2959 }
b99bd4ef 2960
c19d1205
ZW
2961 if (!temp)
2962 temp = 2;
b99bd4ef 2963
c19d1205
ZW
2964 /* Only make a frag if we HAVE to. */
2965 if (temp && !need_pass_2)
dce323d1
PB
2966 {
2967 if (!fill_p && subseg_text_p (now_seg))
2968 frag_align_code (temp, 0);
2969 else
2970 frag_align (temp, (int) temp_fill, 0);
2971 }
c19d1205
ZW
2972 demand_empty_rest_of_line ();
2973
2974 record_alignment (now_seg, temp);
b99bd4ef
NC
2975}
2976
c19d1205
ZW
2977static void
2978s_bss (int ignore ATTRIBUTE_UNUSED)
b99bd4ef 2979{
c19d1205
ZW
2980 /* We don't support putting frags in the BSS segment, we fake it by
2981 marking in_bss, then looking at s_skip for clues. */
2982 subseg_set (bss_section, 0);
2983 demand_empty_rest_of_line ();
cd000bff
DJ
2984
2985#ifdef md_elf_section_change_hook
2986 md_elf_section_change_hook ();
2987#endif
c19d1205 2988}
b99bd4ef 2989
c19d1205
ZW
2990static void
2991s_even (int ignore ATTRIBUTE_UNUSED)
2992{
2993 /* Never make frag if expect extra pass. */
2994 if (!need_pass_2)
2995 frag_align (1, 0, 0);
b99bd4ef 2996
c19d1205 2997 record_alignment (now_seg, 1);
b99bd4ef 2998
c19d1205 2999 demand_empty_rest_of_line ();
b99bd4ef
NC
3000}
3001
c19d1205 3002/* Directives: Literal pools. */
a737bd4d 3003
c19d1205
ZW
3004static literal_pool *
3005find_literal_pool (void)
a737bd4d 3006{
c19d1205 3007 literal_pool * pool;
a737bd4d 3008
c19d1205 3009 for (pool = list_of_pools; pool != NULL; pool = pool->next)
a737bd4d 3010 {
c19d1205
ZW
3011 if (pool->section == now_seg
3012 && pool->sub_section == now_subseg)
3013 break;
a737bd4d
NC
3014 }
3015
c19d1205 3016 return pool;
a737bd4d
NC
3017}
3018
c19d1205
ZW
3019static literal_pool *
3020find_or_make_literal_pool (void)
a737bd4d 3021{
c19d1205
ZW
3022 /* Next literal pool ID number. */
3023 static unsigned int latest_pool_num = 1;
3024 literal_pool * pool;
a737bd4d 3025
c19d1205 3026 pool = find_literal_pool ();
a737bd4d 3027
c19d1205 3028 if (pool == NULL)
a737bd4d 3029 {
c19d1205 3030 /* Create a new pool. */
21d799b5 3031 pool = (literal_pool *) xmalloc (sizeof (* pool));
c19d1205
ZW
3032 if (! pool)
3033 return NULL;
a737bd4d 3034
c19d1205
ZW
3035 pool->next_free_entry = 0;
3036 pool->section = now_seg;
3037 pool->sub_section = now_subseg;
3038 pool->next = list_of_pools;
3039 pool->symbol = NULL;
3040
3041 /* Add it to the list. */
3042 list_of_pools = pool;
a737bd4d 3043 }
a737bd4d 3044
c19d1205
ZW
3045 /* New pools, and emptied pools, will have a NULL symbol. */
3046 if (pool->symbol == NULL)
a737bd4d 3047 {
c19d1205
ZW
3048 pool->symbol = symbol_create (FAKE_LABEL_NAME, undefined_section,
3049 (valueT) 0, &zero_address_frag);
3050 pool->id = latest_pool_num ++;
a737bd4d
NC
3051 }
3052
c19d1205
ZW
3053 /* Done. */
3054 return pool;
a737bd4d
NC
3055}
3056
c19d1205 3057/* Add the literal in the global 'inst'
5f4273c7 3058 structure to the relevant literal pool. */
b99bd4ef
NC
3059
3060static int
c19d1205 3061add_to_lit_pool (void)
b99bd4ef 3062{
c19d1205
ZW
3063 literal_pool * pool;
3064 unsigned int entry;
b99bd4ef 3065
c19d1205
ZW
3066 pool = find_or_make_literal_pool ();
3067
3068 /* Check if this literal value is already in the pool. */
3069 for (entry = 0; entry < pool->next_free_entry; entry ++)
b99bd4ef 3070 {
c19d1205
ZW
3071 if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3072 && (inst.reloc.exp.X_op == O_constant)
3073 && (pool->literals[entry].X_add_number
3074 == inst.reloc.exp.X_add_number)
3075 && (pool->literals[entry].X_unsigned
3076 == inst.reloc.exp.X_unsigned))
3077 break;
3078
3079 if ((pool->literals[entry].X_op == inst.reloc.exp.X_op)
3080 && (inst.reloc.exp.X_op == O_symbol)
3081 && (pool->literals[entry].X_add_number
3082 == inst.reloc.exp.X_add_number)
3083 && (pool->literals[entry].X_add_symbol
3084 == inst.reloc.exp.X_add_symbol)
3085 && (pool->literals[entry].X_op_symbol
3086 == inst.reloc.exp.X_op_symbol))
3087 break;
b99bd4ef
NC
3088 }
3089
c19d1205
ZW
3090 /* Do we need to create a new entry? */
3091 if (entry == pool->next_free_entry)
3092 {
3093 if (entry >= MAX_LITERAL_POOL_SIZE)
3094 {
3095 inst.error = _("literal pool overflow");
3096 return FAIL;
3097 }
3098
3099 pool->literals[entry] = inst.reloc.exp;
a8040cf2
NC
3100#ifdef OBJ_ELF
3101 /* PR ld/12974: Record the location of the first source line to reference
3102 this entry in the literal pool. If it turns out during linking that the
3103 symbol does not exist we will be able to give an accurate line number for
3104 the (first use of the) missing reference. */
3105 if (debug_type == DEBUG_DWARF2)
3106 dwarf2_where (pool->locs + entry);
3107#endif
c19d1205
ZW
3108 pool->next_free_entry += 1;
3109 }
b99bd4ef 3110
c19d1205
ZW
3111 inst.reloc.exp.X_op = O_symbol;
3112 inst.reloc.exp.X_add_number = ((int) entry) * 4;
3113 inst.reloc.exp.X_add_symbol = pool->symbol;
b99bd4ef 3114
c19d1205 3115 return SUCCESS;
b99bd4ef
NC
3116}
3117
c19d1205
ZW
3118/* Can't use symbol_new here, so have to create a symbol and then at
3119 a later date assign it a value. Thats what these functions do. */
e16bb312 3120
c19d1205
ZW
3121static void
3122symbol_locate (symbolS * symbolP,
3123 const char * name, /* It is copied, the caller can modify. */
3124 segT segment, /* Segment identifier (SEG_<something>). */
3125 valueT valu, /* Symbol value. */
3126 fragS * frag) /* Associated fragment. */
3127{
3128 unsigned int name_length;
3129 char * preserved_copy_of_name;
e16bb312 3130
c19d1205
ZW
3131 name_length = strlen (name) + 1; /* +1 for \0. */
3132 obstack_grow (&notes, name, name_length);
21d799b5 3133 preserved_copy_of_name = (char *) obstack_finish (&notes);
e16bb312 3134
c19d1205
ZW
3135#ifdef tc_canonicalize_symbol_name
3136 preserved_copy_of_name =
3137 tc_canonicalize_symbol_name (preserved_copy_of_name);
3138#endif
b99bd4ef 3139
c19d1205 3140 S_SET_NAME (symbolP, preserved_copy_of_name);
b99bd4ef 3141
c19d1205
ZW
3142 S_SET_SEGMENT (symbolP, segment);
3143 S_SET_VALUE (symbolP, valu);
3144 symbol_clear_list_pointers (symbolP);
b99bd4ef 3145
c19d1205 3146 symbol_set_frag (symbolP, frag);
b99bd4ef 3147
c19d1205
ZW
3148 /* Link to end of symbol chain. */
3149 {
3150 extern int symbol_table_frozen;
b99bd4ef 3151
c19d1205
ZW
3152 if (symbol_table_frozen)
3153 abort ();
3154 }
b99bd4ef 3155
c19d1205 3156 symbol_append (symbolP, symbol_lastP, & symbol_rootP, & symbol_lastP);
b99bd4ef 3157
c19d1205 3158 obj_symbol_new_hook (symbolP);
b99bd4ef 3159
c19d1205
ZW
3160#ifdef tc_symbol_new_hook
3161 tc_symbol_new_hook (symbolP);
3162#endif
3163
3164#ifdef DEBUG_SYMS
3165 verify_symbol_chain (symbol_rootP, symbol_lastP);
3166#endif /* DEBUG_SYMS */
b99bd4ef
NC
3167}
3168
b99bd4ef 3169
c19d1205
ZW
3170static void
3171s_ltorg (int ignored ATTRIBUTE_UNUSED)
b99bd4ef 3172{
c19d1205
ZW
3173 unsigned int entry;
3174 literal_pool * pool;
3175 char sym_name[20];
b99bd4ef 3176
c19d1205
ZW
3177 pool = find_literal_pool ();
3178 if (pool == NULL
3179 || pool->symbol == NULL
3180 || pool->next_free_entry == 0)
3181 return;
b99bd4ef 3182
c19d1205 3183 mapping_state (MAP_DATA);
b99bd4ef 3184
c19d1205
ZW
3185 /* Align pool as you have word accesses.
3186 Only make a frag if we have to. */
3187 if (!need_pass_2)
3188 frag_align (2, 0, 0);
b99bd4ef 3189
c19d1205 3190 record_alignment (now_seg, 2);
b99bd4ef 3191
c19d1205 3192 sprintf (sym_name, "$$lit_\002%x", pool->id);
b99bd4ef 3193
c19d1205
ZW
3194 symbol_locate (pool->symbol, sym_name, now_seg,
3195 (valueT) frag_now_fix (), frag_now);
3196 symbol_table_insert (pool->symbol);
b99bd4ef 3197
c19d1205 3198 ARM_SET_THUMB (pool->symbol, thumb_mode);
b99bd4ef 3199
c19d1205
ZW
3200#if defined OBJ_COFF || defined OBJ_ELF
3201 ARM_SET_INTERWORK (pool->symbol, support_interwork);
3202#endif
6c43fab6 3203
c19d1205 3204 for (entry = 0; entry < pool->next_free_entry; entry ++)
a8040cf2
NC
3205 {
3206#ifdef OBJ_ELF
3207 if (debug_type == DEBUG_DWARF2)
3208 dwarf2_gen_line_info (frag_now_fix (), pool->locs + entry);
3209#endif
3210 /* First output the expression in the instruction to the pool. */
3211 emit_expr (&(pool->literals[entry]), 4); /* .word */
3212 }
b99bd4ef 3213
c19d1205
ZW
3214 /* Mark the pool as empty. */
3215 pool->next_free_entry = 0;
3216 pool->symbol = NULL;
b99bd4ef
NC
3217}
3218
c19d1205
ZW
3219#ifdef OBJ_ELF
3220/* Forward declarations for functions below, in the MD interface
3221 section. */
3222static void fix_new_arm (fragS *, int, short, expressionS *, int, int);
3223static valueT create_unwind_entry (int);
3224static void start_unwind_section (const segT, int);
3225static void add_unwind_opcode (valueT, int);
3226static void flush_pending_unwind (void);
b99bd4ef 3227
c19d1205 3228/* Directives: Data. */
b99bd4ef 3229
c19d1205
ZW
3230static void
3231s_arm_elf_cons (int nbytes)
3232{
3233 expressionS exp;
b99bd4ef 3234
c19d1205
ZW
3235#ifdef md_flush_pending_output
3236 md_flush_pending_output ();
3237#endif
b99bd4ef 3238
c19d1205 3239 if (is_it_end_of_statement ())
b99bd4ef 3240 {
c19d1205
ZW
3241 demand_empty_rest_of_line ();
3242 return;
b99bd4ef
NC
3243 }
3244
c19d1205
ZW
3245#ifdef md_cons_align
3246 md_cons_align (nbytes);
3247#endif
b99bd4ef 3248
c19d1205
ZW
3249 mapping_state (MAP_DATA);
3250 do
b99bd4ef 3251 {
c19d1205
ZW
3252 int reloc;
3253 char *base = input_line_pointer;
b99bd4ef 3254
c19d1205 3255 expression (& exp);
b99bd4ef 3256
c19d1205
ZW
3257 if (exp.X_op != O_symbol)
3258 emit_expr (&exp, (unsigned int) nbytes);
3259 else
3260 {
3261 char *before_reloc = input_line_pointer;
3262 reloc = parse_reloc (&input_line_pointer);
3263 if (reloc == -1)
3264 {
3265 as_bad (_("unrecognized relocation suffix"));
3266 ignore_rest_of_line ();
3267 return;
3268 }
3269 else if (reloc == BFD_RELOC_UNUSED)
3270 emit_expr (&exp, (unsigned int) nbytes);
3271 else
3272 {
21d799b5
NC
3273 reloc_howto_type *howto = (reloc_howto_type *)
3274 bfd_reloc_type_lookup (stdoutput,
3275 (bfd_reloc_code_real_type) reloc);
c19d1205 3276 int size = bfd_get_reloc_size (howto);
b99bd4ef 3277
2fc8bdac
ZW
3278 if (reloc == BFD_RELOC_ARM_PLT32)
3279 {
3280 as_bad (_("(plt) is only valid on branch targets"));
3281 reloc = BFD_RELOC_UNUSED;
3282 size = 0;
3283 }
3284
c19d1205 3285 if (size > nbytes)
2fc8bdac 3286 as_bad (_("%s relocations do not fit in %d bytes"),
c19d1205
ZW
3287 howto->name, nbytes);
3288 else
3289 {
3290 /* We've parsed an expression stopping at O_symbol.
3291 But there may be more expression left now that we
3292 have parsed the relocation marker. Parse it again.
3293 XXX Surely there is a cleaner way to do this. */
3294 char *p = input_line_pointer;
3295 int offset;
21d799b5 3296 char *save_buf = (char *) alloca (input_line_pointer - base);
c19d1205
ZW
3297 memcpy (save_buf, base, input_line_pointer - base);
3298 memmove (base + (input_line_pointer - before_reloc),
3299 base, before_reloc - base);
3300
3301 input_line_pointer = base + (input_line_pointer-before_reloc);
3302 expression (&exp);
3303 memcpy (base, save_buf, p - base);
3304
3305 offset = nbytes - size;
3306 p = frag_more ((int) nbytes);
3307 fix_new_exp (frag_now, p - frag_now->fr_literal + offset,
21d799b5 3308 size, &exp, 0, (enum bfd_reloc_code_real) reloc);
c19d1205
ZW
3309 }
3310 }
3311 }
b99bd4ef 3312 }
c19d1205 3313 while (*input_line_pointer++ == ',');
b99bd4ef 3314
c19d1205
ZW
3315 /* Put terminator back into stream. */
3316 input_line_pointer --;
3317 demand_empty_rest_of_line ();
b99bd4ef
NC
3318}
3319
c921be7d
NC
3320/* Emit an expression containing a 32-bit thumb instruction.
3321 Implementation based on put_thumb32_insn. */
3322
3323static void
3324emit_thumb32_expr (expressionS * exp)
3325{
3326 expressionS exp_high = *exp;
3327
3328 exp_high.X_add_number = (unsigned long)exp_high.X_add_number >> 16;
3329 emit_expr (& exp_high, (unsigned int) THUMB_SIZE);
3330 exp->X_add_number &= 0xffff;
3331 emit_expr (exp, (unsigned int) THUMB_SIZE);
3332}
3333
3334/* Guess the instruction size based on the opcode. */
3335
3336static int
3337thumb_insn_size (int opcode)
3338{
3339 if ((unsigned int) opcode < 0xe800u)
3340 return 2;
3341 else if ((unsigned int) opcode >= 0xe8000000u)
3342 return 4;
3343 else
3344 return 0;
3345}
3346
3347static bfd_boolean
3348emit_insn (expressionS *exp, int nbytes)
3349{
3350 int size = 0;
3351
3352 if (exp->X_op == O_constant)
3353 {
3354 size = nbytes;
3355
3356 if (size == 0)
3357 size = thumb_insn_size (exp->X_add_number);
3358
3359 if (size != 0)
3360 {
3361 if (size == 2 && (unsigned int)exp->X_add_number > 0xffffu)
3362 {
3363 as_bad (_(".inst.n operand too big. "\
3364 "Use .inst.w instead"));
3365 size = 0;
3366 }
3367 else
3368 {
3369 if (now_it.state == AUTOMATIC_IT_BLOCK)
3370 set_it_insn_type_nonvoid (OUTSIDE_IT_INSN, 0);
3371 else
3372 set_it_insn_type_nonvoid (NEUTRAL_IT_INSN, 0);
3373
3374 if (thumb_mode && (size > THUMB_SIZE) && !target_big_endian)
3375 emit_thumb32_expr (exp);
3376 else
3377 emit_expr (exp, (unsigned int) size);
3378
3379 it_fsm_post_encode ();
3380 }
3381 }
3382 else
3383 as_bad (_("cannot determine Thumb instruction size. " \
3384 "Use .inst.n/.inst.w instead"));
3385 }
3386 else
3387 as_bad (_("constant expression required"));
3388
3389 return (size != 0);
3390}
3391
3392/* Like s_arm_elf_cons but do not use md_cons_align and
3393 set the mapping state to MAP_ARM/MAP_THUMB. */
3394
3395static void
3396s_arm_elf_inst (int nbytes)
3397{
3398 if (is_it_end_of_statement ())
3399 {
3400 demand_empty_rest_of_line ();
3401 return;
3402 }
3403
3404 /* Calling mapping_state () here will not change ARM/THUMB,
3405 but will ensure not to be in DATA state. */
3406
3407 if (thumb_mode)
3408 mapping_state (MAP_THUMB);
3409 else
3410 {
3411 if (nbytes != 0)
3412 {
3413 as_bad (_("width suffixes are invalid in ARM mode"));
3414 ignore_rest_of_line ();
3415 return;
3416 }
3417
3418 nbytes = 4;
3419
3420 mapping_state (MAP_ARM);
3421 }
3422
3423 do
3424 {
3425 expressionS exp;
3426
3427 expression (& exp);
3428
3429 if (! emit_insn (& exp, nbytes))
3430 {
3431 ignore_rest_of_line ();
3432 return;
3433 }
3434 }
3435 while (*input_line_pointer++ == ',');
3436
3437 /* Put terminator back into stream. */
3438 input_line_pointer --;
3439 demand_empty_rest_of_line ();
3440}
b99bd4ef 3441
c19d1205 3442/* Parse a .rel31 directive. */
b99bd4ef 3443
c19d1205
ZW
3444static void
3445s_arm_rel31 (int ignored ATTRIBUTE_UNUSED)
3446{
3447 expressionS exp;
3448 char *p;
3449 valueT highbit;
b99bd4ef 3450
c19d1205
ZW
3451 highbit = 0;
3452 if (*input_line_pointer == '1')
3453 highbit = 0x80000000;
3454 else if (*input_line_pointer != '0')
3455 as_bad (_("expected 0 or 1"));
b99bd4ef 3456
c19d1205
ZW
3457 input_line_pointer++;
3458 if (*input_line_pointer != ',')
3459 as_bad (_("missing comma"));
3460 input_line_pointer++;
b99bd4ef 3461
c19d1205
ZW
3462#ifdef md_flush_pending_output
3463 md_flush_pending_output ();
3464#endif
b99bd4ef 3465
c19d1205
ZW
3466#ifdef md_cons_align
3467 md_cons_align (4);
3468#endif
b99bd4ef 3469
c19d1205 3470 mapping_state (MAP_DATA);
b99bd4ef 3471
c19d1205 3472 expression (&exp);
b99bd4ef 3473
c19d1205
ZW
3474 p = frag_more (4);
3475 md_number_to_chars (p, highbit, 4);
3476 fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 1,
3477 BFD_RELOC_ARM_PREL31);
b99bd4ef 3478
c19d1205 3479 demand_empty_rest_of_line ();
b99bd4ef
NC
3480}
3481
c19d1205 3482/* Directives: AEABI stack-unwind tables. */
b99bd4ef 3483
c19d1205 3484/* Parse an unwind_fnstart directive. Simply records the current location. */
b99bd4ef 3485
c19d1205
ZW
3486static void
3487s_arm_unwind_fnstart (int ignored ATTRIBUTE_UNUSED)
3488{
3489 demand_empty_rest_of_line ();
921e5f0a
PB
3490 if (unwind.proc_start)
3491 {
c921be7d 3492 as_bad (_("duplicate .fnstart directive"));
921e5f0a
PB
3493 return;
3494 }
3495
c19d1205
ZW
3496 /* Mark the start of the function. */
3497 unwind.proc_start = expr_build_dot ();
b99bd4ef 3498
c19d1205
ZW
3499 /* Reset the rest of the unwind info. */
3500 unwind.opcode_count = 0;
3501 unwind.table_entry = NULL;
3502 unwind.personality_routine = NULL;
3503 unwind.personality_index = -1;
3504 unwind.frame_size = 0;
3505 unwind.fp_offset = 0;
fdfde340 3506 unwind.fp_reg = REG_SP;
c19d1205
ZW
3507 unwind.fp_used = 0;
3508 unwind.sp_restored = 0;
3509}
b99bd4ef 3510
b99bd4ef 3511
c19d1205
ZW
3512/* Parse a handlerdata directive. Creates the exception handling table entry
3513 for the function. */
b99bd4ef 3514
c19d1205
ZW
3515static void
3516s_arm_unwind_handlerdata (int ignored ATTRIBUTE_UNUSED)
3517{
3518 demand_empty_rest_of_line ();
921e5f0a 3519 if (!unwind.proc_start)
c921be7d 3520 as_bad (MISSING_FNSTART);
921e5f0a 3521
c19d1205 3522 if (unwind.table_entry)
6decc662 3523 as_bad (_("duplicate .handlerdata directive"));
f02232aa 3524
c19d1205
ZW
3525 create_unwind_entry (1);
3526}
a737bd4d 3527
c19d1205 3528/* Parse an unwind_fnend directive. Generates the index table entry. */
b99bd4ef 3529
c19d1205
ZW
3530static void
3531s_arm_unwind_fnend (int ignored ATTRIBUTE_UNUSED)
3532{
3533 long where;
3534 char *ptr;
3535 valueT val;
940b5ce0 3536 unsigned int marked_pr_dependency;
f02232aa 3537
c19d1205 3538 demand_empty_rest_of_line ();
f02232aa 3539
921e5f0a
PB
3540 if (!unwind.proc_start)
3541 {
c921be7d 3542 as_bad (_(".fnend directive without .fnstart"));
921e5f0a
PB
3543 return;
3544 }
3545
c19d1205
ZW
3546 /* Add eh table entry. */
3547 if (unwind.table_entry == NULL)
3548 val = create_unwind_entry (0);
3549 else
3550 val = 0;
f02232aa 3551
c19d1205
ZW
3552 /* Add index table entry. This is two words. */
3553 start_unwind_section (unwind.saved_seg, 1);
3554 frag_align (2, 0, 0);
3555 record_alignment (now_seg, 2);
b99bd4ef 3556
c19d1205 3557 ptr = frag_more (8);
5011093d 3558 memset (ptr, 0, 8);
c19d1205 3559 where = frag_now_fix () - 8;
f02232aa 3560
c19d1205
ZW
3561 /* Self relative offset of the function start. */
3562 fix_new (frag_now, where, 4, unwind.proc_start, 0, 1,
3563 BFD_RELOC_ARM_PREL31);
f02232aa 3564
c19d1205
ZW
3565 /* Indicate dependency on EHABI-defined personality routines to the
3566 linker, if it hasn't been done already. */
940b5ce0
DJ
3567 marked_pr_dependency
3568 = seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency;
c19d1205
ZW
3569 if (unwind.personality_index >= 0 && unwind.personality_index < 3
3570 && !(marked_pr_dependency & (1 << unwind.personality_index)))
3571 {
5f4273c7
NC
3572 static const char *const name[] =
3573 {
3574 "__aeabi_unwind_cpp_pr0",
3575 "__aeabi_unwind_cpp_pr1",
3576 "__aeabi_unwind_cpp_pr2"
3577 };
c19d1205
ZW
3578 symbolS *pr = symbol_find_or_make (name[unwind.personality_index]);
3579 fix_new (frag_now, where, 0, pr, 0, 1, BFD_RELOC_NONE);
c19d1205 3580 seg_info (now_seg)->tc_segment_info_data.marked_pr_dependency
940b5ce0 3581 |= 1 << unwind.personality_index;
c19d1205 3582 }
f02232aa 3583
c19d1205
ZW
3584 if (val)
3585 /* Inline exception table entry. */
3586 md_number_to_chars (ptr + 4, val, 4);
3587 else
3588 /* Self relative offset of the table entry. */
3589 fix_new (frag_now, where + 4, 4, unwind.table_entry, 0, 1,
3590 BFD_RELOC_ARM_PREL31);
f02232aa 3591
c19d1205
ZW
3592 /* Restore the original section. */
3593 subseg_set (unwind.saved_seg, unwind.saved_subseg);
921e5f0a
PB
3594
3595 unwind.proc_start = NULL;
c19d1205 3596}
f02232aa 3597
f02232aa 3598
c19d1205 3599/* Parse an unwind_cantunwind directive. */
b99bd4ef 3600
c19d1205
ZW
3601static void
3602s_arm_unwind_cantunwind (int ignored ATTRIBUTE_UNUSED)
3603{
3604 demand_empty_rest_of_line ();
921e5f0a 3605 if (!unwind.proc_start)
c921be7d 3606 as_bad (MISSING_FNSTART);
921e5f0a 3607
c19d1205
ZW
3608 if (unwind.personality_routine || unwind.personality_index != -1)
3609 as_bad (_("personality routine specified for cantunwind frame"));
b99bd4ef 3610
c19d1205
ZW
3611 unwind.personality_index = -2;
3612}
b99bd4ef 3613
b99bd4ef 3614
c19d1205 3615/* Parse a personalityindex directive. */
b99bd4ef 3616
c19d1205
ZW
3617static void
3618s_arm_unwind_personalityindex (int ignored ATTRIBUTE_UNUSED)
3619{
3620 expressionS exp;
b99bd4ef 3621
921e5f0a 3622 if (!unwind.proc_start)
c921be7d 3623 as_bad (MISSING_FNSTART);
921e5f0a 3624
c19d1205
ZW
3625 if (unwind.personality_routine || unwind.personality_index != -1)
3626 as_bad (_("duplicate .personalityindex directive"));
b99bd4ef 3627
c19d1205 3628 expression (&exp);
b99bd4ef 3629
c19d1205
ZW
3630 if (exp.X_op != O_constant
3631 || exp.X_add_number < 0 || exp.X_add_number > 15)
b99bd4ef 3632 {
c19d1205
ZW
3633 as_bad (_("bad personality routine number"));
3634 ignore_rest_of_line ();
3635 return;
b99bd4ef
NC
3636 }
3637
c19d1205 3638 unwind.personality_index = exp.X_add_number;
b99bd4ef 3639
c19d1205
ZW
3640 demand_empty_rest_of_line ();
3641}
e16bb312 3642
e16bb312 3643
c19d1205 3644/* Parse a personality directive. */
e16bb312 3645
c19d1205
ZW
3646static void
3647s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
3648{
3649 char *name, *p, c;
a737bd4d 3650
921e5f0a 3651 if (!unwind.proc_start)
c921be7d 3652 as_bad (MISSING_FNSTART);
921e5f0a 3653
c19d1205
ZW
3654 if (unwind.personality_routine || unwind.personality_index != -1)
3655 as_bad (_("duplicate .personality directive"));
a737bd4d 3656
c19d1205
ZW
3657 name = input_line_pointer;
3658 c = get_symbol_end ();
3659 p = input_line_pointer;
3660 unwind.personality_routine = symbol_find_or_make (name);
3661 *p = c;
3662 demand_empty_rest_of_line ();
3663}
e16bb312 3664
e16bb312 3665
c19d1205 3666/* Parse a directive saving core registers. */
e16bb312 3667
c19d1205
ZW
3668static void
3669s_arm_unwind_save_core (void)
e16bb312 3670{
c19d1205
ZW
3671 valueT op;
3672 long range;
3673 int n;
e16bb312 3674
c19d1205
ZW
3675 range = parse_reg_list (&input_line_pointer);
3676 if (range == FAIL)
e16bb312 3677 {
c19d1205
ZW
3678 as_bad (_("expected register list"));
3679 ignore_rest_of_line ();
3680 return;
3681 }
e16bb312 3682
c19d1205 3683 demand_empty_rest_of_line ();
e16bb312 3684
c19d1205
ZW
3685 /* Turn .unwind_movsp ip followed by .unwind_save {..., ip, ...}
3686 into .unwind_save {..., sp...}. We aren't bothered about the value of
3687 ip because it is clobbered by calls. */
3688 if (unwind.sp_restored && unwind.fp_reg == 12
3689 && (range & 0x3000) == 0x1000)
3690 {
3691 unwind.opcode_count--;
3692 unwind.sp_restored = 0;
3693 range = (range | 0x2000) & ~0x1000;
3694 unwind.pending_offset = 0;
3695 }
e16bb312 3696
01ae4198
DJ
3697 /* Pop r4-r15. */
3698 if (range & 0xfff0)
c19d1205 3699 {
01ae4198
DJ
3700 /* See if we can use the short opcodes. These pop a block of up to 8
3701 registers starting with r4, plus maybe r14. */
3702 for (n = 0; n < 8; n++)
3703 {
3704 /* Break at the first non-saved register. */
3705 if ((range & (1 << (n + 4))) == 0)
3706 break;
3707 }
3708 /* See if there are any other bits set. */
3709 if (n == 0 || (range & (0xfff0 << n) & 0xbff0) != 0)
3710 {
3711 /* Use the long form. */
3712 op = 0x8000 | ((range >> 4) & 0xfff);
3713 add_unwind_opcode (op, 2);
3714 }
0dd132b6 3715 else
01ae4198
DJ
3716 {
3717 /* Use the short form. */
3718 if (range & 0x4000)
3719 op = 0xa8; /* Pop r14. */
3720 else
3721 op = 0xa0; /* Do not pop r14. */
3722 op |= (n - 1);
3723 add_unwind_opcode (op, 1);
3724 }
c19d1205 3725 }
0dd132b6 3726
c19d1205
ZW
3727 /* Pop r0-r3. */
3728 if (range & 0xf)
3729 {
3730 op = 0xb100 | (range & 0xf);
3731 add_unwind_opcode (op, 2);
0dd132b6
NC
3732 }
3733
c19d1205
ZW
3734 /* Record the number of bytes pushed. */
3735 for (n = 0; n < 16; n++)
3736 {
3737 if (range & (1 << n))
3738 unwind.frame_size += 4;
3739 }
0dd132b6
NC
3740}
3741
c19d1205
ZW
3742
3743/* Parse a directive saving FPA registers. */
b99bd4ef
NC
3744
3745static void
c19d1205 3746s_arm_unwind_save_fpa (int reg)
b99bd4ef 3747{
c19d1205
ZW
3748 expressionS exp;
3749 int num_regs;
3750 valueT op;
b99bd4ef 3751
c19d1205
ZW
3752 /* Get Number of registers to transfer. */
3753 if (skip_past_comma (&input_line_pointer) != FAIL)
3754 expression (&exp);
3755 else
3756 exp.X_op = O_illegal;
b99bd4ef 3757
c19d1205 3758 if (exp.X_op != O_constant)
b99bd4ef 3759 {
c19d1205
ZW
3760 as_bad (_("expected , <constant>"));
3761 ignore_rest_of_line ();
b99bd4ef
NC
3762 return;
3763 }
3764
c19d1205
ZW
3765 num_regs = exp.X_add_number;
3766
3767 if (num_regs < 1 || num_regs > 4)
b99bd4ef 3768 {
c19d1205
ZW
3769 as_bad (_("number of registers must be in the range [1:4]"));
3770 ignore_rest_of_line ();
b99bd4ef
NC
3771 return;
3772 }
3773
c19d1205 3774 demand_empty_rest_of_line ();
b99bd4ef 3775
c19d1205
ZW
3776 if (reg == 4)
3777 {
3778 /* Short form. */
3779 op = 0xb4 | (num_regs - 1);
3780 add_unwind_opcode (op, 1);
3781 }
b99bd4ef
NC
3782 else
3783 {
c19d1205
ZW
3784 /* Long form. */
3785 op = 0xc800 | (reg << 4) | (num_regs - 1);
3786 add_unwind_opcode (op, 2);
b99bd4ef 3787 }
c19d1205 3788 unwind.frame_size += num_regs * 12;
b99bd4ef
NC
3789}
3790
c19d1205 3791
fa073d69
MS
3792/* Parse a directive saving VFP registers for ARMv6 and above. */
3793
3794static void
3795s_arm_unwind_save_vfp_armv6 (void)
3796{
3797 int count;
3798 unsigned int start;
3799 valueT op;
3800 int num_vfpv3_regs = 0;
3801 int num_regs_below_16;
3802
3803 count = parse_vfp_reg_list (&input_line_pointer, &start, REGLIST_VFP_D);
3804 if (count == FAIL)
3805 {
3806 as_bad (_("expected register list"));
3807 ignore_rest_of_line ();
3808 return;
3809 }
3810
3811 demand_empty_rest_of_line ();
3812
3813 /* We always generate FSTMD/FLDMD-style unwinding opcodes (rather
3814 than FSTMX/FLDMX-style ones). */
3815
3816 /* Generate opcode for (VFPv3) registers numbered in the range 16 .. 31. */
3817 if (start >= 16)
3818 num_vfpv3_regs = count;
3819 else if (start + count > 16)
3820 num_vfpv3_regs = start + count - 16;
3821
3822 if (num_vfpv3_regs > 0)
3823 {
3824 int start_offset = start > 16 ? start - 16 : 0;
3825 op = 0xc800 | (start_offset << 4) | (num_vfpv3_regs - 1);
3826 add_unwind_opcode (op, 2);
3827 }
3828
3829 /* Generate opcode for registers numbered in the range 0 .. 15. */
3830 num_regs_below_16 = num_vfpv3_regs > 0 ? 16 - (int) start : count;
9c2799c2 3831 gas_assert (num_regs_below_16 + num_vfpv3_regs == count);
fa073d69
MS
3832 if (num_regs_below_16 > 0)
3833 {
3834 op = 0xc900 | (start << 4) | (num_regs_below_16 - 1);
3835 add_unwind_opcode (op, 2);
3836 }
3837
3838 unwind.frame_size += count * 8;
3839}
3840
3841
3842/* Parse a directive saving VFP registers for pre-ARMv6. */
b99bd4ef
NC
3843
3844static void
c19d1205 3845s_arm_unwind_save_vfp (void)
b99bd4ef 3846{
c19d1205 3847 int count;
ca3f61f7 3848 unsigned int reg;
c19d1205 3849 valueT op;
b99bd4ef 3850
5287ad62 3851 count = parse_vfp_reg_list (&input_line_pointer, &reg, REGLIST_VFP_D);
c19d1205 3852 if (count == FAIL)
b99bd4ef 3853 {
c19d1205
ZW
3854 as_bad (_("expected register list"));
3855 ignore_rest_of_line ();
b99bd4ef
NC
3856 return;
3857 }
3858
c19d1205 3859 demand_empty_rest_of_line ();
b99bd4ef 3860
c19d1205 3861 if (reg == 8)
b99bd4ef 3862 {
c19d1205
ZW
3863 /* Short form. */
3864 op = 0xb8 | (count - 1);
3865 add_unwind_opcode (op, 1);
b99bd4ef 3866 }
c19d1205 3867 else
b99bd4ef 3868 {
c19d1205
ZW
3869 /* Long form. */
3870 op = 0xb300 | (reg << 4) | (count - 1);
3871 add_unwind_opcode (op, 2);
b99bd4ef 3872 }
c19d1205
ZW
3873 unwind.frame_size += count * 8 + 4;
3874}
b99bd4ef 3875
b99bd4ef 3876
c19d1205
ZW
3877/* Parse a directive saving iWMMXt data registers. */
3878
3879static void
3880s_arm_unwind_save_mmxwr (void)
3881{
3882 int reg;
3883 int hi_reg;
3884 int i;
3885 unsigned mask = 0;
3886 valueT op;
b99bd4ef 3887
c19d1205
ZW
3888 if (*input_line_pointer == '{')
3889 input_line_pointer++;
b99bd4ef 3890
c19d1205 3891 do
b99bd4ef 3892 {
dcbf9037 3893 reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
b99bd4ef 3894
c19d1205 3895 if (reg == FAIL)
b99bd4ef 3896 {
9b7132d3 3897 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
c19d1205 3898 goto error;
b99bd4ef
NC
3899 }
3900
c19d1205
ZW
3901 if (mask >> reg)
3902 as_tsktsk (_("register list not in ascending order"));
3903 mask |= 1 << reg;
b99bd4ef 3904
c19d1205
ZW
3905 if (*input_line_pointer == '-')
3906 {
3907 input_line_pointer++;
dcbf9037 3908 hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWR);
c19d1205
ZW
3909 if (hi_reg == FAIL)
3910 {
9b7132d3 3911 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWR]));
c19d1205
ZW
3912 goto error;
3913 }
3914 else if (reg >= hi_reg)
3915 {
3916 as_bad (_("bad register range"));
3917 goto error;
3918 }
3919 for (; reg < hi_reg; reg++)
3920 mask |= 1 << reg;
3921 }
3922 }
3923 while (skip_past_comma (&input_line_pointer) != FAIL);
b99bd4ef 3924
c19d1205
ZW
3925 if (*input_line_pointer == '}')
3926 input_line_pointer++;
b99bd4ef 3927
c19d1205 3928 demand_empty_rest_of_line ();
b99bd4ef 3929
708587a4 3930 /* Generate any deferred opcodes because we're going to be looking at
c19d1205
ZW
3931 the list. */
3932 flush_pending_unwind ();
b99bd4ef 3933
c19d1205 3934 for (i = 0; i < 16; i++)
b99bd4ef 3935 {
c19d1205
ZW
3936 if (mask & (1 << i))
3937 unwind.frame_size += 8;
b99bd4ef
NC
3938 }
3939
c19d1205
ZW
3940 /* Attempt to combine with a previous opcode. We do this because gcc
3941 likes to output separate unwind directives for a single block of
3942 registers. */
3943 if (unwind.opcode_count > 0)
b99bd4ef 3944 {
c19d1205
ZW
3945 i = unwind.opcodes[unwind.opcode_count - 1];
3946 if ((i & 0xf8) == 0xc0)
3947 {
3948 i &= 7;
3949 /* Only merge if the blocks are contiguous. */
3950 if (i < 6)
3951 {
3952 if ((mask & 0xfe00) == (1 << 9))
3953 {
3954 mask |= ((1 << (i + 11)) - 1) & 0xfc00;
3955 unwind.opcode_count--;
3956 }
3957 }
3958 else if (i == 6 && unwind.opcode_count >= 2)
3959 {
3960 i = unwind.opcodes[unwind.opcode_count - 2];
3961 reg = i >> 4;
3962 i &= 0xf;
b99bd4ef 3963
c19d1205
ZW
3964 op = 0xffff << (reg - 1);
3965 if (reg > 0
87a1fd79 3966 && ((mask & op) == (1u << (reg - 1))))
c19d1205
ZW
3967 {
3968 op = (1 << (reg + i + 1)) - 1;
3969 op &= ~((1 << reg) - 1);
3970 mask |= op;
3971 unwind.opcode_count -= 2;
3972 }
3973 }
3974 }
b99bd4ef
NC
3975 }
3976
c19d1205
ZW
3977 hi_reg = 15;
3978 /* We want to generate opcodes in the order the registers have been
3979 saved, ie. descending order. */
3980 for (reg = 15; reg >= -1; reg--)
b99bd4ef 3981 {
c19d1205
ZW
3982 /* Save registers in blocks. */
3983 if (reg < 0
3984 || !(mask & (1 << reg)))
3985 {
3986 /* We found an unsaved reg. Generate opcodes to save the
5f4273c7 3987 preceding block. */
c19d1205
ZW
3988 if (reg != hi_reg)
3989 {
3990 if (reg == 9)
3991 {
3992 /* Short form. */
3993 op = 0xc0 | (hi_reg - 10);
3994 add_unwind_opcode (op, 1);
3995 }
3996 else
3997 {
3998 /* Long form. */
3999 op = 0xc600 | ((reg + 1) << 4) | ((hi_reg - reg) - 1);
4000 add_unwind_opcode (op, 2);
4001 }
4002 }
4003 hi_reg = reg - 1;
4004 }
b99bd4ef
NC
4005 }
4006
c19d1205
ZW
4007 return;
4008error:
4009 ignore_rest_of_line ();
b99bd4ef
NC
4010}
4011
4012static void
c19d1205 4013s_arm_unwind_save_mmxwcg (void)
b99bd4ef 4014{
c19d1205
ZW
4015 int reg;
4016 int hi_reg;
4017 unsigned mask = 0;
4018 valueT op;
b99bd4ef 4019
c19d1205
ZW
4020 if (*input_line_pointer == '{')
4021 input_line_pointer++;
b99bd4ef 4022
c19d1205 4023 do
b99bd4ef 4024 {
dcbf9037 4025 reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
b99bd4ef 4026
c19d1205
ZW
4027 if (reg == FAIL)
4028 {
9b7132d3 4029 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
c19d1205
ZW
4030 goto error;
4031 }
b99bd4ef 4032
c19d1205
ZW
4033 reg -= 8;
4034 if (mask >> reg)
4035 as_tsktsk (_("register list not in ascending order"));
4036 mask |= 1 << reg;
b99bd4ef 4037
c19d1205
ZW
4038 if (*input_line_pointer == '-')
4039 {
4040 input_line_pointer++;
dcbf9037 4041 hi_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_MMXWCG);
c19d1205
ZW
4042 if (hi_reg == FAIL)
4043 {
9b7132d3 4044 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_MMXWCG]));
c19d1205
ZW
4045 goto error;
4046 }
4047 else if (reg >= hi_reg)
4048 {
4049 as_bad (_("bad register range"));
4050 goto error;
4051 }
4052 for (; reg < hi_reg; reg++)
4053 mask |= 1 << reg;
4054 }
b99bd4ef 4055 }
c19d1205 4056 while (skip_past_comma (&input_line_pointer) != FAIL);
b99bd4ef 4057
c19d1205
ZW
4058 if (*input_line_pointer == '}')
4059 input_line_pointer++;
b99bd4ef 4060
c19d1205
ZW
4061 demand_empty_rest_of_line ();
4062
708587a4 4063 /* Generate any deferred opcodes because we're going to be looking at
c19d1205
ZW
4064 the list. */
4065 flush_pending_unwind ();
b99bd4ef 4066
c19d1205 4067 for (reg = 0; reg < 16; reg++)
b99bd4ef 4068 {
c19d1205
ZW
4069 if (mask & (1 << reg))
4070 unwind.frame_size += 4;
b99bd4ef 4071 }
c19d1205
ZW
4072 op = 0xc700 | mask;
4073 add_unwind_opcode (op, 2);
4074 return;
4075error:
4076 ignore_rest_of_line ();
b99bd4ef
NC
4077}
4078
c19d1205 4079
fa073d69
MS
4080/* Parse an unwind_save directive.
4081 If the argument is non-zero, this is a .vsave directive. */
c19d1205 4082
b99bd4ef 4083static void
fa073d69 4084s_arm_unwind_save (int arch_v6)
b99bd4ef 4085{
c19d1205
ZW
4086 char *peek;
4087 struct reg_entry *reg;
4088 bfd_boolean had_brace = FALSE;
b99bd4ef 4089
921e5f0a 4090 if (!unwind.proc_start)
c921be7d 4091 as_bad (MISSING_FNSTART);
921e5f0a 4092
c19d1205
ZW
4093 /* Figure out what sort of save we have. */
4094 peek = input_line_pointer;
b99bd4ef 4095
c19d1205 4096 if (*peek == '{')
b99bd4ef 4097 {
c19d1205
ZW
4098 had_brace = TRUE;
4099 peek++;
b99bd4ef
NC
4100 }
4101
c19d1205 4102 reg = arm_reg_parse_multi (&peek);
b99bd4ef 4103
c19d1205 4104 if (!reg)
b99bd4ef 4105 {
c19d1205
ZW
4106 as_bad (_("register expected"));
4107 ignore_rest_of_line ();
b99bd4ef
NC
4108 return;
4109 }
4110
c19d1205 4111 switch (reg->type)
b99bd4ef 4112 {
c19d1205
ZW
4113 case REG_TYPE_FN:
4114 if (had_brace)
4115 {
4116 as_bad (_("FPA .unwind_save does not take a register list"));
4117 ignore_rest_of_line ();
4118 return;
4119 }
93ac2687 4120 input_line_pointer = peek;
c19d1205 4121 s_arm_unwind_save_fpa (reg->number);
b99bd4ef 4122 return;
c19d1205
ZW
4123
4124 case REG_TYPE_RN: s_arm_unwind_save_core (); return;
fa073d69
MS
4125 case REG_TYPE_VFD:
4126 if (arch_v6)
4127 s_arm_unwind_save_vfp_armv6 ();
4128 else
4129 s_arm_unwind_save_vfp ();
4130 return;
c19d1205
ZW
4131 case REG_TYPE_MMXWR: s_arm_unwind_save_mmxwr (); return;
4132 case REG_TYPE_MMXWCG: s_arm_unwind_save_mmxwcg (); return;
4133
4134 default:
4135 as_bad (_(".unwind_save does not support this kind of register"));
4136 ignore_rest_of_line ();
b99bd4ef 4137 }
c19d1205 4138}
b99bd4ef 4139
b99bd4ef 4140
c19d1205
ZW
4141/* Parse an unwind_movsp directive. */
4142
4143static void
4144s_arm_unwind_movsp (int ignored ATTRIBUTE_UNUSED)
4145{
4146 int reg;
4147 valueT op;
4fa3602b 4148 int offset;
c19d1205 4149
921e5f0a 4150 if (!unwind.proc_start)
c921be7d 4151 as_bad (MISSING_FNSTART);
921e5f0a 4152
dcbf9037 4153 reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
c19d1205 4154 if (reg == FAIL)
b99bd4ef 4155 {
9b7132d3 4156 as_bad ("%s", _(reg_expected_msgs[REG_TYPE_RN]));
c19d1205 4157 ignore_rest_of_line ();
b99bd4ef
NC
4158 return;
4159 }
4fa3602b
PB
4160
4161 /* Optional constant. */
4162 if (skip_past_comma (&input_line_pointer) != FAIL)
4163 {
4164 if (immediate_for_directive (&offset) == FAIL)
4165 return;
4166 }
4167 else
4168 offset = 0;
4169
c19d1205 4170 demand_empty_rest_of_line ();
b99bd4ef 4171
c19d1205 4172 if (reg == REG_SP || reg == REG_PC)
b99bd4ef 4173 {
c19d1205 4174 as_bad (_("SP and PC not permitted in .unwind_movsp directive"));
b99bd4ef
NC
4175 return;
4176 }
4177
c19d1205
ZW
4178 if (unwind.fp_reg != REG_SP)
4179 as_bad (_("unexpected .unwind_movsp directive"));
b99bd4ef 4180
c19d1205
ZW
4181 /* Generate opcode to restore the value. */
4182 op = 0x90 | reg;
4183 add_unwind_opcode (op, 1);
4184
4185 /* Record the information for later. */
4186 unwind.fp_reg = reg;
4fa3602b 4187 unwind.fp_offset = unwind.frame_size - offset;
c19d1205 4188 unwind.sp_restored = 1;
b05fe5cf
ZW
4189}
4190
c19d1205
ZW
4191/* Parse an unwind_pad directive. */
4192
b05fe5cf 4193static void
c19d1205 4194s_arm_unwind_pad (int ignored ATTRIBUTE_UNUSED)
b05fe5cf 4195{
c19d1205 4196 int offset;
b05fe5cf 4197
921e5f0a 4198 if (!unwind.proc_start)
c921be7d 4199 as_bad (MISSING_FNSTART);
921e5f0a 4200
c19d1205
ZW
4201 if (immediate_for_directive (&offset) == FAIL)
4202 return;
b99bd4ef 4203
c19d1205
ZW
4204 if (offset & 3)
4205 {
4206 as_bad (_("stack increment must be multiple of 4"));
4207 ignore_rest_of_line ();
4208 return;
4209 }
b99bd4ef 4210
c19d1205
ZW
4211 /* Don't generate any opcodes, just record the details for later. */
4212 unwind.frame_size += offset;
4213 unwind.pending_offset += offset;
4214
4215 demand_empty_rest_of_line ();
4216}
4217
4218/* Parse an unwind_setfp directive. */
4219
4220static void
4221s_arm_unwind_setfp (int ignored ATTRIBUTE_UNUSED)
b99bd4ef 4222{
c19d1205
ZW
4223 int sp_reg;
4224 int fp_reg;
4225 int offset;
4226
921e5f0a 4227 if (!unwind.proc_start)
c921be7d 4228 as_bad (MISSING_FNSTART);
921e5f0a 4229
dcbf9037 4230 fp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
c19d1205
ZW
4231 if (skip_past_comma (&input_line_pointer) == FAIL)
4232 sp_reg = FAIL;
4233 else
dcbf9037 4234 sp_reg = arm_reg_parse (&input_line_pointer, REG_TYPE_RN);
b99bd4ef 4235
c19d1205
ZW
4236 if (fp_reg == FAIL || sp_reg == FAIL)
4237 {
4238 as_bad (_("expected <reg>, <reg>"));
4239 ignore_rest_of_line ();
4240 return;
4241 }
b99bd4ef 4242
c19d1205
ZW
4243 /* Optional constant. */
4244 if (skip_past_comma (&input_line_pointer) != FAIL)
4245 {
4246 if (immediate_for_directive (&offset) == FAIL)
4247 return;
4248 }
4249 else
4250 offset = 0;
a737bd4d 4251
c19d1205 4252 demand_empty_rest_of_line ();
a737bd4d 4253
fdfde340 4254 if (sp_reg != REG_SP && sp_reg != unwind.fp_reg)
a737bd4d 4255 {
c19d1205
ZW
4256 as_bad (_("register must be either sp or set by a previous"
4257 "unwind_movsp directive"));
4258 return;
a737bd4d
NC
4259 }
4260
c19d1205
ZW
4261 /* Don't generate any opcodes, just record the information for later. */
4262 unwind.fp_reg = fp_reg;
4263 unwind.fp_used = 1;
fdfde340 4264 if (sp_reg == REG_SP)
c19d1205
ZW
4265 unwind.fp_offset = unwind.frame_size - offset;
4266 else
4267 unwind.fp_offset -= offset;
a737bd4d
NC
4268}
4269
c19d1205
ZW
4270/* Parse an unwind_raw directive. */
4271
4272static void
4273s_arm_unwind_raw (int ignored ATTRIBUTE_UNUSED)
a737bd4d 4274{
c19d1205 4275 expressionS exp;
708587a4 4276 /* This is an arbitrary limit. */
c19d1205
ZW
4277 unsigned char op[16];
4278 int count;
a737bd4d 4279
921e5f0a 4280 if (!unwind.proc_start)
c921be7d 4281 as_bad (MISSING_FNSTART);
921e5f0a 4282
c19d1205
ZW
4283 expression (&exp);
4284 if (exp.X_op == O_constant
4285 && skip_past_comma (&input_line_pointer) != FAIL)
a737bd4d 4286 {
c19d1205
ZW
4287 unwind.frame_size += exp.X_add_number;
4288 expression (&exp);
4289 }
4290 else
4291 exp.X_op = O_illegal;
a737bd4d 4292
c19d1205
ZW
4293 if (exp.X_op != O_constant)
4294 {
4295 as_bad (_("expected <offset>, <opcode>"));
4296 ignore_rest_of_line ();
4297 return;
4298 }
a737bd4d 4299
c19d1205 4300 count = 0;
a737bd4d 4301
c19d1205
ZW
4302 /* Parse the opcode. */
4303 for (;;)
4304 {
4305 if (count >= 16)
4306 {
4307 as_bad (_("unwind opcode too long"));
4308 ignore_rest_of_line ();
a737bd4d 4309 }
c19d1205 4310 if (exp.X_op != O_constant || exp.X_add_number & ~0xff)
a737bd4d 4311 {
c19d1205
ZW
4312 as_bad (_("invalid unwind opcode"));
4313 ignore_rest_of_line ();
4314 return;
a737bd4d 4315 }
c19d1205 4316 op[count++] = exp.X_add_number;
a737bd4d 4317
c19d1205
ZW
4318 /* Parse the next byte. */
4319 if (skip_past_comma (&input_line_pointer) == FAIL)
4320 break;
a737bd4d 4321
c19d1205
ZW
4322 expression (&exp);
4323 }
b99bd4ef 4324
c19d1205
ZW
4325 /* Add the opcode bytes in reverse order. */
4326 while (count--)
4327 add_unwind_opcode (op[count], 1);
b99bd4ef 4328
c19d1205 4329 demand_empty_rest_of_line ();
b99bd4ef 4330}
ee065d83
PB
4331
4332
4333/* Parse a .eabi_attribute directive. */
4334
4335static void
4336s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
4337{
ee3c0378
AS
4338 int tag = s_vendor_attribute (OBJ_ATTR_PROC);
4339
4340 if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
4341 attributes_set_explicitly[tag] = 1;
ee065d83
PB
4342}
4343
0855e32b
NS
4344/* Emit a tls fix for the symbol. */
4345
4346static void
4347s_arm_tls_descseq (int ignored ATTRIBUTE_UNUSED)
4348{
4349 char *p;
4350 expressionS exp;
4351#ifdef md_flush_pending_output
4352 md_flush_pending_output ();
4353#endif
4354
4355#ifdef md_cons_align
4356 md_cons_align (4);
4357#endif
4358
4359 /* Since we're just labelling the code, there's no need to define a
4360 mapping symbol. */
4361 expression (&exp);
4362 p = obstack_next_free (&frchain_now->frch_obstack);
4363 fix_new_arm (frag_now, p - frag_now->fr_literal, 4, &exp, 0,
4364 thumb_mode ? BFD_RELOC_ARM_THM_TLS_DESCSEQ
4365 : BFD_RELOC_ARM_TLS_DESCSEQ);
4366}
cdf9ccec 4367#endif /* OBJ_ELF */
0855e32b 4368
ee065d83 4369static void s_arm_arch (int);
7a1d4c38 4370static void s_arm_object_arch (int);
ee065d83
PB
4371static void s_arm_cpu (int);
4372static void s_arm_fpu (int);
69133863 4373static void s_arm_arch_extension (int);
b99bd4ef 4374
f0927246
NC
4375#ifdef TE_PE
4376
4377static void
5f4273c7 4378pe_directive_secrel (int dummy ATTRIBUTE_UNUSED)
f0927246
NC
4379{
4380 expressionS exp;
4381
4382 do
4383 {
4384 expression (&exp);
4385 if (exp.X_op == O_symbol)
4386 exp.X_op = O_secrel;
4387
4388 emit_expr (&exp, 4);
4389 }
4390 while (*input_line_pointer++ == ',');
4391
4392 input_line_pointer--;
4393 demand_empty_rest_of_line ();
4394}
4395#endif /* TE_PE */
4396
c19d1205
ZW
4397/* This table describes all the machine specific pseudo-ops the assembler
4398 has to support. The fields are:
4399 pseudo-op name without dot
4400 function to call to execute this pseudo-op
4401 Integer arg to pass to the function. */
b99bd4ef 4402
c19d1205 4403const pseudo_typeS md_pseudo_table[] =
b99bd4ef 4404{
c19d1205
ZW
4405 /* Never called because '.req' does not start a line. */
4406 { "req", s_req, 0 },
dcbf9037
JB
4407 /* Following two are likewise never called. */
4408 { "dn", s_dn, 0 },
4409 { "qn", s_qn, 0 },
c19d1205
ZW
4410 { "unreq", s_unreq, 0 },
4411 { "bss", s_bss, 0 },
4412 { "align", s_align, 0 },
4413 { "arm", s_arm, 0 },
4414 { "thumb", s_thumb, 0 },
4415 { "code", s_code, 0 },
4416 { "force_thumb", s_force_thumb, 0 },
4417 { "thumb_func", s_thumb_func, 0 },
4418 { "thumb_set", s_thumb_set, 0 },
4419 { "even", s_even, 0 },
4420 { "ltorg", s_ltorg, 0 },
4421 { "pool", s_ltorg, 0 },
4422 { "syntax", s_syntax, 0 },
8463be01
PB
4423 { "cpu", s_arm_cpu, 0 },
4424 { "arch", s_arm_arch, 0 },
7a1d4c38 4425 { "object_arch", s_arm_object_arch, 0 },
8463be01 4426 { "fpu", s_arm_fpu, 0 },
69133863 4427 { "arch_extension", s_arm_arch_extension, 0 },
c19d1205 4428#ifdef OBJ_ELF
c921be7d
NC
4429 { "word", s_arm_elf_cons, 4 },
4430 { "long", s_arm_elf_cons, 4 },
4431 { "inst.n", s_arm_elf_inst, 2 },
4432 { "inst.w", s_arm_elf_inst, 4 },
4433 { "inst", s_arm_elf_inst, 0 },
4434 { "rel31", s_arm_rel31, 0 },
c19d1205
ZW
4435 { "fnstart", s_arm_unwind_fnstart, 0 },
4436 { "fnend", s_arm_unwind_fnend, 0 },
4437 { "cantunwind", s_arm_unwind_cantunwind, 0 },
4438 { "personality", s_arm_unwind_personality, 0 },
4439 { "personalityindex", s_arm_unwind_personalityindex, 0 },
4440 { "handlerdata", s_arm_unwind_handlerdata, 0 },
4441 { "save", s_arm_unwind_save, 0 },
fa073d69 4442 { "vsave", s_arm_unwind_save, 1 },
c19d1205
ZW
4443 { "movsp", s_arm_unwind_movsp, 0 },
4444 { "pad", s_arm_unwind_pad, 0 },
4445 { "setfp", s_arm_unwind_setfp, 0 },
4446 { "unwind_raw", s_arm_unwind_raw, 0 },
ee065d83 4447 { "eabi_attribute", s_arm_eabi_attribute, 0 },
0855e32b 4448 { "tlsdescseq", s_arm_tls_descseq, 0 },
c19d1205
ZW
4449#else
4450 { "word", cons, 4},
f0927246
NC
4451
4452 /* These are used for dwarf. */
4453 {"2byte", cons, 2},
4454 {"4byte", cons, 4},
4455 {"8byte", cons, 8},
4456 /* These are used for dwarf2. */
4457 { "file", (void (*) (int)) dwarf2_directive_file, 0 },
4458 { "loc", dwarf2_directive_loc, 0 },
4459 { "loc_mark_labels", dwarf2_directive_loc_mark_labels, 0 },
c19d1205
ZW
4460#endif
4461 { "extend", float_cons, 'x' },
4462 { "ldouble", float_cons, 'x' },
4463 { "packed", float_cons, 'p' },
f0927246
NC
4464#ifdef TE_PE
4465 {"secrel32", pe_directive_secrel, 0},
4466#endif
c19d1205
ZW
4467 { 0, 0, 0 }
4468};
4469\f
4470/* Parser functions used exclusively in instruction operands. */
b99bd4ef 4471
c19d1205
ZW
4472/* Generic immediate-value read function for use in insn parsing.
4473 STR points to the beginning of the immediate (the leading #);
4474 VAL receives the value; if the value is outside [MIN, MAX]
4475 issue an error. PREFIX_OPT is true if the immediate prefix is
4476 optional. */
b99bd4ef 4477
c19d1205
ZW
4478static int
4479parse_immediate (char **str, int *val, int min, int max,
4480 bfd_boolean prefix_opt)
4481{
4482 expressionS exp;
4483 my_get_expression (&exp, str, prefix_opt ? GE_OPT_PREFIX : GE_IMM_PREFIX);
4484 if (exp.X_op != O_constant)
b99bd4ef 4485 {
c19d1205
ZW
4486 inst.error = _("constant expression required");
4487 return FAIL;
4488 }
b99bd4ef 4489
c19d1205
ZW
4490 if (exp.X_add_number < min || exp.X_add_number > max)
4491 {
4492 inst.error = _("immediate value out of range");
4493 return FAIL;
4494 }
b99bd4ef 4495
c19d1205
ZW
4496 *val = exp.X_add_number;
4497 return SUCCESS;
4498}
b99bd4ef 4499
5287ad62 4500/* Less-generic immediate-value read function with the possibility of loading a
036dc3f7 4501 big (64-bit) immediate, as required by Neon VMOV, VMVN and logic immediate
5287ad62
JB
4502 instructions. Puts the result directly in inst.operands[i]. */
4503
4504static int
4505parse_big_immediate (char **str, int i)
4506{
4507 expressionS exp;
4508 char *ptr = *str;
4509
4510 my_get_expression (&exp, &ptr, GE_OPT_PREFIX_BIG);
4511
4512 if (exp.X_op == O_constant)
036dc3f7
PB
4513 {
4514 inst.operands[i].imm = exp.X_add_number & 0xffffffff;
4515 /* If we're on a 64-bit host, then a 64-bit number can be returned using
4516 O_constant. We have to be careful not to break compilation for
4517 32-bit X_add_number, though. */
58ad575f 4518 if ((exp.X_add_number & ~(offsetT)(0xffffffffU)) != 0)
036dc3f7
PB
4519 {
4520 /* X >> 32 is illegal if sizeof (exp.X_add_number) == 4. */
4521 inst.operands[i].reg = ((exp.X_add_number >> 16) >> 16) & 0xffffffff;
4522 inst.operands[i].regisimm = 1;
4523 }
4524 }
5287ad62 4525 else if (exp.X_op == O_big
95b75c01 4526 && LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 32)
5287ad62
JB
4527 {
4528 unsigned parts = 32 / LITTLENUM_NUMBER_OF_BITS, j, idx = 0;
95b75c01 4529
5287ad62
JB
4530 /* Bignums have their least significant bits in
4531 generic_bignum[0]. Make sure we put 32 bits in imm and
4532 32 bits in reg, in a (hopefully) portable way. */
9c2799c2 4533 gas_assert (parts != 0);
95b75c01
NC
4534
4535 /* Make sure that the number is not too big.
4536 PR 11972: Bignums can now be sign-extended to the
4537 size of a .octa so check that the out of range bits
4538 are all zero or all one. */
4539 if (LITTLENUM_NUMBER_OF_BITS * exp.X_add_number > 64)
4540 {
4541 LITTLENUM_TYPE m = -1;
4542
4543 if (generic_bignum[parts * 2] != 0
4544 && generic_bignum[parts * 2] != m)
4545 return FAIL;
4546
4547 for (j = parts * 2 + 1; j < (unsigned) exp.X_add_number; j++)
4548 if (generic_bignum[j] != generic_bignum[j-1])
4549 return FAIL;
4550 }
4551
5287ad62
JB
4552 inst.operands[i].imm = 0;
4553 for (j = 0; j < parts; j++, idx++)
4554 inst.operands[i].imm |= generic_bignum[idx]
4555 << (LITTLENUM_NUMBER_OF_BITS * j);
4556 inst.operands[i].reg = 0;
4557 for (j = 0; j < parts; j++, idx++)
4558 inst.operands[i].reg |= generic_bignum[idx]
4559 << (LITTLENUM_NUMBER_OF_BITS * j);
4560 inst.operands[i].regisimm = 1;
4561 }
4562 else
4563 return FAIL;
5f4273c7 4564
5287ad62
JB
4565 *str = ptr;
4566
4567 return SUCCESS;
4568}
4569
c19d1205
ZW
4570/* Returns the pseudo-register number of an FPA immediate constant,
4571 or FAIL if there isn't a valid constant here. */
b99bd4ef 4572
c19d1205
ZW
4573static int
4574parse_fpa_immediate (char ** str)
4575{
4576 LITTLENUM_TYPE words[MAX_LITTLENUMS];
4577 char * save_in;
4578 expressionS exp;
4579 int i;
4580 int j;
b99bd4ef 4581
c19d1205
ZW
4582 /* First try and match exact strings, this is to guarantee
4583 that some formats will work even for cross assembly. */
b99bd4ef 4584
c19d1205
ZW
4585 for (i = 0; fp_const[i]; i++)
4586 {
4587 if (strncmp (*str, fp_const[i], strlen (fp_const[i])) == 0)
b99bd4ef 4588 {
c19d1205 4589 char *start = *str;
b99bd4ef 4590
c19d1205
ZW
4591 *str += strlen (fp_const[i]);
4592 if (is_end_of_line[(unsigned char) **str])
4593 return i + 8;
4594 *str = start;
4595 }
4596 }
b99bd4ef 4597
c19d1205
ZW
4598 /* Just because we didn't get a match doesn't mean that the constant
4599 isn't valid, just that it is in a format that we don't
4600 automatically recognize. Try parsing it with the standard
4601 expression routines. */
b99bd4ef 4602
c19d1205 4603 memset (words, 0, MAX_LITTLENUMS * sizeof (LITTLENUM_TYPE));
b99bd4ef 4604
c19d1205
ZW
4605 /* Look for a raw floating point number. */
4606 if ((save_in = atof_ieee (*str, 'x', words)) != NULL
4607 && is_end_of_line[(unsigned char) *save_in])
4608 {
4609 for (i = 0; i < NUM_FLOAT_VALS; i++)
4610 {
4611 for (j = 0; j < MAX_LITTLENUMS; j++)
b99bd4ef 4612 {
c19d1205
ZW
4613 if (words[j] != fp_values[i][j])
4614 break;
b99bd4ef
NC
4615 }
4616
c19d1205 4617 if (j == MAX_LITTLENUMS)
b99bd4ef 4618 {
c19d1205
ZW
4619 *str = save_in;
4620 return i + 8;
b99bd4ef
NC
4621 }
4622 }
4623 }
b99bd4ef 4624
c19d1205
ZW
4625 /* Try and parse a more complex expression, this will probably fail
4626 unless the code uses a floating point prefix (eg "0f"). */
4627 save_in = input_line_pointer;
4628 input_line_pointer = *str;
4629 if (expression (&exp) == absolute_section
4630 && exp.X_op == O_big
4631 && exp.X_add_number < 0)
4632 {
4633 /* FIXME: 5 = X_PRECISION, should be #define'd where we can use it.
4634 Ditto for 15. */
4635 if (gen_to_words (words, 5, (long) 15) == 0)
4636 {
4637 for (i = 0; i < NUM_FLOAT_VALS; i++)
4638 {
4639 for (j = 0; j < MAX_LITTLENUMS; j++)
4640 {
4641 if (words[j] != fp_values[i][j])
4642 break;
4643 }
b99bd4ef 4644
c19d1205
ZW
4645 if (j == MAX_LITTLENUMS)
4646 {
4647 *str = input_line_pointer;
4648 input_line_pointer = save_in;
4649 return i + 8;
4650 }
4651 }
4652 }
b99bd4ef
NC
4653 }
4654
c19d1205
ZW
4655 *str = input_line_pointer;
4656 input_line_pointer = save_in;
4657 inst.error = _("invalid FPA immediate expression");
4658 return FAIL;
b99bd4ef
NC
4659}
4660
136da414
JB
4661/* Returns 1 if a number has "quarter-precision" float format
4662 0baBbbbbbc defgh000 00000000 00000000. */
4663
4664static int
4665is_quarter_float (unsigned imm)
4666{
4667 int bs = (imm & 0x20000000) ? 0x3e000000 : 0x40000000;
4668 return (imm & 0x7ffff) == 0 && ((imm & 0x7e000000) ^ bs) == 0;
4669}
4670
4671/* Parse an 8-bit "quarter-precision" floating point number of the form:
4672 0baBbbbbbc defgh000 00000000 00000000.
c96612cc
JB
4673 The zero and minus-zero cases need special handling, since they can't be
4674 encoded in the "quarter-precision" float format, but can nonetheless be
4675 loaded as integer constants. */
136da414
JB
4676
4677static unsigned
4678parse_qfloat_immediate (char **ccp, int *immed)
4679{
4680 char *str = *ccp;
c96612cc 4681 char *fpnum;
136da414 4682 LITTLENUM_TYPE words[MAX_LITTLENUMS];
c96612cc 4683 int found_fpchar = 0;
5f4273c7 4684
136da414 4685 skip_past_char (&str, '#');
5f4273c7 4686
c96612cc
JB
4687 /* We must not accidentally parse an integer as a floating-point number. Make
4688 sure that the value we parse is not an integer by checking for special
4689 characters '.' or 'e'.
4690 FIXME: This is a horrible hack, but doing better is tricky because type
4691 information isn't in a very usable state at parse time. */
4692 fpnum = str;
4693 skip_whitespace (fpnum);
4694
4695 if (strncmp (fpnum, "0x", 2) == 0)
4696 return FAIL;
4697 else
4698 {
4699 for (; *fpnum != '\0' && *fpnum != ' ' && *fpnum != '\n'; fpnum++)
4700 if (*fpnum == '.' || *fpnum == 'e' || *fpnum == 'E')
4701 {
4702 found_fpchar = 1;
4703 break;
4704 }
4705
4706 if (!found_fpchar)
4707 return FAIL;
4708 }
5f4273c7 4709
136da414
JB
4710 if ((str = atof_ieee (str, 's', words)) != NULL)
4711 {
4712 unsigned fpword = 0;
4713 int i;
5f4273c7 4714
136da414
JB
4715 /* Our FP word must be 32 bits (single-precision FP). */
4716 for (i = 0; i < 32 / LITTLENUM_NUMBER_OF_BITS; i++)
4717 {
4718 fpword <<= LITTLENUM_NUMBER_OF_BITS;
4719 fpword |= words[i];
4720 }
5f4273c7 4721
c96612cc 4722 if (is_quarter_float (fpword) || (fpword & 0x7fffffff) == 0)
136da414
JB
4723 *immed = fpword;
4724 else
4725 return FAIL;
4726
4727 *ccp = str;
5f4273c7 4728
136da414
JB
4729 return SUCCESS;
4730 }
5f4273c7 4731
136da414
JB
4732 return FAIL;
4733}
4734
c19d1205
ZW
4735/* Shift operands. */
4736enum shift_kind
b99bd4ef 4737{
c19d1205
ZW
4738 SHIFT_LSL, SHIFT_LSR, SHIFT_ASR, SHIFT_ROR, SHIFT_RRX
4739};
b99bd4ef 4740
c19d1205
ZW
4741struct asm_shift_name
4742{
4743 const char *name;
4744 enum shift_kind kind;
4745};
b99bd4ef 4746
c19d1205
ZW
4747/* Third argument to parse_shift. */
4748enum parse_shift_mode
4749{
4750 NO_SHIFT_RESTRICT, /* Any kind of shift is accepted. */
4751 SHIFT_IMMEDIATE, /* Shift operand must be an immediate. */
4752 SHIFT_LSL_OR_ASR_IMMEDIATE, /* Shift must be LSL or ASR immediate. */
4753 SHIFT_ASR_IMMEDIATE, /* Shift must be ASR immediate. */
4754 SHIFT_LSL_IMMEDIATE, /* Shift must be LSL immediate. */
4755};
b99bd4ef 4756
c19d1205
ZW
4757/* Parse a <shift> specifier on an ARM data processing instruction.
4758 This has three forms:
b99bd4ef 4759
c19d1205
ZW
4760 (LSL|LSR|ASL|ASR|ROR) Rs
4761 (LSL|LSR|ASL|ASR|ROR) #imm
4762 RRX
b99bd4ef 4763
c19d1205
ZW
4764 Note that ASL is assimilated to LSL in the instruction encoding, and
4765 RRX to ROR #0 (which cannot be written as such). */
b99bd4ef 4766
c19d1205
ZW
4767static int
4768parse_shift (char **str, int i, enum parse_shift_mode mode)
b99bd4ef 4769{
c19d1205
ZW
4770 const struct asm_shift_name *shift_name;
4771 enum shift_kind shift;
4772 char *s = *str;
4773 char *p = s;
4774 int reg;
b99bd4ef 4775
c19d1205
ZW
4776 for (p = *str; ISALPHA (*p); p++)
4777 ;
b99bd4ef 4778
c19d1205 4779 if (p == *str)
b99bd4ef 4780 {
c19d1205
ZW
4781 inst.error = _("shift expression expected");
4782 return FAIL;
b99bd4ef
NC
4783 }
4784
21d799b5
NC
4785 shift_name = (const struct asm_shift_name *) hash_find_n (arm_shift_hsh, *str,
4786 p - *str);
c19d1205
ZW
4787
4788 if (shift_name == NULL)
b99bd4ef 4789 {
c19d1205
ZW
4790 inst.error = _("shift expression expected");
4791 return FAIL;
b99bd4ef
NC
4792 }
4793
c19d1205 4794 shift = shift_name->kind;
b99bd4ef 4795
c19d1205
ZW
4796 switch (mode)
4797 {
4798 case NO_SHIFT_RESTRICT:
4799 case SHIFT_IMMEDIATE: break;
b99bd4ef 4800
c19d1205
ZW
4801 case SHIFT_LSL_OR_ASR_IMMEDIATE:
4802 if (shift != SHIFT_LSL && shift != SHIFT_ASR)
4803 {
4804 inst.error = _("'LSL' or 'ASR' required");
4805 return FAIL;
4806 }
4807 break;
b99bd4ef 4808
c19d1205
ZW
4809 case SHIFT_LSL_IMMEDIATE:
4810 if (shift != SHIFT_LSL)
4811 {
4812 inst.error = _("'LSL' required");
4813 return FAIL;
4814 }
4815 break;
b99bd4ef 4816
c19d1205
ZW
4817 case SHIFT_ASR_IMMEDIATE:
4818 if (shift != SHIFT_ASR)
4819 {
4820 inst.error = _("'ASR' required");
4821 return FAIL;
4822 }
4823 break;
b99bd4ef 4824
c19d1205
ZW
4825 default: abort ();
4826 }
b99bd4ef 4827
c19d1205
ZW
4828 if (shift != SHIFT_RRX)
4829 {
4830 /* Whitespace can appear here if the next thing is a bare digit. */
4831 skip_whitespace (p);
b99bd4ef 4832
c19d1205 4833 if (mode == NO_SHIFT_RESTRICT
dcbf9037 4834 && (reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
c19d1205
ZW
4835 {
4836 inst.operands[i].imm = reg;
4837 inst.operands[i].immisreg = 1;
4838 }
4839 else if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4840 return FAIL;
4841 }
4842 inst.operands[i].shift_kind = shift;
4843 inst.operands[i].shifted = 1;
4844 *str = p;
4845 return SUCCESS;
b99bd4ef
NC
4846}
4847
c19d1205 4848/* Parse a <shifter_operand> for an ARM data processing instruction:
b99bd4ef 4849
c19d1205
ZW
4850 #<immediate>
4851 #<immediate>, <rotate>
4852 <Rm>
4853 <Rm>, <shift>
b99bd4ef 4854
c19d1205
ZW
4855 where <shift> is defined by parse_shift above, and <rotate> is a
4856 multiple of 2 between 0 and 30. Validation of immediate operands
55cf6793 4857 is deferred to md_apply_fix. */
b99bd4ef 4858
c19d1205
ZW
4859static int
4860parse_shifter_operand (char **str, int i)
4861{
4862 int value;
91d6fa6a 4863 expressionS exp;
b99bd4ef 4864
dcbf9037 4865 if ((value = arm_reg_parse (str, REG_TYPE_RN)) != FAIL)
c19d1205
ZW
4866 {
4867 inst.operands[i].reg = value;
4868 inst.operands[i].isreg = 1;
b99bd4ef 4869
c19d1205
ZW
4870 /* parse_shift will override this if appropriate */
4871 inst.reloc.exp.X_op = O_constant;
4872 inst.reloc.exp.X_add_number = 0;
b99bd4ef 4873
c19d1205
ZW
4874 if (skip_past_comma (str) == FAIL)
4875 return SUCCESS;
b99bd4ef 4876
c19d1205
ZW
4877 /* Shift operation on register. */
4878 return parse_shift (str, i, NO_SHIFT_RESTRICT);
b99bd4ef
NC
4879 }
4880
c19d1205
ZW
4881 if (my_get_expression (&inst.reloc.exp, str, GE_IMM_PREFIX))
4882 return FAIL;
b99bd4ef 4883
c19d1205 4884 if (skip_past_comma (str) == SUCCESS)
b99bd4ef 4885 {
c19d1205 4886 /* #x, y -- ie explicit rotation by Y. */
91d6fa6a 4887 if (my_get_expression (&exp, str, GE_NO_PREFIX))
c19d1205 4888 return FAIL;
b99bd4ef 4889
91d6fa6a 4890 if (exp.X_op != O_constant || inst.reloc.exp.X_op != O_constant)
c19d1205
ZW
4891 {
4892 inst.error = _("constant expression expected");
4893 return FAIL;
4894 }
b99bd4ef 4895
91d6fa6a 4896 value = exp.X_add_number;
c19d1205
ZW
4897 if (value < 0 || value > 30 || value % 2 != 0)
4898 {
4899 inst.error = _("invalid rotation");
4900 return FAIL;
4901 }
4902 if (inst.reloc.exp.X_add_number < 0 || inst.reloc.exp.X_add_number > 255)
4903 {
4904 inst.error = _("invalid constant");
4905 return FAIL;
4906 }
09d92015 4907
a415b1cd
JB
4908 /* Encode as specified. */
4909 inst.operands[i].imm = inst.reloc.exp.X_add_number | value << 7;
4910 return SUCCESS;
09d92015
MM
4911 }
4912
c19d1205
ZW
4913 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
4914 inst.reloc.pc_rel = 0;
4915 return SUCCESS;
09d92015
MM
4916}
4917
4962c51a
MS
4918/* Group relocation information. Each entry in the table contains the
4919 textual name of the relocation as may appear in assembler source
4920 and must end with a colon.
4921 Along with this textual name are the relocation codes to be used if
4922 the corresponding instruction is an ALU instruction (ADD or SUB only),
4923 an LDR, an LDRS, or an LDC. */
4924
4925struct group_reloc_table_entry
4926{
4927 const char *name;
4928 int alu_code;
4929 int ldr_code;
4930 int ldrs_code;
4931 int ldc_code;
4932};
4933
4934typedef enum
4935{
4936 /* Varieties of non-ALU group relocation. */
4937
4938 GROUP_LDR,
4939 GROUP_LDRS,
4940 GROUP_LDC
4941} group_reloc_type;
4942
4943static struct group_reloc_table_entry group_reloc_table[] =
4944 { /* Program counter relative: */
4945 { "pc_g0_nc",
4946 BFD_RELOC_ARM_ALU_PC_G0_NC, /* ALU */
4947 0, /* LDR */
4948 0, /* LDRS */
4949 0 }, /* LDC */
4950 { "pc_g0",
4951 BFD_RELOC_ARM_ALU_PC_G0, /* ALU */
4952 BFD_RELOC_ARM_LDR_PC_G0, /* LDR */
4953 BFD_RELOC_ARM_LDRS_PC_G0, /* LDRS */
4954 BFD_RELOC_ARM_LDC_PC_G0 }, /* LDC */
4955 { "pc_g1_nc",
4956 BFD_RELOC_ARM_ALU_PC_G1_NC, /* ALU */
4957 0, /* LDR */
4958 0, /* LDRS */
4959 0 }, /* LDC */
4960 { "pc_g1",
4961 BFD_RELOC_ARM_ALU_PC_G1, /* ALU */
4962 BFD_RELOC_ARM_LDR_PC_G1, /* LDR */
4963 BFD_RELOC_ARM_LDRS_PC_G1, /* LDRS */
4964 BFD_RELOC_ARM_LDC_PC_G1 }, /* LDC */
4965 { "pc_g2",
4966 BFD_RELOC_ARM_ALU_PC_G2, /* ALU */
4967 BFD_RELOC_ARM_LDR_PC_G2, /* LDR */
4968 BFD_RELOC_ARM_LDRS_PC_G2, /* LDRS */
4969 BFD_RELOC_ARM_LDC_PC_G2 }, /* LDC */
4970 /* Section base relative */
4971 { "sb_g0_nc",
4972 BFD_RELOC_ARM_ALU_SB_G0_NC, /* ALU */
4973 0, /* LDR */
4974 0, /* LDRS */
4975 0 }, /* LDC */
4976 { "sb_g0",
4977 BFD_RELOC_ARM_ALU_SB_G0, /* ALU */
4978 BFD_RELOC_ARM_LDR_SB_G0, /* LDR */
4979 BFD_RELOC_ARM_LDRS_SB_G0, /* LDRS */
4980 BFD_RELOC_ARM_LDC_SB_G0 }, /* LDC */
4981 { "sb_g1_nc",
4982 BFD_RELOC_ARM_ALU_SB_G1_NC, /* ALU */
4983 0, /* LDR */
4984 0, /* LDRS */
4985 0 }, /* LDC */
4986 { "sb_g1",
4987 BFD_RELOC_ARM_ALU_SB_G1, /* ALU */
4988 BFD_RELOC_ARM_LDR_SB_G1, /* LDR */
4989 BFD_RELOC_ARM_LDRS_SB_G1, /* LDRS */
4990 BFD_RELOC_ARM_LDC_SB_G1 }, /* LDC */
4991 { "sb_g2",
4992 BFD_RELOC_ARM_ALU_SB_G2, /* ALU */
4993 BFD_RELOC_ARM_LDR_SB_G2, /* LDR */
4994 BFD_RELOC_ARM_LDRS_SB_G2, /* LDRS */
4995 BFD_RELOC_ARM_LDC_SB_G2 } }; /* LDC */
4996
4997/* Given the address of a pointer pointing to the textual name of a group
4998 relocation as may appear in assembler source, attempt to find its details
4999 in group_reloc_table. The pointer will be updated to the character after
5000 the trailing colon. On failure, FAIL will be returned; SUCCESS
5001 otherwise. On success, *entry will be updated to point at the relevant
5002 group_reloc_table entry. */
5003
5004static int
5005find_group_reloc_table_entry (char **str, struct group_reloc_table_entry **out)
5006{
5007 unsigned int i;
5008 for (i = 0; i < ARRAY_SIZE (group_reloc_table); i++)
5009 {
5010 int length = strlen (group_reloc_table[i].name);
5011
5f4273c7
NC
5012 if (strncasecmp (group_reloc_table[i].name, *str, length) == 0
5013 && (*str)[length] == ':')
4962c51a
MS
5014 {
5015 *out = &group_reloc_table[i];
5016 *str += (length + 1);
5017 return SUCCESS;
5018 }
5019 }
5020
5021 return FAIL;
5022}
5023
5024/* Parse a <shifter_operand> for an ARM data processing instruction
5025 (as for parse_shifter_operand) where group relocations are allowed:
5026
5027 #<immediate>
5028 #<immediate>, <rotate>
5029 #:<group_reloc>:<expression>
5030 <Rm>
5031 <Rm>, <shift>
5032
5033 where <group_reloc> is one of the strings defined in group_reloc_table.
5034 The hashes are optional.
5035
5036 Everything else is as for parse_shifter_operand. */
5037
5038static parse_operand_result
5039parse_shifter_operand_group_reloc (char **str, int i)
5040{
5041 /* Determine if we have the sequence of characters #: or just :
5042 coming next. If we do, then we check for a group relocation.
5043 If we don't, punt the whole lot to parse_shifter_operand. */
5044
5045 if (((*str)[0] == '#' && (*str)[1] == ':')
5046 || (*str)[0] == ':')
5047 {
5048 struct group_reloc_table_entry *entry;
5049
5050 if ((*str)[0] == '#')
5051 (*str) += 2;
5052 else
5053 (*str)++;
5054
5055 /* Try to parse a group relocation. Anything else is an error. */
5056 if (find_group_reloc_table_entry (str, &entry) == FAIL)
5057 {
5058 inst.error = _("unknown group relocation");
5059 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5060 }
5061
5062 /* We now have the group relocation table entry corresponding to
5063 the name in the assembler source. Next, we parse the expression. */
5064 if (my_get_expression (&inst.reloc.exp, str, GE_NO_PREFIX))
5065 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5066
5067 /* Record the relocation type (always the ALU variant here). */
21d799b5 5068 inst.reloc.type = (bfd_reloc_code_real_type) entry->alu_code;
9c2799c2 5069 gas_assert (inst.reloc.type != 0);
4962c51a
MS
5070
5071 return PARSE_OPERAND_SUCCESS;
5072 }
5073 else
5074 return parse_shifter_operand (str, i) == SUCCESS
5075 ? PARSE_OPERAND_SUCCESS : PARSE_OPERAND_FAIL;
5076
5077 /* Never reached. */
5078}
5079
8e560766
MGD
5080/* Parse a Neon alignment expression. Information is written to
5081 inst.operands[i]. We assume the initial ':' has been skipped.
fa94de6b 5082
8e560766
MGD
5083 align .imm = align << 8, .immisalign=1, .preind=0 */
5084static parse_operand_result
5085parse_neon_alignment (char **str, int i)
5086{
5087 char *p = *str;
5088 expressionS exp;
5089
5090 my_get_expression (&exp, &p, GE_NO_PREFIX);
5091
5092 if (exp.X_op != O_constant)
5093 {
5094 inst.error = _("alignment must be constant");
5095 return PARSE_OPERAND_FAIL;
5096 }
5097
5098 inst.operands[i].imm = exp.X_add_number << 8;
5099 inst.operands[i].immisalign = 1;
5100 /* Alignments are not pre-indexes. */
5101 inst.operands[i].preind = 0;
5102
5103 *str = p;
5104 return PARSE_OPERAND_SUCCESS;
5105}
5106
c19d1205
ZW
5107/* Parse all forms of an ARM address expression. Information is written
5108 to inst.operands[i] and/or inst.reloc.
09d92015 5109
c19d1205 5110 Preindexed addressing (.preind=1):
09d92015 5111
c19d1205
ZW
5112 [Rn, #offset] .reg=Rn .reloc.exp=offset
5113 [Rn, +/-Rm] .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5114 [Rn, +/-Rm, shift] .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5115 .shift_kind=shift .reloc.exp=shift_imm
09d92015 5116
c19d1205 5117 These three may have a trailing ! which causes .writeback to be set also.
09d92015 5118
c19d1205 5119 Postindexed addressing (.postind=1, .writeback=1):
09d92015 5120
c19d1205
ZW
5121 [Rn], #offset .reg=Rn .reloc.exp=offset
5122 [Rn], +/-Rm .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5123 [Rn], +/-Rm, shift .reg=Rn .imm=Rm .immisreg=1 .negative=0/1
5124 .shift_kind=shift .reloc.exp=shift_imm
09d92015 5125
c19d1205 5126 Unindexed addressing (.preind=0, .postind=0):
09d92015 5127
c19d1205 5128 [Rn], {option} .reg=Rn .imm=option .immisreg=0
09d92015 5129
c19d1205 5130 Other:
09d92015 5131
c19d1205
ZW
5132 [Rn]{!} shorthand for [Rn,#0]{!}
5133 =immediate .isreg=0 .reloc.exp=immediate
5134 label .reg=PC .reloc.pc_rel=1 .reloc.exp=label
09d92015 5135
c19d1205
ZW
5136 It is the caller's responsibility to check for addressing modes not
5137 supported by the instruction, and to set inst.reloc.type. */
5138
4962c51a
MS
5139static parse_operand_result
5140parse_address_main (char **str, int i, int group_relocations,
5141 group_reloc_type group_type)
09d92015 5142{
c19d1205
ZW
5143 char *p = *str;
5144 int reg;
09d92015 5145
c19d1205 5146 if (skip_past_char (&p, '[') == FAIL)
09d92015 5147 {
c19d1205
ZW
5148 if (skip_past_char (&p, '=') == FAIL)
5149 {
974da60d 5150 /* Bare address - translate to PC-relative offset. */
c19d1205
ZW
5151 inst.reloc.pc_rel = 1;
5152 inst.operands[i].reg = REG_PC;
5153 inst.operands[i].isreg = 1;
5154 inst.operands[i].preind = 1;
5155 }
974da60d 5156 /* Otherwise a load-constant pseudo op, no special treatment needed here. */
09d92015 5157
c19d1205 5158 if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
4962c51a 5159 return PARSE_OPERAND_FAIL;
09d92015 5160
c19d1205 5161 *str = p;
4962c51a 5162 return PARSE_OPERAND_SUCCESS;
09d92015
MM
5163 }
5164
dcbf9037 5165 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
09d92015 5166 {
c19d1205 5167 inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
4962c51a 5168 return PARSE_OPERAND_FAIL;
09d92015 5169 }
c19d1205
ZW
5170 inst.operands[i].reg = reg;
5171 inst.operands[i].isreg = 1;
09d92015 5172
c19d1205 5173 if (skip_past_comma (&p) == SUCCESS)
09d92015 5174 {
c19d1205 5175 inst.operands[i].preind = 1;
09d92015 5176
c19d1205
ZW
5177 if (*p == '+') p++;
5178 else if (*p == '-') p++, inst.operands[i].negative = 1;
5179
dcbf9037 5180 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
09d92015 5181 {
c19d1205
ZW
5182 inst.operands[i].imm = reg;
5183 inst.operands[i].immisreg = 1;
5184
5185 if (skip_past_comma (&p) == SUCCESS)
5186 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
4962c51a 5187 return PARSE_OPERAND_FAIL;
c19d1205 5188 }
5287ad62 5189 else if (skip_past_char (&p, ':') == SUCCESS)
8e560766
MGD
5190 {
5191 /* FIXME: '@' should be used here, but it's filtered out by generic
5192 code before we get to see it here. This may be subject to
5193 change. */
5194 parse_operand_result result = parse_neon_alignment (&p, i);
fa94de6b 5195
8e560766
MGD
5196 if (result != PARSE_OPERAND_SUCCESS)
5197 return result;
5198 }
c19d1205
ZW
5199 else
5200 {
5201 if (inst.operands[i].negative)
5202 {
5203 inst.operands[i].negative = 0;
5204 p--;
5205 }
4962c51a 5206
5f4273c7
NC
5207 if (group_relocations
5208 && ((*p == '#' && *(p + 1) == ':') || *p == ':'))
4962c51a
MS
5209 {
5210 struct group_reloc_table_entry *entry;
5211
5212 /* Skip over the #: or : sequence. */
5213 if (*p == '#')
5214 p += 2;
5215 else
5216 p++;
5217
5218 /* Try to parse a group relocation. Anything else is an
5219 error. */
5220 if (find_group_reloc_table_entry (&p, &entry) == FAIL)
5221 {
5222 inst.error = _("unknown group relocation");
5223 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5224 }
5225
5226 /* We now have the group relocation table entry corresponding to
5227 the name in the assembler source. Next, we parse the
5228 expression. */
5229 if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5230 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5231
5232 /* Record the relocation type. */
5233 switch (group_type)
5234 {
5235 case GROUP_LDR:
21d799b5 5236 inst.reloc.type = (bfd_reloc_code_real_type) entry->ldr_code;
4962c51a
MS
5237 break;
5238
5239 case GROUP_LDRS:
21d799b5 5240 inst.reloc.type = (bfd_reloc_code_real_type) entry->ldrs_code;
4962c51a
MS
5241 break;
5242
5243 case GROUP_LDC:
21d799b5 5244 inst.reloc.type = (bfd_reloc_code_real_type) entry->ldc_code;
4962c51a
MS
5245 break;
5246
5247 default:
9c2799c2 5248 gas_assert (0);
4962c51a
MS
5249 }
5250
5251 if (inst.reloc.type == 0)
5252 {
5253 inst.error = _("this group relocation is not allowed on this instruction");
5254 return PARSE_OPERAND_FAIL_NO_BACKTRACK;
5255 }
5256 }
5257 else
26d97720
NS
5258 {
5259 char *q = p;
5260 if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
5261 return PARSE_OPERAND_FAIL;
5262 /* If the offset is 0, find out if it's a +0 or -0. */
5263 if (inst.reloc.exp.X_op == O_constant
5264 && inst.reloc.exp.X_add_number == 0)
5265 {
5266 skip_whitespace (q);
5267 if (*q == '#')
5268 {
5269 q++;
5270 skip_whitespace (q);
5271 }
5272 if (*q == '-')
5273 inst.operands[i].negative = 1;
5274 }
5275 }
09d92015
MM
5276 }
5277 }
8e560766
MGD
5278 else if (skip_past_char (&p, ':') == SUCCESS)
5279 {
5280 /* FIXME: '@' should be used here, but it's filtered out by generic code
5281 before we get to see it here. This may be subject to change. */
5282 parse_operand_result result = parse_neon_alignment (&p, i);
fa94de6b 5283
8e560766
MGD
5284 if (result != PARSE_OPERAND_SUCCESS)
5285 return result;
5286 }
09d92015 5287
c19d1205 5288 if (skip_past_char (&p, ']') == FAIL)
09d92015 5289 {
c19d1205 5290 inst.error = _("']' expected");
4962c51a 5291 return PARSE_OPERAND_FAIL;
09d92015
MM
5292 }
5293
c19d1205
ZW
5294 if (skip_past_char (&p, '!') == SUCCESS)
5295 inst.operands[i].writeback = 1;
09d92015 5296
c19d1205 5297 else if (skip_past_comma (&p) == SUCCESS)
09d92015 5298 {
c19d1205
ZW
5299 if (skip_past_char (&p, '{') == SUCCESS)
5300 {
5301 /* [Rn], {expr} - unindexed, with option */
5302 if (parse_immediate (&p, &inst.operands[i].imm,
ca3f61f7 5303 0, 255, TRUE) == FAIL)
4962c51a 5304 return PARSE_OPERAND_FAIL;
09d92015 5305
c19d1205
ZW
5306 if (skip_past_char (&p, '}') == FAIL)
5307 {
5308 inst.error = _("'}' expected at end of 'option' field");
4962c51a 5309 return PARSE_OPERAND_FAIL;
c19d1205
ZW
5310 }
5311 if (inst.operands[i].preind)
5312 {
5313 inst.error = _("cannot combine index with option");
4962c51a 5314 return PARSE_OPERAND_FAIL;
c19d1205
ZW
5315 }
5316 *str = p;
4962c51a 5317 return PARSE_OPERAND_SUCCESS;
09d92015 5318 }
c19d1205
ZW
5319 else
5320 {
5321 inst.operands[i].postind = 1;
5322 inst.operands[i].writeback = 1;
09d92015 5323
c19d1205
ZW
5324 if (inst.operands[i].preind)
5325 {
5326 inst.error = _("cannot combine pre- and post-indexing");
4962c51a 5327 return PARSE_OPERAND_FAIL;
c19d1205 5328 }
09d92015 5329
c19d1205
ZW
5330 if (*p == '+') p++;
5331 else if (*p == '-') p++, inst.operands[i].negative = 1;
a737bd4d 5332
dcbf9037 5333 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) != FAIL)
c19d1205 5334 {
5287ad62
JB
5335 /* We might be using the immediate for alignment already. If we
5336 are, OR the register number into the low-order bits. */
5337 if (inst.operands[i].immisalign)
5338 inst.operands[i].imm |= reg;
5339 else
5340 inst.operands[i].imm = reg;
c19d1205 5341 inst.operands[i].immisreg = 1;
a737bd4d 5342
c19d1205
ZW
5343 if (skip_past_comma (&p) == SUCCESS)
5344 if (parse_shift (&p, i, SHIFT_IMMEDIATE) == FAIL)
4962c51a 5345 return PARSE_OPERAND_FAIL;
c19d1205
ZW
5346 }
5347 else
5348 {
26d97720 5349 char *q = p;
c19d1205
ZW
5350 if (inst.operands[i].negative)
5351 {
5352 inst.operands[i].negative = 0;
5353 p--;
5354 }
5355 if (my_get_expression (&inst.reloc.exp, &p, GE_IMM_PREFIX))
4962c51a 5356 return PARSE_OPERAND_FAIL;
26d97720
NS
5357 /* If the offset is 0, find out if it's a +0 or -0. */
5358 if (inst.reloc.exp.X_op == O_constant
5359 && inst.reloc.exp.X_add_number == 0)
5360 {
5361 skip_whitespace (q);
5362 if (*q == '#')
5363 {
5364 q++;
5365 skip_whitespace (q);
5366 }
5367 if (*q == '-')
5368 inst.operands[i].negative = 1;
5369 }
c19d1205
ZW
5370 }
5371 }
a737bd4d
NC
5372 }
5373
c19d1205
ZW
5374 /* If at this point neither .preind nor .postind is set, we have a
5375 bare [Rn]{!}, which is shorthand for [Rn,#0]{!}. */
5376 if (inst.operands[i].preind == 0 && inst.operands[i].postind == 0)
5377 {
5378 inst.operands[i].preind = 1;
5379 inst.reloc.exp.X_op = O_constant;
5380 inst.reloc.exp.X_add_number = 0;
5381 }
5382 *str = p;
4962c51a
MS
5383 return PARSE_OPERAND_SUCCESS;
5384}
5385
5386static int
5387parse_address (char **str, int i)
5388{
21d799b5 5389 return parse_address_main (str, i, 0, GROUP_LDR) == PARSE_OPERAND_SUCCESS
4962c51a
MS
5390 ? SUCCESS : FAIL;
5391}
5392
5393static parse_operand_result
5394parse_address_group_reloc (char **str, int i, group_reloc_type type)
5395{
5396 return parse_address_main (str, i, 1, type);
a737bd4d
NC
5397}
5398
b6895b4f
PB
5399/* Parse an operand for a MOVW or MOVT instruction. */
5400static int
5401parse_half (char **str)
5402{
5403 char * p;
5f4273c7 5404
b6895b4f
PB
5405 p = *str;
5406 skip_past_char (&p, '#');
5f4273c7 5407 if (strncasecmp (p, ":lower16:", 9) == 0)
b6895b4f
PB
5408 inst.reloc.type = BFD_RELOC_ARM_MOVW;
5409 else if (strncasecmp (p, ":upper16:", 9) == 0)
5410 inst.reloc.type = BFD_RELOC_ARM_MOVT;
5411
5412 if (inst.reloc.type != BFD_RELOC_UNUSED)
5413 {
5414 p += 9;
5f4273c7 5415 skip_whitespace (p);
b6895b4f
PB
5416 }
5417
5418 if (my_get_expression (&inst.reloc.exp, &p, GE_NO_PREFIX))
5419 return FAIL;
5420
5421 if (inst.reloc.type == BFD_RELOC_UNUSED)
5422 {
5423 if (inst.reloc.exp.X_op != O_constant)
5424 {
5425 inst.error = _("constant expression expected");
5426 return FAIL;
5427 }
5428 if (inst.reloc.exp.X_add_number < 0
5429 || inst.reloc.exp.X_add_number > 0xffff)
5430 {
5431 inst.error = _("immediate value out of range");
5432 return FAIL;
5433 }
5434 }
5435 *str = p;
5436 return SUCCESS;
5437}
5438
c19d1205 5439/* Miscellaneous. */
a737bd4d 5440
c19d1205
ZW
5441/* Parse a PSR flag operand. The value returned is FAIL on syntax error,
5442 or a bitmask suitable to be or-ed into the ARM msr instruction. */
5443static int
d2cd1205 5444parse_psr (char **str, bfd_boolean lhs)
09d92015 5445{
c19d1205
ZW
5446 char *p;
5447 unsigned long psr_field;
62b3e311
PB
5448 const struct asm_psr *psr;
5449 char *start;
d2cd1205 5450 bfd_boolean is_apsr = FALSE;
ac7f631b 5451 bfd_boolean m_profile = ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m);
09d92015 5452
a4482bb6
NC
5453 /* PR gas/12698: If the user has specified -march=all then m_profile will
5454 be TRUE, but we want to ignore it in this case as we are building for any
5455 CPU type, including non-m variants. */
5456 if (selected_cpu.core == arm_arch_any.core)
5457 m_profile = FALSE;
5458
c19d1205
ZW
5459 /* CPSR's and SPSR's can now be lowercase. This is just a convenience
5460 feature for ease of use and backwards compatibility. */
5461 p = *str;
62b3e311 5462 if (strncasecmp (p, "SPSR", 4) == 0)
d2cd1205
JB
5463 {
5464 if (m_profile)
5465 goto unsupported_psr;
fa94de6b 5466
d2cd1205
JB
5467 psr_field = SPSR_BIT;
5468 }
5469 else if (strncasecmp (p, "CPSR", 4) == 0)
5470 {
5471 if (m_profile)
5472 goto unsupported_psr;
5473
5474 psr_field = 0;
5475 }
5476 else if (strncasecmp (p, "APSR", 4) == 0)
5477 {
5478 /* APSR[_<bits>] can be used as a synonym for CPSR[_<flags>] on ARMv7-A
5479 and ARMv7-R architecture CPUs. */
5480 is_apsr = TRUE;
5481 psr_field = 0;
5482 }
5483 else if (m_profile)
62b3e311
PB
5484 {
5485 start = p;
5486 do
5487 p++;
5488 while (ISALNUM (*p) || *p == '_');
5489
d2cd1205
JB
5490 if (strncasecmp (start, "iapsr", 5) == 0
5491 || strncasecmp (start, "eapsr", 5) == 0
5492 || strncasecmp (start, "xpsr", 4) == 0
5493 || strncasecmp (start, "psr", 3) == 0)
5494 p = start + strcspn (start, "rR") + 1;
5495
21d799b5
NC
5496 psr = (const struct asm_psr *) hash_find_n (arm_v7m_psr_hsh, start,
5497 p - start);
d2cd1205 5498
62b3e311
PB
5499 if (!psr)
5500 return FAIL;
09d92015 5501
d2cd1205
JB
5502 /* If APSR is being written, a bitfield may be specified. Note that
5503 APSR itself is handled above. */
5504 if (psr->field <= 3)
5505 {
5506 psr_field = psr->field;
5507 is_apsr = TRUE;
5508 goto check_suffix;
5509 }
5510
62b3e311 5511 *str = p;
d2cd1205
JB
5512 /* M-profile MSR instructions have the mask field set to "10", except
5513 *PSR variants which modify APSR, which may use a different mask (and
5514 have been handled already). Do that by setting the PSR_f field
5515 here. */
5516 return psr->field | (lhs ? PSR_f : 0);
62b3e311 5517 }
d2cd1205
JB
5518 else
5519 goto unsupported_psr;
09d92015 5520
62b3e311 5521 p += 4;
d2cd1205 5522check_suffix:
c19d1205
ZW
5523 if (*p == '_')
5524 {
5525 /* A suffix follows. */
c19d1205
ZW
5526 p++;
5527 start = p;
a737bd4d 5528
c19d1205
ZW
5529 do
5530 p++;
5531 while (ISALNUM (*p) || *p == '_');
a737bd4d 5532
d2cd1205
JB
5533 if (is_apsr)
5534 {
5535 /* APSR uses a notation for bits, rather than fields. */
5536 unsigned int nzcvq_bits = 0;
5537 unsigned int g_bit = 0;
5538 char *bit;
fa94de6b 5539
d2cd1205
JB
5540 for (bit = start; bit != p; bit++)
5541 {
5542 switch (TOLOWER (*bit))
5543 {
5544 case 'n':
5545 nzcvq_bits |= (nzcvq_bits & 0x01) ? 0x20 : 0x01;
5546 break;
5547
5548 case 'z':
5549 nzcvq_bits |= (nzcvq_bits & 0x02) ? 0x20 : 0x02;
5550 break;
5551
5552 case 'c':
5553 nzcvq_bits |= (nzcvq_bits & 0x04) ? 0x20 : 0x04;
5554 break;
5555
5556 case 'v':
5557 nzcvq_bits |= (nzcvq_bits & 0x08) ? 0x20 : 0x08;
5558 break;
fa94de6b 5559
d2cd1205
JB
5560 case 'q':
5561 nzcvq_bits |= (nzcvq_bits & 0x10) ? 0x20 : 0x10;
5562 break;
fa94de6b 5563
d2cd1205
JB
5564 case 'g':
5565 g_bit |= (g_bit & 0x1) ? 0x2 : 0x1;
5566 break;
fa94de6b 5567
d2cd1205
JB
5568 default:
5569 inst.error = _("unexpected bit specified after APSR");
5570 return FAIL;
5571 }
5572 }
fa94de6b 5573
d2cd1205
JB
5574 if (nzcvq_bits == 0x1f)
5575 psr_field |= PSR_f;
fa94de6b 5576
d2cd1205
JB
5577 if (g_bit == 0x1)
5578 {
5579 if (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp))
5580 {
5581 inst.error = _("selected processor does not "
5582 "support DSP extension");
5583 return FAIL;
5584 }
5585
5586 psr_field |= PSR_s;
5587 }
fa94de6b 5588
d2cd1205
JB
5589 if ((nzcvq_bits & 0x20) != 0
5590 || (nzcvq_bits != 0x1f && nzcvq_bits != 0)
5591 || (g_bit & 0x2) != 0)
5592 {
5593 inst.error = _("bad bitmask specified after APSR");
5594 return FAIL;
5595 }
5596 }
5597 else
5598 {
5599 psr = (const struct asm_psr *) hash_find_n (arm_psr_hsh, start,
5600 p - start);
5601 if (!psr)
5602 goto error;
a737bd4d 5603
d2cd1205
JB
5604 psr_field |= psr->field;
5605 }
a737bd4d 5606 }
c19d1205 5607 else
a737bd4d 5608 {
c19d1205
ZW
5609 if (ISALNUM (*p))
5610 goto error; /* Garbage after "[CS]PSR". */
5611
d2cd1205
JB
5612 /* Unadorned APSR is equivalent to APSR_nzcvq/CPSR_f (for writes). This
5613 is deprecated, but allow it anyway. */
5614 if (is_apsr && lhs)
5615 {
5616 psr_field |= PSR_f;
5617 as_tsktsk (_("writing to APSR without specifying a bitmask is "
5618 "deprecated"));
5619 }
5620 else if (!m_profile)
5621 /* These bits are never right for M-profile devices: don't set them
5622 (only code paths which read/write APSR reach here). */
5623 psr_field |= (PSR_c | PSR_f);
a737bd4d 5624 }
c19d1205
ZW
5625 *str = p;
5626 return psr_field;
a737bd4d 5627
d2cd1205
JB
5628 unsupported_psr:
5629 inst.error = _("selected processor does not support requested special "
5630 "purpose register");
5631 return FAIL;
5632
c19d1205
ZW
5633 error:
5634 inst.error = _("flag for {c}psr instruction expected");
5635 return FAIL;
a737bd4d
NC
5636}
5637
c19d1205
ZW
5638/* Parse the flags argument to CPSI[ED]. Returns FAIL on error, or a
5639 value suitable for splatting into the AIF field of the instruction. */
a737bd4d 5640
c19d1205
ZW
5641static int
5642parse_cps_flags (char **str)
a737bd4d 5643{
c19d1205
ZW
5644 int val = 0;
5645 int saw_a_flag = 0;
5646 char *s = *str;
a737bd4d 5647
c19d1205
ZW
5648 for (;;)
5649 switch (*s++)
5650 {
5651 case '\0': case ',':
5652 goto done;
a737bd4d 5653
c19d1205
ZW
5654 case 'a': case 'A': saw_a_flag = 1; val |= 0x4; break;
5655 case 'i': case 'I': saw_a_flag = 1; val |= 0x2; break;
5656 case 'f': case 'F': saw_a_flag = 1; val |= 0x1; break;
a737bd4d 5657
c19d1205
ZW
5658 default:
5659 inst.error = _("unrecognized CPS flag");
5660 return FAIL;
5661 }
a737bd4d 5662
c19d1205
ZW
5663 done:
5664 if (saw_a_flag == 0)
a737bd4d 5665 {
c19d1205
ZW
5666 inst.error = _("missing CPS flags");
5667 return FAIL;
a737bd4d 5668 }
a737bd4d 5669
c19d1205
ZW
5670 *str = s - 1;
5671 return val;
a737bd4d
NC
5672}
5673
c19d1205
ZW
5674/* Parse an endian specifier ("BE" or "LE", case insensitive);
5675 returns 0 for big-endian, 1 for little-endian, FAIL for an error. */
a737bd4d
NC
5676
5677static int
c19d1205 5678parse_endian_specifier (char **str)
a737bd4d 5679{
c19d1205
ZW
5680 int little_endian;
5681 char *s = *str;
a737bd4d 5682
c19d1205
ZW
5683 if (strncasecmp (s, "BE", 2))
5684 little_endian = 0;
5685 else if (strncasecmp (s, "LE", 2))
5686 little_endian = 1;
5687 else
a737bd4d 5688 {
c19d1205 5689 inst.error = _("valid endian specifiers are be or le");
a737bd4d
NC
5690 return FAIL;
5691 }
5692
c19d1205 5693 if (ISALNUM (s[2]) || s[2] == '_')
a737bd4d 5694 {
c19d1205 5695 inst.error = _("valid endian specifiers are be or le");
a737bd4d
NC
5696 return FAIL;
5697 }
5698
c19d1205
ZW
5699 *str = s + 2;
5700 return little_endian;
5701}
a737bd4d 5702
c19d1205
ZW
5703/* Parse a rotation specifier: ROR #0, #8, #16, #24. *val receives a
5704 value suitable for poking into the rotate field of an sxt or sxta
5705 instruction, or FAIL on error. */
5706
5707static int
5708parse_ror (char **str)
5709{
5710 int rot;
5711 char *s = *str;
5712
5713 if (strncasecmp (s, "ROR", 3) == 0)
5714 s += 3;
5715 else
a737bd4d 5716 {
c19d1205 5717 inst.error = _("missing rotation field after comma");
a737bd4d
NC
5718 return FAIL;
5719 }
c19d1205
ZW
5720
5721 if (parse_immediate (&s, &rot, 0, 24, FALSE) == FAIL)
5722 return FAIL;
5723
5724 switch (rot)
a737bd4d 5725 {
c19d1205
ZW
5726 case 0: *str = s; return 0x0;
5727 case 8: *str = s; return 0x1;
5728 case 16: *str = s; return 0x2;
5729 case 24: *str = s; return 0x3;
5730
5731 default:
5732 inst.error = _("rotation can only be 0, 8, 16, or 24");
a737bd4d
NC
5733 return FAIL;
5734 }
c19d1205 5735}
a737bd4d 5736
c19d1205
ZW
5737/* Parse a conditional code (from conds[] below). The value returned is in the
5738 range 0 .. 14, or FAIL. */
5739static int
5740parse_cond (char **str)
5741{
c462b453 5742 char *q;
c19d1205 5743 const struct asm_cond *c;
c462b453
PB
5744 int n;
5745 /* Condition codes are always 2 characters, so matching up to
5746 3 characters is sufficient. */
5747 char cond[3];
a737bd4d 5748
c462b453
PB
5749 q = *str;
5750 n = 0;
5751 while (ISALPHA (*q) && n < 3)
5752 {
e07e6e58 5753 cond[n] = TOLOWER (*q);
c462b453
PB
5754 q++;
5755 n++;
5756 }
a737bd4d 5757
21d799b5 5758 c = (const struct asm_cond *) hash_find_n (arm_cond_hsh, cond, n);
c19d1205 5759 if (!c)
a737bd4d 5760 {
c19d1205 5761 inst.error = _("condition required");
a737bd4d
NC
5762 return FAIL;
5763 }
5764
c19d1205
ZW
5765 *str = q;
5766 return c->value;
5767}
5768
62b3e311
PB
5769/* Parse an option for a barrier instruction. Returns the encoding for the
5770 option, or FAIL. */
5771static int
5772parse_barrier (char **str)
5773{
5774 char *p, *q;
5775 const struct asm_barrier_opt *o;
5776
5777 p = q = *str;
5778 while (ISALPHA (*q))
5779 q++;
5780
21d799b5
NC
5781 o = (const struct asm_barrier_opt *) hash_find_n (arm_barrier_opt_hsh, p,
5782 q - p);
62b3e311
PB
5783 if (!o)
5784 return FAIL;
5785
5786 *str = q;
5787 return o->value;
5788}
5789
92e90b6e
PB
5790/* Parse the operands of a table branch instruction. Similar to a memory
5791 operand. */
5792static int
5793parse_tb (char **str)
5794{
5795 char * p = *str;
5796 int reg;
5797
5798 if (skip_past_char (&p, '[') == FAIL)
ab1eb5fe
PB
5799 {
5800 inst.error = _("'[' expected");
5801 return FAIL;
5802 }
92e90b6e 5803
dcbf9037 5804 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
92e90b6e
PB
5805 {
5806 inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5807 return FAIL;
5808 }
5809 inst.operands[0].reg = reg;
5810
5811 if (skip_past_comma (&p) == FAIL)
ab1eb5fe
PB
5812 {
5813 inst.error = _("',' expected");
5814 return FAIL;
5815 }
5f4273c7 5816
dcbf9037 5817 if ((reg = arm_reg_parse (&p, REG_TYPE_RN)) == FAIL)
92e90b6e
PB
5818 {
5819 inst.error = _(reg_expected_msgs[REG_TYPE_RN]);
5820 return FAIL;
5821 }
5822 inst.operands[0].imm = reg;
5823
5824 if (skip_past_comma (&p) == SUCCESS)
5825 {
5826 if (parse_shift (&p, 0, SHIFT_LSL_IMMEDIATE) == FAIL)
5827 return FAIL;
5828 if (inst.reloc.exp.X_add_number != 1)
5829 {
5830 inst.error = _("invalid shift");
5831 return FAIL;
5832 }
5833 inst.operands[0].shifted = 1;
5834 }
5835
5836 if (skip_past_char (&p, ']') == FAIL)
5837 {
5838 inst.error = _("']' expected");
5839 return FAIL;
5840 }
5841 *str = p;
5842 return SUCCESS;
5843}
5844
5287ad62
JB
5845/* Parse the operands of a Neon VMOV instruction. See do_neon_mov for more
5846 information on the types the operands can take and how they are encoded.
037e8744
JB
5847 Up to four operands may be read; this function handles setting the
5848 ".present" field for each read operand itself.
5287ad62
JB
5849 Updates STR and WHICH_OPERAND if parsing is successful and returns SUCCESS,
5850 else returns FAIL. */
5851
5852static int
5853parse_neon_mov (char **str, int *which_operand)
5854{
5855 int i = *which_operand, val;
5856 enum arm_reg_type rtype;
5857 char *ptr = *str;
dcbf9037 5858 struct neon_type_el optype;
5f4273c7 5859
dcbf9037 5860 if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5287ad62
JB
5861 {
5862 /* Case 4: VMOV<c><q>.<size> <Dn[x]>, <Rd>. */
5863 inst.operands[i].reg = val;
5864 inst.operands[i].isscalar = 1;
dcbf9037 5865 inst.operands[i].vectype = optype;
5287ad62
JB
5866 inst.operands[i++].present = 1;
5867
5868 if (skip_past_comma (&ptr) == FAIL)
5869 goto wanted_comma;
5f4273c7 5870
dcbf9037 5871 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5287ad62 5872 goto wanted_arm;
5f4273c7 5873
5287ad62
JB
5874 inst.operands[i].reg = val;
5875 inst.operands[i].isreg = 1;
5876 inst.operands[i].present = 1;
5877 }
037e8744 5878 else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype, &optype))
dcbf9037 5879 != FAIL)
5287ad62
JB
5880 {
5881 /* Cases 0, 1, 2, 3, 5 (D only). */
5882 if (skip_past_comma (&ptr) == FAIL)
5883 goto wanted_comma;
5f4273c7 5884
5287ad62
JB
5885 inst.operands[i].reg = val;
5886 inst.operands[i].isreg = 1;
5887 inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
037e8744
JB
5888 inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5889 inst.operands[i].isvec = 1;
dcbf9037 5890 inst.operands[i].vectype = optype;
5287ad62
JB
5891 inst.operands[i++].present = 1;
5892
dcbf9037 5893 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5287ad62 5894 {
037e8744
JB
5895 /* Case 5: VMOV<c><q> <Dm>, <Rd>, <Rn>.
5896 Case 13: VMOV <Sd>, <Rm> */
5287ad62
JB
5897 inst.operands[i].reg = val;
5898 inst.operands[i].isreg = 1;
037e8744 5899 inst.operands[i].present = 1;
5287ad62
JB
5900
5901 if (rtype == REG_TYPE_NQ)
5902 {
dcbf9037 5903 first_error (_("can't use Neon quad register here"));
5287ad62
JB
5904 return FAIL;
5905 }
037e8744
JB
5906 else if (rtype != REG_TYPE_VFS)
5907 {
5908 i++;
5909 if (skip_past_comma (&ptr) == FAIL)
5910 goto wanted_comma;
5911 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5912 goto wanted_arm;
5913 inst.operands[i].reg = val;
5914 inst.operands[i].isreg = 1;
5915 inst.operands[i].present = 1;
5916 }
5287ad62 5917 }
037e8744
JB
5918 else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_NSDQ, &rtype,
5919 &optype)) != FAIL)
5287ad62
JB
5920 {
5921 /* Case 0: VMOV<c><q> <Qd>, <Qm>
037e8744
JB
5922 Case 1: VMOV<c><q> <Dd>, <Dm>
5923 Case 8: VMOV.F32 <Sd>, <Sm>
5924 Case 15: VMOV <Sd>, <Se>, <Rn>, <Rm> */
5287ad62
JB
5925
5926 inst.operands[i].reg = val;
5927 inst.operands[i].isreg = 1;
5928 inst.operands[i].isquad = (rtype == REG_TYPE_NQ);
037e8744
JB
5929 inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
5930 inst.operands[i].isvec = 1;
dcbf9037 5931 inst.operands[i].vectype = optype;
5287ad62 5932 inst.operands[i].present = 1;
5f4273c7 5933
037e8744
JB
5934 if (skip_past_comma (&ptr) == SUCCESS)
5935 {
5936 /* Case 15. */
5937 i++;
5938
5939 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5940 goto wanted_arm;
5941
5942 inst.operands[i].reg = val;
5943 inst.operands[i].isreg = 1;
5944 inst.operands[i++].present = 1;
5f4273c7 5945
037e8744
JB
5946 if (skip_past_comma (&ptr) == FAIL)
5947 goto wanted_comma;
5f4273c7 5948
037e8744
JB
5949 if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) == FAIL)
5950 goto wanted_arm;
5f4273c7 5951
037e8744
JB
5952 inst.operands[i].reg = val;
5953 inst.operands[i].isreg = 1;
1b11b49f 5954 inst.operands[i].present = 1;
037e8744 5955 }
5287ad62 5956 }
4641781c
PB
5957 else if (parse_qfloat_immediate (&ptr, &inst.operands[i].imm) == SUCCESS)
5958 /* Case 2: VMOV<c><q>.<dt> <Qd>, #<float-imm>
5959 Case 3: VMOV<c><q>.<dt> <Dd>, #<float-imm>
5960 Case 10: VMOV.F32 <Sd>, #<imm>
5961 Case 11: VMOV.F64 <Dd>, #<imm> */
5962 inst.operands[i].immisfloat = 1;
5963 else if (parse_big_immediate (&ptr, i) == SUCCESS)
5964 /* Case 2: VMOV<c><q>.<dt> <Qd>, #<imm>
5965 Case 3: VMOV<c><q>.<dt> <Dd>, #<imm> */
5966 ;
5287ad62
JB
5967 else
5968 {
dcbf9037 5969 first_error (_("expected <Rm> or <Dm> or <Qm> operand"));
5287ad62
JB
5970 return FAIL;
5971 }
5972 }
dcbf9037 5973 else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5287ad62
JB
5974 {
5975 /* Cases 6, 7. */
5976 inst.operands[i].reg = val;
5977 inst.operands[i].isreg = 1;
5978 inst.operands[i++].present = 1;
5f4273c7 5979
5287ad62
JB
5980 if (skip_past_comma (&ptr) == FAIL)
5981 goto wanted_comma;
5f4273c7 5982
dcbf9037 5983 if ((val = parse_scalar (&ptr, 8, &optype)) != FAIL)
5287ad62
JB
5984 {
5985 /* Case 6: VMOV<c><q>.<dt> <Rd>, <Dn[x]> */
5986 inst.operands[i].reg = val;
5987 inst.operands[i].isscalar = 1;
5988 inst.operands[i].present = 1;
dcbf9037 5989 inst.operands[i].vectype = optype;
5287ad62 5990 }
dcbf9037 5991 else if ((val = arm_reg_parse (&ptr, REG_TYPE_RN)) != FAIL)
5287ad62
JB
5992 {
5993 /* Case 7: VMOV<c><q> <Rd>, <Rn>, <Dm> */
5994 inst.operands[i].reg = val;
5995 inst.operands[i].isreg = 1;
5996 inst.operands[i++].present = 1;
5f4273c7 5997
5287ad62
JB
5998 if (skip_past_comma (&ptr) == FAIL)
5999 goto wanted_comma;
5f4273c7 6000
037e8744 6001 if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFSD, &rtype, &optype))
dcbf9037 6002 == FAIL)
5287ad62 6003 {
037e8744 6004 first_error (_(reg_expected_msgs[REG_TYPE_VFSD]));
5287ad62
JB
6005 return FAIL;
6006 }
6007
6008 inst.operands[i].reg = val;
6009 inst.operands[i].isreg = 1;
037e8744
JB
6010 inst.operands[i].isvec = 1;
6011 inst.operands[i].issingle = (rtype == REG_TYPE_VFS);
dcbf9037 6012 inst.operands[i].vectype = optype;
5287ad62 6013 inst.operands[i].present = 1;
5f4273c7 6014
037e8744
JB
6015 if (rtype == REG_TYPE_VFS)
6016 {
6017 /* Case 14. */
6018 i++;
6019 if (skip_past_comma (&ptr) == FAIL)
6020 goto wanted_comma;
6021 if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL,
6022 &optype)) == FAIL)
6023 {
6024 first_error (_(reg_expected_msgs[REG_TYPE_VFS]));
6025 return FAIL;
6026 }
6027 inst.operands[i].reg = val;
6028 inst.operands[i].isreg = 1;
6029 inst.operands[i].isvec = 1;
6030 inst.operands[i].issingle = 1;
6031 inst.operands[i].vectype = optype;
6032 inst.operands[i].present = 1;
6033 }
6034 }
6035 else if ((val = arm_typed_reg_parse (&ptr, REG_TYPE_VFS, NULL, &optype))
6036 != FAIL)
6037 {
6038 /* Case 13. */
6039 inst.operands[i].reg = val;
6040 inst.operands[i].isreg = 1;
6041 inst.operands[i].isvec = 1;
6042 inst.operands[i].issingle = 1;
6043 inst.operands[i].vectype = optype;
1b11b49f 6044 inst.operands[i].present = 1;
5287ad62
JB
6045 }
6046 }
6047 else
6048 {
dcbf9037 6049 first_error (_("parse error"));
5287ad62
JB
6050 return FAIL;
6051 }
6052
6053 /* Successfully parsed the operands. Update args. */
6054 *which_operand = i;
6055 *str = ptr;
6056 return SUCCESS;
6057
5f4273c7 6058 wanted_comma:
dcbf9037 6059 first_error (_("expected comma"));
5287ad62 6060 return FAIL;
5f4273c7
NC
6061
6062 wanted_arm:
dcbf9037 6063 first_error (_(reg_expected_msgs[REG_TYPE_RN]));
5287ad62 6064 return FAIL;
5287ad62
JB
6065}
6066
5be8be5d
DG
6067/* Use this macro when the operand constraints are different
6068 for ARM and THUMB (e.g. ldrd). */
6069#define MIX_ARM_THUMB_OPERANDS(arm_operand, thumb_operand) \
6070 ((arm_operand) | ((thumb_operand) << 16))
6071
c19d1205
ZW
6072/* Matcher codes for parse_operands. */
6073enum operand_parse_code
6074{
6075 OP_stop, /* end of line */
6076
6077 OP_RR, /* ARM register */
6078 OP_RRnpc, /* ARM register, not r15 */
5be8be5d 6079 OP_RRnpcsp, /* ARM register, neither r15 nor r13 (a.k.a. 'BadReg') */
c19d1205 6080 OP_RRnpcb, /* ARM register, not r15, in square brackets */
fa94de6b 6081 OP_RRnpctw, /* ARM register, not r15 in Thumb-state or with writeback,
55881a11 6082 optional trailing ! */
c19d1205
ZW
6083 OP_RRw, /* ARM register, not r15, optional trailing ! */
6084 OP_RCP, /* Coprocessor number */
6085 OP_RCN, /* Coprocessor register */
6086 OP_RF, /* FPA register */
6087 OP_RVS, /* VFP single precision register */
5287ad62
JB
6088 OP_RVD, /* VFP double precision register (0..15) */
6089 OP_RND, /* Neon double precision register (0..31) */
6090 OP_RNQ, /* Neon quad precision register */
037e8744 6091 OP_RVSD, /* VFP single or double precision register */
5287ad62 6092 OP_RNDQ, /* Neon double or quad precision register */
037e8744 6093 OP_RNSDQ, /* Neon single, double or quad precision register */
5287ad62 6094 OP_RNSC, /* Neon scalar D[X] */
c19d1205
ZW
6095 OP_RVC, /* VFP control register */
6096 OP_RMF, /* Maverick F register */
6097 OP_RMD, /* Maverick D register */
6098 OP_RMFX, /* Maverick FX register */
6099 OP_RMDX, /* Maverick DX register */
6100 OP_RMAX, /* Maverick AX register */
6101 OP_RMDS, /* Maverick DSPSC register */
6102 OP_RIWR, /* iWMMXt wR register */
6103 OP_RIWC, /* iWMMXt wC register */
6104 OP_RIWG, /* iWMMXt wCG register */
6105 OP_RXA, /* XScale accumulator register */
6106
6107 OP_REGLST, /* ARM register list */
6108 OP_VRSLST, /* VFP single-precision register list */
6109 OP_VRDLST, /* VFP double-precision register list */
037e8744 6110 OP_VRSDLST, /* VFP single or double-precision register list (& quad) */
5287ad62
JB
6111 OP_NRDLST, /* Neon double-precision register list (d0-d31, qN aliases) */
6112 OP_NSTRLST, /* Neon element/structure list */
6113
5287ad62 6114 OP_RNDQ_I0, /* Neon D or Q reg, or immediate zero. */
037e8744 6115 OP_RVSD_I0, /* VFP S or D reg, or immediate zero. */
5287ad62 6116 OP_RR_RNSC, /* ARM reg or Neon scalar. */
037e8744 6117 OP_RNSDQ_RNSC, /* Vector S, D or Q reg, or Neon scalar. */
5287ad62
JB
6118 OP_RNDQ_RNSC, /* Neon D or Q reg, or Neon scalar. */
6119 OP_RND_RNSC, /* Neon D reg, or Neon scalar. */
6120 OP_VMOV, /* Neon VMOV operands. */
4316f0d2 6121 OP_RNDQ_Ibig, /* Neon D or Q reg, or big immediate for logic and VMVN. */
5287ad62 6122 OP_RNDQ_I63b, /* Neon D or Q reg, or immediate for shift. */
2d447fca 6123 OP_RIWR_I32z, /* iWMMXt wR register, or immediate 0 .. 32 for iWMMXt2. */
5287ad62
JB
6124
6125 OP_I0, /* immediate zero */
c19d1205
ZW
6126 OP_I7, /* immediate value 0 .. 7 */
6127 OP_I15, /* 0 .. 15 */
6128 OP_I16, /* 1 .. 16 */
5287ad62 6129 OP_I16z, /* 0 .. 16 */
c19d1205
ZW
6130 OP_I31, /* 0 .. 31 */
6131 OP_I31w, /* 0 .. 31, optional trailing ! */
6132 OP_I32, /* 1 .. 32 */
5287ad62
JB
6133 OP_I32z, /* 0 .. 32 */
6134 OP_I63, /* 0 .. 63 */
c19d1205 6135 OP_I63s, /* -64 .. 63 */
5287ad62
JB
6136 OP_I64, /* 1 .. 64 */
6137 OP_I64z, /* 0 .. 64 */
c19d1205 6138 OP_I255, /* 0 .. 255 */
c19d1205
ZW
6139
6140 OP_I4b, /* immediate, prefix optional, 1 .. 4 */
6141 OP_I7b, /* 0 .. 7 */
6142 OP_I15b, /* 0 .. 15 */
6143 OP_I31b, /* 0 .. 31 */
6144
6145 OP_SH, /* shifter operand */
4962c51a 6146 OP_SHG, /* shifter operand with possible group relocation */
c19d1205 6147 OP_ADDR, /* Memory address expression (any mode) */
4962c51a
MS
6148 OP_ADDRGLDR, /* Mem addr expr (any mode) with possible LDR group reloc */
6149 OP_ADDRGLDRS, /* Mem addr expr (any mode) with possible LDRS group reloc */
6150 OP_ADDRGLDC, /* Mem addr expr (any mode) with possible LDC group reloc */
c19d1205
ZW
6151 OP_EXP, /* arbitrary expression */
6152 OP_EXPi, /* same, with optional immediate prefix */
6153 OP_EXPr, /* same, with optional relocation suffix */
b6895b4f 6154 OP_HALF, /* 0 .. 65535 or low/high reloc. */
c19d1205
ZW
6155
6156 OP_CPSF, /* CPS flags */
6157 OP_ENDI, /* Endianness specifier */
d2cd1205
JB
6158 OP_wPSR, /* CPSR/SPSR/APSR mask for msr (writing). */
6159 OP_rPSR, /* CPSR/SPSR/APSR mask for msr (reading). */
c19d1205 6160 OP_COND, /* conditional code */
92e90b6e 6161 OP_TB, /* Table branch. */
c19d1205 6162
037e8744
JB
6163 OP_APSR_RR, /* ARM register or "APSR_nzcv". */
6164
c19d1205
ZW
6165 OP_RRnpc_I0, /* ARM register or literal 0 */
6166 OP_RR_EXr, /* ARM register or expression with opt. reloc suff. */
6167 OP_RR_EXi, /* ARM register or expression with imm prefix */
6168 OP_RF_IF, /* FPA register or immediate */
6169 OP_RIWR_RIWC, /* iWMMXt R or C reg */
41adaa5c 6170 OP_RIWC_RIWG, /* iWMMXt wC or wCG reg */
c19d1205
ZW
6171
6172 /* Optional operands. */
6173 OP_oI7b, /* immediate, prefix optional, 0 .. 7 */
6174 OP_oI31b, /* 0 .. 31 */
5287ad62 6175 OP_oI32b, /* 1 .. 32 */
5f1af56b 6176 OP_oI32z, /* 0 .. 32 */
c19d1205
ZW
6177 OP_oIffffb, /* 0 .. 65535 */
6178 OP_oI255c, /* curly-brace enclosed, 0 .. 255 */
6179
6180 OP_oRR, /* ARM register */
6181 OP_oRRnpc, /* ARM register, not the PC */
5be8be5d 6182 OP_oRRnpcsp, /* ARM register, neither the PC nor the SP (a.k.a. BadReg) */
b6702015 6183 OP_oRRw, /* ARM register, not r15, optional trailing ! */
5287ad62
JB
6184 OP_oRND, /* Optional Neon double precision register */
6185 OP_oRNQ, /* Optional Neon quad precision register */
6186 OP_oRNDQ, /* Optional Neon double or quad precision register */
037e8744 6187 OP_oRNSDQ, /* Optional single, double or quad precision vector register */
c19d1205
ZW
6188 OP_oSHll, /* LSL immediate */
6189 OP_oSHar, /* ASR immediate */
6190 OP_oSHllar, /* LSL or ASR immediate */
6191 OP_oROR, /* ROR 0/8/16/24 */
52e7f43d 6192 OP_oBARRIER_I15, /* Option argument for a barrier instruction. */
c19d1205 6193
5be8be5d
DG
6194 /* Some pre-defined mixed (ARM/THUMB) operands. */
6195 OP_RR_npcsp = MIX_ARM_THUMB_OPERANDS (OP_RR, OP_RRnpcsp),
6196 OP_RRnpc_npcsp = MIX_ARM_THUMB_OPERANDS (OP_RRnpc, OP_RRnpcsp),
6197 OP_oRRnpc_npcsp = MIX_ARM_THUMB_OPERANDS (OP_oRRnpc, OP_oRRnpcsp),
6198
c19d1205
ZW
6199 OP_FIRST_OPTIONAL = OP_oI7b
6200};
a737bd4d 6201
c19d1205
ZW
6202/* Generic instruction operand parser. This does no encoding and no
6203 semantic validation; it merely squirrels values away in the inst
6204 structure. Returns SUCCESS or FAIL depending on whether the
6205 specified grammar matched. */
6206static int
5be8be5d 6207parse_operands (char *str, const unsigned int *pattern, bfd_boolean thumb)
c19d1205 6208{
5be8be5d 6209 unsigned const int *upat = pattern;
c19d1205
ZW
6210 char *backtrack_pos = 0;
6211 const char *backtrack_error = 0;
99aad254 6212 int i, val = 0, backtrack_index = 0;
5287ad62 6213 enum arm_reg_type rtype;
4962c51a 6214 parse_operand_result result;
5be8be5d 6215 unsigned int op_parse_code;
c19d1205 6216
e07e6e58
NC
6217#define po_char_or_fail(chr) \
6218 do \
6219 { \
6220 if (skip_past_char (&str, chr) == FAIL) \
6221 goto bad_args; \
6222 } \
6223 while (0)
c19d1205 6224
e07e6e58
NC
6225#define po_reg_or_fail(regtype) \
6226 do \
dcbf9037 6227 { \
e07e6e58
NC
6228 val = arm_typed_reg_parse (& str, regtype, & rtype, \
6229 & inst.operands[i].vectype); \
6230 if (val == FAIL) \
6231 { \
6232 first_error (_(reg_expected_msgs[regtype])); \
6233 goto failure; \
6234 } \
6235 inst.operands[i].reg = val; \
6236 inst.operands[i].isreg = 1; \
6237 inst.operands[i].isquad = (rtype == REG_TYPE_NQ); \
6238 inst.operands[i].issingle = (rtype == REG_TYPE_VFS); \
6239 inst.operands[i].isvec = (rtype == REG_TYPE_VFS \
6240 || rtype == REG_TYPE_VFD \
6241 || rtype == REG_TYPE_NQ); \
dcbf9037 6242 } \
e07e6e58
NC
6243 while (0)
6244
6245#define po_reg_or_goto(regtype, label) \
6246 do \
6247 { \
6248 val = arm_typed_reg_parse (& str, regtype, & rtype, \
6249 & inst.operands[i].vectype); \
6250 if (val == FAIL) \
6251 goto label; \
dcbf9037 6252 \
e07e6e58
NC
6253 inst.operands[i].reg = val; \
6254 inst.operands[i].isreg = 1; \
6255 inst.operands[i].isquad = (rtype == REG_TYPE_NQ); \
6256 inst.operands[i].issingle = (rtype == REG_TYPE_VFS); \
6257 inst.operands[i].isvec = (rtype == REG_TYPE_VFS \
6258 || rtype == REG_TYPE_VFD \
6259 || rtype == REG_TYPE_NQ); \
6260 } \
6261 while (0)
6262
6263#define po_imm_or_fail(min, max, popt) \
6264 do \
6265 { \
6266 if (parse_immediate (&str, &val, min, max, popt) == FAIL) \
6267 goto failure; \
6268 inst.operands[i].imm = val; \
6269 } \
6270 while (0)
6271
6272#define po_scalar_or_goto(elsz, label) \
6273 do \
6274 { \
6275 val = parse_scalar (& str, elsz, & inst.operands[i].vectype); \
6276 if (val == FAIL) \
6277 goto label; \
6278 inst.operands[i].reg = val; \
6279 inst.operands[i].isscalar = 1; \
6280 } \
6281 while (0)
6282
6283#define po_misc_or_fail(expr) \
6284 do \
6285 { \
6286 if (expr) \
6287 goto failure; \
6288 } \
6289 while (0)
6290
6291#define po_misc_or_fail_no_backtrack(expr) \
6292 do \
6293 { \
6294 result = expr; \
6295 if (result == PARSE_OPERAND_FAIL_NO_BACKTRACK) \
6296 backtrack_pos = 0; \
6297 if (result != PARSE_OPERAND_SUCCESS) \
6298 goto failure; \
6299 } \
6300 while (0)
4962c51a 6301
52e7f43d
RE
6302#define po_barrier_or_imm(str) \
6303 do \
6304 { \
6305 val = parse_barrier (&str); \
6306 if (val == FAIL) \
6307 { \
6308 if (ISALPHA (*str)) \
6309 goto failure; \
6310 else \
6311 goto immediate; \
6312 } \
6313 else \
6314 { \
6315 if ((inst.instruction & 0xf0) == 0x60 \
6316 && val != 0xf) \
6317 { \
6318 /* ISB can only take SY as an option. */ \
6319 inst.error = _("invalid barrier type"); \
6320 goto failure; \
6321 } \
6322 } \
6323 } \
6324 while (0)
6325
c19d1205
ZW
6326 skip_whitespace (str);
6327
6328 for (i = 0; upat[i] != OP_stop; i++)
6329 {
5be8be5d
DG
6330 op_parse_code = upat[i];
6331 if (op_parse_code >= 1<<16)
6332 op_parse_code = thumb ? (op_parse_code >> 16)
6333 : (op_parse_code & ((1<<16)-1));
6334
6335 if (op_parse_code >= OP_FIRST_OPTIONAL)
c19d1205
ZW
6336 {
6337 /* Remember where we are in case we need to backtrack. */
9c2799c2 6338 gas_assert (!backtrack_pos);
c19d1205
ZW
6339 backtrack_pos = str;
6340 backtrack_error = inst.error;
6341 backtrack_index = i;
6342 }
6343
b6702015 6344 if (i > 0 && (i > 1 || inst.operands[0].present))
c19d1205
ZW
6345 po_char_or_fail (',');
6346
5be8be5d 6347 switch (op_parse_code)
c19d1205
ZW
6348 {
6349 /* Registers */
6350 case OP_oRRnpc:
5be8be5d 6351 case OP_oRRnpcsp:
c19d1205 6352 case OP_RRnpc:
5be8be5d 6353 case OP_RRnpcsp:
c19d1205
ZW
6354 case OP_oRR:
6355 case OP_RR: po_reg_or_fail (REG_TYPE_RN); break;
6356 case OP_RCP: po_reg_or_fail (REG_TYPE_CP); break;
6357 case OP_RCN: po_reg_or_fail (REG_TYPE_CN); break;
6358 case OP_RF: po_reg_or_fail (REG_TYPE_FN); break;
6359 case OP_RVS: po_reg_or_fail (REG_TYPE_VFS); break;
6360 case OP_RVD: po_reg_or_fail (REG_TYPE_VFD); break;
5287ad62
JB
6361 case OP_oRND:
6362 case OP_RND: po_reg_or_fail (REG_TYPE_VFD); break;
cd2cf30b
PB
6363 case OP_RVC:
6364 po_reg_or_goto (REG_TYPE_VFC, coproc_reg);
6365 break;
6366 /* Also accept generic coprocessor regs for unknown registers. */
6367 coproc_reg:
6368 po_reg_or_fail (REG_TYPE_CN);
6369 break;
c19d1205
ZW
6370 case OP_RMF: po_reg_or_fail (REG_TYPE_MVF); break;
6371 case OP_RMD: po_reg_or_fail (REG_TYPE_MVD); break;
6372 case OP_RMFX: po_reg_or_fail (REG_TYPE_MVFX); break;
6373 case OP_RMDX: po_reg_or_fail (REG_TYPE_MVDX); break;
6374 case OP_RMAX: po_reg_or_fail (REG_TYPE_MVAX); break;
6375 case OP_RMDS: po_reg_or_fail (REG_TYPE_DSPSC); break;
6376 case OP_RIWR: po_reg_or_fail (REG_TYPE_MMXWR); break;
6377 case OP_RIWC: po_reg_or_fail (REG_TYPE_MMXWC); break;
6378 case OP_RIWG: po_reg_or_fail (REG_TYPE_MMXWCG); break;
6379 case OP_RXA: po_reg_or_fail (REG_TYPE_XSCALE); break;
5287ad62
JB
6380 case OP_oRNQ:
6381 case OP_RNQ: po_reg_or_fail (REG_TYPE_NQ); break;
6382 case OP_oRNDQ:
6383 case OP_RNDQ: po_reg_or_fail (REG_TYPE_NDQ); break;
037e8744
JB
6384 case OP_RVSD: po_reg_or_fail (REG_TYPE_VFSD); break;
6385 case OP_oRNSDQ:
6386 case OP_RNSDQ: po_reg_or_fail (REG_TYPE_NSDQ); break;
5287ad62
JB
6387
6388 /* Neon scalar. Using an element size of 8 means that some invalid
6389 scalars are accepted here, so deal with those in later code. */
6390 case OP_RNSC: po_scalar_or_goto (8, failure); break;
6391
5287ad62
JB
6392 case OP_RNDQ_I0:
6393 {
6394 po_reg_or_goto (REG_TYPE_NDQ, try_imm0);
6395 break;
6396 try_imm0:
6397 po_imm_or_fail (0, 0, TRUE);
6398 }
6399 break;
6400
037e8744
JB
6401 case OP_RVSD_I0:
6402 po_reg_or_goto (REG_TYPE_VFSD, try_imm0);
6403 break;
6404
5287ad62
JB
6405 case OP_RR_RNSC:
6406 {
6407 po_scalar_or_goto (8, try_rr);
6408 break;
6409 try_rr:
6410 po_reg_or_fail (REG_TYPE_RN);
6411 }
6412 break;
6413
037e8744
JB
6414 case OP_RNSDQ_RNSC:
6415 {
6416 po_scalar_or_goto (8, try_nsdq);
6417 break;
6418 try_nsdq:
6419 po_reg_or_fail (REG_TYPE_NSDQ);
6420 }
6421 break;
6422
5287ad62
JB
6423 case OP_RNDQ_RNSC:
6424 {
6425 po_scalar_or_goto (8, try_ndq);
6426 break;
6427 try_ndq:
6428 po_reg_or_fail (REG_TYPE_NDQ);
6429 }
6430 break;
6431
6432 case OP_RND_RNSC:
6433 {
6434 po_scalar_or_goto (8, try_vfd);
6435 break;
6436 try_vfd:
6437 po_reg_or_fail (REG_TYPE_VFD);
6438 }
6439 break;
6440
6441 case OP_VMOV:
6442 /* WARNING: parse_neon_mov can move the operand counter, i. If we're
6443 not careful then bad things might happen. */
6444 po_misc_or_fail (parse_neon_mov (&str, &i) == FAIL);
6445 break;
6446
4316f0d2 6447 case OP_RNDQ_Ibig:
5287ad62 6448 {
4316f0d2 6449 po_reg_or_goto (REG_TYPE_NDQ, try_immbig);
5287ad62 6450 break;
4316f0d2 6451 try_immbig:
5287ad62
JB
6452 /* There's a possibility of getting a 64-bit immediate here, so
6453 we need special handling. */
6454 if (parse_big_immediate (&str, i) == FAIL)
6455 {
6456 inst.error = _("immediate value is out of range");
6457 goto failure;
6458 }
6459 }
6460 break;
6461
6462 case OP_RNDQ_I63b:
6463 {
6464 po_reg_or_goto (REG_TYPE_NDQ, try_shimm);
6465 break;
6466 try_shimm:
6467 po_imm_or_fail (0, 63, TRUE);
6468 }
6469 break;
c19d1205
ZW
6470
6471 case OP_RRnpcb:
6472 po_char_or_fail ('[');
6473 po_reg_or_fail (REG_TYPE_RN);
6474 po_char_or_fail (']');
6475 break;
a737bd4d 6476
55881a11 6477 case OP_RRnpctw:
c19d1205 6478 case OP_RRw:
b6702015 6479 case OP_oRRw:
c19d1205
ZW
6480 po_reg_or_fail (REG_TYPE_RN);
6481 if (skip_past_char (&str, '!') == SUCCESS)
6482 inst.operands[i].writeback = 1;
6483 break;
6484
6485 /* Immediates */
6486 case OP_I7: po_imm_or_fail ( 0, 7, FALSE); break;
6487 case OP_I15: po_imm_or_fail ( 0, 15, FALSE); break;
6488 case OP_I16: po_imm_or_fail ( 1, 16, FALSE); break;
5287ad62 6489 case OP_I16z: po_imm_or_fail ( 0, 16, FALSE); break;
c19d1205
ZW
6490 case OP_I31: po_imm_or_fail ( 0, 31, FALSE); break;
6491 case OP_I32: po_imm_or_fail ( 1, 32, FALSE); break;
5287ad62 6492 case OP_I32z: po_imm_or_fail ( 0, 32, FALSE); break;
c19d1205 6493 case OP_I63s: po_imm_or_fail (-64, 63, FALSE); break;
5287ad62
JB
6494 case OP_I63: po_imm_or_fail ( 0, 63, FALSE); break;
6495 case OP_I64: po_imm_or_fail ( 1, 64, FALSE); break;
6496 case OP_I64z: po_imm_or_fail ( 0, 64, FALSE); break;
c19d1205 6497 case OP_I255: po_imm_or_fail ( 0, 255, FALSE); break;
c19d1205
ZW
6498
6499 case OP_I4b: po_imm_or_fail ( 1, 4, TRUE); break;
6500 case OP_oI7b:
6501 case OP_I7b: po_imm_or_fail ( 0, 7, TRUE); break;
6502 case OP_I15b: po_imm_or_fail ( 0, 15, TRUE); break;
6503 case OP_oI31b:
6504 case OP_I31b: po_imm_or_fail ( 0, 31, TRUE); break;
5287ad62 6505 case OP_oI32b: po_imm_or_fail ( 1, 32, TRUE); break;
5f1af56b 6506 case OP_oI32z: po_imm_or_fail ( 0, 32, TRUE); break;
c19d1205
ZW
6507 case OP_oIffffb: po_imm_or_fail ( 0, 0xffff, TRUE); break;
6508
6509 /* Immediate variants */
6510 case OP_oI255c:
6511 po_char_or_fail ('{');
6512 po_imm_or_fail (0, 255, TRUE);
6513 po_char_or_fail ('}');
6514 break;
6515
6516 case OP_I31w:
6517 /* The expression parser chokes on a trailing !, so we have
6518 to find it first and zap it. */
6519 {
6520 char *s = str;
6521 while (*s && *s != ',')
6522 s++;
6523 if (s[-1] == '!')
6524 {
6525 s[-1] = '\0';
6526 inst.operands[i].writeback = 1;
6527 }
6528 po_imm_or_fail (0, 31, TRUE);
6529 if (str == s - 1)
6530 str = s;
6531 }
6532 break;
6533
6534 /* Expressions */
6535 case OP_EXPi: EXPi:
6536 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6537 GE_OPT_PREFIX));
6538 break;
6539
6540 case OP_EXP:
6541 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6542 GE_NO_PREFIX));
6543 break;
6544
6545 case OP_EXPr: EXPr:
6546 po_misc_or_fail (my_get_expression (&inst.reloc.exp, &str,
6547 GE_NO_PREFIX));
6548 if (inst.reloc.exp.X_op == O_symbol)
a737bd4d 6549 {
c19d1205
ZW
6550 val = parse_reloc (&str);
6551 if (val == -1)
6552 {
6553 inst.error = _("unrecognized relocation suffix");
6554 goto failure;
6555 }
6556 else if (val != BFD_RELOC_UNUSED)
6557 {
6558 inst.operands[i].imm = val;
6559 inst.operands[i].hasreloc = 1;
6560 }
a737bd4d 6561 }
c19d1205 6562 break;
a737bd4d 6563
b6895b4f
PB
6564 /* Operand for MOVW or MOVT. */
6565 case OP_HALF:
6566 po_misc_or_fail (parse_half (&str));
6567 break;
6568
e07e6e58 6569 /* Register or expression. */
c19d1205
ZW
6570 case OP_RR_EXr: po_reg_or_goto (REG_TYPE_RN, EXPr); break;
6571 case OP_RR_EXi: po_reg_or_goto (REG_TYPE_RN, EXPi); break;
a737bd4d 6572
e07e6e58 6573 /* Register or immediate. */
c19d1205
ZW
6574 case OP_RRnpc_I0: po_reg_or_goto (REG_TYPE_RN, I0); break;
6575 I0: po_imm_or_fail (0, 0, FALSE); break;
a737bd4d 6576
c19d1205
ZW
6577 case OP_RF_IF: po_reg_or_goto (REG_TYPE_FN, IF); break;
6578 IF:
6579 if (!is_immediate_prefix (*str))
6580 goto bad_args;
6581 str++;
6582 val = parse_fpa_immediate (&str);
6583 if (val == FAIL)
6584 goto failure;
6585 /* FPA immediates are encoded as registers 8-15.
6586 parse_fpa_immediate has already applied the offset. */
6587 inst.operands[i].reg = val;
6588 inst.operands[i].isreg = 1;
6589 break;
09d92015 6590
2d447fca
JM
6591 case OP_RIWR_I32z: po_reg_or_goto (REG_TYPE_MMXWR, I32z); break;
6592 I32z: po_imm_or_fail (0, 32, FALSE); break;
6593
e07e6e58 6594 /* Two kinds of register. */
c19d1205
ZW
6595 case OP_RIWR_RIWC:
6596 {
6597 struct reg_entry *rege = arm_reg_parse_multi (&str);
97f87066
JM
6598 if (!rege
6599 || (rege->type != REG_TYPE_MMXWR
6600 && rege->type != REG_TYPE_MMXWC
6601 && rege->type != REG_TYPE_MMXWCG))
c19d1205
ZW
6602 {
6603 inst.error = _("iWMMXt data or control register expected");
6604 goto failure;
6605 }
6606 inst.operands[i].reg = rege->number;
6607 inst.operands[i].isreg = (rege->type == REG_TYPE_MMXWR);
6608 }
6609 break;
09d92015 6610
41adaa5c
JM
6611 case OP_RIWC_RIWG:
6612 {
6613 struct reg_entry *rege = arm_reg_parse_multi (&str);
6614 if (!rege
6615 || (rege->type != REG_TYPE_MMXWC
6616 && rege->type != REG_TYPE_MMXWCG))
6617 {
6618 inst.error = _("iWMMXt control register expected");
6619 goto failure;
6620 }
6621 inst.operands[i].reg = rege->number;
6622 inst.operands[i].isreg = 1;
6623 }
6624 break;
6625
c19d1205
ZW
6626 /* Misc */
6627 case OP_CPSF: val = parse_cps_flags (&str); break;
6628 case OP_ENDI: val = parse_endian_specifier (&str); break;
6629 case OP_oROR: val = parse_ror (&str); break;
c19d1205 6630 case OP_COND: val = parse_cond (&str); break;
52e7f43d
RE
6631 case OP_oBARRIER_I15:
6632 po_barrier_or_imm (str); break;
6633 immediate:
6634 if (parse_immediate (&str, &val, 0, 15, TRUE) == FAIL)
6635 goto failure;
6636 break;
c19d1205 6637
fa94de6b 6638 case OP_wPSR:
d2cd1205 6639 case OP_rPSR:
90ec0d68
MGD
6640 po_reg_or_goto (REG_TYPE_RNB, try_psr);
6641 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_virt))
6642 {
6643 inst.error = _("Banked registers are not available with this "
6644 "architecture.");
6645 goto failure;
6646 }
6647 break;
d2cd1205
JB
6648 try_psr:
6649 val = parse_psr (&str, op_parse_code == OP_wPSR);
6650 break;
037e8744
JB
6651
6652 case OP_APSR_RR:
6653 po_reg_or_goto (REG_TYPE_RN, try_apsr);
6654 break;
6655 try_apsr:
6656 /* Parse "APSR_nvzc" operand (for FMSTAT-equivalent MRS
6657 instruction). */
6658 if (strncasecmp (str, "APSR_", 5) == 0)
6659 {
6660 unsigned found = 0;
6661 str += 5;
6662 while (found < 15)
6663 switch (*str++)
6664 {
6665 case 'c': found = (found & 1) ? 16 : found | 1; break;
6666 case 'n': found = (found & 2) ? 16 : found | 2; break;
6667 case 'z': found = (found & 4) ? 16 : found | 4; break;
6668 case 'v': found = (found & 8) ? 16 : found | 8; break;
6669 default: found = 16;
6670 }
6671 if (found != 15)
6672 goto failure;
6673 inst.operands[i].isvec = 1;
f7c21dc7
NC
6674 /* APSR_nzcv is encoded in instructions as if it were the REG_PC. */
6675 inst.operands[i].reg = REG_PC;
037e8744
JB
6676 }
6677 else
6678 goto failure;
6679 break;
6680
92e90b6e
PB
6681 case OP_TB:
6682 po_misc_or_fail (parse_tb (&str));
6683 break;
6684
e07e6e58 6685 /* Register lists. */
c19d1205
ZW
6686 case OP_REGLST:
6687 val = parse_reg_list (&str);
6688 if (*str == '^')
6689 {
6690 inst.operands[1].writeback = 1;
6691 str++;
6692 }
6693 break;
09d92015 6694
c19d1205 6695 case OP_VRSLST:
5287ad62 6696 val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_S);
c19d1205 6697 break;
09d92015 6698
c19d1205 6699 case OP_VRDLST:
5287ad62 6700 val = parse_vfp_reg_list (&str, &inst.operands[i].reg, REGLIST_VFP_D);
c19d1205 6701 break;
a737bd4d 6702
037e8744
JB
6703 case OP_VRSDLST:
6704 /* Allow Q registers too. */
6705 val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6706 REGLIST_NEON_D);
6707 if (val == FAIL)
6708 {
6709 inst.error = NULL;
6710 val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6711 REGLIST_VFP_S);
6712 inst.operands[i].issingle = 1;
6713 }
6714 break;
6715
5287ad62
JB
6716 case OP_NRDLST:
6717 val = parse_vfp_reg_list (&str, &inst.operands[i].reg,
6718 REGLIST_NEON_D);
6719 break;
6720
6721 case OP_NSTRLST:
dcbf9037
JB
6722 val = parse_neon_el_struct_list (&str, &inst.operands[i].reg,
6723 &inst.operands[i].vectype);
5287ad62
JB
6724 break;
6725
c19d1205
ZW
6726 /* Addressing modes */
6727 case OP_ADDR:
6728 po_misc_or_fail (parse_address (&str, i));
6729 break;
09d92015 6730
4962c51a
MS
6731 case OP_ADDRGLDR:
6732 po_misc_or_fail_no_backtrack (
6733 parse_address_group_reloc (&str, i, GROUP_LDR));
6734 break;
6735
6736 case OP_ADDRGLDRS:
6737 po_misc_or_fail_no_backtrack (
6738 parse_address_group_reloc (&str, i, GROUP_LDRS));
6739 break;
6740
6741 case OP_ADDRGLDC:
6742 po_misc_or_fail_no_backtrack (
6743 parse_address_group_reloc (&str, i, GROUP_LDC));
6744 break;
6745
c19d1205
ZW
6746 case OP_SH:
6747 po_misc_or_fail (parse_shifter_operand (&str, i));
6748 break;
09d92015 6749
4962c51a
MS
6750 case OP_SHG:
6751 po_misc_or_fail_no_backtrack (
6752 parse_shifter_operand_group_reloc (&str, i));
6753 break;
6754
c19d1205
ZW
6755 case OP_oSHll:
6756 po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_IMMEDIATE));
6757 break;
09d92015 6758
c19d1205
ZW
6759 case OP_oSHar:
6760 po_misc_or_fail (parse_shift (&str, i, SHIFT_ASR_IMMEDIATE));
6761 break;
09d92015 6762
c19d1205
ZW
6763 case OP_oSHllar:
6764 po_misc_or_fail (parse_shift (&str, i, SHIFT_LSL_OR_ASR_IMMEDIATE));
6765 break;
09d92015 6766
c19d1205 6767 default:
5be8be5d 6768 as_fatal (_("unhandled operand code %d"), op_parse_code);
c19d1205 6769 }
09d92015 6770
c19d1205
ZW
6771 /* Various value-based sanity checks and shared operations. We
6772 do not signal immediate failures for the register constraints;
6773 this allows a syntax error to take precedence. */
5be8be5d 6774 switch (op_parse_code)
c19d1205
ZW
6775 {
6776 case OP_oRRnpc:
6777 case OP_RRnpc:
6778 case OP_RRnpcb:
6779 case OP_RRw:
b6702015 6780 case OP_oRRw:
c19d1205
ZW
6781 case OP_RRnpc_I0:
6782 if (inst.operands[i].isreg && inst.operands[i].reg == REG_PC)
6783 inst.error = BAD_PC;
6784 break;
09d92015 6785
5be8be5d
DG
6786 case OP_oRRnpcsp:
6787 case OP_RRnpcsp:
6788 if (inst.operands[i].isreg)
6789 {
6790 if (inst.operands[i].reg == REG_PC)
6791 inst.error = BAD_PC;
6792 else if (inst.operands[i].reg == REG_SP)
6793 inst.error = BAD_SP;
6794 }
6795 break;
6796
55881a11 6797 case OP_RRnpctw:
fa94de6b
RM
6798 if (inst.operands[i].isreg
6799 && inst.operands[i].reg == REG_PC
55881a11
MGD
6800 && (inst.operands[i].writeback || thumb))
6801 inst.error = BAD_PC;
6802 break;
6803
c19d1205
ZW
6804 case OP_CPSF:
6805 case OP_ENDI:
6806 case OP_oROR:
d2cd1205
JB
6807 case OP_wPSR:
6808 case OP_rPSR:
c19d1205 6809 case OP_COND:
52e7f43d 6810 case OP_oBARRIER_I15:
c19d1205
ZW
6811 case OP_REGLST:
6812 case OP_VRSLST:
6813 case OP_VRDLST:
037e8744 6814 case OP_VRSDLST:
5287ad62
JB
6815 case OP_NRDLST:
6816 case OP_NSTRLST:
c19d1205
ZW
6817 if (val == FAIL)
6818 goto failure;
6819 inst.operands[i].imm = val;
6820 break;
a737bd4d 6821
c19d1205
ZW
6822 default:
6823 break;
6824 }
09d92015 6825
c19d1205
ZW
6826 /* If we get here, this operand was successfully parsed. */
6827 inst.operands[i].present = 1;
6828 continue;
09d92015 6829
c19d1205 6830 bad_args:
09d92015 6831 inst.error = BAD_ARGS;
c19d1205
ZW
6832
6833 failure:
6834 if (!backtrack_pos)
d252fdde
PB
6835 {
6836 /* The parse routine should already have set inst.error, but set a
5f4273c7 6837 default here just in case. */
d252fdde
PB
6838 if (!inst.error)
6839 inst.error = _("syntax error");
6840 return FAIL;
6841 }
c19d1205
ZW
6842
6843 /* Do not backtrack over a trailing optional argument that
6844 absorbed some text. We will only fail again, with the
6845 'garbage following instruction' error message, which is
6846 probably less helpful than the current one. */
6847 if (backtrack_index == i && backtrack_pos != str
6848 && upat[i+1] == OP_stop)
d252fdde
PB
6849 {
6850 if (!inst.error)
6851 inst.error = _("syntax error");
6852 return FAIL;
6853 }
c19d1205
ZW
6854
6855 /* Try again, skipping the optional argument at backtrack_pos. */
6856 str = backtrack_pos;
6857 inst.error = backtrack_error;
6858 inst.operands[backtrack_index].present = 0;
6859 i = backtrack_index;
6860 backtrack_pos = 0;
09d92015 6861 }
09d92015 6862
c19d1205
ZW
6863 /* Check that we have parsed all the arguments. */
6864 if (*str != '\0' && !inst.error)
6865 inst.error = _("garbage following instruction");
09d92015 6866
c19d1205 6867 return inst.error ? FAIL : SUCCESS;
09d92015
MM
6868}
6869
c19d1205
ZW
6870#undef po_char_or_fail
6871#undef po_reg_or_fail
6872#undef po_reg_or_goto
6873#undef po_imm_or_fail
5287ad62 6874#undef po_scalar_or_fail
52e7f43d 6875#undef po_barrier_or_imm
e07e6e58 6876
c19d1205 6877/* Shorthand macro for instruction encoding functions issuing errors. */
e07e6e58
NC
6878#define constraint(expr, err) \
6879 do \
c19d1205 6880 { \
e07e6e58
NC
6881 if (expr) \
6882 { \
6883 inst.error = err; \
6884 return; \
6885 } \
c19d1205 6886 } \
e07e6e58 6887 while (0)
c19d1205 6888
fdfde340
JM
6889/* Reject "bad registers" for Thumb-2 instructions. Many Thumb-2
6890 instructions are unpredictable if these registers are used. This
6891 is the BadReg predicate in ARM's Thumb-2 documentation. */
6892#define reject_bad_reg(reg) \
6893 do \
6894 if (reg == REG_SP || reg == REG_PC) \
6895 { \
6896 inst.error = (reg == REG_SP) ? BAD_SP : BAD_PC; \
6897 return; \
6898 } \
6899 while (0)
6900
94206790
MM
6901/* If REG is R13 (the stack pointer), warn that its use is
6902 deprecated. */
6903#define warn_deprecated_sp(reg) \
6904 do \
6905 if (warn_on_deprecated && reg == REG_SP) \
6906 as_warn (_("use of r13 is deprecated")); \
6907 while (0)
6908
c19d1205
ZW
6909/* Functions for operand encoding. ARM, then Thumb. */
6910
6911#define rotate_left(v, n) (v << n | v >> (32 - n))
6912
6913/* If VAL can be encoded in the immediate field of an ARM instruction,
6914 return the encoded form. Otherwise, return FAIL. */
6915
6916static unsigned int
6917encode_arm_immediate (unsigned int val)
09d92015 6918{
c19d1205
ZW
6919 unsigned int a, i;
6920
6921 for (i = 0; i < 32; i += 2)
6922 if ((a = rotate_left (val, i)) <= 0xff)
6923 return a | (i << 7); /* 12-bit pack: [shift-cnt,const]. */
6924
6925 return FAIL;
09d92015
MM
6926}
6927
c19d1205
ZW
6928/* If VAL can be encoded in the immediate field of a Thumb32 instruction,
6929 return the encoded form. Otherwise, return FAIL. */
6930static unsigned int
6931encode_thumb32_immediate (unsigned int val)
09d92015 6932{
c19d1205 6933 unsigned int a, i;
09d92015 6934
9c3c69f2 6935 if (val <= 0xff)
c19d1205 6936 return val;
a737bd4d 6937
9c3c69f2 6938 for (i = 1; i <= 24; i++)
09d92015 6939 {
9c3c69f2
PB
6940 a = val >> i;
6941 if ((val & ~(0xff << i)) == 0)
6942 return ((val >> i) & 0x7f) | ((32 - i) << 7);
09d92015 6943 }
a737bd4d 6944
c19d1205
ZW
6945 a = val & 0xff;
6946 if (val == ((a << 16) | a))
6947 return 0x100 | a;
6948 if (val == ((a << 24) | (a << 16) | (a << 8) | a))
6949 return 0x300 | a;
09d92015 6950
c19d1205
ZW
6951 a = val & 0xff00;
6952 if (val == ((a << 16) | a))
6953 return 0x200 | (a >> 8);
a737bd4d 6954
c19d1205 6955 return FAIL;
09d92015 6956}
5287ad62 6957/* Encode a VFP SP or DP register number into inst.instruction. */
09d92015
MM
6958
6959static void
5287ad62
JB
6960encode_arm_vfp_reg (int reg, enum vfp_reg_pos pos)
6961{
6962 if ((pos == VFP_REG_Dd || pos == VFP_REG_Dn || pos == VFP_REG_Dm)
6963 && reg > 15)
6964 {
b1cc4aeb 6965 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_d32))
5287ad62
JB
6966 {
6967 if (thumb_mode)
6968 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
b1cc4aeb 6969 fpu_vfp_ext_d32);
5287ad62
JB
6970 else
6971 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
b1cc4aeb 6972 fpu_vfp_ext_d32);
5287ad62
JB
6973 }
6974 else
6975 {
dcbf9037 6976 first_error (_("D register out of range for selected VFP version"));
5287ad62
JB
6977 return;
6978 }
6979 }
6980
c19d1205 6981 switch (pos)
09d92015 6982 {
c19d1205
ZW
6983 case VFP_REG_Sd:
6984 inst.instruction |= ((reg >> 1) << 12) | ((reg & 1) << 22);
6985 break;
6986
6987 case VFP_REG_Sn:
6988 inst.instruction |= ((reg >> 1) << 16) | ((reg & 1) << 7);
6989 break;
6990
6991 case VFP_REG_Sm:
6992 inst.instruction |= ((reg >> 1) << 0) | ((reg & 1) << 5);
6993 break;
6994
5287ad62
JB
6995 case VFP_REG_Dd:
6996 inst.instruction |= ((reg & 15) << 12) | ((reg >> 4) << 22);
6997 break;
5f4273c7 6998
5287ad62
JB
6999 case VFP_REG_Dn:
7000 inst.instruction |= ((reg & 15) << 16) | ((reg >> 4) << 7);
7001 break;
5f4273c7 7002
5287ad62
JB
7003 case VFP_REG_Dm:
7004 inst.instruction |= (reg & 15) | ((reg >> 4) << 5);
7005 break;
7006
c19d1205
ZW
7007 default:
7008 abort ();
09d92015 7009 }
09d92015
MM
7010}
7011
c19d1205 7012/* Encode a <shift> in an ARM-format instruction. The immediate,
55cf6793 7013 if any, is handled by md_apply_fix. */
09d92015 7014static void
c19d1205 7015encode_arm_shift (int i)
09d92015 7016{
c19d1205
ZW
7017 if (inst.operands[i].shift_kind == SHIFT_RRX)
7018 inst.instruction |= SHIFT_ROR << 5;
7019 else
09d92015 7020 {
c19d1205
ZW
7021 inst.instruction |= inst.operands[i].shift_kind << 5;
7022 if (inst.operands[i].immisreg)
7023 {
7024 inst.instruction |= SHIFT_BY_REG;
7025 inst.instruction |= inst.operands[i].imm << 8;
7026 }
7027 else
7028 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
09d92015 7029 }
c19d1205 7030}
09d92015 7031
c19d1205
ZW
7032static void
7033encode_arm_shifter_operand (int i)
7034{
7035 if (inst.operands[i].isreg)
09d92015 7036 {
c19d1205
ZW
7037 inst.instruction |= inst.operands[i].reg;
7038 encode_arm_shift (i);
09d92015 7039 }
c19d1205 7040 else
a415b1cd
JB
7041 {
7042 inst.instruction |= INST_IMMEDIATE;
7043 if (inst.reloc.type != BFD_RELOC_ARM_IMMEDIATE)
7044 inst.instruction |= inst.operands[i].imm;
7045 }
09d92015
MM
7046}
7047
c19d1205 7048/* Subroutine of encode_arm_addr_mode_2 and encode_arm_addr_mode_3. */
09d92015 7049static void
c19d1205 7050encode_arm_addr_mode_common (int i, bfd_boolean is_t)
09d92015 7051{
2b2f5df9
NC
7052 /* PR 14260:
7053 Generate an error if the operand is not a register. */
7054 constraint (!inst.operands[i].isreg,
7055 _("Instruction does not support =N addresses"));
7056
c19d1205 7057 inst.instruction |= inst.operands[i].reg << 16;
a737bd4d 7058
c19d1205 7059 if (inst.operands[i].preind)
09d92015 7060 {
c19d1205
ZW
7061 if (is_t)
7062 {
7063 inst.error = _("instruction does not accept preindexed addressing");
7064 return;
7065 }
7066 inst.instruction |= PRE_INDEX;
7067 if (inst.operands[i].writeback)
7068 inst.instruction |= WRITE_BACK;
09d92015 7069
c19d1205
ZW
7070 }
7071 else if (inst.operands[i].postind)
7072 {
9c2799c2 7073 gas_assert (inst.operands[i].writeback);
c19d1205
ZW
7074 if (is_t)
7075 inst.instruction |= WRITE_BACK;
7076 }
7077 else /* unindexed - only for coprocessor */
09d92015 7078 {
c19d1205 7079 inst.error = _("instruction does not accept unindexed addressing");
09d92015
MM
7080 return;
7081 }
7082
c19d1205
ZW
7083 if (((inst.instruction & WRITE_BACK) || !(inst.instruction & PRE_INDEX))
7084 && (((inst.instruction & 0x000f0000) >> 16)
7085 == ((inst.instruction & 0x0000f000) >> 12)))
7086 as_warn ((inst.instruction & LOAD_BIT)
7087 ? _("destination register same as write-back base")
7088 : _("source register same as write-back base"));
09d92015
MM
7089}
7090
c19d1205
ZW
7091/* inst.operands[i] was set up by parse_address. Encode it into an
7092 ARM-format mode 2 load or store instruction. If is_t is true,
7093 reject forms that cannot be used with a T instruction (i.e. not
7094 post-indexed). */
a737bd4d 7095static void
c19d1205 7096encode_arm_addr_mode_2 (int i, bfd_boolean is_t)
09d92015 7097{
5be8be5d
DG
7098 const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
7099
c19d1205 7100 encode_arm_addr_mode_common (i, is_t);
a737bd4d 7101
c19d1205 7102 if (inst.operands[i].immisreg)
09d92015 7103 {
5be8be5d
DG
7104 constraint ((inst.operands[i].imm == REG_PC
7105 || (is_pc && inst.operands[i].writeback)),
7106 BAD_PC_ADDRESSING);
c19d1205
ZW
7107 inst.instruction |= INST_IMMEDIATE; /* yes, this is backwards */
7108 inst.instruction |= inst.operands[i].imm;
7109 if (!inst.operands[i].negative)
7110 inst.instruction |= INDEX_UP;
7111 if (inst.operands[i].shifted)
7112 {
7113 if (inst.operands[i].shift_kind == SHIFT_RRX)
7114 inst.instruction |= SHIFT_ROR << 5;
7115 else
7116 {
7117 inst.instruction |= inst.operands[i].shift_kind << 5;
7118 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
7119 }
7120 }
09d92015 7121 }
c19d1205 7122 else /* immediate offset in inst.reloc */
09d92015 7123 {
5be8be5d
DG
7124 if (is_pc && !inst.reloc.pc_rel)
7125 {
7126 const bfd_boolean is_load = ((inst.instruction & LOAD_BIT) != 0);
23a10334
JZ
7127
7128 /* If is_t is TRUE, it's called from do_ldstt. ldrt/strt
7129 cannot use PC in addressing.
7130 PC cannot be used in writeback addressing, either. */
7131 constraint ((is_t || inst.operands[i].writeback),
5be8be5d 7132 BAD_PC_ADDRESSING);
23a10334 7133
dc5ec521 7134 /* Use of PC in str is deprecated for ARMv7. */
23a10334
JZ
7135 if (warn_on_deprecated
7136 && !is_load
7137 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
7138 as_warn (_("use of PC in this instruction is deprecated"));
5be8be5d
DG
7139 }
7140
c19d1205 7141 if (inst.reloc.type == BFD_RELOC_UNUSED)
26d97720
NS
7142 {
7143 /* Prefer + for zero encoded value. */
7144 if (!inst.operands[i].negative)
7145 inst.instruction |= INDEX_UP;
7146 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM;
7147 }
09d92015 7148 }
09d92015
MM
7149}
7150
c19d1205
ZW
7151/* inst.operands[i] was set up by parse_address. Encode it into an
7152 ARM-format mode 3 load or store instruction. Reject forms that
7153 cannot be used with such instructions. If is_t is true, reject
7154 forms that cannot be used with a T instruction (i.e. not
7155 post-indexed). */
7156static void
7157encode_arm_addr_mode_3 (int i, bfd_boolean is_t)
09d92015 7158{
c19d1205 7159 if (inst.operands[i].immisreg && inst.operands[i].shifted)
09d92015 7160 {
c19d1205
ZW
7161 inst.error = _("instruction does not accept scaled register index");
7162 return;
09d92015 7163 }
a737bd4d 7164
c19d1205 7165 encode_arm_addr_mode_common (i, is_t);
a737bd4d 7166
c19d1205
ZW
7167 if (inst.operands[i].immisreg)
7168 {
5be8be5d
DG
7169 constraint ((inst.operands[i].imm == REG_PC
7170 || inst.operands[i].reg == REG_PC),
7171 BAD_PC_ADDRESSING);
c19d1205
ZW
7172 inst.instruction |= inst.operands[i].imm;
7173 if (!inst.operands[i].negative)
7174 inst.instruction |= INDEX_UP;
7175 }
7176 else /* immediate offset in inst.reloc */
7177 {
5be8be5d
DG
7178 constraint ((inst.operands[i].reg == REG_PC && !inst.reloc.pc_rel
7179 && inst.operands[i].writeback),
7180 BAD_PC_WRITEBACK);
c19d1205
ZW
7181 inst.instruction |= HWOFFSET_IMM;
7182 if (inst.reloc.type == BFD_RELOC_UNUSED)
26d97720
NS
7183 {
7184 /* Prefer + for zero encoded value. */
7185 if (!inst.operands[i].negative)
7186 inst.instruction |= INDEX_UP;
7187
7188 inst.reloc.type = BFD_RELOC_ARM_OFFSET_IMM8;
7189 }
c19d1205 7190 }
a737bd4d
NC
7191}
7192
c19d1205
ZW
7193/* inst.operands[i] was set up by parse_address. Encode it into an
7194 ARM-format instruction. Reject all forms which cannot be encoded
7195 into a coprocessor load/store instruction. If wb_ok is false,
7196 reject use of writeback; if unind_ok is false, reject use of
7197 unindexed addressing. If reloc_override is not 0, use it instead
4962c51a
MS
7198 of BFD_ARM_CP_OFF_IMM, unless the initial relocation is a group one
7199 (in which case it is preserved). */
09d92015 7200
c19d1205
ZW
7201static int
7202encode_arm_cp_address (int i, int wb_ok, int unind_ok, int reloc_override)
09d92015 7203{
c19d1205 7204 inst.instruction |= inst.operands[i].reg << 16;
a737bd4d 7205
9c2799c2 7206 gas_assert (!(inst.operands[i].preind && inst.operands[i].postind));
09d92015 7207
c19d1205 7208 if (!inst.operands[i].preind && !inst.operands[i].postind) /* unindexed */
09d92015 7209 {
9c2799c2 7210 gas_assert (!inst.operands[i].writeback);
c19d1205
ZW
7211 if (!unind_ok)
7212 {
7213 inst.error = _("instruction does not support unindexed addressing");
7214 return FAIL;
7215 }
7216 inst.instruction |= inst.operands[i].imm;
7217 inst.instruction |= INDEX_UP;
7218 return SUCCESS;
09d92015 7219 }
a737bd4d 7220
c19d1205
ZW
7221 if (inst.operands[i].preind)
7222 inst.instruction |= PRE_INDEX;
a737bd4d 7223
c19d1205 7224 if (inst.operands[i].writeback)
09d92015 7225 {
c19d1205
ZW
7226 if (inst.operands[i].reg == REG_PC)
7227 {
7228 inst.error = _("pc may not be used with write-back");
7229 return FAIL;
7230 }
7231 if (!wb_ok)
7232 {
7233 inst.error = _("instruction does not support writeback");
7234 return FAIL;
7235 }
7236 inst.instruction |= WRITE_BACK;
09d92015 7237 }
a737bd4d 7238
c19d1205 7239 if (reloc_override)
21d799b5 7240 inst.reloc.type = (bfd_reloc_code_real_type) reloc_override;
4962c51a
MS
7241 else if ((inst.reloc.type < BFD_RELOC_ARM_ALU_PC_G0_NC
7242 || inst.reloc.type > BFD_RELOC_ARM_LDC_SB_G2)
7243 && inst.reloc.type != BFD_RELOC_ARM_LDR_PC_G0)
7244 {
7245 if (thumb_mode)
7246 inst.reloc.type = BFD_RELOC_ARM_T32_CP_OFF_IMM;
7247 else
7248 inst.reloc.type = BFD_RELOC_ARM_CP_OFF_IMM;
7249 }
7250
26d97720
NS
7251 /* Prefer + for zero encoded value. */
7252 if (!inst.operands[i].negative)
7253 inst.instruction |= INDEX_UP;
7254
c19d1205
ZW
7255 return SUCCESS;
7256}
a737bd4d 7257
c19d1205
ZW
7258/* inst.reloc.exp describes an "=expr" load pseudo-operation.
7259 Determine whether it can be performed with a move instruction; if
7260 it can, convert inst.instruction to that move instruction and
c921be7d
NC
7261 return TRUE; if it can't, convert inst.instruction to a literal-pool
7262 load and return FALSE. If this is not a valid thing to do in the
7263 current context, set inst.error and return TRUE.
a737bd4d 7264
c19d1205
ZW
7265 inst.operands[i] describes the destination register. */
7266
c921be7d 7267static bfd_boolean
c19d1205
ZW
7268move_or_literal_pool (int i, bfd_boolean thumb_p, bfd_boolean mode_3)
7269{
53365c0d
PB
7270 unsigned long tbit;
7271
7272 if (thumb_p)
7273 tbit = (inst.instruction > 0xffff) ? THUMB2_LOAD_BIT : THUMB_LOAD_BIT;
7274 else
7275 tbit = LOAD_BIT;
7276
7277 if ((inst.instruction & tbit) == 0)
09d92015 7278 {
c19d1205 7279 inst.error = _("invalid pseudo operation");
c921be7d 7280 return TRUE;
09d92015 7281 }
c19d1205 7282 if (inst.reloc.exp.X_op != O_constant && inst.reloc.exp.X_op != O_symbol)
09d92015
MM
7283 {
7284 inst.error = _("constant expression expected");
c921be7d 7285 return TRUE;
09d92015 7286 }
c19d1205 7287 if (inst.reloc.exp.X_op == O_constant)
09d92015 7288 {
c19d1205
ZW
7289 if (thumb_p)
7290 {
53365c0d 7291 if (!unified_syntax && (inst.reloc.exp.X_add_number & ~0xFF) == 0)
c19d1205
ZW
7292 {
7293 /* This can be done with a mov(1) instruction. */
7294 inst.instruction = T_OPCODE_MOV_I8 | (inst.operands[i].reg << 8);
7295 inst.instruction |= inst.reloc.exp.X_add_number;
c921be7d 7296 return TRUE;
c19d1205
ZW
7297 }
7298 }
7299 else
7300 {
7301 int value = encode_arm_immediate (inst.reloc.exp.X_add_number);
7302 if (value != FAIL)
7303 {
7304 /* This can be done with a mov instruction. */
7305 inst.instruction &= LITERAL_MASK;
7306 inst.instruction |= INST_IMMEDIATE | (OPCODE_MOV << DATA_OP_SHIFT);
7307 inst.instruction |= value & 0xfff;
c921be7d 7308 return TRUE;
c19d1205 7309 }
09d92015 7310
c19d1205
ZW
7311 value = encode_arm_immediate (~inst.reloc.exp.X_add_number);
7312 if (value != FAIL)
7313 {
7314 /* This can be done with a mvn instruction. */
7315 inst.instruction &= LITERAL_MASK;
7316 inst.instruction |= INST_IMMEDIATE | (OPCODE_MVN << DATA_OP_SHIFT);
7317 inst.instruction |= value & 0xfff;
c921be7d 7318 return TRUE;
c19d1205
ZW
7319 }
7320 }
09d92015
MM
7321 }
7322
c19d1205
ZW
7323 if (add_to_lit_pool () == FAIL)
7324 {
7325 inst.error = _("literal pool insertion failed");
c921be7d 7326 return TRUE;
c19d1205
ZW
7327 }
7328 inst.operands[1].reg = REG_PC;
7329 inst.operands[1].isreg = 1;
7330 inst.operands[1].preind = 1;
7331 inst.reloc.pc_rel = 1;
7332 inst.reloc.type = (thumb_p
7333 ? BFD_RELOC_ARM_THUMB_OFFSET
7334 : (mode_3
7335 ? BFD_RELOC_ARM_HWLITERAL
7336 : BFD_RELOC_ARM_LITERAL));
c921be7d 7337 return FALSE;
09d92015
MM
7338}
7339
5f4273c7 7340/* Functions for instruction encoding, sorted by sub-architecture.
c19d1205
ZW
7341 First some generics; their names are taken from the conventional
7342 bit positions for register arguments in ARM format instructions. */
09d92015 7343
a737bd4d 7344static void
c19d1205 7345do_noargs (void)
09d92015 7346{
c19d1205 7347}
a737bd4d 7348
c19d1205
ZW
7349static void
7350do_rd (void)
7351{
7352 inst.instruction |= inst.operands[0].reg << 12;
7353}
a737bd4d 7354
c19d1205
ZW
7355static void
7356do_rd_rm (void)
7357{
7358 inst.instruction |= inst.operands[0].reg << 12;
7359 inst.instruction |= inst.operands[1].reg;
7360}
09d92015 7361
c19d1205
ZW
7362static void
7363do_rd_rn (void)
7364{
7365 inst.instruction |= inst.operands[0].reg << 12;
7366 inst.instruction |= inst.operands[1].reg << 16;
7367}
a737bd4d 7368
c19d1205
ZW
7369static void
7370do_rn_rd (void)
7371{
7372 inst.instruction |= inst.operands[0].reg << 16;
7373 inst.instruction |= inst.operands[1].reg << 12;
7374}
09d92015 7375
59d09be6
MGD
7376static bfd_boolean
7377check_obsolete (const arm_feature_set *feature, const char *msg)
7378{
7379 if (ARM_CPU_IS_ANY (cpu_variant))
7380 {
7381 as_warn ("%s", msg);
7382 return TRUE;
7383 }
7384 else if (ARM_CPU_HAS_FEATURE (cpu_variant, *feature))
7385 {
7386 as_bad ("%s", msg);
7387 return TRUE;
7388 }
7389
7390 return FALSE;
7391}
7392
c19d1205
ZW
7393static void
7394do_rd_rm_rn (void)
7395{
9a64e435 7396 unsigned Rn = inst.operands[2].reg;
708587a4 7397 /* Enforce restrictions on SWP instruction. */
9a64e435 7398 if ((inst.instruction & 0x0fbfffff) == 0x01000090)
56adecf4
DG
7399 {
7400 constraint (Rn == inst.operands[0].reg || Rn == inst.operands[1].reg,
7401 _("Rn must not overlap other operands"));
7402
59d09be6
MGD
7403 /* SWP{b} is obsolete for ARMv8-A, and deprecated for ARMv6* and ARMv7.
7404 */
7405 if (!check_obsolete (&arm_ext_v8,
7406 _("swp{b} use is obsoleted for ARMv8 and later"))
7407 && warn_on_deprecated
7408 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6))
7409 as_warn (_("swp{b} use is deprecated for ARMv6 and ARMv7"));
56adecf4 7410 }
59d09be6 7411
c19d1205
ZW
7412 inst.instruction |= inst.operands[0].reg << 12;
7413 inst.instruction |= inst.operands[1].reg;
9a64e435 7414 inst.instruction |= Rn << 16;
c19d1205 7415}
09d92015 7416
c19d1205
ZW
7417static void
7418do_rd_rn_rm (void)
7419{
7420 inst.instruction |= inst.operands[0].reg << 12;
7421 inst.instruction |= inst.operands[1].reg << 16;
7422 inst.instruction |= inst.operands[2].reg;
7423}
a737bd4d 7424
c19d1205
ZW
7425static void
7426do_rm_rd_rn (void)
7427{
5be8be5d
DG
7428 constraint ((inst.operands[2].reg == REG_PC), BAD_PC);
7429 constraint (((inst.reloc.exp.X_op != O_constant
7430 && inst.reloc.exp.X_op != O_illegal)
7431 || inst.reloc.exp.X_add_number != 0),
7432 BAD_ADDR_MODE);
c19d1205
ZW
7433 inst.instruction |= inst.operands[0].reg;
7434 inst.instruction |= inst.operands[1].reg << 12;
7435 inst.instruction |= inst.operands[2].reg << 16;
7436}
09d92015 7437
c19d1205
ZW
7438static void
7439do_imm0 (void)
7440{
7441 inst.instruction |= inst.operands[0].imm;
7442}
09d92015 7443
c19d1205
ZW
7444static void
7445do_rd_cpaddr (void)
7446{
7447 inst.instruction |= inst.operands[0].reg << 12;
7448 encode_arm_cp_address (1, TRUE, TRUE, 0);
09d92015 7449}
a737bd4d 7450
c19d1205
ZW
7451/* ARM instructions, in alphabetical order by function name (except
7452 that wrapper functions appear immediately after the function they
7453 wrap). */
09d92015 7454
c19d1205
ZW
7455/* This is a pseudo-op of the form "adr rd, label" to be converted
7456 into a relative address of the form "add rd, pc, #label-.-8". */
09d92015
MM
7457
7458static void
c19d1205 7459do_adr (void)
09d92015 7460{
c19d1205 7461 inst.instruction |= (inst.operands[0].reg << 12); /* Rd */
a737bd4d 7462
c19d1205
ZW
7463 /* Frag hacking will turn this into a sub instruction if the offset turns
7464 out to be negative. */
7465 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
c19d1205 7466 inst.reloc.pc_rel = 1;
2fc8bdac 7467 inst.reloc.exp.X_add_number -= 8;
c19d1205 7468}
b99bd4ef 7469
c19d1205
ZW
7470/* This is a pseudo-op of the form "adrl rd, label" to be converted
7471 into a relative address of the form:
7472 add rd, pc, #low(label-.-8)"
7473 add rd, rd, #high(label-.-8)" */
b99bd4ef 7474
c19d1205
ZW
7475static void
7476do_adrl (void)
7477{
7478 inst.instruction |= (inst.operands[0].reg << 12); /* Rd */
a737bd4d 7479
c19d1205
ZW
7480 /* Frag hacking will turn this into a sub instruction if the offset turns
7481 out to be negative. */
7482 inst.reloc.type = BFD_RELOC_ARM_ADRL_IMMEDIATE;
c19d1205
ZW
7483 inst.reloc.pc_rel = 1;
7484 inst.size = INSN_SIZE * 2;
2fc8bdac 7485 inst.reloc.exp.X_add_number -= 8;
b99bd4ef
NC
7486}
7487
b99bd4ef 7488static void
c19d1205 7489do_arit (void)
b99bd4ef 7490{
c19d1205
ZW
7491 if (!inst.operands[1].present)
7492 inst.operands[1].reg = inst.operands[0].reg;
7493 inst.instruction |= inst.operands[0].reg << 12;
7494 inst.instruction |= inst.operands[1].reg << 16;
7495 encode_arm_shifter_operand (2);
7496}
b99bd4ef 7497
62b3e311
PB
7498static void
7499do_barrier (void)
7500{
7501 if (inst.operands[0].present)
7502 {
7503 constraint ((inst.instruction & 0xf0) != 0x40
52e7f43d
RE
7504 && inst.operands[0].imm > 0xf
7505 && inst.operands[0].imm < 0x0,
bd3ba5d1 7506 _("bad barrier type"));
62b3e311
PB
7507 inst.instruction |= inst.operands[0].imm;
7508 }
7509 else
7510 inst.instruction |= 0xf;
7511}
7512
c19d1205
ZW
7513static void
7514do_bfc (void)
7515{
7516 unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
7517 constraint (msb > 32, _("bit-field extends past end of register"));
7518 /* The instruction encoding stores the LSB and MSB,
7519 not the LSB and width. */
7520 inst.instruction |= inst.operands[0].reg << 12;
7521 inst.instruction |= inst.operands[1].imm << 7;
7522 inst.instruction |= (msb - 1) << 16;
7523}
b99bd4ef 7524
c19d1205
ZW
7525static void
7526do_bfi (void)
7527{
7528 unsigned int msb;
b99bd4ef 7529
c19d1205
ZW
7530 /* #0 in second position is alternative syntax for bfc, which is
7531 the same instruction but with REG_PC in the Rm field. */
7532 if (!inst.operands[1].isreg)
7533 inst.operands[1].reg = REG_PC;
b99bd4ef 7534
c19d1205
ZW
7535 msb = inst.operands[2].imm + inst.operands[3].imm;
7536 constraint (msb > 32, _("bit-field extends past end of register"));
7537 /* The instruction encoding stores the LSB and MSB,
7538 not the LSB and width. */
7539 inst.instruction |= inst.operands[0].reg << 12;
7540 inst.instruction |= inst.operands[1].reg;
7541 inst.instruction |= inst.operands[2].imm << 7;
7542 inst.instruction |= (msb - 1) << 16;
b99bd4ef
NC
7543}
7544
b99bd4ef 7545static void
c19d1205 7546do_bfx (void)
b99bd4ef 7547{
c19d1205
ZW
7548 constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
7549 _("bit-field extends past end of register"));
7550 inst.instruction |= inst.operands[0].reg << 12;
7551 inst.instruction |= inst.operands[1].reg;
7552 inst.instruction |= inst.operands[2].imm << 7;
7553 inst.instruction |= (inst.operands[3].imm - 1) << 16;
7554}
09d92015 7555
c19d1205
ZW
7556/* ARM V5 breakpoint instruction (argument parse)
7557 BKPT <16 bit unsigned immediate>
7558 Instruction is not conditional.
7559 The bit pattern given in insns[] has the COND_ALWAYS condition,
7560 and it is an error if the caller tried to override that. */
b99bd4ef 7561
c19d1205
ZW
7562static void
7563do_bkpt (void)
7564{
7565 /* Top 12 of 16 bits to bits 19:8. */
7566 inst.instruction |= (inst.operands[0].imm & 0xfff0) << 4;
09d92015 7567
c19d1205
ZW
7568 /* Bottom 4 of 16 bits to bits 3:0. */
7569 inst.instruction |= inst.operands[0].imm & 0xf;
7570}
09d92015 7571
c19d1205
ZW
7572static void
7573encode_branch (int default_reloc)
7574{
7575 if (inst.operands[0].hasreloc)
7576 {
0855e32b
NS
7577 constraint (inst.operands[0].imm != BFD_RELOC_ARM_PLT32
7578 && inst.operands[0].imm != BFD_RELOC_ARM_TLS_CALL,
7579 _("the only valid suffixes here are '(plt)' and '(tlscall)'"));
7580 inst.reloc.type = inst.operands[0].imm == BFD_RELOC_ARM_PLT32
7581 ? BFD_RELOC_ARM_PLT32
7582 : thumb_mode ? BFD_RELOC_ARM_THM_TLS_CALL : BFD_RELOC_ARM_TLS_CALL;
c19d1205 7583 }
b99bd4ef 7584 else
9ae92b05 7585 inst.reloc.type = (bfd_reloc_code_real_type) default_reloc;
2fc8bdac 7586 inst.reloc.pc_rel = 1;
b99bd4ef
NC
7587}
7588
b99bd4ef 7589static void
c19d1205 7590do_branch (void)
b99bd4ef 7591{
39b41c9c
PB
7592#ifdef OBJ_ELF
7593 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7594 encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7595 else
7596#endif
7597 encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
7598}
7599
7600static void
7601do_bl (void)
7602{
7603#ifdef OBJ_ELF
7604 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
7605 {
7606 if (inst.cond == COND_ALWAYS)
7607 encode_branch (BFD_RELOC_ARM_PCREL_CALL);
7608 else
7609 encode_branch (BFD_RELOC_ARM_PCREL_JUMP);
7610 }
7611 else
7612#endif
7613 encode_branch (BFD_RELOC_ARM_PCREL_BRANCH);
c19d1205 7614}
b99bd4ef 7615
c19d1205
ZW
7616/* ARM V5 branch-link-exchange instruction (argument parse)
7617 BLX <target_addr> ie BLX(1)
7618 BLX{<condition>} <Rm> ie BLX(2)
7619 Unfortunately, there are two different opcodes for this mnemonic.
7620 So, the insns[].value is not used, and the code here zaps values
7621 into inst.instruction.
7622 Also, the <target_addr> can be 25 bits, hence has its own reloc. */
b99bd4ef 7623
c19d1205
ZW
7624static void
7625do_blx (void)
7626{
7627 if (inst.operands[0].isreg)
b99bd4ef 7628 {
c19d1205
ZW
7629 /* Arg is a register; the opcode provided by insns[] is correct.
7630 It is not illegal to do "blx pc", just useless. */
7631 if (inst.operands[0].reg == REG_PC)
7632 as_tsktsk (_("use of r15 in blx in ARM mode is not really useful"));
b99bd4ef 7633
c19d1205
ZW
7634 inst.instruction |= inst.operands[0].reg;
7635 }
7636 else
b99bd4ef 7637 {
c19d1205 7638 /* Arg is an address; this instruction cannot be executed
267bf995
RR
7639 conditionally, and the opcode must be adjusted.
7640 We retain the BFD_RELOC_ARM_PCREL_BLX till the very end
7641 where we generate out a BFD_RELOC_ARM_PCREL_CALL instead. */
c19d1205 7642 constraint (inst.cond != COND_ALWAYS, BAD_COND);
2fc8bdac 7643 inst.instruction = 0xfa000000;
267bf995 7644 encode_branch (BFD_RELOC_ARM_PCREL_BLX);
b99bd4ef 7645 }
c19d1205
ZW
7646}
7647
7648static void
7649do_bx (void)
7650{
845b51d6
PB
7651 bfd_boolean want_reloc;
7652
c19d1205
ZW
7653 if (inst.operands[0].reg == REG_PC)
7654 as_tsktsk (_("use of r15 in bx in ARM mode is not really useful"));
b99bd4ef 7655
c19d1205 7656 inst.instruction |= inst.operands[0].reg;
845b51d6
PB
7657 /* Output R_ARM_V4BX relocations if is an EABI object that looks like
7658 it is for ARMv4t or earlier. */
7659 want_reloc = !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5);
7660 if (object_arch && !ARM_CPU_HAS_FEATURE (*object_arch, arm_ext_v5))
7661 want_reloc = TRUE;
7662
5ad34203 7663#ifdef OBJ_ELF
845b51d6 7664 if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
5ad34203 7665#endif
584206db 7666 want_reloc = FALSE;
845b51d6
PB
7667
7668 if (want_reloc)
7669 inst.reloc.type = BFD_RELOC_ARM_V4BX;
09d92015
MM
7670}
7671
c19d1205
ZW
7672
7673/* ARM v5TEJ. Jump to Jazelle code. */
a737bd4d
NC
7674
7675static void
c19d1205 7676do_bxj (void)
a737bd4d 7677{
c19d1205
ZW
7678 if (inst.operands[0].reg == REG_PC)
7679 as_tsktsk (_("use of r15 in bxj is not really useful"));
7680
7681 inst.instruction |= inst.operands[0].reg;
a737bd4d
NC
7682}
7683
c19d1205
ZW
7684/* Co-processor data operation:
7685 CDP{cond} <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>}
7686 CDP2 <coproc>, <opcode_1>, <CRd>, <CRn>, <CRm>{, <opcode_2>} */
7687static void
7688do_cdp (void)
7689{
7690 inst.instruction |= inst.operands[0].reg << 8;
7691 inst.instruction |= inst.operands[1].imm << 20;
7692 inst.instruction |= inst.operands[2].reg << 12;
7693 inst.instruction |= inst.operands[3].reg << 16;
7694 inst.instruction |= inst.operands[4].reg;
7695 inst.instruction |= inst.operands[5].imm << 5;
7696}
a737bd4d
NC
7697
7698static void
c19d1205 7699do_cmp (void)
a737bd4d 7700{
c19d1205
ZW
7701 inst.instruction |= inst.operands[0].reg << 16;
7702 encode_arm_shifter_operand (1);
a737bd4d
NC
7703}
7704
c19d1205
ZW
7705/* Transfer between coprocessor and ARM registers.
7706 MRC{cond} <coproc>, <opcode_1>, <Rd>, <CRn>, <CRm>{, <opcode_2>}
7707 MRC2
7708 MCR{cond}
7709 MCR2
7710
7711 No special properties. */
09d92015 7712
dcbd0d71
MGD
7713struct deprecated_coproc_regs_s
7714{
7715 unsigned cp;
7716 int opc1;
7717 unsigned crn;
7718 unsigned crm;
7719 int opc2;
7720 arm_feature_set deprecated;
7721 arm_feature_set obsoleted;
7722 const char *dep_msg;
7723 const char *obs_msg;
7724};
7725
7726#define DEPR_ACCESS_V8 \
7727 N_("This coprocessor register access is deprecated in ARMv8")
7728
7729/* Table of all deprecated coprocessor registers. */
7730static struct deprecated_coproc_regs_s deprecated_coproc_regs[] =
7731{
7732 {15, 0, 7, 10, 5, /* CP15DMB. */
7733 ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7734 DEPR_ACCESS_V8, NULL},
7735 {15, 0, 7, 10, 4, /* CP15DSB. */
7736 ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7737 DEPR_ACCESS_V8, NULL},
7738 {15, 0, 7, 5, 4, /* CP15ISB. */
7739 ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7740 DEPR_ACCESS_V8, NULL},
7741 {14, 6, 1, 0, 0, /* TEEHBR. */
7742 ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7743 DEPR_ACCESS_V8, NULL},
7744 {14, 6, 0, 0, 0, /* TEECR. */
7745 ARM_FEATURE (ARM_EXT_V8, 0), ARM_FEATURE (0, 0),
7746 DEPR_ACCESS_V8, NULL},
7747};
7748
7749#undef DEPR_ACCESS_V8
7750
7751static const size_t deprecated_coproc_reg_count =
7752 sizeof (deprecated_coproc_regs) / sizeof (deprecated_coproc_regs[0]);
7753
09d92015 7754static void
c19d1205 7755do_co_reg (void)
09d92015 7756{
fdfde340 7757 unsigned Rd;
dcbd0d71 7758 size_t i;
fdfde340
JM
7759
7760 Rd = inst.operands[2].reg;
7761 if (thumb_mode)
7762 {
7763 if (inst.instruction == 0xee000010
7764 || inst.instruction == 0xfe000010)
7765 /* MCR, MCR2 */
7766 reject_bad_reg (Rd);
7767 else
7768 /* MRC, MRC2 */
7769 constraint (Rd == REG_SP, BAD_SP);
7770 }
7771 else
7772 {
7773 /* MCR */
7774 if (inst.instruction == 0xe000010)
7775 constraint (Rd == REG_PC, BAD_PC);
7776 }
7777
dcbd0d71
MGD
7778 for (i = 0; i < deprecated_coproc_reg_count; ++i)
7779 {
7780 const struct deprecated_coproc_regs_s *r =
7781 deprecated_coproc_regs + i;
7782
7783 if (inst.operands[0].reg == r->cp
7784 && inst.operands[1].imm == r->opc1
7785 && inst.operands[3].reg == r->crn
7786 && inst.operands[4].reg == r->crm
7787 && inst.operands[5].imm == r->opc2)
7788 {
7789 if (!check_obsolete (&r->obsoleted, r->obs_msg)
7790 && warn_on_deprecated
7791 && ARM_CPU_HAS_FEATURE (cpu_variant, r->deprecated))
7792 as_warn ("%s", r->dep_msg);
7793 }
7794 }
fdfde340 7795
c19d1205
ZW
7796 inst.instruction |= inst.operands[0].reg << 8;
7797 inst.instruction |= inst.operands[1].imm << 21;
fdfde340 7798 inst.instruction |= Rd << 12;
c19d1205
ZW
7799 inst.instruction |= inst.operands[3].reg << 16;
7800 inst.instruction |= inst.operands[4].reg;
7801 inst.instruction |= inst.operands[5].imm << 5;
7802}
09d92015 7803
c19d1205
ZW
7804/* Transfer between coprocessor register and pair of ARM registers.
7805 MCRR{cond} <coproc>, <opcode>, <Rd>, <Rn>, <CRm>.
7806 MCRR2
7807 MRRC{cond}
7808 MRRC2
b99bd4ef 7809
c19d1205 7810 Two XScale instructions are special cases of these:
09d92015 7811
c19d1205
ZW
7812 MAR{cond} acc0, <RdLo>, <RdHi> == MCRR{cond} p0, #0, <RdLo>, <RdHi>, c0
7813 MRA{cond} acc0, <RdLo>, <RdHi> == MRRC{cond} p0, #0, <RdLo>, <RdHi>, c0
b99bd4ef 7814
5f4273c7 7815 Result unpredictable if Rd or Rn is R15. */
a737bd4d 7816
c19d1205
ZW
7817static void
7818do_co_reg2c (void)
7819{
fdfde340
JM
7820 unsigned Rd, Rn;
7821
7822 Rd = inst.operands[2].reg;
7823 Rn = inst.operands[3].reg;
7824
7825 if (thumb_mode)
7826 {
7827 reject_bad_reg (Rd);
7828 reject_bad_reg (Rn);
7829 }
7830 else
7831 {
7832 constraint (Rd == REG_PC, BAD_PC);
7833 constraint (Rn == REG_PC, BAD_PC);
7834 }
7835
c19d1205
ZW
7836 inst.instruction |= inst.operands[0].reg << 8;
7837 inst.instruction |= inst.operands[1].imm << 4;
fdfde340
JM
7838 inst.instruction |= Rd << 12;
7839 inst.instruction |= Rn << 16;
c19d1205 7840 inst.instruction |= inst.operands[4].reg;
b99bd4ef
NC
7841}
7842
c19d1205
ZW
7843static void
7844do_cpsi (void)
7845{
7846 inst.instruction |= inst.operands[0].imm << 6;
a028a6f5
PB
7847 if (inst.operands[1].present)
7848 {
7849 inst.instruction |= CPSI_MMOD;
7850 inst.instruction |= inst.operands[1].imm;
7851 }
c19d1205 7852}
b99bd4ef 7853
62b3e311
PB
7854static void
7855do_dbg (void)
7856{
7857 inst.instruction |= inst.operands[0].imm;
7858}
7859
eea54501
MGD
7860static void
7861do_div (void)
7862{
7863 unsigned Rd, Rn, Rm;
7864
7865 Rd = inst.operands[0].reg;
7866 Rn = (inst.operands[1].present
7867 ? inst.operands[1].reg : Rd);
7868 Rm = inst.operands[2].reg;
7869
7870 constraint ((Rd == REG_PC), BAD_PC);
7871 constraint ((Rn == REG_PC), BAD_PC);
7872 constraint ((Rm == REG_PC), BAD_PC);
7873
7874 inst.instruction |= Rd << 16;
7875 inst.instruction |= Rn << 0;
7876 inst.instruction |= Rm << 8;
7877}
7878
b99bd4ef 7879static void
c19d1205 7880do_it (void)
b99bd4ef 7881{
c19d1205 7882 /* There is no IT instruction in ARM mode. We
e07e6e58
NC
7883 process it to do the validation as if in
7884 thumb mode, just in case the code gets
7885 assembled for thumb using the unified syntax. */
7886
c19d1205 7887 inst.size = 0;
e07e6e58
NC
7888 if (unified_syntax)
7889 {
7890 set_it_insn_type (IT_INSN);
7891 now_it.mask = (inst.instruction & 0xf) | 0x10;
7892 now_it.cc = inst.operands[0].imm;
7893 }
09d92015 7894}
b99bd4ef 7895
6530b175
NC
7896/* If there is only one register in the register list,
7897 then return its register number. Otherwise return -1. */
7898static int
7899only_one_reg_in_list (int range)
7900{
7901 int i = ffs (range) - 1;
7902 return (i > 15 || range != (1 << i)) ? -1 : i;
7903}
7904
09d92015 7905static void
6530b175 7906encode_ldmstm(int from_push_pop_mnem)
ea6ef066 7907{
c19d1205
ZW
7908 int base_reg = inst.operands[0].reg;
7909 int range = inst.operands[1].imm;
6530b175 7910 int one_reg;
ea6ef066 7911
c19d1205
ZW
7912 inst.instruction |= base_reg << 16;
7913 inst.instruction |= range;
ea6ef066 7914
c19d1205
ZW
7915 if (inst.operands[1].writeback)
7916 inst.instruction |= LDM_TYPE_2_OR_3;
09d92015 7917
c19d1205 7918 if (inst.operands[0].writeback)
ea6ef066 7919 {
c19d1205
ZW
7920 inst.instruction |= WRITE_BACK;
7921 /* Check for unpredictable uses of writeback. */
7922 if (inst.instruction & LOAD_BIT)
09d92015 7923 {
c19d1205
ZW
7924 /* Not allowed in LDM type 2. */
7925 if ((inst.instruction & LDM_TYPE_2_OR_3)
7926 && ((range & (1 << REG_PC)) == 0))
7927 as_warn (_("writeback of base register is UNPREDICTABLE"));
7928 /* Only allowed if base reg not in list for other types. */
7929 else if (range & (1 << base_reg))
7930 as_warn (_("writeback of base register when in register list is UNPREDICTABLE"));
7931 }
7932 else /* STM. */
7933 {
7934 /* Not allowed for type 2. */
7935 if (inst.instruction & LDM_TYPE_2_OR_3)
7936 as_warn (_("writeback of base register is UNPREDICTABLE"));
7937 /* Only allowed if base reg not in list, or first in list. */
7938 else if ((range & (1 << base_reg))
7939 && (range & ((1 << base_reg) - 1)))
7940 as_warn (_("if writeback register is in list, it must be the lowest reg in the list"));
09d92015 7941 }
ea6ef066 7942 }
6530b175
NC
7943
7944 /* If PUSH/POP has only one register, then use the A2 encoding. */
7945 one_reg = only_one_reg_in_list (range);
7946 if (from_push_pop_mnem && one_reg >= 0)
7947 {
7948 int is_push = (inst.instruction & A_PUSH_POP_OP_MASK) == A1_OPCODE_PUSH;
7949
7950 inst.instruction &= A_COND_MASK;
7951 inst.instruction |= is_push ? A2_OPCODE_PUSH : A2_OPCODE_POP;
7952 inst.instruction |= one_reg << 12;
7953 }
7954}
7955
7956static void
7957do_ldmstm (void)
7958{
7959 encode_ldmstm (/*from_push_pop_mnem=*/FALSE);
a737bd4d
NC
7960}
7961
c19d1205
ZW
7962/* ARMv5TE load-consecutive (argument parse)
7963 Mode is like LDRH.
7964
7965 LDRccD R, mode
7966 STRccD R, mode. */
7967
a737bd4d 7968static void
c19d1205 7969do_ldrd (void)
a737bd4d 7970{
c19d1205 7971 constraint (inst.operands[0].reg % 2 != 0,
c56791bb 7972 _("first transfer register must be even"));
c19d1205
ZW
7973 constraint (inst.operands[1].present
7974 && inst.operands[1].reg != inst.operands[0].reg + 1,
c56791bb 7975 _("can only transfer two consecutive registers"));
c19d1205
ZW
7976 constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
7977 constraint (!inst.operands[2].isreg, _("'[' expected"));
a737bd4d 7978
c19d1205
ZW
7979 if (!inst.operands[1].present)
7980 inst.operands[1].reg = inst.operands[0].reg + 1;
5f4273c7 7981
c56791bb
RE
7982 /* encode_arm_addr_mode_3 will diagnose overlap between the base
7983 register and the first register written; we have to diagnose
7984 overlap between the base and the second register written here. */
ea6ef066 7985
c56791bb
RE
7986 if (inst.operands[2].reg == inst.operands[1].reg
7987 && (inst.operands[2].writeback || inst.operands[2].postind))
7988 as_warn (_("base register written back, and overlaps "
7989 "second transfer register"));
b05fe5cf 7990
c56791bb
RE
7991 if (!(inst.instruction & V4_STR_BIT))
7992 {
c19d1205 7993 /* For an index-register load, the index register must not overlap the
c56791bb
RE
7994 destination (even if not write-back). */
7995 if (inst.operands[2].immisreg
7996 && ((unsigned) inst.operands[2].imm == inst.operands[0].reg
7997 || (unsigned) inst.operands[2].imm == inst.operands[1].reg))
7998 as_warn (_("index register overlaps transfer register"));
b05fe5cf 7999 }
c19d1205
ZW
8000 inst.instruction |= inst.operands[0].reg << 12;
8001 encode_arm_addr_mode_3 (2, /*is_t=*/FALSE);
b05fe5cf
ZW
8002}
8003
8004static void
c19d1205 8005do_ldrex (void)
b05fe5cf 8006{
c19d1205
ZW
8007 constraint (!inst.operands[1].isreg || !inst.operands[1].preind
8008 || inst.operands[1].postind || inst.operands[1].writeback
8009 || inst.operands[1].immisreg || inst.operands[1].shifted
01cfc07f
NC
8010 || inst.operands[1].negative
8011 /* This can arise if the programmer has written
8012 strex rN, rM, foo
8013 or if they have mistakenly used a register name as the last
8014 operand, eg:
8015 strex rN, rM, rX
8016 It is very difficult to distinguish between these two cases
8017 because "rX" might actually be a label. ie the register
8018 name has been occluded by a symbol of the same name. So we
8019 just generate a general 'bad addressing mode' type error
8020 message and leave it up to the programmer to discover the
8021 true cause and fix their mistake. */
8022 || (inst.operands[1].reg == REG_PC),
8023 BAD_ADDR_MODE);
b05fe5cf 8024
c19d1205
ZW
8025 constraint (inst.reloc.exp.X_op != O_constant
8026 || inst.reloc.exp.X_add_number != 0,
8027 _("offset must be zero in ARM encoding"));
b05fe5cf 8028
5be8be5d
DG
8029 constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
8030
c19d1205
ZW
8031 inst.instruction |= inst.operands[0].reg << 12;
8032 inst.instruction |= inst.operands[1].reg << 16;
8033 inst.reloc.type = BFD_RELOC_UNUSED;
b05fe5cf
ZW
8034}
8035
8036static void
c19d1205 8037do_ldrexd (void)
b05fe5cf 8038{
c19d1205
ZW
8039 constraint (inst.operands[0].reg % 2 != 0,
8040 _("even register required"));
8041 constraint (inst.operands[1].present
8042 && inst.operands[1].reg != inst.operands[0].reg + 1,
8043 _("can only load two consecutive registers"));
8044 /* If op 1 were present and equal to PC, this function wouldn't
8045 have been called in the first place. */
8046 constraint (inst.operands[0].reg == REG_LR, _("r14 not allowed here"));
b05fe5cf 8047
c19d1205
ZW
8048 inst.instruction |= inst.operands[0].reg << 12;
8049 inst.instruction |= inst.operands[2].reg << 16;
b05fe5cf
ZW
8050}
8051
1be5fd2e
NC
8052/* In both ARM and thumb state 'ldr pc, #imm' with an immediate
8053 which is not a multiple of four is UNPREDICTABLE. */
8054static void
8055check_ldr_r15_aligned (void)
8056{
8057 constraint (!(inst.operands[1].immisreg)
8058 && (inst.operands[0].reg == REG_PC
8059 && inst.operands[1].reg == REG_PC
8060 && (inst.reloc.exp.X_add_number & 0x3)),
8061 _("ldr to register 15 must be 4-byte alligned"));
8062}
8063
b05fe5cf 8064static void
c19d1205 8065do_ldst (void)
b05fe5cf 8066{
c19d1205
ZW
8067 inst.instruction |= inst.operands[0].reg << 12;
8068 if (!inst.operands[1].isreg)
8069 if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/FALSE))
b05fe5cf 8070 return;
c19d1205 8071 encode_arm_addr_mode_2 (1, /*is_t=*/FALSE);
1be5fd2e 8072 check_ldr_r15_aligned ();
b05fe5cf
ZW
8073}
8074
8075static void
c19d1205 8076do_ldstt (void)
b05fe5cf 8077{
c19d1205
ZW
8078 /* ldrt/strt always use post-indexed addressing. Turn [Rn] into [Rn]! and
8079 reject [Rn,...]. */
8080 if (inst.operands[1].preind)
b05fe5cf 8081 {
bd3ba5d1
NC
8082 constraint (inst.reloc.exp.X_op != O_constant
8083 || inst.reloc.exp.X_add_number != 0,
c19d1205 8084 _("this instruction requires a post-indexed address"));
b05fe5cf 8085
c19d1205
ZW
8086 inst.operands[1].preind = 0;
8087 inst.operands[1].postind = 1;
8088 inst.operands[1].writeback = 1;
b05fe5cf 8089 }
c19d1205
ZW
8090 inst.instruction |= inst.operands[0].reg << 12;
8091 encode_arm_addr_mode_2 (1, /*is_t=*/TRUE);
8092}
b05fe5cf 8093
c19d1205 8094/* Halfword and signed-byte load/store operations. */
b05fe5cf 8095
c19d1205
ZW
8096static void
8097do_ldstv4 (void)
8098{
ff4a8d2b 8099 constraint (inst.operands[0].reg == REG_PC, BAD_PC);
c19d1205
ZW
8100 inst.instruction |= inst.operands[0].reg << 12;
8101 if (!inst.operands[1].isreg)
8102 if (move_or_literal_pool (0, /*thumb_p=*/FALSE, /*mode_3=*/TRUE))
b05fe5cf 8103 return;
c19d1205 8104 encode_arm_addr_mode_3 (1, /*is_t=*/FALSE);
b05fe5cf
ZW
8105}
8106
8107static void
c19d1205 8108do_ldsttv4 (void)
b05fe5cf 8109{
c19d1205
ZW
8110 /* ldrt/strt always use post-indexed addressing. Turn [Rn] into [Rn]! and
8111 reject [Rn,...]. */
8112 if (inst.operands[1].preind)
b05fe5cf 8113 {
bd3ba5d1
NC
8114 constraint (inst.reloc.exp.X_op != O_constant
8115 || inst.reloc.exp.X_add_number != 0,
c19d1205 8116 _("this instruction requires a post-indexed address"));
b05fe5cf 8117
c19d1205
ZW
8118 inst.operands[1].preind = 0;
8119 inst.operands[1].postind = 1;
8120 inst.operands[1].writeback = 1;
b05fe5cf 8121 }
c19d1205
ZW
8122 inst.instruction |= inst.operands[0].reg << 12;
8123 encode_arm_addr_mode_3 (1, /*is_t=*/TRUE);
8124}
b05fe5cf 8125
c19d1205
ZW
8126/* Co-processor register load/store.
8127 Format: <LDC|STC>{cond}[L] CP#,CRd,<address> */
8128static void
8129do_lstc (void)
8130{
8131 inst.instruction |= inst.operands[0].reg << 8;
8132 inst.instruction |= inst.operands[1].reg << 12;
8133 encode_arm_cp_address (2, TRUE, TRUE, 0);
b05fe5cf
ZW
8134}
8135
b05fe5cf 8136static void
c19d1205 8137do_mlas (void)
b05fe5cf 8138{
8fb9d7b9 8139 /* This restriction does not apply to mls (nor to mla in v6 or later). */
c19d1205 8140 if (inst.operands[0].reg == inst.operands[1].reg
8fb9d7b9 8141 && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6)
c19d1205 8142 && !(inst.instruction & 0x00400000))
8fb9d7b9 8143 as_tsktsk (_("Rd and Rm should be different in mla"));
b05fe5cf 8144
c19d1205
ZW
8145 inst.instruction |= inst.operands[0].reg << 16;
8146 inst.instruction |= inst.operands[1].reg;
8147 inst.instruction |= inst.operands[2].reg << 8;
8148 inst.instruction |= inst.operands[3].reg << 12;
c19d1205 8149}
b05fe5cf 8150
c19d1205
ZW
8151static void
8152do_mov (void)
8153{
8154 inst.instruction |= inst.operands[0].reg << 12;
8155 encode_arm_shifter_operand (1);
8156}
b05fe5cf 8157
c19d1205
ZW
8158/* ARM V6T2 16-bit immediate register load: MOV[WT]{cond} Rd, #<imm16>. */
8159static void
8160do_mov16 (void)
8161{
b6895b4f
PB
8162 bfd_vma imm;
8163 bfd_boolean top;
8164
8165 top = (inst.instruction & 0x00400000) != 0;
8166 constraint (top && inst.reloc.type == BFD_RELOC_ARM_MOVW,
8167 _(":lower16: not allowed this instruction"));
8168 constraint (!top && inst.reloc.type == BFD_RELOC_ARM_MOVT,
8169 _(":upper16: not allowed instruction"));
c19d1205 8170 inst.instruction |= inst.operands[0].reg << 12;
b6895b4f
PB
8171 if (inst.reloc.type == BFD_RELOC_UNUSED)
8172 {
8173 imm = inst.reloc.exp.X_add_number;
8174 /* The value is in two pieces: 0:11, 16:19. */
8175 inst.instruction |= (imm & 0x00000fff);
8176 inst.instruction |= (imm & 0x0000f000) << 4;
8177 }
b05fe5cf 8178}
b99bd4ef 8179
037e8744
JB
8180static void do_vfp_nsyn_opcode (const char *);
8181
8182static int
8183do_vfp_nsyn_mrs (void)
8184{
8185 if (inst.operands[0].isvec)
8186 {
8187 if (inst.operands[1].reg != 1)
8188 first_error (_("operand 1 must be FPSCR"));
8189 memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
8190 memset (&inst.operands[1], '\0', sizeof (inst.operands[1]));
8191 do_vfp_nsyn_opcode ("fmstat");
8192 }
8193 else if (inst.operands[1].isvec)
8194 do_vfp_nsyn_opcode ("fmrx");
8195 else
8196 return FAIL;
5f4273c7 8197
037e8744
JB
8198 return SUCCESS;
8199}
8200
8201static int
8202do_vfp_nsyn_msr (void)
8203{
8204 if (inst.operands[0].isvec)
8205 do_vfp_nsyn_opcode ("fmxr");
8206 else
8207 return FAIL;
8208
8209 return SUCCESS;
8210}
8211
f7c21dc7
NC
8212static void
8213do_vmrs (void)
8214{
8215 unsigned Rt = inst.operands[0].reg;
fa94de6b 8216
f7c21dc7
NC
8217 if (thumb_mode && inst.operands[0].reg == REG_SP)
8218 {
8219 inst.error = BAD_SP;
8220 return;
8221 }
8222
8223 /* APSR_ sets isvec. All other refs to PC are illegal. */
8224 if (!inst.operands[0].isvec && inst.operands[0].reg == REG_PC)
8225 {
8226 inst.error = BAD_PC;
8227 return;
8228 }
8229
7465e07a
NC
8230 switch (inst.operands[1].reg)
8231 {
8232 case 0: /* FPSID */
8233 case 1: /* FPSCR */
8234 case 6: /* MVFR1 */
8235 case 7: /* MVFR0 */
8236 case 8: /* FPEXC */
8237 inst.instruction |= (inst.operands[1].reg << 16);
8238 break;
8239 default:
8240 first_error (_("operand 1 must be a VFP extension System Register"));
8241 }
f7c21dc7
NC
8242
8243 inst.instruction |= (Rt << 12);
8244}
8245
8246static void
8247do_vmsr (void)
8248{
8249 unsigned Rt = inst.operands[1].reg;
fa94de6b 8250
f7c21dc7
NC
8251 if (thumb_mode)
8252 reject_bad_reg (Rt);
8253 else if (Rt == REG_PC)
8254 {
8255 inst.error = BAD_PC;
8256 return;
8257 }
8258
7465e07a
NC
8259 switch (inst.operands[0].reg)
8260 {
8261 case 0: /* FPSID */
8262 case 1: /* FPSCR */
8263 case 8: /* FPEXC */
8264 inst.instruction |= (inst.operands[0].reg << 16);
8265 break;
8266 default:
8267 first_error (_("operand 0 must be FPSID or FPSCR pr FPEXC"));
8268 }
f7c21dc7
NC
8269
8270 inst.instruction |= (Rt << 12);
8271}
8272
b99bd4ef 8273static void
c19d1205 8274do_mrs (void)
b99bd4ef 8275{
90ec0d68
MGD
8276 unsigned br;
8277
037e8744
JB
8278 if (do_vfp_nsyn_mrs () == SUCCESS)
8279 return;
8280
ff4a8d2b 8281 constraint (inst.operands[0].reg == REG_PC, BAD_PC);
c19d1205 8282 inst.instruction |= inst.operands[0].reg << 12;
90ec0d68
MGD
8283
8284 if (inst.operands[1].isreg)
8285 {
8286 br = inst.operands[1].reg;
8287 if (((br & 0x200) == 0) && ((br & 0xf0000) != 0xf000))
8288 as_bad (_("bad register for mrs"));
8289 }
8290 else
8291 {
8292 /* mrs only accepts CPSR/SPSR/CPSR_all/SPSR_all. */
8293 constraint ((inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f))
8294 != (PSR_c|PSR_f),
d2cd1205 8295 _("'APSR', 'CPSR' or 'SPSR' expected"));
90ec0d68
MGD
8296 br = (15<<16) | (inst.operands[1].imm & SPSR_BIT);
8297 }
8298
8299 inst.instruction |= br;
c19d1205 8300}
b99bd4ef 8301
c19d1205
ZW
8302/* Two possible forms:
8303 "{C|S}PSR_<field>, Rm",
8304 "{C|S}PSR_f, #expression". */
b99bd4ef 8305
c19d1205
ZW
8306static void
8307do_msr (void)
8308{
037e8744
JB
8309 if (do_vfp_nsyn_msr () == SUCCESS)
8310 return;
8311
c19d1205
ZW
8312 inst.instruction |= inst.operands[0].imm;
8313 if (inst.operands[1].isreg)
8314 inst.instruction |= inst.operands[1].reg;
8315 else
b99bd4ef 8316 {
c19d1205
ZW
8317 inst.instruction |= INST_IMMEDIATE;
8318 inst.reloc.type = BFD_RELOC_ARM_IMMEDIATE;
8319 inst.reloc.pc_rel = 0;
b99bd4ef 8320 }
b99bd4ef
NC
8321}
8322
c19d1205
ZW
8323static void
8324do_mul (void)
a737bd4d 8325{
ff4a8d2b
NC
8326 constraint (inst.operands[2].reg == REG_PC, BAD_PC);
8327
c19d1205
ZW
8328 if (!inst.operands[2].present)
8329 inst.operands[2].reg = inst.operands[0].reg;
8330 inst.instruction |= inst.operands[0].reg << 16;
8331 inst.instruction |= inst.operands[1].reg;
8332 inst.instruction |= inst.operands[2].reg << 8;
a737bd4d 8333
8fb9d7b9
MS
8334 if (inst.operands[0].reg == inst.operands[1].reg
8335 && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
8336 as_tsktsk (_("Rd and Rm should be different in mul"));
a737bd4d
NC
8337}
8338
c19d1205
ZW
8339/* Long Multiply Parser
8340 UMULL RdLo, RdHi, Rm, Rs
8341 SMULL RdLo, RdHi, Rm, Rs
8342 UMLAL RdLo, RdHi, Rm, Rs
8343 SMLAL RdLo, RdHi, Rm, Rs. */
b99bd4ef
NC
8344
8345static void
c19d1205 8346do_mull (void)
b99bd4ef 8347{
c19d1205
ZW
8348 inst.instruction |= inst.operands[0].reg << 12;
8349 inst.instruction |= inst.operands[1].reg << 16;
8350 inst.instruction |= inst.operands[2].reg;
8351 inst.instruction |= inst.operands[3].reg << 8;
b99bd4ef 8352
682b27ad
PB
8353 /* rdhi and rdlo must be different. */
8354 if (inst.operands[0].reg == inst.operands[1].reg)
8355 as_tsktsk (_("rdhi and rdlo must be different"));
8356
8357 /* rdhi, rdlo and rm must all be different before armv6. */
8358 if ((inst.operands[0].reg == inst.operands[2].reg
c19d1205 8359 || inst.operands[1].reg == inst.operands[2].reg)
682b27ad 8360 && !ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6))
c19d1205
ZW
8361 as_tsktsk (_("rdhi, rdlo and rm must all be different"));
8362}
b99bd4ef 8363
c19d1205
ZW
8364static void
8365do_nop (void)
8366{
e7495e45
NS
8367 if (inst.operands[0].present
8368 || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k))
c19d1205
ZW
8369 {
8370 /* Architectural NOP hints are CPSR sets with no bits selected. */
8371 inst.instruction &= 0xf0000000;
e7495e45
NS
8372 inst.instruction |= 0x0320f000;
8373 if (inst.operands[0].present)
8374 inst.instruction |= inst.operands[0].imm;
c19d1205 8375 }
b99bd4ef
NC
8376}
8377
c19d1205
ZW
8378/* ARM V6 Pack Halfword Bottom Top instruction (argument parse).
8379 PKHBT {<cond>} <Rd>, <Rn>, <Rm> {, LSL #<shift_imm>}
8380 Condition defaults to COND_ALWAYS.
8381 Error if Rd, Rn or Rm are R15. */
b99bd4ef
NC
8382
8383static void
c19d1205 8384do_pkhbt (void)
b99bd4ef 8385{
c19d1205
ZW
8386 inst.instruction |= inst.operands[0].reg << 12;
8387 inst.instruction |= inst.operands[1].reg << 16;
8388 inst.instruction |= inst.operands[2].reg;
8389 if (inst.operands[3].present)
8390 encode_arm_shift (3);
8391}
b99bd4ef 8392
c19d1205 8393/* ARM V6 PKHTB (Argument Parse). */
b99bd4ef 8394
c19d1205
ZW
8395static void
8396do_pkhtb (void)
8397{
8398 if (!inst.operands[3].present)
b99bd4ef 8399 {
c19d1205
ZW
8400 /* If the shift specifier is omitted, turn the instruction
8401 into pkhbt rd, rm, rn. */
8402 inst.instruction &= 0xfff00010;
8403 inst.instruction |= inst.operands[0].reg << 12;
8404 inst.instruction |= inst.operands[1].reg;
8405 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef
NC
8406 }
8407 else
8408 {
c19d1205
ZW
8409 inst.instruction |= inst.operands[0].reg << 12;
8410 inst.instruction |= inst.operands[1].reg << 16;
8411 inst.instruction |= inst.operands[2].reg;
8412 encode_arm_shift (3);
b99bd4ef
NC
8413 }
8414}
8415
c19d1205 8416/* ARMv5TE: Preload-Cache
60e5ef9f 8417 MP Extensions: Preload for write
c19d1205 8418
60e5ef9f 8419 PLD(W) <addr_mode>
c19d1205
ZW
8420
8421 Syntactically, like LDR with B=1, W=0, L=1. */
b99bd4ef
NC
8422
8423static void
c19d1205 8424do_pld (void)
b99bd4ef 8425{
c19d1205
ZW
8426 constraint (!inst.operands[0].isreg,
8427 _("'[' expected after PLD mnemonic"));
8428 constraint (inst.operands[0].postind,
8429 _("post-indexed expression used in preload instruction"));
8430 constraint (inst.operands[0].writeback,
8431 _("writeback used in preload instruction"));
8432 constraint (!inst.operands[0].preind,
8433 _("unindexed addressing used in preload instruction"));
c19d1205
ZW
8434 encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8435}
b99bd4ef 8436
62b3e311
PB
8437/* ARMv7: PLI <addr_mode> */
8438static void
8439do_pli (void)
8440{
8441 constraint (!inst.operands[0].isreg,
8442 _("'[' expected after PLI mnemonic"));
8443 constraint (inst.operands[0].postind,
8444 _("post-indexed expression used in preload instruction"));
8445 constraint (inst.operands[0].writeback,
8446 _("writeback used in preload instruction"));
8447 constraint (!inst.operands[0].preind,
8448 _("unindexed addressing used in preload instruction"));
8449 encode_arm_addr_mode_2 (0, /*is_t=*/FALSE);
8450 inst.instruction &= ~PRE_INDEX;
8451}
8452
c19d1205
ZW
8453static void
8454do_push_pop (void)
8455{
8456 inst.operands[1] = inst.operands[0];
8457 memset (&inst.operands[0], 0, sizeof inst.operands[0]);
8458 inst.operands[0].isreg = 1;
8459 inst.operands[0].writeback = 1;
8460 inst.operands[0].reg = REG_SP;
6530b175 8461 encode_ldmstm (/*from_push_pop_mnem=*/TRUE);
c19d1205 8462}
b99bd4ef 8463
c19d1205
ZW
8464/* ARM V6 RFE (Return from Exception) loads the PC and CPSR from the
8465 word at the specified address and the following word
8466 respectively.
8467 Unconditionally executed.
8468 Error if Rn is R15. */
b99bd4ef 8469
c19d1205
ZW
8470static void
8471do_rfe (void)
8472{
8473 inst.instruction |= inst.operands[0].reg << 16;
8474 if (inst.operands[0].writeback)
8475 inst.instruction |= WRITE_BACK;
8476}
b99bd4ef 8477
c19d1205 8478/* ARM V6 ssat (argument parse). */
b99bd4ef 8479
c19d1205
ZW
8480static void
8481do_ssat (void)
8482{
8483 inst.instruction |= inst.operands[0].reg << 12;
8484 inst.instruction |= (inst.operands[1].imm - 1) << 16;
8485 inst.instruction |= inst.operands[2].reg;
b99bd4ef 8486
c19d1205
ZW
8487 if (inst.operands[3].present)
8488 encode_arm_shift (3);
b99bd4ef
NC
8489}
8490
c19d1205 8491/* ARM V6 usat (argument parse). */
b99bd4ef
NC
8492
8493static void
c19d1205 8494do_usat (void)
b99bd4ef 8495{
c19d1205
ZW
8496 inst.instruction |= inst.operands[0].reg << 12;
8497 inst.instruction |= inst.operands[1].imm << 16;
8498 inst.instruction |= inst.operands[2].reg;
b99bd4ef 8499
c19d1205
ZW
8500 if (inst.operands[3].present)
8501 encode_arm_shift (3);
b99bd4ef
NC
8502}
8503
c19d1205 8504/* ARM V6 ssat16 (argument parse). */
09d92015
MM
8505
8506static void
c19d1205 8507do_ssat16 (void)
09d92015 8508{
c19d1205
ZW
8509 inst.instruction |= inst.operands[0].reg << 12;
8510 inst.instruction |= ((inst.operands[1].imm - 1) << 16);
8511 inst.instruction |= inst.operands[2].reg;
09d92015
MM
8512}
8513
c19d1205
ZW
8514static void
8515do_usat16 (void)
a737bd4d 8516{
c19d1205
ZW
8517 inst.instruction |= inst.operands[0].reg << 12;
8518 inst.instruction |= inst.operands[1].imm << 16;
8519 inst.instruction |= inst.operands[2].reg;
8520}
a737bd4d 8521
c19d1205
ZW
8522/* ARM V6 SETEND (argument parse). Sets the E bit in the CPSR while
8523 preserving the other bits.
a737bd4d 8524
c19d1205
ZW
8525 setend <endian_specifier>, where <endian_specifier> is either
8526 BE or LE. */
a737bd4d 8527
c19d1205
ZW
8528static void
8529do_setend (void)
8530{
12e37cbc
MGD
8531 if (warn_on_deprecated
8532 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
8533 as_warn (_("setend use is deprecated for ARMv8"));
8534
c19d1205
ZW
8535 if (inst.operands[0].imm)
8536 inst.instruction |= 0x200;
a737bd4d
NC
8537}
8538
8539static void
c19d1205 8540do_shift (void)
a737bd4d 8541{
c19d1205
ZW
8542 unsigned int Rm = (inst.operands[1].present
8543 ? inst.operands[1].reg
8544 : inst.operands[0].reg);
a737bd4d 8545
c19d1205
ZW
8546 inst.instruction |= inst.operands[0].reg << 12;
8547 inst.instruction |= Rm;
8548 if (inst.operands[2].isreg) /* Rd, {Rm,} Rs */
a737bd4d 8549 {
c19d1205
ZW
8550 inst.instruction |= inst.operands[2].reg << 8;
8551 inst.instruction |= SHIFT_BY_REG;
94342ec3
NC
8552 /* PR 12854: Error on extraneous shifts. */
8553 constraint (inst.operands[2].shifted,
8554 _("extraneous shift as part of operand to shift insn"));
a737bd4d
NC
8555 }
8556 else
c19d1205 8557 inst.reloc.type = BFD_RELOC_ARM_SHIFT_IMM;
a737bd4d
NC
8558}
8559
09d92015 8560static void
3eb17e6b 8561do_smc (void)
09d92015 8562{
3eb17e6b 8563 inst.reloc.type = BFD_RELOC_ARM_SMC;
c19d1205 8564 inst.reloc.pc_rel = 0;
09d92015
MM
8565}
8566
90ec0d68
MGD
8567static void
8568do_hvc (void)
8569{
8570 inst.reloc.type = BFD_RELOC_ARM_HVC;
8571 inst.reloc.pc_rel = 0;
8572}
8573
09d92015 8574static void
c19d1205 8575do_swi (void)
09d92015 8576{
c19d1205
ZW
8577 inst.reloc.type = BFD_RELOC_ARM_SWI;
8578 inst.reloc.pc_rel = 0;
09d92015
MM
8579}
8580
c19d1205
ZW
8581/* ARM V5E (El Segundo) signed-multiply-accumulate (argument parse)
8582 SMLAxy{cond} Rd,Rm,Rs,Rn
8583 SMLAWy{cond} Rd,Rm,Rs,Rn
8584 Error if any register is R15. */
e16bb312 8585
c19d1205
ZW
8586static void
8587do_smla (void)
e16bb312 8588{
c19d1205
ZW
8589 inst.instruction |= inst.operands[0].reg << 16;
8590 inst.instruction |= inst.operands[1].reg;
8591 inst.instruction |= inst.operands[2].reg << 8;
8592 inst.instruction |= inst.operands[3].reg << 12;
8593}
a737bd4d 8594
c19d1205
ZW
8595/* ARM V5E (El Segundo) signed-multiply-accumulate-long (argument parse)
8596 SMLALxy{cond} Rdlo,Rdhi,Rm,Rs
8597 Error if any register is R15.
8598 Warning if Rdlo == Rdhi. */
a737bd4d 8599
c19d1205
ZW
8600static void
8601do_smlal (void)
8602{
8603 inst.instruction |= inst.operands[0].reg << 12;
8604 inst.instruction |= inst.operands[1].reg << 16;
8605 inst.instruction |= inst.operands[2].reg;
8606 inst.instruction |= inst.operands[3].reg << 8;
a737bd4d 8607
c19d1205
ZW
8608 if (inst.operands[0].reg == inst.operands[1].reg)
8609 as_tsktsk (_("rdhi and rdlo must be different"));
8610}
a737bd4d 8611
c19d1205
ZW
8612/* ARM V5E (El Segundo) signed-multiply (argument parse)
8613 SMULxy{cond} Rd,Rm,Rs
8614 Error if any register is R15. */
a737bd4d 8615
c19d1205
ZW
8616static void
8617do_smul (void)
8618{
8619 inst.instruction |= inst.operands[0].reg << 16;
8620 inst.instruction |= inst.operands[1].reg;
8621 inst.instruction |= inst.operands[2].reg << 8;
8622}
a737bd4d 8623
b6702015
PB
8624/* ARM V6 srs (argument parse). The variable fields in the encoding are
8625 the same for both ARM and Thumb-2. */
a737bd4d 8626
c19d1205
ZW
8627static void
8628do_srs (void)
8629{
b6702015
PB
8630 int reg;
8631
8632 if (inst.operands[0].present)
8633 {
8634 reg = inst.operands[0].reg;
fdfde340 8635 constraint (reg != REG_SP, _("SRS base register must be r13"));
b6702015
PB
8636 }
8637 else
fdfde340 8638 reg = REG_SP;
b6702015
PB
8639
8640 inst.instruction |= reg << 16;
8641 inst.instruction |= inst.operands[1].imm;
8642 if (inst.operands[0].writeback || inst.operands[1].writeback)
c19d1205
ZW
8643 inst.instruction |= WRITE_BACK;
8644}
a737bd4d 8645
c19d1205 8646/* ARM V6 strex (argument parse). */
a737bd4d 8647
c19d1205
ZW
8648static void
8649do_strex (void)
8650{
8651 constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8652 || inst.operands[2].postind || inst.operands[2].writeback
8653 || inst.operands[2].immisreg || inst.operands[2].shifted
01cfc07f
NC
8654 || inst.operands[2].negative
8655 /* See comment in do_ldrex(). */
8656 || (inst.operands[2].reg == REG_PC),
8657 BAD_ADDR_MODE);
a737bd4d 8658
c19d1205
ZW
8659 constraint (inst.operands[0].reg == inst.operands[1].reg
8660 || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
a737bd4d 8661
c19d1205
ZW
8662 constraint (inst.reloc.exp.X_op != O_constant
8663 || inst.reloc.exp.X_add_number != 0,
8664 _("offset must be zero in ARM encoding"));
a737bd4d 8665
c19d1205
ZW
8666 inst.instruction |= inst.operands[0].reg << 12;
8667 inst.instruction |= inst.operands[1].reg;
8668 inst.instruction |= inst.operands[2].reg << 16;
8669 inst.reloc.type = BFD_RELOC_UNUSED;
e16bb312
NC
8670}
8671
877807f8
NC
8672static void
8673do_t_strexbh (void)
8674{
8675 constraint (!inst.operands[2].isreg || !inst.operands[2].preind
8676 || inst.operands[2].postind || inst.operands[2].writeback
8677 || inst.operands[2].immisreg || inst.operands[2].shifted
8678 || inst.operands[2].negative,
8679 BAD_ADDR_MODE);
8680
8681 constraint (inst.operands[0].reg == inst.operands[1].reg
8682 || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
8683
8684 do_rm_rd_rn ();
8685}
8686
e16bb312 8687static void
c19d1205 8688do_strexd (void)
e16bb312 8689{
c19d1205
ZW
8690 constraint (inst.operands[1].reg % 2 != 0,
8691 _("even register required"));
8692 constraint (inst.operands[2].present
8693 && inst.operands[2].reg != inst.operands[1].reg + 1,
8694 _("can only store two consecutive registers"));
8695 /* If op 2 were present and equal to PC, this function wouldn't
8696 have been called in the first place. */
8697 constraint (inst.operands[1].reg == REG_LR, _("r14 not allowed here"));
e16bb312 8698
c19d1205
ZW
8699 constraint (inst.operands[0].reg == inst.operands[1].reg
8700 || inst.operands[0].reg == inst.operands[1].reg + 1
8701 || inst.operands[0].reg == inst.operands[3].reg,
8702 BAD_OVERLAP);
e16bb312 8703
c19d1205
ZW
8704 inst.instruction |= inst.operands[0].reg << 12;
8705 inst.instruction |= inst.operands[1].reg;
8706 inst.instruction |= inst.operands[3].reg << 16;
e16bb312
NC
8707}
8708
c19d1205
ZW
8709/* ARM V6 SXTAH extracts a 16-bit value from a register, sign
8710 extends it to 32-bits, and adds the result to a value in another
8711 register. You can specify a rotation by 0, 8, 16, or 24 bits
8712 before extracting the 16-bit value.
8713 SXTAH{<cond>} <Rd>, <Rn>, <Rm>{, <rotation>}
8714 Condition defaults to COND_ALWAYS.
8715 Error if any register uses R15. */
8716
e16bb312 8717static void
c19d1205 8718do_sxtah (void)
e16bb312 8719{
c19d1205
ZW
8720 inst.instruction |= inst.operands[0].reg << 12;
8721 inst.instruction |= inst.operands[1].reg << 16;
8722 inst.instruction |= inst.operands[2].reg;
8723 inst.instruction |= inst.operands[3].imm << 10;
8724}
e16bb312 8725
c19d1205 8726/* ARM V6 SXTH.
e16bb312 8727
c19d1205
ZW
8728 SXTH {<cond>} <Rd>, <Rm>{, <rotation>}
8729 Condition defaults to COND_ALWAYS.
8730 Error if any register uses R15. */
e16bb312
NC
8731
8732static void
c19d1205 8733do_sxth (void)
e16bb312 8734{
c19d1205
ZW
8735 inst.instruction |= inst.operands[0].reg << 12;
8736 inst.instruction |= inst.operands[1].reg;
8737 inst.instruction |= inst.operands[2].imm << 10;
e16bb312 8738}
c19d1205
ZW
8739\f
8740/* VFP instructions. In a logical order: SP variant first, monad
8741 before dyad, arithmetic then move then load/store. */
e16bb312
NC
8742
8743static void
c19d1205 8744do_vfp_sp_monadic (void)
e16bb312 8745{
5287ad62
JB
8746 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8747 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
e16bb312
NC
8748}
8749
8750static void
c19d1205 8751do_vfp_sp_dyadic (void)
e16bb312 8752{
5287ad62
JB
8753 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8754 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
8755 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
e16bb312
NC
8756}
8757
8758static void
c19d1205 8759do_vfp_sp_compare_z (void)
e16bb312 8760{
5287ad62 8761 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
e16bb312
NC
8762}
8763
8764static void
c19d1205 8765do_vfp_dp_sp_cvt (void)
e16bb312 8766{
5287ad62
JB
8767 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8768 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
e16bb312
NC
8769}
8770
8771static void
c19d1205 8772do_vfp_sp_dp_cvt (void)
e16bb312 8773{
5287ad62
JB
8774 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8775 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
e16bb312
NC
8776}
8777
8778static void
c19d1205 8779do_vfp_reg_from_sp (void)
e16bb312 8780{
c19d1205 8781 inst.instruction |= inst.operands[0].reg << 12;
5287ad62 8782 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sn);
e16bb312
NC
8783}
8784
8785static void
c19d1205 8786do_vfp_reg2_from_sp2 (void)
e16bb312 8787{
c19d1205
ZW
8788 constraint (inst.operands[2].imm != 2,
8789 _("only two consecutive VFP SP registers allowed here"));
8790 inst.instruction |= inst.operands[0].reg << 12;
8791 inst.instruction |= inst.operands[1].reg << 16;
5287ad62 8792 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Sm);
e16bb312
NC
8793}
8794
8795static void
c19d1205 8796do_vfp_sp_from_reg (void)
e16bb312 8797{
5287ad62 8798 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sn);
c19d1205 8799 inst.instruction |= inst.operands[1].reg << 12;
e16bb312
NC
8800}
8801
8802static void
c19d1205 8803do_vfp_sp2_from_reg2 (void)
e16bb312 8804{
c19d1205
ZW
8805 constraint (inst.operands[0].imm != 2,
8806 _("only two consecutive VFP SP registers allowed here"));
5287ad62 8807 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sm);
c19d1205
ZW
8808 inst.instruction |= inst.operands[1].reg << 12;
8809 inst.instruction |= inst.operands[2].reg << 16;
e16bb312
NC
8810}
8811
8812static void
c19d1205 8813do_vfp_sp_ldst (void)
e16bb312 8814{
5287ad62 8815 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
c19d1205 8816 encode_arm_cp_address (1, FALSE, TRUE, 0);
e16bb312
NC
8817}
8818
8819static void
c19d1205 8820do_vfp_dp_ldst (void)
e16bb312 8821{
5287ad62 8822 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
c19d1205 8823 encode_arm_cp_address (1, FALSE, TRUE, 0);
e16bb312
NC
8824}
8825
c19d1205 8826
e16bb312 8827static void
c19d1205 8828vfp_sp_ldstm (enum vfp_ldstm_type ldstm_type)
e16bb312 8829{
c19d1205
ZW
8830 if (inst.operands[0].writeback)
8831 inst.instruction |= WRITE_BACK;
8832 else
8833 constraint (ldstm_type != VFP_LDSTMIA,
8834 _("this addressing mode requires base-register writeback"));
8835 inst.instruction |= inst.operands[0].reg << 16;
5287ad62 8836 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sd);
c19d1205 8837 inst.instruction |= inst.operands[1].imm;
e16bb312
NC
8838}
8839
8840static void
c19d1205 8841vfp_dp_ldstm (enum vfp_ldstm_type ldstm_type)
e16bb312 8842{
c19d1205 8843 int count;
e16bb312 8844
c19d1205
ZW
8845 if (inst.operands[0].writeback)
8846 inst.instruction |= WRITE_BACK;
8847 else
8848 constraint (ldstm_type != VFP_LDSTMIA && ldstm_type != VFP_LDSTMIAX,
8849 _("this addressing mode requires base-register writeback"));
e16bb312 8850
c19d1205 8851 inst.instruction |= inst.operands[0].reg << 16;
5287ad62 8852 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
e16bb312 8853
c19d1205
ZW
8854 count = inst.operands[1].imm << 1;
8855 if (ldstm_type == VFP_LDSTMIAX || ldstm_type == VFP_LDSTMDBX)
8856 count += 1;
e16bb312 8857
c19d1205 8858 inst.instruction |= count;
e16bb312
NC
8859}
8860
8861static void
c19d1205 8862do_vfp_sp_ldstmia (void)
e16bb312 8863{
c19d1205 8864 vfp_sp_ldstm (VFP_LDSTMIA);
e16bb312
NC
8865}
8866
8867static void
c19d1205 8868do_vfp_sp_ldstmdb (void)
e16bb312 8869{
c19d1205 8870 vfp_sp_ldstm (VFP_LDSTMDB);
e16bb312
NC
8871}
8872
8873static void
c19d1205 8874do_vfp_dp_ldstmia (void)
e16bb312 8875{
c19d1205 8876 vfp_dp_ldstm (VFP_LDSTMIA);
e16bb312
NC
8877}
8878
8879static void
c19d1205 8880do_vfp_dp_ldstmdb (void)
e16bb312 8881{
c19d1205 8882 vfp_dp_ldstm (VFP_LDSTMDB);
e16bb312
NC
8883}
8884
8885static void
c19d1205 8886do_vfp_xp_ldstmia (void)
e16bb312 8887{
c19d1205
ZW
8888 vfp_dp_ldstm (VFP_LDSTMIAX);
8889}
e16bb312 8890
c19d1205
ZW
8891static void
8892do_vfp_xp_ldstmdb (void)
8893{
8894 vfp_dp_ldstm (VFP_LDSTMDBX);
e16bb312 8895}
5287ad62
JB
8896
8897static void
8898do_vfp_dp_rd_rm (void)
8899{
8900 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8901 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dm);
8902}
8903
8904static void
8905do_vfp_dp_rn_rd (void)
8906{
8907 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dn);
8908 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8909}
8910
8911static void
8912do_vfp_dp_rd_rn (void)
8913{
8914 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8915 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8916}
8917
8918static void
8919do_vfp_dp_rd_rn_rm (void)
8920{
8921 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8922 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dn);
8923 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dm);
8924}
8925
8926static void
8927do_vfp_dp_rd (void)
8928{
8929 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8930}
8931
8932static void
8933do_vfp_dp_rm_rd_rn (void)
8934{
8935 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dm);
8936 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Dd);
8937 encode_arm_vfp_reg (inst.operands[2].reg, VFP_REG_Dn);
8938}
8939
8940/* VFPv3 instructions. */
8941static void
8942do_vfp_sp_const (void)
8943{
8944 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
00249aaa
PB
8945 inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8946 inst.instruction |= (inst.operands[1].imm & 0x0f);
5287ad62
JB
8947}
8948
8949static void
8950do_vfp_dp_const (void)
8951{
8952 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
00249aaa
PB
8953 inst.instruction |= (inst.operands[1].imm & 0xf0) << 12;
8954 inst.instruction |= (inst.operands[1].imm & 0x0f);
5287ad62
JB
8955}
8956
8957static void
8958vfp_conv (int srcsize)
8959{
5f1af56b
MGD
8960 int immbits = srcsize - inst.operands[1].imm;
8961
fa94de6b
RM
8962 if (srcsize == 16 && !(immbits >= 0 && immbits <= srcsize))
8963 {
5f1af56b
MGD
8964 /* If srcsize is 16, inst.operands[1].imm must be in the range 0-16.
8965 i.e. immbits must be in range 0 - 16. */
8966 inst.error = _("immediate value out of range, expected range [0, 16]");
8967 return;
8968 }
fa94de6b 8969 else if (srcsize == 32 && !(immbits >= 0 && immbits < srcsize))
5f1af56b
MGD
8970 {
8971 /* If srcsize is 32, inst.operands[1].imm must be in the range 1-32.
8972 i.e. immbits must be in range 0 - 31. */
8973 inst.error = _("immediate value out of range, expected range [1, 32]");
8974 return;
8975 }
8976
5287ad62
JB
8977 inst.instruction |= (immbits & 1) << 5;
8978 inst.instruction |= (immbits >> 1);
8979}
8980
8981static void
8982do_vfp_sp_conv_16 (void)
8983{
8984 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8985 vfp_conv (16);
8986}
8987
8988static void
8989do_vfp_dp_conv_16 (void)
8990{
8991 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
8992 vfp_conv (16);
8993}
8994
8995static void
8996do_vfp_sp_conv_32 (void)
8997{
8998 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
8999 vfp_conv (32);
9000}
9001
9002static void
9003do_vfp_dp_conv_32 (void)
9004{
9005 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Dd);
9006 vfp_conv (32);
9007}
c19d1205
ZW
9008\f
9009/* FPA instructions. Also in a logical order. */
e16bb312 9010
c19d1205
ZW
9011static void
9012do_fpa_cmp (void)
9013{
9014 inst.instruction |= inst.operands[0].reg << 16;
9015 inst.instruction |= inst.operands[1].reg;
9016}
b99bd4ef
NC
9017
9018static void
c19d1205 9019do_fpa_ldmstm (void)
b99bd4ef 9020{
c19d1205
ZW
9021 inst.instruction |= inst.operands[0].reg << 12;
9022 switch (inst.operands[1].imm)
9023 {
9024 case 1: inst.instruction |= CP_T_X; break;
9025 case 2: inst.instruction |= CP_T_Y; break;
9026 case 3: inst.instruction |= CP_T_Y | CP_T_X; break;
9027 case 4: break;
9028 default: abort ();
9029 }
b99bd4ef 9030
c19d1205
ZW
9031 if (inst.instruction & (PRE_INDEX | INDEX_UP))
9032 {
9033 /* The instruction specified "ea" or "fd", so we can only accept
9034 [Rn]{!}. The instruction does not really support stacking or
9035 unstacking, so we have to emulate these by setting appropriate
9036 bits and offsets. */
9037 constraint (inst.reloc.exp.X_op != O_constant
9038 || inst.reloc.exp.X_add_number != 0,
9039 _("this instruction does not support indexing"));
b99bd4ef 9040
c19d1205
ZW
9041 if ((inst.instruction & PRE_INDEX) || inst.operands[2].writeback)
9042 inst.reloc.exp.X_add_number = 12 * inst.operands[1].imm;
b99bd4ef 9043
c19d1205
ZW
9044 if (!(inst.instruction & INDEX_UP))
9045 inst.reloc.exp.X_add_number = -inst.reloc.exp.X_add_number;
b99bd4ef 9046
c19d1205
ZW
9047 if (!(inst.instruction & PRE_INDEX) && inst.operands[2].writeback)
9048 {
9049 inst.operands[2].preind = 0;
9050 inst.operands[2].postind = 1;
9051 }
9052 }
b99bd4ef 9053
c19d1205 9054 encode_arm_cp_address (2, TRUE, TRUE, 0);
b99bd4ef 9055}
c19d1205
ZW
9056\f
9057/* iWMMXt instructions: strictly in alphabetical order. */
b99bd4ef 9058
c19d1205
ZW
9059static void
9060do_iwmmxt_tandorc (void)
9061{
9062 constraint (inst.operands[0].reg != REG_PC, _("only r15 allowed here"));
9063}
b99bd4ef 9064
c19d1205
ZW
9065static void
9066do_iwmmxt_textrc (void)
9067{
9068 inst.instruction |= inst.operands[0].reg << 12;
9069 inst.instruction |= inst.operands[1].imm;
9070}
b99bd4ef
NC
9071
9072static void
c19d1205 9073do_iwmmxt_textrm (void)
b99bd4ef 9074{
c19d1205
ZW
9075 inst.instruction |= inst.operands[0].reg << 12;
9076 inst.instruction |= inst.operands[1].reg << 16;
9077 inst.instruction |= inst.operands[2].imm;
9078}
b99bd4ef 9079
c19d1205
ZW
9080static void
9081do_iwmmxt_tinsr (void)
9082{
9083 inst.instruction |= inst.operands[0].reg << 16;
9084 inst.instruction |= inst.operands[1].reg << 12;
9085 inst.instruction |= inst.operands[2].imm;
9086}
b99bd4ef 9087
c19d1205
ZW
9088static void
9089do_iwmmxt_tmia (void)
9090{
9091 inst.instruction |= inst.operands[0].reg << 5;
9092 inst.instruction |= inst.operands[1].reg;
9093 inst.instruction |= inst.operands[2].reg << 12;
9094}
b99bd4ef 9095
c19d1205
ZW
9096static void
9097do_iwmmxt_waligni (void)
9098{
9099 inst.instruction |= inst.operands[0].reg << 12;
9100 inst.instruction |= inst.operands[1].reg << 16;
9101 inst.instruction |= inst.operands[2].reg;
9102 inst.instruction |= inst.operands[3].imm << 20;
9103}
b99bd4ef 9104
2d447fca
JM
9105static void
9106do_iwmmxt_wmerge (void)
9107{
9108 inst.instruction |= inst.operands[0].reg << 12;
9109 inst.instruction |= inst.operands[1].reg << 16;
9110 inst.instruction |= inst.operands[2].reg;
9111 inst.instruction |= inst.operands[3].imm << 21;
9112}
9113
c19d1205
ZW
9114static void
9115do_iwmmxt_wmov (void)
9116{
9117 /* WMOV rD, rN is an alias for WOR rD, rN, rN. */
9118 inst.instruction |= inst.operands[0].reg << 12;
9119 inst.instruction |= inst.operands[1].reg << 16;
9120 inst.instruction |= inst.operands[1].reg;
9121}
b99bd4ef 9122
c19d1205
ZW
9123static void
9124do_iwmmxt_wldstbh (void)
9125{
8f06b2d8 9126 int reloc;
c19d1205 9127 inst.instruction |= inst.operands[0].reg << 12;
8f06b2d8
PB
9128 if (thumb_mode)
9129 reloc = BFD_RELOC_ARM_T32_CP_OFF_IMM_S2;
9130 else
9131 reloc = BFD_RELOC_ARM_CP_OFF_IMM_S2;
9132 encode_arm_cp_address (1, TRUE, FALSE, reloc);
b99bd4ef
NC
9133}
9134
c19d1205
ZW
9135static void
9136do_iwmmxt_wldstw (void)
9137{
9138 /* RIWR_RIWC clears .isreg for a control register. */
9139 if (!inst.operands[0].isreg)
9140 {
9141 constraint (inst.cond != COND_ALWAYS, BAD_COND);
9142 inst.instruction |= 0xf0000000;
9143 }
b99bd4ef 9144
c19d1205
ZW
9145 inst.instruction |= inst.operands[0].reg << 12;
9146 encode_arm_cp_address (1, TRUE, TRUE, 0);
9147}
b99bd4ef
NC
9148
9149static void
c19d1205 9150do_iwmmxt_wldstd (void)
b99bd4ef 9151{
c19d1205 9152 inst.instruction |= inst.operands[0].reg << 12;
2d447fca
JM
9153 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2)
9154 && inst.operands[1].immisreg)
9155 {
9156 inst.instruction &= ~0x1a000ff;
9157 inst.instruction |= (0xf << 28);
9158 if (inst.operands[1].preind)
9159 inst.instruction |= PRE_INDEX;
9160 if (!inst.operands[1].negative)
9161 inst.instruction |= INDEX_UP;
9162 if (inst.operands[1].writeback)
9163 inst.instruction |= WRITE_BACK;
9164 inst.instruction |= inst.operands[1].reg << 16;
9165 inst.instruction |= inst.reloc.exp.X_add_number << 4;
9166 inst.instruction |= inst.operands[1].imm;
9167 }
9168 else
9169 encode_arm_cp_address (1, TRUE, FALSE, 0);
c19d1205 9170}
b99bd4ef 9171
c19d1205
ZW
9172static void
9173do_iwmmxt_wshufh (void)
9174{
9175 inst.instruction |= inst.operands[0].reg << 12;
9176 inst.instruction |= inst.operands[1].reg << 16;
9177 inst.instruction |= ((inst.operands[2].imm & 0xf0) << 16);
9178 inst.instruction |= (inst.operands[2].imm & 0x0f);
9179}
b99bd4ef 9180
c19d1205
ZW
9181static void
9182do_iwmmxt_wzero (void)
9183{
9184 /* WZERO reg is an alias for WANDN reg, reg, reg. */
9185 inst.instruction |= inst.operands[0].reg;
9186 inst.instruction |= inst.operands[0].reg << 12;
9187 inst.instruction |= inst.operands[0].reg << 16;
9188}
2d447fca
JM
9189
9190static void
9191do_iwmmxt_wrwrwr_or_imm5 (void)
9192{
9193 if (inst.operands[2].isreg)
9194 do_rd_rn_rm ();
9195 else {
9196 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2),
9197 _("immediate operand requires iWMMXt2"));
9198 do_rd_rn ();
9199 if (inst.operands[2].imm == 0)
9200 {
9201 switch ((inst.instruction >> 20) & 0xf)
9202 {
9203 case 4:
9204 case 5:
9205 case 6:
5f4273c7 9206 case 7:
2d447fca
JM
9207 /* w...h wrd, wrn, #0 -> wrorh wrd, wrn, #16. */
9208 inst.operands[2].imm = 16;
9209 inst.instruction = (inst.instruction & 0xff0fffff) | (0x7 << 20);
9210 break;
9211 case 8:
9212 case 9:
9213 case 10:
9214 case 11:
9215 /* w...w wrd, wrn, #0 -> wrorw wrd, wrn, #32. */
9216 inst.operands[2].imm = 32;
9217 inst.instruction = (inst.instruction & 0xff0fffff) | (0xb << 20);
9218 break;
9219 case 12:
9220 case 13:
9221 case 14:
9222 case 15:
9223 {
9224 /* w...d wrd, wrn, #0 -> wor wrd, wrn, wrn. */
9225 unsigned long wrn;
9226 wrn = (inst.instruction >> 16) & 0xf;
9227 inst.instruction &= 0xff0fff0f;
9228 inst.instruction |= wrn;
9229 /* Bail out here; the instruction is now assembled. */
9230 return;
9231 }
9232 }
9233 }
9234 /* Map 32 -> 0, etc. */
9235 inst.operands[2].imm &= 0x1f;
9236 inst.instruction |= (0xf << 28) | ((inst.operands[2].imm & 0x10) << 4) | (inst.operands[2].imm & 0xf);
9237 }
9238}
c19d1205
ZW
9239\f
9240/* Cirrus Maverick instructions. Simple 2-, 3-, and 4-register
9241 operations first, then control, shift, and load/store. */
b99bd4ef 9242
c19d1205 9243/* Insns like "foo X,Y,Z". */
b99bd4ef 9244
c19d1205
ZW
9245static void
9246do_mav_triple (void)
9247{
9248 inst.instruction |= inst.operands[0].reg << 16;
9249 inst.instruction |= inst.operands[1].reg;
9250 inst.instruction |= inst.operands[2].reg << 12;
9251}
b99bd4ef 9252
c19d1205
ZW
9253/* Insns like "foo W,X,Y,Z".
9254 where W=MVAX[0:3] and X,Y,Z=MVFX[0:15]. */
a737bd4d 9255
c19d1205
ZW
9256static void
9257do_mav_quad (void)
9258{
9259 inst.instruction |= inst.operands[0].reg << 5;
9260 inst.instruction |= inst.operands[1].reg << 12;
9261 inst.instruction |= inst.operands[2].reg << 16;
9262 inst.instruction |= inst.operands[3].reg;
a737bd4d
NC
9263}
9264
c19d1205
ZW
9265/* cfmvsc32<cond> DSPSC,MVDX[15:0]. */
9266static void
9267do_mav_dspsc (void)
a737bd4d 9268{
c19d1205
ZW
9269 inst.instruction |= inst.operands[1].reg << 12;
9270}
a737bd4d 9271
c19d1205
ZW
9272/* Maverick shift immediate instructions.
9273 cfsh32<cond> MVFX[15:0],MVFX[15:0],Shift[6:0].
9274 cfsh64<cond> MVDX[15:0],MVDX[15:0],Shift[6:0]. */
a737bd4d 9275
c19d1205
ZW
9276static void
9277do_mav_shift (void)
9278{
9279 int imm = inst.operands[2].imm;
a737bd4d 9280
c19d1205
ZW
9281 inst.instruction |= inst.operands[0].reg << 12;
9282 inst.instruction |= inst.operands[1].reg << 16;
a737bd4d 9283
c19d1205
ZW
9284 /* Bits 0-3 of the insn should have bits 0-3 of the immediate.
9285 Bits 5-7 of the insn should have bits 4-6 of the immediate.
9286 Bit 4 should be 0. */
9287 imm = (imm & 0xf) | ((imm & 0x70) << 1);
a737bd4d 9288
c19d1205
ZW
9289 inst.instruction |= imm;
9290}
9291\f
9292/* XScale instructions. Also sorted arithmetic before move. */
a737bd4d 9293
c19d1205
ZW
9294/* Xscale multiply-accumulate (argument parse)
9295 MIAcc acc0,Rm,Rs
9296 MIAPHcc acc0,Rm,Rs
9297 MIAxycc acc0,Rm,Rs. */
a737bd4d 9298
c19d1205
ZW
9299static void
9300do_xsc_mia (void)
9301{
9302 inst.instruction |= inst.operands[1].reg;
9303 inst.instruction |= inst.operands[2].reg << 12;
9304}
a737bd4d 9305
c19d1205 9306/* Xscale move-accumulator-register (argument parse)
a737bd4d 9307
c19d1205 9308 MARcc acc0,RdLo,RdHi. */
b99bd4ef 9309
c19d1205
ZW
9310static void
9311do_xsc_mar (void)
9312{
9313 inst.instruction |= inst.operands[1].reg << 12;
9314 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef
NC
9315}
9316
c19d1205 9317/* Xscale move-register-accumulator (argument parse)
b99bd4ef 9318
c19d1205 9319 MRAcc RdLo,RdHi,acc0. */
b99bd4ef
NC
9320
9321static void
c19d1205 9322do_xsc_mra (void)
b99bd4ef 9323{
c19d1205
ZW
9324 constraint (inst.operands[0].reg == inst.operands[1].reg, BAD_OVERLAP);
9325 inst.instruction |= inst.operands[0].reg << 12;
9326 inst.instruction |= inst.operands[1].reg << 16;
9327}
9328\f
9329/* Encoding functions relevant only to Thumb. */
b99bd4ef 9330
c19d1205
ZW
9331/* inst.operands[i] is a shifted-register operand; encode
9332 it into inst.instruction in the format used by Thumb32. */
9333
9334static void
9335encode_thumb32_shifted_operand (int i)
9336{
9337 unsigned int value = inst.reloc.exp.X_add_number;
9338 unsigned int shift = inst.operands[i].shift_kind;
b99bd4ef 9339
9c3c69f2
PB
9340 constraint (inst.operands[i].immisreg,
9341 _("shift by register not allowed in thumb mode"));
c19d1205
ZW
9342 inst.instruction |= inst.operands[i].reg;
9343 if (shift == SHIFT_RRX)
9344 inst.instruction |= SHIFT_ROR << 4;
9345 else
b99bd4ef 9346 {
c19d1205
ZW
9347 constraint (inst.reloc.exp.X_op != O_constant,
9348 _("expression too complex"));
9349
9350 constraint (value > 32
9351 || (value == 32 && (shift == SHIFT_LSL
9352 || shift == SHIFT_ROR)),
9353 _("shift expression is too large"));
9354
9355 if (value == 0)
9356 shift = SHIFT_LSL;
9357 else if (value == 32)
9358 value = 0;
9359
9360 inst.instruction |= shift << 4;
9361 inst.instruction |= (value & 0x1c) << 10;
9362 inst.instruction |= (value & 0x03) << 6;
b99bd4ef 9363 }
c19d1205 9364}
b99bd4ef 9365
b99bd4ef 9366
c19d1205
ZW
9367/* inst.operands[i] was set up by parse_address. Encode it into a
9368 Thumb32 format load or store instruction. Reject forms that cannot
9369 be used with such instructions. If is_t is true, reject forms that
9370 cannot be used with a T instruction; if is_d is true, reject forms
5be8be5d
DG
9371 that cannot be used with a D instruction. If it is a store insn,
9372 reject PC in Rn. */
b99bd4ef 9373
c19d1205
ZW
9374static void
9375encode_thumb32_addr_mode (int i, bfd_boolean is_t, bfd_boolean is_d)
9376{
5be8be5d 9377 const bfd_boolean is_pc = (inst.operands[i].reg == REG_PC);
c19d1205
ZW
9378
9379 constraint (!inst.operands[i].isreg,
53365c0d 9380 _("Instruction does not support =N addresses"));
b99bd4ef 9381
c19d1205
ZW
9382 inst.instruction |= inst.operands[i].reg << 16;
9383 if (inst.operands[i].immisreg)
b99bd4ef 9384 {
5be8be5d 9385 constraint (is_pc, BAD_PC_ADDRESSING);
c19d1205
ZW
9386 constraint (is_t || is_d, _("cannot use register index with this instruction"));
9387 constraint (inst.operands[i].negative,
9388 _("Thumb does not support negative register indexing"));
9389 constraint (inst.operands[i].postind,
9390 _("Thumb does not support register post-indexing"));
9391 constraint (inst.operands[i].writeback,
9392 _("Thumb does not support register indexing with writeback"));
9393 constraint (inst.operands[i].shifted && inst.operands[i].shift_kind != SHIFT_LSL,
9394 _("Thumb supports only LSL in shifted register indexing"));
b99bd4ef 9395
f40d1643 9396 inst.instruction |= inst.operands[i].imm;
c19d1205 9397 if (inst.operands[i].shifted)
b99bd4ef 9398 {
c19d1205
ZW
9399 constraint (inst.reloc.exp.X_op != O_constant,
9400 _("expression too complex"));
9c3c69f2
PB
9401 constraint (inst.reloc.exp.X_add_number < 0
9402 || inst.reloc.exp.X_add_number > 3,
c19d1205 9403 _("shift out of range"));
9c3c69f2 9404 inst.instruction |= inst.reloc.exp.X_add_number << 4;
c19d1205
ZW
9405 }
9406 inst.reloc.type = BFD_RELOC_UNUSED;
9407 }
9408 else if (inst.operands[i].preind)
9409 {
5be8be5d 9410 constraint (is_pc && inst.operands[i].writeback, BAD_PC_WRITEBACK);
f40d1643 9411 constraint (is_t && inst.operands[i].writeback,
c19d1205 9412 _("cannot use writeback with this instruction"));
5be8be5d
DG
9413 constraint (is_pc && ((inst.instruction & THUMB2_LOAD_BIT) == 0)
9414 && !inst.reloc.pc_rel, BAD_PC_ADDRESSING);
c19d1205
ZW
9415
9416 if (is_d)
9417 {
9418 inst.instruction |= 0x01000000;
9419 if (inst.operands[i].writeback)
9420 inst.instruction |= 0x00200000;
b99bd4ef 9421 }
c19d1205 9422 else
b99bd4ef 9423 {
c19d1205
ZW
9424 inst.instruction |= 0x00000c00;
9425 if (inst.operands[i].writeback)
9426 inst.instruction |= 0x00000100;
b99bd4ef 9427 }
c19d1205 9428 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
b99bd4ef 9429 }
c19d1205 9430 else if (inst.operands[i].postind)
b99bd4ef 9431 {
9c2799c2 9432 gas_assert (inst.operands[i].writeback);
c19d1205
ZW
9433 constraint (is_pc, _("cannot use post-indexing with PC-relative addressing"));
9434 constraint (is_t, _("cannot use post-indexing with this instruction"));
9435
9436 if (is_d)
9437 inst.instruction |= 0x00200000;
9438 else
9439 inst.instruction |= 0x00000900;
9440 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_IMM;
9441 }
9442 else /* unindexed - only for coprocessor */
9443 inst.error = _("instruction does not accept unindexed addressing");
9444}
9445
9446/* Table of Thumb instructions which exist in both 16- and 32-bit
9447 encodings (the latter only in post-V6T2 cores). The index is the
9448 value used in the insns table below. When there is more than one
9449 possible 16-bit encoding for the instruction, this table always
0110f2b8
PB
9450 holds variant (1).
9451 Also contains several pseudo-instructions used during relaxation. */
c19d1205 9452#define T16_32_TAB \
21d799b5
NC
9453 X(_adc, 4140, eb400000), \
9454 X(_adcs, 4140, eb500000), \
9455 X(_add, 1c00, eb000000), \
9456 X(_adds, 1c00, eb100000), \
9457 X(_addi, 0000, f1000000), \
9458 X(_addis, 0000, f1100000), \
9459 X(_add_pc,000f, f20f0000), \
9460 X(_add_sp,000d, f10d0000), \
9461 X(_adr, 000f, f20f0000), \
9462 X(_and, 4000, ea000000), \
9463 X(_ands, 4000, ea100000), \
9464 X(_asr, 1000, fa40f000), \
9465 X(_asrs, 1000, fa50f000), \
9466 X(_b, e000, f000b000), \
9467 X(_bcond, d000, f0008000), \
9468 X(_bic, 4380, ea200000), \
9469 X(_bics, 4380, ea300000), \
9470 X(_cmn, 42c0, eb100f00), \
9471 X(_cmp, 2800, ebb00f00), \
9472 X(_cpsie, b660, f3af8400), \
9473 X(_cpsid, b670, f3af8600), \
9474 X(_cpy, 4600, ea4f0000), \
9475 X(_dec_sp,80dd, f1ad0d00), \
9476 X(_eor, 4040, ea800000), \
9477 X(_eors, 4040, ea900000), \
9478 X(_inc_sp,00dd, f10d0d00), \
9479 X(_ldmia, c800, e8900000), \
9480 X(_ldr, 6800, f8500000), \
9481 X(_ldrb, 7800, f8100000), \
9482 X(_ldrh, 8800, f8300000), \
9483 X(_ldrsb, 5600, f9100000), \
9484 X(_ldrsh, 5e00, f9300000), \
9485 X(_ldr_pc,4800, f85f0000), \
9486 X(_ldr_pc2,4800, f85f0000), \
9487 X(_ldr_sp,9800, f85d0000), \
9488 X(_lsl, 0000, fa00f000), \
9489 X(_lsls, 0000, fa10f000), \
9490 X(_lsr, 0800, fa20f000), \
9491 X(_lsrs, 0800, fa30f000), \
9492 X(_mov, 2000, ea4f0000), \
9493 X(_movs, 2000, ea5f0000), \
9494 X(_mul, 4340, fb00f000), \
9495 X(_muls, 4340, ffffffff), /* no 32b muls */ \
9496 X(_mvn, 43c0, ea6f0000), \
9497 X(_mvns, 43c0, ea7f0000), \
9498 X(_neg, 4240, f1c00000), /* rsb #0 */ \
9499 X(_negs, 4240, f1d00000), /* rsbs #0 */ \
9500 X(_orr, 4300, ea400000), \
9501 X(_orrs, 4300, ea500000), \
9502 X(_pop, bc00, e8bd0000), /* ldmia sp!,... */ \
9503 X(_push, b400, e92d0000), /* stmdb sp!,... */ \
9504 X(_rev, ba00, fa90f080), \
9505 X(_rev16, ba40, fa90f090), \
9506 X(_revsh, bac0, fa90f0b0), \
9507 X(_ror, 41c0, fa60f000), \
9508 X(_rors, 41c0, fa70f000), \
9509 X(_sbc, 4180, eb600000), \
9510 X(_sbcs, 4180, eb700000), \
9511 X(_stmia, c000, e8800000), \
9512 X(_str, 6000, f8400000), \
9513 X(_strb, 7000, f8000000), \
9514 X(_strh, 8000, f8200000), \
9515 X(_str_sp,9000, f84d0000), \
9516 X(_sub, 1e00, eba00000), \
9517 X(_subs, 1e00, ebb00000), \
9518 X(_subi, 8000, f1a00000), \
9519 X(_subis, 8000, f1b00000), \
9520 X(_sxtb, b240, fa4ff080), \
9521 X(_sxth, b200, fa0ff080), \
9522 X(_tst, 4200, ea100f00), \
9523 X(_uxtb, b2c0, fa5ff080), \
9524 X(_uxth, b280, fa1ff080), \
9525 X(_nop, bf00, f3af8000), \
9526 X(_yield, bf10, f3af8001), \
9527 X(_wfe, bf20, f3af8002), \
9528 X(_wfi, bf30, f3af8003), \
9529 X(_sev, bf40, f3af8004),
c19d1205
ZW
9530
9531/* To catch errors in encoding functions, the codes are all offset by
9532 0xF800, putting them in one of the 32-bit prefix ranges, ergo undefined
9533 as 16-bit instructions. */
21d799b5 9534#define X(a,b,c) T_MNEM##a
c19d1205
ZW
9535enum t16_32_codes { T16_32_OFFSET = 0xF7FF, T16_32_TAB };
9536#undef X
9537
9538#define X(a,b,c) 0x##b
9539static const unsigned short thumb_op16[] = { T16_32_TAB };
9540#define THUMB_OP16(n) (thumb_op16[(n) - (T16_32_OFFSET + 1)])
9541#undef X
9542
9543#define X(a,b,c) 0x##c
9544static const unsigned int thumb_op32[] = { T16_32_TAB };
c921be7d
NC
9545#define THUMB_OP32(n) (thumb_op32[(n) - (T16_32_OFFSET + 1)])
9546#define THUMB_SETS_FLAGS(n) (THUMB_OP32 (n) & 0x00100000)
c19d1205
ZW
9547#undef X
9548#undef T16_32_TAB
9549
9550/* Thumb instruction encoders, in alphabetical order. */
9551
92e90b6e 9552/* ADDW or SUBW. */
c921be7d 9553
92e90b6e
PB
9554static void
9555do_t_add_sub_w (void)
9556{
9557 int Rd, Rn;
9558
9559 Rd = inst.operands[0].reg;
9560 Rn = inst.operands[1].reg;
9561
539d4391
NC
9562 /* If Rn is REG_PC, this is ADR; if Rn is REG_SP, then this
9563 is the SP-{plus,minus}-immediate form of the instruction. */
9564 if (Rn == REG_SP)
9565 constraint (Rd == REG_PC, BAD_PC);
9566 else
9567 reject_bad_reg (Rd);
fdfde340 9568
92e90b6e
PB
9569 inst.instruction |= (Rn << 16) | (Rd << 8);
9570 inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9571}
9572
c19d1205
ZW
9573/* Parse an add or subtract instruction. We get here with inst.instruction
9574 equalling any of THUMB_OPCODE_add, adds, sub, or subs. */
9575
9576static void
9577do_t_add_sub (void)
9578{
9579 int Rd, Rs, Rn;
9580
9581 Rd = inst.operands[0].reg;
9582 Rs = (inst.operands[1].present
9583 ? inst.operands[1].reg /* Rd, Rs, foo */
9584 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
9585
e07e6e58
NC
9586 if (Rd == REG_PC)
9587 set_it_insn_type_last ();
9588
c19d1205
ZW
9589 if (unified_syntax)
9590 {
0110f2b8
PB
9591 bfd_boolean flags;
9592 bfd_boolean narrow;
9593 int opcode;
9594
9595 flags = (inst.instruction == T_MNEM_adds
9596 || inst.instruction == T_MNEM_subs);
9597 if (flags)
e07e6e58 9598 narrow = !in_it_block ();
0110f2b8 9599 else
e07e6e58 9600 narrow = in_it_block ();
c19d1205 9601 if (!inst.operands[2].isreg)
b99bd4ef 9602 {
16805f35
PB
9603 int add;
9604
fdfde340
JM
9605 constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9606
16805f35
PB
9607 add = (inst.instruction == T_MNEM_add
9608 || inst.instruction == T_MNEM_adds);
0110f2b8
PB
9609 opcode = 0;
9610 if (inst.size_req != 4)
9611 {
0110f2b8
PB
9612 /* Attempt to use a narrow opcode, with relaxation if
9613 appropriate. */
9614 if (Rd == REG_SP && Rs == REG_SP && !flags)
9615 opcode = add ? T_MNEM_inc_sp : T_MNEM_dec_sp;
9616 else if (Rd <= 7 && Rs == REG_SP && add && !flags)
9617 opcode = T_MNEM_add_sp;
9618 else if (Rd <= 7 && Rs == REG_PC && add && !flags)
9619 opcode = T_MNEM_add_pc;
9620 else if (Rd <= 7 && Rs <= 7 && narrow)
9621 {
9622 if (flags)
9623 opcode = add ? T_MNEM_addis : T_MNEM_subis;
9624 else
9625 opcode = add ? T_MNEM_addi : T_MNEM_subi;
9626 }
9627 if (opcode)
9628 {
9629 inst.instruction = THUMB_OP16(opcode);
9630 inst.instruction |= (Rd << 4) | Rs;
9631 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9632 if (inst.size_req != 2)
9633 inst.relax = opcode;
9634 }
9635 else
9636 constraint (inst.size_req == 2, BAD_HIREG);
9637 }
9638 if (inst.size_req == 4
9639 || (inst.size_req != 2 && !opcode))
9640 {
efd81785
PB
9641 if (Rd == REG_PC)
9642 {
fdfde340 9643 constraint (add, BAD_PC);
efd81785
PB
9644 constraint (Rs != REG_LR || inst.instruction != T_MNEM_subs,
9645 _("only SUBS PC, LR, #const allowed"));
9646 constraint (inst.reloc.exp.X_op != O_constant,
9647 _("expression too complex"));
9648 constraint (inst.reloc.exp.X_add_number < 0
9649 || inst.reloc.exp.X_add_number > 0xff,
9650 _("immediate value out of range"));
9651 inst.instruction = T2_SUBS_PC_LR
9652 | inst.reloc.exp.X_add_number;
9653 inst.reloc.type = BFD_RELOC_UNUSED;
9654 return;
9655 }
9656 else if (Rs == REG_PC)
16805f35
PB
9657 {
9658 /* Always use addw/subw. */
9659 inst.instruction = add ? 0xf20f0000 : 0xf2af0000;
9660 inst.reloc.type = BFD_RELOC_ARM_T32_IMM12;
9661 }
9662 else
9663 {
9664 inst.instruction = THUMB_OP32 (inst.instruction);
9665 inst.instruction = (inst.instruction & 0xe1ffffff)
9666 | 0x10000000;
9667 if (flags)
9668 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9669 else
9670 inst.reloc.type = BFD_RELOC_ARM_T32_ADD_IMM;
9671 }
dc4503c6
PB
9672 inst.instruction |= Rd << 8;
9673 inst.instruction |= Rs << 16;
0110f2b8 9674 }
b99bd4ef 9675 }
c19d1205
ZW
9676 else
9677 {
5f4cb198
NC
9678 unsigned int value = inst.reloc.exp.X_add_number;
9679 unsigned int shift = inst.operands[2].shift_kind;
9680
c19d1205
ZW
9681 Rn = inst.operands[2].reg;
9682 /* See if we can do this with a 16-bit instruction. */
9683 if (!inst.operands[2].shifted && inst.size_req != 4)
9684 {
e27ec89e
PB
9685 if (Rd > 7 || Rs > 7 || Rn > 7)
9686 narrow = FALSE;
9687
9688 if (narrow)
c19d1205 9689 {
e27ec89e
PB
9690 inst.instruction = ((inst.instruction == T_MNEM_adds
9691 || inst.instruction == T_MNEM_add)
c19d1205
ZW
9692 ? T_OPCODE_ADD_R3
9693 : T_OPCODE_SUB_R3);
9694 inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
9695 return;
9696 }
b99bd4ef 9697
7e806470 9698 if (inst.instruction == T_MNEM_add && (Rd == Rs || Rd == Rn))
c19d1205 9699 {
7e806470
PB
9700 /* Thumb-1 cores (except v6-M) require at least one high
9701 register in a narrow non flag setting add. */
9702 if (Rd > 7 || Rn > 7
9703 || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2)
9704 || ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_msr))
c19d1205 9705 {
7e806470
PB
9706 if (Rd == Rn)
9707 {
9708 Rn = Rs;
9709 Rs = Rd;
9710 }
c19d1205
ZW
9711 inst.instruction = T_OPCODE_ADD_HI;
9712 inst.instruction |= (Rd & 8) << 4;
9713 inst.instruction |= (Rd & 7);
9714 inst.instruction |= Rn << 3;
9715 return;
9716 }
c19d1205
ZW
9717 }
9718 }
c921be7d 9719
fdfde340
JM
9720 constraint (Rd == REG_PC, BAD_PC);
9721 constraint (Rd == REG_SP && Rs != REG_SP, BAD_SP);
9722 constraint (Rs == REG_PC, BAD_PC);
9723 reject_bad_reg (Rn);
9724
c19d1205
ZW
9725 /* If we get here, it can't be done in 16 bits. */
9726 constraint (inst.operands[2].shifted && inst.operands[2].immisreg,
9727 _("shift must be constant"));
9728 inst.instruction = THUMB_OP32 (inst.instruction);
9729 inst.instruction |= Rd << 8;
9730 inst.instruction |= Rs << 16;
5f4cb198
NC
9731 constraint (Rd == REG_SP && Rs == REG_SP && value > 3,
9732 _("shift value over 3 not allowed in thumb mode"));
9733 constraint (Rd == REG_SP && Rs == REG_SP && shift != SHIFT_LSL,
9734 _("only LSL shift allowed in thumb mode"));
c19d1205
ZW
9735 encode_thumb32_shifted_operand (2);
9736 }
9737 }
9738 else
9739 {
9740 constraint (inst.instruction == T_MNEM_adds
9741 || inst.instruction == T_MNEM_subs,
9742 BAD_THUMB32);
b99bd4ef 9743
c19d1205 9744 if (!inst.operands[2].isreg) /* Rd, Rs, #imm */
b99bd4ef 9745 {
c19d1205
ZW
9746 constraint ((Rd > 7 && (Rd != REG_SP || Rs != REG_SP))
9747 || (Rs > 7 && Rs != REG_SP && Rs != REG_PC),
9748 BAD_HIREG);
9749
9750 inst.instruction = (inst.instruction == T_MNEM_add
9751 ? 0x0000 : 0x8000);
9752 inst.instruction |= (Rd << 4) | Rs;
9753 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
b99bd4ef
NC
9754 return;
9755 }
9756
c19d1205
ZW
9757 Rn = inst.operands[2].reg;
9758 constraint (inst.operands[2].shifted, _("unshifted register required"));
b99bd4ef 9759
c19d1205
ZW
9760 /* We now have Rd, Rs, and Rn set to registers. */
9761 if (Rd > 7 || Rs > 7 || Rn > 7)
b99bd4ef 9762 {
c19d1205
ZW
9763 /* Can't do this for SUB. */
9764 constraint (inst.instruction == T_MNEM_sub, BAD_HIREG);
9765 inst.instruction = T_OPCODE_ADD_HI;
9766 inst.instruction |= (Rd & 8) << 4;
9767 inst.instruction |= (Rd & 7);
9768 if (Rs == Rd)
9769 inst.instruction |= Rn << 3;
9770 else if (Rn == Rd)
9771 inst.instruction |= Rs << 3;
9772 else
9773 constraint (1, _("dest must overlap one source register"));
9774 }
9775 else
9776 {
9777 inst.instruction = (inst.instruction == T_MNEM_add
9778 ? T_OPCODE_ADD_R3 : T_OPCODE_SUB_R3);
9779 inst.instruction |= Rd | (Rs << 3) | (Rn << 6);
b99bd4ef 9780 }
b99bd4ef 9781 }
b99bd4ef
NC
9782}
9783
c19d1205
ZW
9784static void
9785do_t_adr (void)
9786{
fdfde340
JM
9787 unsigned Rd;
9788
9789 Rd = inst.operands[0].reg;
9790 reject_bad_reg (Rd);
9791
9792 if (unified_syntax && inst.size_req == 0 && Rd <= 7)
0110f2b8
PB
9793 {
9794 /* Defer to section relaxation. */
9795 inst.relax = inst.instruction;
9796 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340 9797 inst.instruction |= Rd << 4;
0110f2b8
PB
9798 }
9799 else if (unified_syntax && inst.size_req != 2)
e9f89963 9800 {
0110f2b8 9801 /* Generate a 32-bit opcode. */
e9f89963 9802 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340 9803 inst.instruction |= Rd << 8;
e9f89963
PB
9804 inst.reloc.type = BFD_RELOC_ARM_T32_ADD_PC12;
9805 inst.reloc.pc_rel = 1;
9806 }
9807 else
9808 {
0110f2b8 9809 /* Generate a 16-bit opcode. */
e9f89963
PB
9810 inst.instruction = THUMB_OP16 (inst.instruction);
9811 inst.reloc.type = BFD_RELOC_ARM_THUMB_ADD;
9812 inst.reloc.exp.X_add_number -= 4; /* PC relative adjust. */
9813 inst.reloc.pc_rel = 1;
b99bd4ef 9814
fdfde340 9815 inst.instruction |= Rd << 4;
e9f89963 9816 }
c19d1205 9817}
b99bd4ef 9818
c19d1205
ZW
9819/* Arithmetic instructions for which there is just one 16-bit
9820 instruction encoding, and it allows only two low registers.
9821 For maximal compatibility with ARM syntax, we allow three register
9822 operands even when Thumb-32 instructions are not available, as long
9823 as the first two are identical. For instance, both "sbc r0,r1" and
9824 "sbc r0,r0,r1" are allowed. */
b99bd4ef 9825static void
c19d1205 9826do_t_arit3 (void)
b99bd4ef 9827{
c19d1205 9828 int Rd, Rs, Rn;
b99bd4ef 9829
c19d1205
ZW
9830 Rd = inst.operands[0].reg;
9831 Rs = (inst.operands[1].present
9832 ? inst.operands[1].reg /* Rd, Rs, foo */
9833 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
9834 Rn = inst.operands[2].reg;
b99bd4ef 9835
fdfde340
JM
9836 reject_bad_reg (Rd);
9837 reject_bad_reg (Rs);
9838 if (inst.operands[2].isreg)
9839 reject_bad_reg (Rn);
9840
c19d1205 9841 if (unified_syntax)
b99bd4ef 9842 {
c19d1205
ZW
9843 if (!inst.operands[2].isreg)
9844 {
9845 /* For an immediate, we always generate a 32-bit opcode;
9846 section relaxation will shrink it later if possible. */
9847 inst.instruction = THUMB_OP32 (inst.instruction);
9848 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9849 inst.instruction |= Rd << 8;
9850 inst.instruction |= Rs << 16;
9851 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
9852 }
9853 else
9854 {
e27ec89e
PB
9855 bfd_boolean narrow;
9856
c19d1205 9857 /* See if we can do this with a 16-bit instruction. */
e27ec89e 9858 if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 9859 narrow = !in_it_block ();
e27ec89e 9860 else
e07e6e58 9861 narrow = in_it_block ();
e27ec89e
PB
9862
9863 if (Rd > 7 || Rn > 7 || Rs > 7)
9864 narrow = FALSE;
9865 if (inst.operands[2].shifted)
9866 narrow = FALSE;
9867 if (inst.size_req == 4)
9868 narrow = FALSE;
9869
9870 if (narrow
c19d1205
ZW
9871 && Rd == Rs)
9872 {
9873 inst.instruction = THUMB_OP16 (inst.instruction);
9874 inst.instruction |= Rd;
9875 inst.instruction |= Rn << 3;
9876 return;
9877 }
b99bd4ef 9878
c19d1205
ZW
9879 /* If we get here, it can't be done in 16 bits. */
9880 constraint (inst.operands[2].shifted
9881 && inst.operands[2].immisreg,
9882 _("shift must be constant"));
9883 inst.instruction = THUMB_OP32 (inst.instruction);
9884 inst.instruction |= Rd << 8;
9885 inst.instruction |= Rs << 16;
9886 encode_thumb32_shifted_operand (2);
9887 }
a737bd4d 9888 }
c19d1205 9889 else
b99bd4ef 9890 {
c19d1205
ZW
9891 /* On its face this is a lie - the instruction does set the
9892 flags. However, the only supported mnemonic in this mode
9893 says it doesn't. */
9894 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
a737bd4d 9895
c19d1205
ZW
9896 constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9897 _("unshifted register required"));
9898 constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9899 constraint (Rd != Rs,
9900 _("dest and source1 must be the same register"));
a737bd4d 9901
c19d1205
ZW
9902 inst.instruction = THUMB_OP16 (inst.instruction);
9903 inst.instruction |= Rd;
9904 inst.instruction |= Rn << 3;
b99bd4ef 9905 }
a737bd4d 9906}
b99bd4ef 9907
c19d1205
ZW
9908/* Similarly, but for instructions where the arithmetic operation is
9909 commutative, so we can allow either of them to be different from
9910 the destination operand in a 16-bit instruction. For instance, all
9911 three of "adc r0,r1", "adc r0,r0,r1", and "adc r0,r1,r0" are
9912 accepted. */
9913static void
9914do_t_arit3c (void)
a737bd4d 9915{
c19d1205 9916 int Rd, Rs, Rn;
b99bd4ef 9917
c19d1205
ZW
9918 Rd = inst.operands[0].reg;
9919 Rs = (inst.operands[1].present
9920 ? inst.operands[1].reg /* Rd, Rs, foo */
9921 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
9922 Rn = inst.operands[2].reg;
c921be7d 9923
fdfde340
JM
9924 reject_bad_reg (Rd);
9925 reject_bad_reg (Rs);
9926 if (inst.operands[2].isreg)
9927 reject_bad_reg (Rn);
a737bd4d 9928
c19d1205 9929 if (unified_syntax)
a737bd4d 9930 {
c19d1205 9931 if (!inst.operands[2].isreg)
b99bd4ef 9932 {
c19d1205
ZW
9933 /* For an immediate, we always generate a 32-bit opcode;
9934 section relaxation will shrink it later if possible. */
9935 inst.instruction = THUMB_OP32 (inst.instruction);
9936 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
9937 inst.instruction |= Rd << 8;
9938 inst.instruction |= Rs << 16;
9939 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
b99bd4ef 9940 }
c19d1205 9941 else
a737bd4d 9942 {
e27ec89e
PB
9943 bfd_boolean narrow;
9944
c19d1205 9945 /* See if we can do this with a 16-bit instruction. */
e27ec89e 9946 if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 9947 narrow = !in_it_block ();
e27ec89e 9948 else
e07e6e58 9949 narrow = in_it_block ();
e27ec89e
PB
9950
9951 if (Rd > 7 || Rn > 7 || Rs > 7)
9952 narrow = FALSE;
9953 if (inst.operands[2].shifted)
9954 narrow = FALSE;
9955 if (inst.size_req == 4)
9956 narrow = FALSE;
9957
9958 if (narrow)
a737bd4d 9959 {
c19d1205 9960 if (Rd == Rs)
a737bd4d 9961 {
c19d1205
ZW
9962 inst.instruction = THUMB_OP16 (inst.instruction);
9963 inst.instruction |= Rd;
9964 inst.instruction |= Rn << 3;
9965 return;
a737bd4d 9966 }
c19d1205 9967 if (Rd == Rn)
a737bd4d 9968 {
c19d1205
ZW
9969 inst.instruction = THUMB_OP16 (inst.instruction);
9970 inst.instruction |= Rd;
9971 inst.instruction |= Rs << 3;
9972 return;
a737bd4d
NC
9973 }
9974 }
c19d1205
ZW
9975
9976 /* If we get here, it can't be done in 16 bits. */
9977 constraint (inst.operands[2].shifted
9978 && inst.operands[2].immisreg,
9979 _("shift must be constant"));
9980 inst.instruction = THUMB_OP32 (inst.instruction);
9981 inst.instruction |= Rd << 8;
9982 inst.instruction |= Rs << 16;
9983 encode_thumb32_shifted_operand (2);
a737bd4d 9984 }
b99bd4ef 9985 }
c19d1205
ZW
9986 else
9987 {
9988 /* On its face this is a lie - the instruction does set the
9989 flags. However, the only supported mnemonic in this mode
9990 says it doesn't. */
9991 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
a737bd4d 9992
c19d1205
ZW
9993 constraint (!inst.operands[2].isreg || inst.operands[2].shifted,
9994 _("unshifted register required"));
9995 constraint (Rd > 7 || Rs > 7 || Rn > 7, BAD_HIREG);
9996
9997 inst.instruction = THUMB_OP16 (inst.instruction);
9998 inst.instruction |= Rd;
9999
10000 if (Rd == Rs)
10001 inst.instruction |= Rn << 3;
10002 else if (Rd == Rn)
10003 inst.instruction |= Rs << 3;
10004 else
10005 constraint (1, _("dest must overlap one source register"));
10006 }
a737bd4d
NC
10007}
10008
62b3e311
PB
10009static void
10010do_t_barrier (void)
10011{
10012 if (inst.operands[0].present)
10013 {
10014 constraint ((inst.instruction & 0xf0) != 0x40
52e7f43d
RE
10015 && inst.operands[0].imm > 0xf
10016 && inst.operands[0].imm < 0x0,
bd3ba5d1 10017 _("bad barrier type"));
62b3e311
PB
10018 inst.instruction |= inst.operands[0].imm;
10019 }
10020 else
10021 inst.instruction |= 0xf;
10022}
10023
c19d1205
ZW
10024static void
10025do_t_bfc (void)
a737bd4d 10026{
fdfde340 10027 unsigned Rd;
c19d1205
ZW
10028 unsigned int msb = inst.operands[1].imm + inst.operands[2].imm;
10029 constraint (msb > 32, _("bit-field extends past end of register"));
10030 /* The instruction encoding stores the LSB and MSB,
10031 not the LSB and width. */
fdfde340
JM
10032 Rd = inst.operands[0].reg;
10033 reject_bad_reg (Rd);
10034 inst.instruction |= Rd << 8;
c19d1205
ZW
10035 inst.instruction |= (inst.operands[1].imm & 0x1c) << 10;
10036 inst.instruction |= (inst.operands[1].imm & 0x03) << 6;
10037 inst.instruction |= msb - 1;
b99bd4ef
NC
10038}
10039
c19d1205
ZW
10040static void
10041do_t_bfi (void)
b99bd4ef 10042{
fdfde340 10043 int Rd, Rn;
c19d1205 10044 unsigned int msb;
b99bd4ef 10045
fdfde340
JM
10046 Rd = inst.operands[0].reg;
10047 reject_bad_reg (Rd);
10048
c19d1205
ZW
10049 /* #0 in second position is alternative syntax for bfc, which is
10050 the same instruction but with REG_PC in the Rm field. */
10051 if (!inst.operands[1].isreg)
fdfde340
JM
10052 Rn = REG_PC;
10053 else
10054 {
10055 Rn = inst.operands[1].reg;
10056 reject_bad_reg (Rn);
10057 }
b99bd4ef 10058
c19d1205
ZW
10059 msb = inst.operands[2].imm + inst.operands[3].imm;
10060 constraint (msb > 32, _("bit-field extends past end of register"));
10061 /* The instruction encoding stores the LSB and MSB,
10062 not the LSB and width. */
fdfde340
JM
10063 inst.instruction |= Rd << 8;
10064 inst.instruction |= Rn << 16;
c19d1205
ZW
10065 inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
10066 inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
10067 inst.instruction |= msb - 1;
b99bd4ef
NC
10068}
10069
c19d1205
ZW
10070static void
10071do_t_bfx (void)
b99bd4ef 10072{
fdfde340
JM
10073 unsigned Rd, Rn;
10074
10075 Rd = inst.operands[0].reg;
10076 Rn = inst.operands[1].reg;
10077
10078 reject_bad_reg (Rd);
10079 reject_bad_reg (Rn);
10080
c19d1205
ZW
10081 constraint (inst.operands[2].imm + inst.operands[3].imm > 32,
10082 _("bit-field extends past end of register"));
fdfde340
JM
10083 inst.instruction |= Rd << 8;
10084 inst.instruction |= Rn << 16;
c19d1205
ZW
10085 inst.instruction |= (inst.operands[2].imm & 0x1c) << 10;
10086 inst.instruction |= (inst.operands[2].imm & 0x03) << 6;
10087 inst.instruction |= inst.operands[3].imm - 1;
10088}
b99bd4ef 10089
c19d1205
ZW
10090/* ARM V5 Thumb BLX (argument parse)
10091 BLX <target_addr> which is BLX(1)
10092 BLX <Rm> which is BLX(2)
10093 Unfortunately, there are two different opcodes for this mnemonic.
10094 So, the insns[].value is not used, and the code here zaps values
10095 into inst.instruction.
b99bd4ef 10096
c19d1205
ZW
10097 ??? How to take advantage of the additional two bits of displacement
10098 available in Thumb32 mode? Need new relocation? */
b99bd4ef 10099
c19d1205
ZW
10100static void
10101do_t_blx (void)
10102{
e07e6e58
NC
10103 set_it_insn_type_last ();
10104
c19d1205 10105 if (inst.operands[0].isreg)
fdfde340
JM
10106 {
10107 constraint (inst.operands[0].reg == REG_PC, BAD_PC);
10108 /* We have a register, so this is BLX(2). */
10109 inst.instruction |= inst.operands[0].reg << 3;
10110 }
b99bd4ef
NC
10111 else
10112 {
c19d1205 10113 /* No register. This must be BLX(1). */
2fc8bdac 10114 inst.instruction = 0xf000e800;
0855e32b 10115 encode_branch (BFD_RELOC_THUMB_PCREL_BLX);
b99bd4ef
NC
10116 }
10117}
10118
c19d1205
ZW
10119static void
10120do_t_branch (void)
b99bd4ef 10121{
0110f2b8 10122 int opcode;
dfa9f0d5 10123 int cond;
9ae92b05 10124 int reloc;
dfa9f0d5 10125
e07e6e58
NC
10126 cond = inst.cond;
10127 set_it_insn_type (IF_INSIDE_IT_LAST_INSN);
10128
10129 if (in_it_block ())
dfa9f0d5
PB
10130 {
10131 /* Conditional branches inside IT blocks are encoded as unconditional
10132 branches. */
10133 cond = COND_ALWAYS;
dfa9f0d5
PB
10134 }
10135 else
10136 cond = inst.cond;
10137
10138 if (cond != COND_ALWAYS)
0110f2b8
PB
10139 opcode = T_MNEM_bcond;
10140 else
10141 opcode = inst.instruction;
10142
12d6b0b7
RS
10143 if (unified_syntax
10144 && (inst.size_req == 4
10960bfb
PB
10145 || (inst.size_req != 2
10146 && (inst.operands[0].hasreloc
10147 || inst.reloc.exp.X_op == O_constant))))
c19d1205 10148 {
0110f2b8 10149 inst.instruction = THUMB_OP32(opcode);
dfa9f0d5 10150 if (cond == COND_ALWAYS)
9ae92b05 10151 reloc = BFD_RELOC_THUMB_PCREL_BRANCH25;
c19d1205
ZW
10152 else
10153 {
9c2799c2 10154 gas_assert (cond != 0xF);
dfa9f0d5 10155 inst.instruction |= cond << 22;
9ae92b05 10156 reloc = BFD_RELOC_THUMB_PCREL_BRANCH20;
c19d1205
ZW
10157 }
10158 }
b99bd4ef
NC
10159 else
10160 {
0110f2b8 10161 inst.instruction = THUMB_OP16(opcode);
dfa9f0d5 10162 if (cond == COND_ALWAYS)
9ae92b05 10163 reloc = BFD_RELOC_THUMB_PCREL_BRANCH12;
c19d1205 10164 else
b99bd4ef 10165 {
dfa9f0d5 10166 inst.instruction |= cond << 8;
9ae92b05 10167 reloc = BFD_RELOC_THUMB_PCREL_BRANCH9;
b99bd4ef 10168 }
0110f2b8
PB
10169 /* Allow section relaxation. */
10170 if (unified_syntax && inst.size_req != 2)
10171 inst.relax = opcode;
b99bd4ef 10172 }
9ae92b05 10173 inst.reloc.type = reloc;
c19d1205 10174 inst.reloc.pc_rel = 1;
b99bd4ef
NC
10175}
10176
10177static void
c19d1205 10178do_t_bkpt (void)
b99bd4ef 10179{
dfa9f0d5
PB
10180 constraint (inst.cond != COND_ALWAYS,
10181 _("instruction is always unconditional"));
c19d1205 10182 if (inst.operands[0].present)
b99bd4ef 10183 {
c19d1205
ZW
10184 constraint (inst.operands[0].imm > 255,
10185 _("immediate value out of range"));
10186 inst.instruction |= inst.operands[0].imm;
e07e6e58 10187 set_it_insn_type (NEUTRAL_IT_INSN);
b99bd4ef 10188 }
b99bd4ef
NC
10189}
10190
10191static void
c19d1205 10192do_t_branch23 (void)
b99bd4ef 10193{
e07e6e58 10194 set_it_insn_type_last ();
0855e32b 10195 encode_branch (BFD_RELOC_THUMB_PCREL_BRANCH23);
fa94de6b 10196
0855e32b
NS
10197 /* md_apply_fix blows up with 'bl foo(PLT)' where foo is defined in
10198 this file. We used to simply ignore the PLT reloc type here --
10199 the branch encoding is now needed to deal with TLSCALL relocs.
10200 So if we see a PLT reloc now, put it back to how it used to be to
10201 keep the preexisting behaviour. */
10202 if (inst.reloc.type == BFD_RELOC_ARM_PLT32)
10203 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH23;
90e4755a 10204
4343666d 10205#if defined(OBJ_COFF)
c19d1205
ZW
10206 /* If the destination of the branch is a defined symbol which does not have
10207 the THUMB_FUNC attribute, then we must be calling a function which has
10208 the (interfacearm) attribute. We look for the Thumb entry point to that
10209 function and change the branch to refer to that function instead. */
10210 if ( inst.reloc.exp.X_op == O_symbol
10211 && inst.reloc.exp.X_add_symbol != NULL
10212 && S_IS_DEFINED (inst.reloc.exp.X_add_symbol)
10213 && ! THUMB_IS_FUNC (inst.reloc.exp.X_add_symbol))
10214 inst.reloc.exp.X_add_symbol =
10215 find_real_start (inst.reloc.exp.X_add_symbol);
4343666d 10216#endif
90e4755a
RE
10217}
10218
10219static void
c19d1205 10220do_t_bx (void)
90e4755a 10221{
e07e6e58 10222 set_it_insn_type_last ();
c19d1205
ZW
10223 inst.instruction |= inst.operands[0].reg << 3;
10224 /* ??? FIXME: Should add a hacky reloc here if reg is REG_PC. The reloc
10225 should cause the alignment to be checked once it is known. This is
10226 because BX PC only works if the instruction is word aligned. */
10227}
90e4755a 10228
c19d1205
ZW
10229static void
10230do_t_bxj (void)
10231{
fdfde340 10232 int Rm;
90e4755a 10233
e07e6e58 10234 set_it_insn_type_last ();
fdfde340
JM
10235 Rm = inst.operands[0].reg;
10236 reject_bad_reg (Rm);
10237 inst.instruction |= Rm << 16;
90e4755a
RE
10238}
10239
10240static void
c19d1205 10241do_t_clz (void)
90e4755a 10242{
fdfde340
JM
10243 unsigned Rd;
10244 unsigned Rm;
10245
10246 Rd = inst.operands[0].reg;
10247 Rm = inst.operands[1].reg;
10248
10249 reject_bad_reg (Rd);
10250 reject_bad_reg (Rm);
10251
10252 inst.instruction |= Rd << 8;
10253 inst.instruction |= Rm << 16;
10254 inst.instruction |= Rm;
c19d1205 10255}
90e4755a 10256
dfa9f0d5
PB
10257static void
10258do_t_cps (void)
10259{
e07e6e58 10260 set_it_insn_type (OUTSIDE_IT_INSN);
dfa9f0d5
PB
10261 inst.instruction |= inst.operands[0].imm;
10262}
10263
c19d1205
ZW
10264static void
10265do_t_cpsi (void)
10266{
e07e6e58 10267 set_it_insn_type (OUTSIDE_IT_INSN);
c19d1205 10268 if (unified_syntax
62b3e311
PB
10269 && (inst.operands[1].present || inst.size_req == 4)
10270 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6_notm))
90e4755a 10271 {
c19d1205
ZW
10272 unsigned int imod = (inst.instruction & 0x0030) >> 4;
10273 inst.instruction = 0xf3af8000;
10274 inst.instruction |= imod << 9;
10275 inst.instruction |= inst.operands[0].imm << 5;
10276 if (inst.operands[1].present)
10277 inst.instruction |= 0x100 | inst.operands[1].imm;
90e4755a 10278 }
c19d1205 10279 else
90e4755a 10280 {
62b3e311
PB
10281 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1)
10282 && (inst.operands[0].imm & 4),
10283 _("selected processor does not support 'A' form "
10284 "of this instruction"));
10285 constraint (inst.operands[1].present || inst.size_req == 4,
c19d1205
ZW
10286 _("Thumb does not support the 2-argument "
10287 "form of this instruction"));
10288 inst.instruction |= inst.operands[0].imm;
90e4755a 10289 }
90e4755a
RE
10290}
10291
c19d1205
ZW
10292/* THUMB CPY instruction (argument parse). */
10293
90e4755a 10294static void
c19d1205 10295do_t_cpy (void)
90e4755a 10296{
c19d1205 10297 if (inst.size_req == 4)
90e4755a 10298 {
c19d1205
ZW
10299 inst.instruction = THUMB_OP32 (T_MNEM_mov);
10300 inst.instruction |= inst.operands[0].reg << 8;
10301 inst.instruction |= inst.operands[1].reg;
90e4755a 10302 }
c19d1205 10303 else
90e4755a 10304 {
c19d1205
ZW
10305 inst.instruction |= (inst.operands[0].reg & 0x8) << 4;
10306 inst.instruction |= (inst.operands[0].reg & 0x7);
10307 inst.instruction |= inst.operands[1].reg << 3;
90e4755a 10308 }
90e4755a
RE
10309}
10310
90e4755a 10311static void
25fe350b 10312do_t_cbz (void)
90e4755a 10313{
e07e6e58 10314 set_it_insn_type (OUTSIDE_IT_INSN);
c19d1205
ZW
10315 constraint (inst.operands[0].reg > 7, BAD_HIREG);
10316 inst.instruction |= inst.operands[0].reg;
10317 inst.reloc.pc_rel = 1;
10318 inst.reloc.type = BFD_RELOC_THUMB_PCREL_BRANCH7;
10319}
90e4755a 10320
62b3e311
PB
10321static void
10322do_t_dbg (void)
10323{
10324 inst.instruction |= inst.operands[0].imm;
10325}
10326
10327static void
10328do_t_div (void)
10329{
fdfde340
JM
10330 unsigned Rd, Rn, Rm;
10331
10332 Rd = inst.operands[0].reg;
10333 Rn = (inst.operands[1].present
10334 ? inst.operands[1].reg : Rd);
10335 Rm = inst.operands[2].reg;
10336
10337 reject_bad_reg (Rd);
10338 reject_bad_reg (Rn);
10339 reject_bad_reg (Rm);
10340
10341 inst.instruction |= Rd << 8;
10342 inst.instruction |= Rn << 16;
10343 inst.instruction |= Rm;
62b3e311
PB
10344}
10345
c19d1205
ZW
10346static void
10347do_t_hint (void)
10348{
10349 if (unified_syntax && inst.size_req == 4)
10350 inst.instruction = THUMB_OP32 (inst.instruction);
10351 else
10352 inst.instruction = THUMB_OP16 (inst.instruction);
10353}
90e4755a 10354
c19d1205
ZW
10355static void
10356do_t_it (void)
10357{
10358 unsigned int cond = inst.operands[0].imm;
e27ec89e 10359
e07e6e58
NC
10360 set_it_insn_type (IT_INSN);
10361 now_it.mask = (inst.instruction & 0xf) | 0x10;
10362 now_it.cc = cond;
5a01bb1d 10363 now_it.warn_deprecated = FALSE;
e27ec89e
PB
10364
10365 /* If the condition is a negative condition, invert the mask. */
c19d1205 10366 if ((cond & 0x1) == 0x0)
90e4755a 10367 {
c19d1205 10368 unsigned int mask = inst.instruction & 0x000f;
90e4755a 10369
c19d1205 10370 if ((mask & 0x7) == 0)
5a01bb1d
MGD
10371 {
10372 /* No conversion needed. */
10373 now_it.block_length = 1;
10374 }
c19d1205 10375 else if ((mask & 0x3) == 0)
5a01bb1d
MGD
10376 {
10377 mask ^= 0x8;
10378 now_it.block_length = 2;
10379 }
e27ec89e 10380 else if ((mask & 0x1) == 0)
5a01bb1d
MGD
10381 {
10382 mask ^= 0xC;
10383 now_it.block_length = 3;
10384 }
c19d1205 10385 else
5a01bb1d
MGD
10386 {
10387 mask ^= 0xE;
10388 now_it.block_length = 4;
10389 }
90e4755a 10390
e27ec89e
PB
10391 inst.instruction &= 0xfff0;
10392 inst.instruction |= mask;
c19d1205 10393 }
90e4755a 10394
c19d1205
ZW
10395 inst.instruction |= cond << 4;
10396}
90e4755a 10397
3c707909
PB
10398/* Helper function used for both push/pop and ldm/stm. */
10399static void
10400encode_thumb2_ldmstm (int base, unsigned mask, bfd_boolean writeback)
10401{
10402 bfd_boolean load;
10403
10404 load = (inst.instruction & (1 << 20)) != 0;
10405
10406 if (mask & (1 << 13))
10407 inst.error = _("SP not allowed in register list");
1e5b0379
NC
10408
10409 if ((mask & (1 << base)) != 0
10410 && writeback)
10411 inst.error = _("having the base register in the register list when "
10412 "using write back is UNPREDICTABLE");
10413
3c707909
PB
10414 if (load)
10415 {
e07e6e58
NC
10416 if (mask & (1 << 15))
10417 {
10418 if (mask & (1 << 14))
10419 inst.error = _("LR and PC should not both be in register list");
10420 else
10421 set_it_insn_type_last ();
10422 }
3c707909
PB
10423 }
10424 else
10425 {
10426 if (mask & (1 << 15))
10427 inst.error = _("PC not allowed in register list");
3c707909
PB
10428 }
10429
10430 if ((mask & (mask - 1)) == 0)
10431 {
10432 /* Single register transfers implemented as str/ldr. */
10433 if (writeback)
10434 {
10435 if (inst.instruction & (1 << 23))
10436 inst.instruction = 0x00000b04; /* ia! -> [base], #4 */
10437 else
10438 inst.instruction = 0x00000d04; /* db! -> [base, #-4]! */
10439 }
10440 else
10441 {
10442 if (inst.instruction & (1 << 23))
10443 inst.instruction = 0x00800000; /* ia -> [base] */
10444 else
10445 inst.instruction = 0x00000c04; /* db -> [base, #-4] */
10446 }
10447
10448 inst.instruction |= 0xf8400000;
10449 if (load)
10450 inst.instruction |= 0x00100000;
10451
5f4273c7 10452 mask = ffs (mask) - 1;
3c707909
PB
10453 mask <<= 12;
10454 }
10455 else if (writeback)
10456 inst.instruction |= WRITE_BACK;
10457
10458 inst.instruction |= mask;
10459 inst.instruction |= base << 16;
10460}
10461
c19d1205
ZW
10462static void
10463do_t_ldmstm (void)
10464{
10465 /* This really doesn't seem worth it. */
10466 constraint (inst.reloc.type != BFD_RELOC_UNUSED,
10467 _("expression too complex"));
10468 constraint (inst.operands[1].writeback,
10469 _("Thumb load/store multiple does not support {reglist}^"));
90e4755a 10470
c19d1205
ZW
10471 if (unified_syntax)
10472 {
3c707909
PB
10473 bfd_boolean narrow;
10474 unsigned mask;
10475
10476 narrow = FALSE;
c19d1205
ZW
10477 /* See if we can use a 16-bit instruction. */
10478 if (inst.instruction < 0xffff /* not ldmdb/stmdb */
10479 && inst.size_req != 4
3c707909 10480 && !(inst.operands[1].imm & ~0xff))
90e4755a 10481 {
3c707909 10482 mask = 1 << inst.operands[0].reg;
90e4755a 10483
eab4f823 10484 if (inst.operands[0].reg <= 7)
90e4755a 10485 {
3c707909 10486 if (inst.instruction == T_MNEM_stmia
eab4f823
MGD
10487 ? inst.operands[0].writeback
10488 : (inst.operands[0].writeback
10489 == !(inst.operands[1].imm & mask)))
10490 {
10491 if (inst.instruction == T_MNEM_stmia
10492 && (inst.operands[1].imm & mask)
10493 && (inst.operands[1].imm & (mask - 1)))
10494 as_warn (_("value stored for r%d is UNKNOWN"),
10495 inst.operands[0].reg);
3c707909 10496
eab4f823
MGD
10497 inst.instruction = THUMB_OP16 (inst.instruction);
10498 inst.instruction |= inst.operands[0].reg << 8;
10499 inst.instruction |= inst.operands[1].imm;
10500 narrow = TRUE;
10501 }
10502 else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10503 {
10504 /* This means 1 register in reg list one of 3 situations:
10505 1. Instruction is stmia, but without writeback.
10506 2. lmdia without writeback, but with Rn not in
10507 reglist.
10508 3. ldmia with writeback, but with Rn in reglist.
10509 Case 3 is UNPREDICTABLE behaviour, so we handle
10510 case 1 and 2 which can be converted into a 16-bit
10511 str or ldr. The SP cases are handled below. */
10512 unsigned long opcode;
10513 /* First, record an error for Case 3. */
10514 if (inst.operands[1].imm & mask
10515 && inst.operands[0].writeback)
fa94de6b 10516 inst.error =
eab4f823
MGD
10517 _("having the base register in the register list when "
10518 "using write back is UNPREDICTABLE");
fa94de6b
RM
10519
10520 opcode = (inst.instruction == T_MNEM_stmia ? T_MNEM_str
eab4f823
MGD
10521 : T_MNEM_ldr);
10522 inst.instruction = THUMB_OP16 (opcode);
10523 inst.instruction |= inst.operands[0].reg << 3;
10524 inst.instruction |= (ffs (inst.operands[1].imm)-1);
10525 narrow = TRUE;
10526 }
90e4755a 10527 }
eab4f823 10528 else if (inst.operands[0] .reg == REG_SP)
90e4755a 10529 {
eab4f823
MGD
10530 if (inst.operands[0].writeback)
10531 {
fa94de6b 10532 inst.instruction =
eab4f823
MGD
10533 THUMB_OP16 (inst.instruction == T_MNEM_stmia
10534 ? T_MNEM_push : T_MNEM_pop);
10535 inst.instruction |= inst.operands[1].imm;
10536 narrow = TRUE;
10537 }
10538 else if ((inst.operands[1].imm & (inst.operands[1].imm-1)) == 0)
10539 {
fa94de6b 10540 inst.instruction =
eab4f823
MGD
10541 THUMB_OP16 (inst.instruction == T_MNEM_stmia
10542 ? T_MNEM_str_sp : T_MNEM_ldr_sp);
10543 inst.instruction |= ((ffs (inst.operands[1].imm)-1) << 8);
10544 narrow = TRUE;
10545 }
90e4755a 10546 }
3c707909
PB
10547 }
10548
10549 if (!narrow)
10550 {
c19d1205
ZW
10551 if (inst.instruction < 0xffff)
10552 inst.instruction = THUMB_OP32 (inst.instruction);
3c707909 10553
5f4273c7
NC
10554 encode_thumb2_ldmstm (inst.operands[0].reg, inst.operands[1].imm,
10555 inst.operands[0].writeback);
90e4755a
RE
10556 }
10557 }
c19d1205 10558 else
90e4755a 10559 {
c19d1205
ZW
10560 constraint (inst.operands[0].reg > 7
10561 || (inst.operands[1].imm & ~0xff), BAD_HIREG);
1198ca51
PB
10562 constraint (inst.instruction != T_MNEM_ldmia
10563 && inst.instruction != T_MNEM_stmia,
10564 _("Thumb-2 instruction only valid in unified syntax"));
c19d1205 10565 if (inst.instruction == T_MNEM_stmia)
f03698e6 10566 {
c19d1205
ZW
10567 if (!inst.operands[0].writeback)
10568 as_warn (_("this instruction will write back the base register"));
10569 if ((inst.operands[1].imm & (1 << inst.operands[0].reg))
10570 && (inst.operands[1].imm & ((1 << inst.operands[0].reg) - 1)))
1e5b0379 10571 as_warn (_("value stored for r%d is UNKNOWN"),
c19d1205 10572 inst.operands[0].reg);
f03698e6 10573 }
c19d1205 10574 else
90e4755a 10575 {
c19d1205
ZW
10576 if (!inst.operands[0].writeback
10577 && !(inst.operands[1].imm & (1 << inst.operands[0].reg)))
10578 as_warn (_("this instruction will write back the base register"));
10579 else if (inst.operands[0].writeback
10580 && (inst.operands[1].imm & (1 << inst.operands[0].reg)))
10581 as_warn (_("this instruction will not write back the base register"));
90e4755a
RE
10582 }
10583
c19d1205
ZW
10584 inst.instruction = THUMB_OP16 (inst.instruction);
10585 inst.instruction |= inst.operands[0].reg << 8;
10586 inst.instruction |= inst.operands[1].imm;
10587 }
10588}
e28cd48c 10589
c19d1205
ZW
10590static void
10591do_t_ldrex (void)
10592{
10593 constraint (!inst.operands[1].isreg || !inst.operands[1].preind
10594 || inst.operands[1].postind || inst.operands[1].writeback
10595 || inst.operands[1].immisreg || inst.operands[1].shifted
10596 || inst.operands[1].negative,
01cfc07f 10597 BAD_ADDR_MODE);
e28cd48c 10598
5be8be5d
DG
10599 constraint ((inst.operands[1].reg == REG_PC), BAD_PC);
10600
c19d1205
ZW
10601 inst.instruction |= inst.operands[0].reg << 12;
10602 inst.instruction |= inst.operands[1].reg << 16;
10603 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
10604}
e28cd48c 10605
c19d1205
ZW
10606static void
10607do_t_ldrexd (void)
10608{
10609 if (!inst.operands[1].present)
1cac9012 10610 {
c19d1205
ZW
10611 constraint (inst.operands[0].reg == REG_LR,
10612 _("r14 not allowed as first register "
10613 "when second register is omitted"));
10614 inst.operands[1].reg = inst.operands[0].reg + 1;
b99bd4ef 10615 }
c19d1205
ZW
10616 constraint (inst.operands[0].reg == inst.operands[1].reg,
10617 BAD_OVERLAP);
b99bd4ef 10618
c19d1205
ZW
10619 inst.instruction |= inst.operands[0].reg << 12;
10620 inst.instruction |= inst.operands[1].reg << 8;
10621 inst.instruction |= inst.operands[2].reg << 16;
b99bd4ef
NC
10622}
10623
10624static void
c19d1205 10625do_t_ldst (void)
b99bd4ef 10626{
0110f2b8
PB
10627 unsigned long opcode;
10628 int Rn;
10629
e07e6e58
NC
10630 if (inst.operands[0].isreg
10631 && !inst.operands[0].preind
10632 && inst.operands[0].reg == REG_PC)
10633 set_it_insn_type_last ();
10634
0110f2b8 10635 opcode = inst.instruction;
c19d1205 10636 if (unified_syntax)
b99bd4ef 10637 {
53365c0d
PB
10638 if (!inst.operands[1].isreg)
10639 {
10640 if (opcode <= 0xffff)
10641 inst.instruction = THUMB_OP32 (opcode);
10642 if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10643 return;
10644 }
0110f2b8
PB
10645 if (inst.operands[1].isreg
10646 && !inst.operands[1].writeback
c19d1205
ZW
10647 && !inst.operands[1].shifted && !inst.operands[1].postind
10648 && !inst.operands[1].negative && inst.operands[0].reg <= 7
0110f2b8
PB
10649 && opcode <= 0xffff
10650 && inst.size_req != 4)
c19d1205 10651 {
0110f2b8
PB
10652 /* Insn may have a 16-bit form. */
10653 Rn = inst.operands[1].reg;
10654 if (inst.operands[1].immisreg)
10655 {
10656 inst.instruction = THUMB_OP16 (opcode);
5f4273c7 10657 /* [Rn, Rik] */
0110f2b8
PB
10658 if (Rn <= 7 && inst.operands[1].imm <= 7)
10659 goto op16;
5be8be5d
DG
10660 else if (opcode != T_MNEM_ldr && opcode != T_MNEM_str)
10661 reject_bad_reg (inst.operands[1].imm);
0110f2b8
PB
10662 }
10663 else if ((Rn <= 7 && opcode != T_MNEM_ldrsh
10664 && opcode != T_MNEM_ldrsb)
10665 || ((Rn == REG_PC || Rn == REG_SP) && opcode == T_MNEM_ldr)
10666 || (Rn == REG_SP && opcode == T_MNEM_str))
10667 {
10668 /* [Rn, #const] */
10669 if (Rn > 7)
10670 {
10671 if (Rn == REG_PC)
10672 {
10673 if (inst.reloc.pc_rel)
10674 opcode = T_MNEM_ldr_pc2;
10675 else
10676 opcode = T_MNEM_ldr_pc;
10677 }
10678 else
10679 {
10680 if (opcode == T_MNEM_ldr)
10681 opcode = T_MNEM_ldr_sp;
10682 else
10683 opcode = T_MNEM_str_sp;
10684 }
10685 inst.instruction = inst.operands[0].reg << 8;
10686 }
10687 else
10688 {
10689 inst.instruction = inst.operands[0].reg;
10690 inst.instruction |= inst.operands[1].reg << 3;
10691 }
10692 inst.instruction |= THUMB_OP16 (opcode);
10693 if (inst.size_req == 2)
10694 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10695 else
10696 inst.relax = opcode;
10697 return;
10698 }
c19d1205 10699 }
0110f2b8 10700 /* Definitely a 32-bit variant. */
5be8be5d 10701
8d67f500
NC
10702 /* Warning for Erratum 752419. */
10703 if (opcode == T_MNEM_ldr
10704 && inst.operands[0].reg == REG_SP
10705 && inst.operands[1].writeback == 1
10706 && !inst.operands[1].immisreg)
10707 {
10708 if (no_cpu_selected ()
10709 || (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7)
10710 && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a)
10711 && !ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7r)))
10712 as_warn (_("This instruction may be unpredictable "
10713 "if executed on M-profile cores "
10714 "with interrupts enabled."));
10715 }
10716
5be8be5d 10717 /* Do some validations regarding addressing modes. */
1be5fd2e 10718 if (inst.operands[1].immisreg)
5be8be5d
DG
10719 reject_bad_reg (inst.operands[1].imm);
10720
1be5fd2e
NC
10721 constraint (inst.operands[1].writeback == 1
10722 && inst.operands[0].reg == inst.operands[1].reg,
10723 BAD_OVERLAP);
10724
0110f2b8 10725 inst.instruction = THUMB_OP32 (opcode);
c19d1205
ZW
10726 inst.instruction |= inst.operands[0].reg << 12;
10727 encode_thumb32_addr_mode (1, /*is_t=*/FALSE, /*is_d=*/FALSE);
1be5fd2e 10728 check_ldr_r15_aligned ();
b99bd4ef
NC
10729 return;
10730 }
10731
c19d1205
ZW
10732 constraint (inst.operands[0].reg > 7, BAD_HIREG);
10733
10734 if (inst.instruction == T_MNEM_ldrsh || inst.instruction == T_MNEM_ldrsb)
b99bd4ef 10735 {
c19d1205
ZW
10736 /* Only [Rn,Rm] is acceptable. */
10737 constraint (inst.operands[1].reg > 7 || inst.operands[1].imm > 7, BAD_HIREG);
10738 constraint (!inst.operands[1].isreg || !inst.operands[1].immisreg
10739 || inst.operands[1].postind || inst.operands[1].shifted
10740 || inst.operands[1].negative,
10741 _("Thumb does not support this addressing mode"));
10742 inst.instruction = THUMB_OP16 (inst.instruction);
10743 goto op16;
b99bd4ef 10744 }
5f4273c7 10745
c19d1205
ZW
10746 inst.instruction = THUMB_OP16 (inst.instruction);
10747 if (!inst.operands[1].isreg)
10748 if (move_or_literal_pool (0, /*thumb_p=*/TRUE, /*mode_3=*/FALSE))
10749 return;
b99bd4ef 10750
c19d1205
ZW
10751 constraint (!inst.operands[1].preind
10752 || inst.operands[1].shifted
10753 || inst.operands[1].writeback,
10754 _("Thumb does not support this addressing mode"));
10755 if (inst.operands[1].reg == REG_PC || inst.operands[1].reg == REG_SP)
90e4755a 10756 {
c19d1205
ZW
10757 constraint (inst.instruction & 0x0600,
10758 _("byte or halfword not valid for base register"));
10759 constraint (inst.operands[1].reg == REG_PC
10760 && !(inst.instruction & THUMB_LOAD_BIT),
10761 _("r15 based store not allowed"));
10762 constraint (inst.operands[1].immisreg,
10763 _("invalid base register for register offset"));
b99bd4ef 10764
c19d1205
ZW
10765 if (inst.operands[1].reg == REG_PC)
10766 inst.instruction = T_OPCODE_LDR_PC;
10767 else if (inst.instruction & THUMB_LOAD_BIT)
10768 inst.instruction = T_OPCODE_LDR_SP;
10769 else
10770 inst.instruction = T_OPCODE_STR_SP;
b99bd4ef 10771
c19d1205
ZW
10772 inst.instruction |= inst.operands[0].reg << 8;
10773 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10774 return;
10775 }
90e4755a 10776
c19d1205
ZW
10777 constraint (inst.operands[1].reg > 7, BAD_HIREG);
10778 if (!inst.operands[1].immisreg)
10779 {
10780 /* Immediate offset. */
10781 inst.instruction |= inst.operands[0].reg;
10782 inst.instruction |= inst.operands[1].reg << 3;
10783 inst.reloc.type = BFD_RELOC_ARM_THUMB_OFFSET;
10784 return;
10785 }
90e4755a 10786
c19d1205
ZW
10787 /* Register offset. */
10788 constraint (inst.operands[1].imm > 7, BAD_HIREG);
10789 constraint (inst.operands[1].negative,
10790 _("Thumb does not support this addressing mode"));
90e4755a 10791
c19d1205
ZW
10792 op16:
10793 switch (inst.instruction)
10794 {
10795 case T_OPCODE_STR_IW: inst.instruction = T_OPCODE_STR_RW; break;
10796 case T_OPCODE_STR_IH: inst.instruction = T_OPCODE_STR_RH; break;
10797 case T_OPCODE_STR_IB: inst.instruction = T_OPCODE_STR_RB; break;
10798 case T_OPCODE_LDR_IW: inst.instruction = T_OPCODE_LDR_RW; break;
10799 case T_OPCODE_LDR_IH: inst.instruction = T_OPCODE_LDR_RH; break;
10800 case T_OPCODE_LDR_IB: inst.instruction = T_OPCODE_LDR_RB; break;
10801 case 0x5600 /* ldrsb */:
10802 case 0x5e00 /* ldrsh */: break;
10803 default: abort ();
10804 }
90e4755a 10805
c19d1205
ZW
10806 inst.instruction |= inst.operands[0].reg;
10807 inst.instruction |= inst.operands[1].reg << 3;
10808 inst.instruction |= inst.operands[1].imm << 6;
10809}
90e4755a 10810
c19d1205
ZW
10811static void
10812do_t_ldstd (void)
10813{
10814 if (!inst.operands[1].present)
b99bd4ef 10815 {
c19d1205
ZW
10816 inst.operands[1].reg = inst.operands[0].reg + 1;
10817 constraint (inst.operands[0].reg == REG_LR,
10818 _("r14 not allowed here"));
bd340a04
MGD
10819 constraint (inst.operands[0].reg == REG_R12,
10820 _("r12 not allowed here"));
b99bd4ef 10821 }
bd340a04
MGD
10822
10823 if (inst.operands[2].writeback
10824 && (inst.operands[0].reg == inst.operands[2].reg
10825 || inst.operands[1].reg == inst.operands[2].reg))
10826 as_warn (_("base register written back, and overlaps "
10827 "one of transfer registers"));
10828
c19d1205
ZW
10829 inst.instruction |= inst.operands[0].reg << 12;
10830 inst.instruction |= inst.operands[1].reg << 8;
10831 encode_thumb32_addr_mode (2, /*is_t=*/FALSE, /*is_d=*/TRUE);
b99bd4ef
NC
10832}
10833
c19d1205
ZW
10834static void
10835do_t_ldstt (void)
10836{
10837 inst.instruction |= inst.operands[0].reg << 12;
10838 encode_thumb32_addr_mode (1, /*is_t=*/TRUE, /*is_d=*/FALSE);
10839}
a737bd4d 10840
b99bd4ef 10841static void
c19d1205 10842do_t_mla (void)
b99bd4ef 10843{
fdfde340 10844 unsigned Rd, Rn, Rm, Ra;
c921be7d 10845
fdfde340
JM
10846 Rd = inst.operands[0].reg;
10847 Rn = inst.operands[1].reg;
10848 Rm = inst.operands[2].reg;
10849 Ra = inst.operands[3].reg;
10850
10851 reject_bad_reg (Rd);
10852 reject_bad_reg (Rn);
10853 reject_bad_reg (Rm);
10854 reject_bad_reg (Ra);
10855
10856 inst.instruction |= Rd << 8;
10857 inst.instruction |= Rn << 16;
10858 inst.instruction |= Rm;
10859 inst.instruction |= Ra << 12;
c19d1205 10860}
b99bd4ef 10861
c19d1205
ZW
10862static void
10863do_t_mlal (void)
10864{
fdfde340
JM
10865 unsigned RdLo, RdHi, Rn, Rm;
10866
10867 RdLo = inst.operands[0].reg;
10868 RdHi = inst.operands[1].reg;
10869 Rn = inst.operands[2].reg;
10870 Rm = inst.operands[3].reg;
10871
10872 reject_bad_reg (RdLo);
10873 reject_bad_reg (RdHi);
10874 reject_bad_reg (Rn);
10875 reject_bad_reg (Rm);
10876
10877 inst.instruction |= RdLo << 12;
10878 inst.instruction |= RdHi << 8;
10879 inst.instruction |= Rn << 16;
10880 inst.instruction |= Rm;
c19d1205 10881}
b99bd4ef 10882
c19d1205
ZW
10883static void
10884do_t_mov_cmp (void)
10885{
fdfde340
JM
10886 unsigned Rn, Rm;
10887
10888 Rn = inst.operands[0].reg;
10889 Rm = inst.operands[1].reg;
10890
e07e6e58
NC
10891 if (Rn == REG_PC)
10892 set_it_insn_type_last ();
10893
c19d1205 10894 if (unified_syntax)
b99bd4ef 10895 {
c19d1205
ZW
10896 int r0off = (inst.instruction == T_MNEM_mov
10897 || inst.instruction == T_MNEM_movs) ? 8 : 16;
0110f2b8 10898 unsigned long opcode;
3d388997
PB
10899 bfd_boolean narrow;
10900 bfd_boolean low_regs;
10901
fdfde340 10902 low_regs = (Rn <= 7 && Rm <= 7);
0110f2b8 10903 opcode = inst.instruction;
e07e6e58 10904 if (in_it_block ())
0110f2b8 10905 narrow = opcode != T_MNEM_movs;
3d388997 10906 else
0110f2b8 10907 narrow = opcode != T_MNEM_movs || low_regs;
3d388997
PB
10908 if (inst.size_req == 4
10909 || inst.operands[1].shifted)
10910 narrow = FALSE;
10911
efd81785
PB
10912 /* MOVS PC, LR is encoded as SUBS PC, LR, #0. */
10913 if (opcode == T_MNEM_movs && inst.operands[1].isreg
10914 && !inst.operands[1].shifted
fdfde340
JM
10915 && Rn == REG_PC
10916 && Rm == REG_LR)
efd81785
PB
10917 {
10918 inst.instruction = T2_SUBS_PC_LR;
10919 return;
10920 }
10921
fdfde340
JM
10922 if (opcode == T_MNEM_cmp)
10923 {
10924 constraint (Rn == REG_PC, BAD_PC);
94206790
MM
10925 if (narrow)
10926 {
10927 /* In the Thumb-2 ISA, use of R13 as Rm is deprecated,
10928 but valid. */
10929 warn_deprecated_sp (Rm);
10930 /* R15 was documented as a valid choice for Rm in ARMv6,
10931 but as UNPREDICTABLE in ARMv7. ARM's proprietary
10932 tools reject R15, so we do too. */
10933 constraint (Rm == REG_PC, BAD_PC);
10934 }
10935 else
10936 reject_bad_reg (Rm);
fdfde340
JM
10937 }
10938 else if (opcode == T_MNEM_mov
10939 || opcode == T_MNEM_movs)
10940 {
10941 if (inst.operands[1].isreg)
10942 {
10943 if (opcode == T_MNEM_movs)
10944 {
10945 reject_bad_reg (Rn);
10946 reject_bad_reg (Rm);
10947 }
76fa04a4
MGD
10948 else if (narrow)
10949 {
10950 /* This is mov.n. */
10951 if ((Rn == REG_SP || Rn == REG_PC)
10952 && (Rm == REG_SP || Rm == REG_PC))
10953 {
10954 as_warn (_("Use of r%u as a source register is "
10955 "deprecated when r%u is the destination "
10956 "register."), Rm, Rn);
10957 }
10958 }
10959 else
10960 {
10961 /* This is mov.w. */
10962 constraint (Rn == REG_PC, BAD_PC);
10963 constraint (Rm == REG_PC, BAD_PC);
10964 constraint (Rn == REG_SP && Rm == REG_SP, BAD_SP);
10965 }
fdfde340
JM
10966 }
10967 else
10968 reject_bad_reg (Rn);
10969 }
10970
c19d1205
ZW
10971 if (!inst.operands[1].isreg)
10972 {
0110f2b8 10973 /* Immediate operand. */
e07e6e58 10974 if (!in_it_block () && opcode == T_MNEM_mov)
0110f2b8
PB
10975 narrow = 0;
10976 if (low_regs && narrow)
10977 {
10978 inst.instruction = THUMB_OP16 (opcode);
fdfde340 10979 inst.instruction |= Rn << 8;
0110f2b8
PB
10980 if (inst.size_req == 2)
10981 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
10982 else
10983 inst.relax = opcode;
10984 }
10985 else
10986 {
10987 inst.instruction = THUMB_OP32 (inst.instruction);
10988 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
fdfde340 10989 inst.instruction |= Rn << r0off;
0110f2b8
PB
10990 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
10991 }
c19d1205 10992 }
728ca7c9
PB
10993 else if (inst.operands[1].shifted && inst.operands[1].immisreg
10994 && (inst.instruction == T_MNEM_mov
10995 || inst.instruction == T_MNEM_movs))
10996 {
10997 /* Register shifts are encoded as separate shift instructions. */
10998 bfd_boolean flags = (inst.instruction == T_MNEM_movs);
10999
e07e6e58 11000 if (in_it_block ())
728ca7c9
PB
11001 narrow = !flags;
11002 else
11003 narrow = flags;
11004
11005 if (inst.size_req == 4)
11006 narrow = FALSE;
11007
11008 if (!low_regs || inst.operands[1].imm > 7)
11009 narrow = FALSE;
11010
fdfde340 11011 if (Rn != Rm)
728ca7c9
PB
11012 narrow = FALSE;
11013
11014 switch (inst.operands[1].shift_kind)
11015 {
11016 case SHIFT_LSL:
11017 opcode = narrow ? T_OPCODE_LSL_R : THUMB_OP32 (T_MNEM_lsl);
11018 break;
11019 case SHIFT_ASR:
11020 opcode = narrow ? T_OPCODE_ASR_R : THUMB_OP32 (T_MNEM_asr);
11021 break;
11022 case SHIFT_LSR:
11023 opcode = narrow ? T_OPCODE_LSR_R : THUMB_OP32 (T_MNEM_lsr);
11024 break;
11025 case SHIFT_ROR:
11026 opcode = narrow ? T_OPCODE_ROR_R : THUMB_OP32 (T_MNEM_ror);
11027 break;
11028 default:
5f4273c7 11029 abort ();
728ca7c9
PB
11030 }
11031
11032 inst.instruction = opcode;
11033 if (narrow)
11034 {
fdfde340 11035 inst.instruction |= Rn;
728ca7c9
PB
11036 inst.instruction |= inst.operands[1].imm << 3;
11037 }
11038 else
11039 {
11040 if (flags)
11041 inst.instruction |= CONDS_BIT;
11042
fdfde340
JM
11043 inst.instruction |= Rn << 8;
11044 inst.instruction |= Rm << 16;
728ca7c9
PB
11045 inst.instruction |= inst.operands[1].imm;
11046 }
11047 }
3d388997 11048 else if (!narrow)
c19d1205 11049 {
728ca7c9
PB
11050 /* Some mov with immediate shift have narrow variants.
11051 Register shifts are handled above. */
11052 if (low_regs && inst.operands[1].shifted
11053 && (inst.instruction == T_MNEM_mov
11054 || inst.instruction == T_MNEM_movs))
11055 {
e07e6e58 11056 if (in_it_block ())
728ca7c9
PB
11057 narrow = (inst.instruction == T_MNEM_mov);
11058 else
11059 narrow = (inst.instruction == T_MNEM_movs);
11060 }
11061
11062 if (narrow)
11063 {
11064 switch (inst.operands[1].shift_kind)
11065 {
11066 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11067 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
11068 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11069 default: narrow = FALSE; break;
11070 }
11071 }
11072
11073 if (narrow)
11074 {
fdfde340
JM
11075 inst.instruction |= Rn;
11076 inst.instruction |= Rm << 3;
728ca7c9
PB
11077 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11078 }
11079 else
11080 {
11081 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340 11082 inst.instruction |= Rn << r0off;
728ca7c9
PB
11083 encode_thumb32_shifted_operand (1);
11084 }
c19d1205
ZW
11085 }
11086 else
11087 switch (inst.instruction)
11088 {
11089 case T_MNEM_mov:
837b3435 11090 /* In v4t or v5t a move of two lowregs produces unpredictable
c6400f8a
MGD
11091 results. Don't allow this. */
11092 if (low_regs)
11093 {
11094 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6),
11095 "MOV Rd, Rs with two low registers is not "
11096 "permitted on this architecture");
fa94de6b 11097 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
c6400f8a
MGD
11098 arm_ext_v6);
11099 }
11100
c19d1205 11101 inst.instruction = T_OPCODE_MOV_HR;
fdfde340
JM
11102 inst.instruction |= (Rn & 0x8) << 4;
11103 inst.instruction |= (Rn & 0x7);
11104 inst.instruction |= Rm << 3;
c19d1205 11105 break;
b99bd4ef 11106
c19d1205
ZW
11107 case T_MNEM_movs:
11108 /* We know we have low registers at this point.
941a8a52
MGD
11109 Generate LSLS Rd, Rs, #0. */
11110 inst.instruction = T_OPCODE_LSL_I;
fdfde340
JM
11111 inst.instruction |= Rn;
11112 inst.instruction |= Rm << 3;
c19d1205
ZW
11113 break;
11114
11115 case T_MNEM_cmp:
3d388997 11116 if (low_regs)
c19d1205
ZW
11117 {
11118 inst.instruction = T_OPCODE_CMP_LR;
fdfde340
JM
11119 inst.instruction |= Rn;
11120 inst.instruction |= Rm << 3;
c19d1205
ZW
11121 }
11122 else
11123 {
11124 inst.instruction = T_OPCODE_CMP_HR;
fdfde340
JM
11125 inst.instruction |= (Rn & 0x8) << 4;
11126 inst.instruction |= (Rn & 0x7);
11127 inst.instruction |= Rm << 3;
c19d1205
ZW
11128 }
11129 break;
11130 }
b99bd4ef
NC
11131 return;
11132 }
11133
c19d1205 11134 inst.instruction = THUMB_OP16 (inst.instruction);
539d4391
NC
11135
11136 /* PR 10443: Do not silently ignore shifted operands. */
11137 constraint (inst.operands[1].shifted,
11138 _("shifts in CMP/MOV instructions are only supported in unified syntax"));
11139
c19d1205 11140 if (inst.operands[1].isreg)
b99bd4ef 11141 {
fdfde340 11142 if (Rn < 8 && Rm < 8)
b99bd4ef 11143 {
c19d1205
ZW
11144 /* A move of two lowregs is encoded as ADD Rd, Rs, #0
11145 since a MOV instruction produces unpredictable results. */
11146 if (inst.instruction == T_OPCODE_MOV_I8)
11147 inst.instruction = T_OPCODE_ADD_I3;
b99bd4ef 11148 else
c19d1205 11149 inst.instruction = T_OPCODE_CMP_LR;
b99bd4ef 11150
fdfde340
JM
11151 inst.instruction |= Rn;
11152 inst.instruction |= Rm << 3;
b99bd4ef
NC
11153 }
11154 else
11155 {
c19d1205
ZW
11156 if (inst.instruction == T_OPCODE_MOV_I8)
11157 inst.instruction = T_OPCODE_MOV_HR;
11158 else
11159 inst.instruction = T_OPCODE_CMP_HR;
11160 do_t_cpy ();
b99bd4ef
NC
11161 }
11162 }
c19d1205 11163 else
b99bd4ef 11164 {
fdfde340 11165 constraint (Rn > 7,
c19d1205 11166 _("only lo regs allowed with immediate"));
fdfde340 11167 inst.instruction |= Rn << 8;
c19d1205
ZW
11168 inst.reloc.type = BFD_RELOC_ARM_THUMB_IMM;
11169 }
11170}
b99bd4ef 11171
c19d1205
ZW
11172static void
11173do_t_mov16 (void)
11174{
fdfde340 11175 unsigned Rd;
b6895b4f
PB
11176 bfd_vma imm;
11177 bfd_boolean top;
11178
11179 top = (inst.instruction & 0x00800000) != 0;
11180 if (inst.reloc.type == BFD_RELOC_ARM_MOVW)
11181 {
11182 constraint (top, _(":lower16: not allowed this instruction"));
11183 inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVW;
11184 }
11185 else if (inst.reloc.type == BFD_RELOC_ARM_MOVT)
11186 {
11187 constraint (!top, _(":upper16: not allowed this instruction"));
11188 inst.reloc.type = BFD_RELOC_ARM_THUMB_MOVT;
11189 }
11190
fdfde340
JM
11191 Rd = inst.operands[0].reg;
11192 reject_bad_reg (Rd);
11193
11194 inst.instruction |= Rd << 8;
b6895b4f
PB
11195 if (inst.reloc.type == BFD_RELOC_UNUSED)
11196 {
11197 imm = inst.reloc.exp.X_add_number;
11198 inst.instruction |= (imm & 0xf000) << 4;
11199 inst.instruction |= (imm & 0x0800) << 15;
11200 inst.instruction |= (imm & 0x0700) << 4;
11201 inst.instruction |= (imm & 0x00ff);
11202 }
c19d1205 11203}
b99bd4ef 11204
c19d1205
ZW
11205static void
11206do_t_mvn_tst (void)
11207{
fdfde340 11208 unsigned Rn, Rm;
c921be7d 11209
fdfde340
JM
11210 Rn = inst.operands[0].reg;
11211 Rm = inst.operands[1].reg;
11212
11213 if (inst.instruction == T_MNEM_cmp
11214 || inst.instruction == T_MNEM_cmn)
11215 constraint (Rn == REG_PC, BAD_PC);
11216 else
11217 reject_bad_reg (Rn);
11218 reject_bad_reg (Rm);
11219
c19d1205
ZW
11220 if (unified_syntax)
11221 {
11222 int r0off = (inst.instruction == T_MNEM_mvn
11223 || inst.instruction == T_MNEM_mvns) ? 8 : 16;
3d388997
PB
11224 bfd_boolean narrow;
11225
11226 if (inst.size_req == 4
11227 || inst.instruction > 0xffff
11228 || inst.operands[1].shifted
fdfde340 11229 || Rn > 7 || Rm > 7)
3d388997
PB
11230 narrow = FALSE;
11231 else if (inst.instruction == T_MNEM_cmn)
11232 narrow = TRUE;
11233 else if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 11234 narrow = !in_it_block ();
3d388997 11235 else
e07e6e58 11236 narrow = in_it_block ();
3d388997 11237
c19d1205 11238 if (!inst.operands[1].isreg)
b99bd4ef 11239 {
c19d1205
ZW
11240 /* For an immediate, we always generate a 32-bit opcode;
11241 section relaxation will shrink it later if possible. */
11242 if (inst.instruction < 0xffff)
11243 inst.instruction = THUMB_OP32 (inst.instruction);
11244 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
fdfde340 11245 inst.instruction |= Rn << r0off;
c19d1205 11246 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
b99bd4ef 11247 }
c19d1205 11248 else
b99bd4ef 11249 {
c19d1205 11250 /* See if we can do this with a 16-bit instruction. */
3d388997 11251 if (narrow)
b99bd4ef 11252 {
c19d1205 11253 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340
JM
11254 inst.instruction |= Rn;
11255 inst.instruction |= Rm << 3;
b99bd4ef 11256 }
c19d1205 11257 else
b99bd4ef 11258 {
c19d1205
ZW
11259 constraint (inst.operands[1].shifted
11260 && inst.operands[1].immisreg,
11261 _("shift must be constant"));
11262 if (inst.instruction < 0xffff)
11263 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340 11264 inst.instruction |= Rn << r0off;
c19d1205 11265 encode_thumb32_shifted_operand (1);
b99bd4ef 11266 }
b99bd4ef
NC
11267 }
11268 }
11269 else
11270 {
c19d1205
ZW
11271 constraint (inst.instruction > 0xffff
11272 || inst.instruction == T_MNEM_mvns, BAD_THUMB32);
11273 constraint (!inst.operands[1].isreg || inst.operands[1].shifted,
11274 _("unshifted register required"));
fdfde340 11275 constraint (Rn > 7 || Rm > 7,
c19d1205 11276 BAD_HIREG);
b99bd4ef 11277
c19d1205 11278 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340
JM
11279 inst.instruction |= Rn;
11280 inst.instruction |= Rm << 3;
b99bd4ef 11281 }
b99bd4ef
NC
11282}
11283
b05fe5cf 11284static void
c19d1205 11285do_t_mrs (void)
b05fe5cf 11286{
fdfde340 11287 unsigned Rd;
037e8744
JB
11288
11289 if (do_vfp_nsyn_mrs () == SUCCESS)
11290 return;
11291
90ec0d68
MGD
11292 Rd = inst.operands[0].reg;
11293 reject_bad_reg (Rd);
11294 inst.instruction |= Rd << 8;
11295
11296 if (inst.operands[1].isreg)
62b3e311 11297 {
90ec0d68
MGD
11298 unsigned br = inst.operands[1].reg;
11299 if (((br & 0x200) == 0) && ((br & 0xf000) != 0xf000))
11300 as_bad (_("bad register for mrs"));
11301
11302 inst.instruction |= br & (0xf << 16);
11303 inst.instruction |= (br & 0x300) >> 4;
11304 inst.instruction |= (br & SPSR_BIT) >> 2;
62b3e311
PB
11305 }
11306 else
11307 {
90ec0d68 11308 int flags = inst.operands[1].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
5f4273c7 11309
d2cd1205 11310 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
1a43faaf
NC
11311 {
11312 /* PR gas/12698: The constraint is only applied for m_profile.
11313 If the user has specified -march=all, we want to ignore it as
11314 we are building for any CPU type, including non-m variants. */
11315 bfd_boolean m_profile = selected_cpu.core != arm_arch_any.core;
11316 constraint ((flags != 0) && m_profile, _("selected processor does "
11317 "not support requested special purpose register"));
11318 }
90ec0d68 11319 else
d2cd1205
JB
11320 /* mrs only accepts APSR/CPSR/SPSR/CPSR_all/SPSR_all (for non-M profile
11321 devices). */
11322 constraint ((flags & ~SPSR_BIT) != (PSR_c|PSR_f),
11323 _("'APSR', 'CPSR' or 'SPSR' expected"));
fdfde340 11324
90ec0d68
MGD
11325 inst.instruction |= (flags & SPSR_BIT) >> 2;
11326 inst.instruction |= inst.operands[1].imm & 0xff;
11327 inst.instruction |= 0xf0000;
11328 }
c19d1205 11329}
b05fe5cf 11330
c19d1205
ZW
11331static void
11332do_t_msr (void)
11333{
62b3e311 11334 int flags;
fdfde340 11335 unsigned Rn;
62b3e311 11336
037e8744
JB
11337 if (do_vfp_nsyn_msr () == SUCCESS)
11338 return;
11339
c19d1205
ZW
11340 constraint (!inst.operands[1].isreg,
11341 _("Thumb encoding does not support an immediate here"));
90ec0d68
MGD
11342
11343 if (inst.operands[0].isreg)
11344 flags = (int)(inst.operands[0].reg);
11345 else
11346 flags = inst.operands[0].imm;
11347
d2cd1205 11348 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_m))
62b3e311 11349 {
d2cd1205
JB
11350 int bits = inst.operands[0].imm & (PSR_c|PSR_x|PSR_s|PSR_f|SPSR_BIT);
11351
1a43faaf
NC
11352 /* PR gas/12698: The constraint is only applied for m_profile.
11353 If the user has specified -march=all, we want to ignore it as
11354 we are building for any CPU type, including non-m variants. */
11355 bfd_boolean m_profile = selected_cpu.core != arm_arch_any.core;
11356 constraint (((ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11357 && (bits & ~(PSR_s | PSR_f)) != 0)
11358 || (!ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6_dsp)
11359 && bits != PSR_f)) && m_profile,
11360 _("selected processor does not support requested special "
11361 "purpose register"));
62b3e311
PB
11362 }
11363 else
d2cd1205
JB
11364 constraint ((flags & 0xff) != 0, _("selected processor does not support "
11365 "requested special purpose register"));
c921be7d 11366
fdfde340
JM
11367 Rn = inst.operands[1].reg;
11368 reject_bad_reg (Rn);
11369
62b3e311 11370 inst.instruction |= (flags & SPSR_BIT) >> 2;
90ec0d68
MGD
11371 inst.instruction |= (flags & 0xf0000) >> 8;
11372 inst.instruction |= (flags & 0x300) >> 4;
62b3e311 11373 inst.instruction |= (flags & 0xff);
fdfde340 11374 inst.instruction |= Rn << 16;
c19d1205 11375}
b05fe5cf 11376
c19d1205
ZW
11377static void
11378do_t_mul (void)
11379{
17828f45 11380 bfd_boolean narrow;
fdfde340 11381 unsigned Rd, Rn, Rm;
17828f45 11382
c19d1205
ZW
11383 if (!inst.operands[2].present)
11384 inst.operands[2].reg = inst.operands[0].reg;
b05fe5cf 11385
fdfde340
JM
11386 Rd = inst.operands[0].reg;
11387 Rn = inst.operands[1].reg;
11388 Rm = inst.operands[2].reg;
11389
17828f45 11390 if (unified_syntax)
b05fe5cf 11391 {
17828f45 11392 if (inst.size_req == 4
fdfde340
JM
11393 || (Rd != Rn
11394 && Rd != Rm)
11395 || Rn > 7
11396 || Rm > 7)
17828f45
JM
11397 narrow = FALSE;
11398 else if (inst.instruction == T_MNEM_muls)
e07e6e58 11399 narrow = !in_it_block ();
17828f45 11400 else
e07e6e58 11401 narrow = in_it_block ();
b05fe5cf 11402 }
c19d1205 11403 else
b05fe5cf 11404 {
17828f45 11405 constraint (inst.instruction == T_MNEM_muls, BAD_THUMB32);
fdfde340 11406 constraint (Rn > 7 || Rm > 7,
c19d1205 11407 BAD_HIREG);
17828f45
JM
11408 narrow = TRUE;
11409 }
b05fe5cf 11410
17828f45
JM
11411 if (narrow)
11412 {
11413 /* 16-bit MULS/Conditional MUL. */
c19d1205 11414 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340 11415 inst.instruction |= Rd;
b05fe5cf 11416
fdfde340
JM
11417 if (Rd == Rn)
11418 inst.instruction |= Rm << 3;
11419 else if (Rd == Rm)
11420 inst.instruction |= Rn << 3;
c19d1205
ZW
11421 else
11422 constraint (1, _("dest must overlap one source register"));
11423 }
17828f45
JM
11424 else
11425 {
e07e6e58
NC
11426 constraint (inst.instruction != T_MNEM_mul,
11427 _("Thumb-2 MUL must not set flags"));
17828f45
JM
11428 /* 32-bit MUL. */
11429 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340
JM
11430 inst.instruction |= Rd << 8;
11431 inst.instruction |= Rn << 16;
11432 inst.instruction |= Rm << 0;
11433
11434 reject_bad_reg (Rd);
11435 reject_bad_reg (Rn);
11436 reject_bad_reg (Rm);
17828f45 11437 }
c19d1205 11438}
b05fe5cf 11439
c19d1205
ZW
11440static void
11441do_t_mull (void)
11442{
fdfde340 11443 unsigned RdLo, RdHi, Rn, Rm;
b05fe5cf 11444
fdfde340
JM
11445 RdLo = inst.operands[0].reg;
11446 RdHi = inst.operands[1].reg;
11447 Rn = inst.operands[2].reg;
11448 Rm = inst.operands[3].reg;
11449
11450 reject_bad_reg (RdLo);
11451 reject_bad_reg (RdHi);
11452 reject_bad_reg (Rn);
11453 reject_bad_reg (Rm);
11454
11455 inst.instruction |= RdLo << 12;
11456 inst.instruction |= RdHi << 8;
11457 inst.instruction |= Rn << 16;
11458 inst.instruction |= Rm;
11459
11460 if (RdLo == RdHi)
c19d1205
ZW
11461 as_tsktsk (_("rdhi and rdlo must be different"));
11462}
b05fe5cf 11463
c19d1205
ZW
11464static void
11465do_t_nop (void)
11466{
e07e6e58
NC
11467 set_it_insn_type (NEUTRAL_IT_INSN);
11468
c19d1205
ZW
11469 if (unified_syntax)
11470 {
11471 if (inst.size_req == 4 || inst.operands[0].imm > 15)
b05fe5cf 11472 {
c19d1205
ZW
11473 inst.instruction = THUMB_OP32 (inst.instruction);
11474 inst.instruction |= inst.operands[0].imm;
11475 }
11476 else
11477 {
bc2d1808
NC
11478 /* PR9722: Check for Thumb2 availability before
11479 generating a thumb2 nop instruction. */
afa62d5e 11480 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
bc2d1808
NC
11481 {
11482 inst.instruction = THUMB_OP16 (inst.instruction);
11483 inst.instruction |= inst.operands[0].imm << 4;
11484 }
11485 else
11486 inst.instruction = 0x46c0;
c19d1205
ZW
11487 }
11488 }
11489 else
11490 {
11491 constraint (inst.operands[0].present,
11492 _("Thumb does not support NOP with hints"));
11493 inst.instruction = 0x46c0;
11494 }
11495}
b05fe5cf 11496
c19d1205
ZW
11497static void
11498do_t_neg (void)
11499{
11500 if (unified_syntax)
11501 {
3d388997
PB
11502 bfd_boolean narrow;
11503
11504 if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 11505 narrow = !in_it_block ();
3d388997 11506 else
e07e6e58 11507 narrow = in_it_block ();
3d388997
PB
11508 if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11509 narrow = FALSE;
11510 if (inst.size_req == 4)
11511 narrow = FALSE;
11512
11513 if (!narrow)
c19d1205
ZW
11514 {
11515 inst.instruction = THUMB_OP32 (inst.instruction);
11516 inst.instruction |= inst.operands[0].reg << 8;
11517 inst.instruction |= inst.operands[1].reg << 16;
b05fe5cf
ZW
11518 }
11519 else
11520 {
c19d1205
ZW
11521 inst.instruction = THUMB_OP16 (inst.instruction);
11522 inst.instruction |= inst.operands[0].reg;
11523 inst.instruction |= inst.operands[1].reg << 3;
b05fe5cf
ZW
11524 }
11525 }
11526 else
11527 {
c19d1205
ZW
11528 constraint (inst.operands[0].reg > 7 || inst.operands[1].reg > 7,
11529 BAD_HIREG);
11530 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
11531
11532 inst.instruction = THUMB_OP16 (inst.instruction);
11533 inst.instruction |= inst.operands[0].reg;
11534 inst.instruction |= inst.operands[1].reg << 3;
11535 }
11536}
11537
1c444d06
JM
11538static void
11539do_t_orn (void)
11540{
11541 unsigned Rd, Rn;
11542
11543 Rd = inst.operands[0].reg;
11544 Rn = inst.operands[1].present ? inst.operands[1].reg : Rd;
11545
fdfde340
JM
11546 reject_bad_reg (Rd);
11547 /* Rn == REG_SP is unpredictable; Rn == REG_PC is MVN. */
11548 reject_bad_reg (Rn);
11549
1c444d06
JM
11550 inst.instruction |= Rd << 8;
11551 inst.instruction |= Rn << 16;
11552
11553 if (!inst.operands[2].isreg)
11554 {
11555 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11556 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11557 }
11558 else
11559 {
11560 unsigned Rm;
11561
11562 Rm = inst.operands[2].reg;
fdfde340 11563 reject_bad_reg (Rm);
1c444d06
JM
11564
11565 constraint (inst.operands[2].shifted
11566 && inst.operands[2].immisreg,
11567 _("shift must be constant"));
11568 encode_thumb32_shifted_operand (2);
11569 }
11570}
11571
c19d1205
ZW
11572static void
11573do_t_pkhbt (void)
11574{
fdfde340
JM
11575 unsigned Rd, Rn, Rm;
11576
11577 Rd = inst.operands[0].reg;
11578 Rn = inst.operands[1].reg;
11579 Rm = inst.operands[2].reg;
11580
11581 reject_bad_reg (Rd);
11582 reject_bad_reg (Rn);
11583 reject_bad_reg (Rm);
11584
11585 inst.instruction |= Rd << 8;
11586 inst.instruction |= Rn << 16;
11587 inst.instruction |= Rm;
c19d1205
ZW
11588 if (inst.operands[3].present)
11589 {
11590 unsigned int val = inst.reloc.exp.X_add_number;
11591 constraint (inst.reloc.exp.X_op != O_constant,
11592 _("expression too complex"));
11593 inst.instruction |= (val & 0x1c) << 10;
11594 inst.instruction |= (val & 0x03) << 6;
b05fe5cf 11595 }
c19d1205 11596}
b05fe5cf 11597
c19d1205
ZW
11598static void
11599do_t_pkhtb (void)
11600{
11601 if (!inst.operands[3].present)
1ef52f49
NC
11602 {
11603 unsigned Rtmp;
11604
11605 inst.instruction &= ~0x00000020;
11606
11607 /* PR 10168. Swap the Rm and Rn registers. */
11608 Rtmp = inst.operands[1].reg;
11609 inst.operands[1].reg = inst.operands[2].reg;
11610 inst.operands[2].reg = Rtmp;
11611 }
c19d1205 11612 do_t_pkhbt ();
b05fe5cf
ZW
11613}
11614
c19d1205
ZW
11615static void
11616do_t_pld (void)
11617{
fdfde340
JM
11618 if (inst.operands[0].immisreg)
11619 reject_bad_reg (inst.operands[0].imm);
11620
c19d1205
ZW
11621 encode_thumb32_addr_mode (0, /*is_t=*/FALSE, /*is_d=*/FALSE);
11622}
b05fe5cf 11623
c19d1205
ZW
11624static void
11625do_t_push_pop (void)
b99bd4ef 11626{
e9f89963 11627 unsigned mask;
5f4273c7 11628
c19d1205
ZW
11629 constraint (inst.operands[0].writeback,
11630 _("push/pop do not support {reglist}^"));
11631 constraint (inst.reloc.type != BFD_RELOC_UNUSED,
11632 _("expression too complex"));
b99bd4ef 11633
e9f89963
PB
11634 mask = inst.operands[0].imm;
11635 if ((mask & ~0xff) == 0)
3c707909 11636 inst.instruction = THUMB_OP16 (inst.instruction) | mask;
c19d1205 11637 else if ((inst.instruction == T_MNEM_push
e9f89963 11638 && (mask & ~0xff) == 1 << REG_LR)
c19d1205 11639 || (inst.instruction == T_MNEM_pop
e9f89963 11640 && (mask & ~0xff) == 1 << REG_PC))
b99bd4ef 11641 {
c19d1205
ZW
11642 inst.instruction = THUMB_OP16 (inst.instruction);
11643 inst.instruction |= THUMB_PP_PC_LR;
3c707909 11644 inst.instruction |= mask & 0xff;
c19d1205
ZW
11645 }
11646 else if (unified_syntax)
11647 {
3c707909 11648 inst.instruction = THUMB_OP32 (inst.instruction);
5f4273c7 11649 encode_thumb2_ldmstm (13, mask, TRUE);
c19d1205
ZW
11650 }
11651 else
11652 {
11653 inst.error = _("invalid register list to push/pop instruction");
11654 return;
11655 }
c19d1205 11656}
b99bd4ef 11657
c19d1205
ZW
11658static void
11659do_t_rbit (void)
11660{
fdfde340
JM
11661 unsigned Rd, Rm;
11662
11663 Rd = inst.operands[0].reg;
11664 Rm = inst.operands[1].reg;
11665
11666 reject_bad_reg (Rd);
11667 reject_bad_reg (Rm);
11668
11669 inst.instruction |= Rd << 8;
11670 inst.instruction |= Rm << 16;
11671 inst.instruction |= Rm;
c19d1205 11672}
b99bd4ef 11673
c19d1205
ZW
11674static void
11675do_t_rev (void)
11676{
fdfde340
JM
11677 unsigned Rd, Rm;
11678
11679 Rd = inst.operands[0].reg;
11680 Rm = inst.operands[1].reg;
11681
11682 reject_bad_reg (Rd);
11683 reject_bad_reg (Rm);
11684
11685 if (Rd <= 7 && Rm <= 7
c19d1205
ZW
11686 && inst.size_req != 4)
11687 {
11688 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340
JM
11689 inst.instruction |= Rd;
11690 inst.instruction |= Rm << 3;
c19d1205
ZW
11691 }
11692 else if (unified_syntax)
11693 {
11694 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340
JM
11695 inst.instruction |= Rd << 8;
11696 inst.instruction |= Rm << 16;
11697 inst.instruction |= Rm;
c19d1205
ZW
11698 }
11699 else
11700 inst.error = BAD_HIREG;
11701}
b99bd4ef 11702
1c444d06
JM
11703static void
11704do_t_rrx (void)
11705{
11706 unsigned Rd, Rm;
11707
11708 Rd = inst.operands[0].reg;
11709 Rm = inst.operands[1].reg;
11710
fdfde340
JM
11711 reject_bad_reg (Rd);
11712 reject_bad_reg (Rm);
c921be7d 11713
1c444d06
JM
11714 inst.instruction |= Rd << 8;
11715 inst.instruction |= Rm;
11716}
11717
c19d1205
ZW
11718static void
11719do_t_rsb (void)
11720{
fdfde340 11721 unsigned Rd, Rs;
b99bd4ef 11722
c19d1205
ZW
11723 Rd = inst.operands[0].reg;
11724 Rs = (inst.operands[1].present
11725 ? inst.operands[1].reg /* Rd, Rs, foo */
11726 : inst.operands[0].reg); /* Rd, foo -> Rd, Rd, foo */
b99bd4ef 11727
fdfde340
JM
11728 reject_bad_reg (Rd);
11729 reject_bad_reg (Rs);
11730 if (inst.operands[2].isreg)
11731 reject_bad_reg (inst.operands[2].reg);
11732
c19d1205
ZW
11733 inst.instruction |= Rd << 8;
11734 inst.instruction |= Rs << 16;
11735 if (!inst.operands[2].isreg)
11736 {
026d3abb
PB
11737 bfd_boolean narrow;
11738
11739 if ((inst.instruction & 0x00100000) != 0)
e07e6e58 11740 narrow = !in_it_block ();
026d3abb 11741 else
e07e6e58 11742 narrow = in_it_block ();
026d3abb
PB
11743
11744 if (Rd > 7 || Rs > 7)
11745 narrow = FALSE;
11746
11747 if (inst.size_req == 4 || !unified_syntax)
11748 narrow = FALSE;
11749
11750 if (inst.reloc.exp.X_op != O_constant
11751 || inst.reloc.exp.X_add_number != 0)
11752 narrow = FALSE;
11753
11754 /* Turn rsb #0 into 16-bit neg. We should probably do this via
11755 relaxation, but it doesn't seem worth the hassle. */
11756 if (narrow)
11757 {
11758 inst.reloc.type = BFD_RELOC_UNUSED;
11759 inst.instruction = THUMB_OP16 (T_MNEM_negs);
11760 inst.instruction |= Rs << 3;
11761 inst.instruction |= Rd;
11762 }
11763 else
11764 {
11765 inst.instruction = (inst.instruction & 0xe1ffffff) | 0x10000000;
11766 inst.reloc.type = BFD_RELOC_ARM_T32_IMMEDIATE;
11767 }
c19d1205
ZW
11768 }
11769 else
11770 encode_thumb32_shifted_operand (2);
11771}
b99bd4ef 11772
c19d1205
ZW
11773static void
11774do_t_setend (void)
11775{
12e37cbc
MGD
11776 if (warn_on_deprecated
11777 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
11778 as_warn (_("setend use is deprecated for ARMv8"));
11779
e07e6e58 11780 set_it_insn_type (OUTSIDE_IT_INSN);
c19d1205
ZW
11781 if (inst.operands[0].imm)
11782 inst.instruction |= 0x8;
11783}
b99bd4ef 11784
c19d1205
ZW
11785static void
11786do_t_shift (void)
11787{
11788 if (!inst.operands[1].present)
11789 inst.operands[1].reg = inst.operands[0].reg;
11790
11791 if (unified_syntax)
11792 {
3d388997
PB
11793 bfd_boolean narrow;
11794 int shift_kind;
11795
11796 switch (inst.instruction)
11797 {
11798 case T_MNEM_asr:
11799 case T_MNEM_asrs: shift_kind = SHIFT_ASR; break;
11800 case T_MNEM_lsl:
11801 case T_MNEM_lsls: shift_kind = SHIFT_LSL; break;
11802 case T_MNEM_lsr:
11803 case T_MNEM_lsrs: shift_kind = SHIFT_LSR; break;
11804 case T_MNEM_ror:
11805 case T_MNEM_rors: shift_kind = SHIFT_ROR; break;
11806 default: abort ();
11807 }
11808
11809 if (THUMB_SETS_FLAGS (inst.instruction))
e07e6e58 11810 narrow = !in_it_block ();
3d388997 11811 else
e07e6e58 11812 narrow = in_it_block ();
3d388997
PB
11813 if (inst.operands[0].reg > 7 || inst.operands[1].reg > 7)
11814 narrow = FALSE;
11815 if (!inst.operands[2].isreg && shift_kind == SHIFT_ROR)
11816 narrow = FALSE;
11817 if (inst.operands[2].isreg
11818 && (inst.operands[1].reg != inst.operands[0].reg
11819 || inst.operands[2].reg > 7))
11820 narrow = FALSE;
11821 if (inst.size_req == 4)
11822 narrow = FALSE;
11823
fdfde340
JM
11824 reject_bad_reg (inst.operands[0].reg);
11825 reject_bad_reg (inst.operands[1].reg);
c921be7d 11826
3d388997 11827 if (!narrow)
c19d1205
ZW
11828 {
11829 if (inst.operands[2].isreg)
b99bd4ef 11830 {
fdfde340 11831 reject_bad_reg (inst.operands[2].reg);
c19d1205
ZW
11832 inst.instruction = THUMB_OP32 (inst.instruction);
11833 inst.instruction |= inst.operands[0].reg << 8;
11834 inst.instruction |= inst.operands[1].reg << 16;
11835 inst.instruction |= inst.operands[2].reg;
94342ec3
NC
11836
11837 /* PR 12854: Error on extraneous shifts. */
11838 constraint (inst.operands[2].shifted,
11839 _("extraneous shift as part of operand to shift insn"));
c19d1205
ZW
11840 }
11841 else
11842 {
11843 inst.operands[1].shifted = 1;
3d388997 11844 inst.operands[1].shift_kind = shift_kind;
c19d1205
ZW
11845 inst.instruction = THUMB_OP32 (THUMB_SETS_FLAGS (inst.instruction)
11846 ? T_MNEM_movs : T_MNEM_mov);
11847 inst.instruction |= inst.operands[0].reg << 8;
11848 encode_thumb32_shifted_operand (1);
11849 /* Prevent the incorrect generation of an ARM_IMMEDIATE fixup. */
11850 inst.reloc.type = BFD_RELOC_UNUSED;
b99bd4ef
NC
11851 }
11852 }
11853 else
11854 {
c19d1205 11855 if (inst.operands[2].isreg)
b99bd4ef 11856 {
3d388997 11857 switch (shift_kind)
b99bd4ef 11858 {
3d388997
PB
11859 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_R; break;
11860 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_R; break;
11861 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_R; break;
11862 case SHIFT_ROR: inst.instruction = T_OPCODE_ROR_R; break;
c19d1205 11863 default: abort ();
b99bd4ef 11864 }
5f4273c7 11865
c19d1205
ZW
11866 inst.instruction |= inst.operands[0].reg;
11867 inst.instruction |= inst.operands[2].reg << 3;
af199b06
NC
11868
11869 /* PR 12854: Error on extraneous shifts. */
11870 constraint (inst.operands[2].shifted,
11871 _("extraneous shift as part of operand to shift insn"));
b99bd4ef
NC
11872 }
11873 else
11874 {
3d388997 11875 switch (shift_kind)
b99bd4ef 11876 {
3d388997
PB
11877 case SHIFT_ASR: inst.instruction = T_OPCODE_ASR_I; break;
11878 case SHIFT_LSL: inst.instruction = T_OPCODE_LSL_I; break;
11879 case SHIFT_LSR: inst.instruction = T_OPCODE_LSR_I; break;
c19d1205 11880 default: abort ();
b99bd4ef 11881 }
c19d1205
ZW
11882 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11883 inst.instruction |= inst.operands[0].reg;
11884 inst.instruction |= inst.operands[1].reg << 3;
b99bd4ef
NC
11885 }
11886 }
c19d1205
ZW
11887 }
11888 else
11889 {
11890 constraint (inst.operands[0].reg > 7
11891 || inst.operands[1].reg > 7, BAD_HIREG);
11892 constraint (THUMB_SETS_FLAGS (inst.instruction), BAD_THUMB32);
b99bd4ef 11893
c19d1205
ZW
11894 if (inst.operands[2].isreg) /* Rd, {Rs,} Rn */
11895 {
11896 constraint (inst.operands[2].reg > 7, BAD_HIREG);
11897 constraint (inst.operands[0].reg != inst.operands[1].reg,
11898 _("source1 and dest must be same register"));
b99bd4ef 11899
c19d1205
ZW
11900 switch (inst.instruction)
11901 {
11902 case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_R; break;
11903 case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_R; break;
11904 case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_R; break;
11905 case T_MNEM_ror: inst.instruction = T_OPCODE_ROR_R; break;
11906 default: abort ();
11907 }
5f4273c7 11908
c19d1205
ZW
11909 inst.instruction |= inst.operands[0].reg;
11910 inst.instruction |= inst.operands[2].reg << 3;
af199b06
NC
11911
11912 /* PR 12854: Error on extraneous shifts. */
11913 constraint (inst.operands[2].shifted,
11914 _("extraneous shift as part of operand to shift insn"));
c19d1205
ZW
11915 }
11916 else
b99bd4ef 11917 {
c19d1205
ZW
11918 switch (inst.instruction)
11919 {
11920 case T_MNEM_asr: inst.instruction = T_OPCODE_ASR_I; break;
11921 case T_MNEM_lsl: inst.instruction = T_OPCODE_LSL_I; break;
11922 case T_MNEM_lsr: inst.instruction = T_OPCODE_LSR_I; break;
11923 case T_MNEM_ror: inst.error = _("ror #imm not supported"); return;
11924 default: abort ();
11925 }
11926 inst.reloc.type = BFD_RELOC_ARM_THUMB_SHIFT;
11927 inst.instruction |= inst.operands[0].reg;
11928 inst.instruction |= inst.operands[1].reg << 3;
b99bd4ef
NC
11929 }
11930 }
b99bd4ef
NC
11931}
11932
11933static void
c19d1205 11934do_t_simd (void)
b99bd4ef 11935{
fdfde340
JM
11936 unsigned Rd, Rn, Rm;
11937
11938 Rd = inst.operands[0].reg;
11939 Rn = inst.operands[1].reg;
11940 Rm = inst.operands[2].reg;
11941
11942 reject_bad_reg (Rd);
11943 reject_bad_reg (Rn);
11944 reject_bad_reg (Rm);
11945
11946 inst.instruction |= Rd << 8;
11947 inst.instruction |= Rn << 16;
11948 inst.instruction |= Rm;
c19d1205 11949}
b99bd4ef 11950
03ee1b7f
NC
11951static void
11952do_t_simd2 (void)
11953{
11954 unsigned Rd, Rn, Rm;
11955
11956 Rd = inst.operands[0].reg;
11957 Rm = inst.operands[1].reg;
11958 Rn = inst.operands[2].reg;
11959
11960 reject_bad_reg (Rd);
11961 reject_bad_reg (Rn);
11962 reject_bad_reg (Rm);
11963
11964 inst.instruction |= Rd << 8;
11965 inst.instruction |= Rn << 16;
11966 inst.instruction |= Rm;
11967}
11968
c19d1205 11969static void
3eb17e6b 11970do_t_smc (void)
c19d1205
ZW
11971{
11972 unsigned int value = inst.reloc.exp.X_add_number;
f4c65163
MGD
11973 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7a),
11974 _("SMC is not permitted on this architecture"));
c19d1205
ZW
11975 constraint (inst.reloc.exp.X_op != O_constant,
11976 _("expression too complex"));
11977 inst.reloc.type = BFD_RELOC_UNUSED;
11978 inst.instruction |= (value & 0xf000) >> 12;
11979 inst.instruction |= (value & 0x0ff0);
11980 inst.instruction |= (value & 0x000f) << 16;
11981}
b99bd4ef 11982
90ec0d68
MGD
11983static void
11984do_t_hvc (void)
11985{
11986 unsigned int value = inst.reloc.exp.X_add_number;
11987
11988 inst.reloc.type = BFD_RELOC_UNUSED;
11989 inst.instruction |= (value & 0x0fff);
11990 inst.instruction |= (value & 0xf000) << 4;
11991}
11992
c19d1205 11993static void
3a21c15a 11994do_t_ssat_usat (int bias)
c19d1205 11995{
fdfde340
JM
11996 unsigned Rd, Rn;
11997
11998 Rd = inst.operands[0].reg;
11999 Rn = inst.operands[2].reg;
12000
12001 reject_bad_reg (Rd);
12002 reject_bad_reg (Rn);
12003
12004 inst.instruction |= Rd << 8;
3a21c15a 12005 inst.instruction |= inst.operands[1].imm - bias;
fdfde340 12006 inst.instruction |= Rn << 16;
b99bd4ef 12007
c19d1205 12008 if (inst.operands[3].present)
b99bd4ef 12009 {
3a21c15a
NC
12010 offsetT shift_amount = inst.reloc.exp.X_add_number;
12011
12012 inst.reloc.type = BFD_RELOC_UNUSED;
12013
c19d1205
ZW
12014 constraint (inst.reloc.exp.X_op != O_constant,
12015 _("expression too complex"));
b99bd4ef 12016
3a21c15a 12017 if (shift_amount != 0)
6189168b 12018 {
3a21c15a
NC
12019 constraint (shift_amount > 31,
12020 _("shift expression is too large"));
12021
c19d1205 12022 if (inst.operands[3].shift_kind == SHIFT_ASR)
3a21c15a
NC
12023 inst.instruction |= 0x00200000; /* sh bit. */
12024
12025 inst.instruction |= (shift_amount & 0x1c) << 10;
12026 inst.instruction |= (shift_amount & 0x03) << 6;
6189168b
NC
12027 }
12028 }
b99bd4ef 12029}
c921be7d 12030
3a21c15a
NC
12031static void
12032do_t_ssat (void)
12033{
12034 do_t_ssat_usat (1);
12035}
b99bd4ef 12036
0dd132b6 12037static void
c19d1205 12038do_t_ssat16 (void)
0dd132b6 12039{
fdfde340
JM
12040 unsigned Rd, Rn;
12041
12042 Rd = inst.operands[0].reg;
12043 Rn = inst.operands[2].reg;
12044
12045 reject_bad_reg (Rd);
12046 reject_bad_reg (Rn);
12047
12048 inst.instruction |= Rd << 8;
c19d1205 12049 inst.instruction |= inst.operands[1].imm - 1;
fdfde340 12050 inst.instruction |= Rn << 16;
c19d1205 12051}
0dd132b6 12052
c19d1205
ZW
12053static void
12054do_t_strex (void)
12055{
12056 constraint (!inst.operands[2].isreg || !inst.operands[2].preind
12057 || inst.operands[2].postind || inst.operands[2].writeback
12058 || inst.operands[2].immisreg || inst.operands[2].shifted
12059 || inst.operands[2].negative,
01cfc07f 12060 BAD_ADDR_MODE);
0dd132b6 12061
5be8be5d
DG
12062 constraint (inst.operands[2].reg == REG_PC, BAD_PC);
12063
c19d1205
ZW
12064 inst.instruction |= inst.operands[0].reg << 8;
12065 inst.instruction |= inst.operands[1].reg << 12;
12066 inst.instruction |= inst.operands[2].reg << 16;
12067 inst.reloc.type = BFD_RELOC_ARM_T32_OFFSET_U8;
0dd132b6
NC
12068}
12069
b99bd4ef 12070static void
c19d1205 12071do_t_strexd (void)
b99bd4ef 12072{
c19d1205
ZW
12073 if (!inst.operands[2].present)
12074 inst.operands[2].reg = inst.operands[1].reg + 1;
b99bd4ef 12075
c19d1205
ZW
12076 constraint (inst.operands[0].reg == inst.operands[1].reg
12077 || inst.operands[0].reg == inst.operands[2].reg
f8a8e9d6 12078 || inst.operands[0].reg == inst.operands[3].reg,
c19d1205 12079 BAD_OVERLAP);
b99bd4ef 12080
c19d1205
ZW
12081 inst.instruction |= inst.operands[0].reg;
12082 inst.instruction |= inst.operands[1].reg << 12;
12083 inst.instruction |= inst.operands[2].reg << 8;
12084 inst.instruction |= inst.operands[3].reg << 16;
b99bd4ef
NC
12085}
12086
12087static void
c19d1205 12088do_t_sxtah (void)
b99bd4ef 12089{
fdfde340
JM
12090 unsigned Rd, Rn, Rm;
12091
12092 Rd = inst.operands[0].reg;
12093 Rn = inst.operands[1].reg;
12094 Rm = inst.operands[2].reg;
12095
12096 reject_bad_reg (Rd);
12097 reject_bad_reg (Rn);
12098 reject_bad_reg (Rm);
12099
12100 inst.instruction |= Rd << 8;
12101 inst.instruction |= Rn << 16;
12102 inst.instruction |= Rm;
c19d1205
ZW
12103 inst.instruction |= inst.operands[3].imm << 4;
12104}
b99bd4ef 12105
c19d1205
ZW
12106static void
12107do_t_sxth (void)
12108{
fdfde340
JM
12109 unsigned Rd, Rm;
12110
12111 Rd = inst.operands[0].reg;
12112 Rm = inst.operands[1].reg;
12113
12114 reject_bad_reg (Rd);
12115 reject_bad_reg (Rm);
c921be7d
NC
12116
12117 if (inst.instruction <= 0xffff
12118 && inst.size_req != 4
fdfde340 12119 && Rd <= 7 && Rm <= 7
c19d1205 12120 && (!inst.operands[2].present || inst.operands[2].imm == 0))
b99bd4ef 12121 {
c19d1205 12122 inst.instruction = THUMB_OP16 (inst.instruction);
fdfde340
JM
12123 inst.instruction |= Rd;
12124 inst.instruction |= Rm << 3;
b99bd4ef 12125 }
c19d1205 12126 else if (unified_syntax)
b99bd4ef 12127 {
c19d1205
ZW
12128 if (inst.instruction <= 0xffff)
12129 inst.instruction = THUMB_OP32 (inst.instruction);
fdfde340
JM
12130 inst.instruction |= Rd << 8;
12131 inst.instruction |= Rm;
c19d1205 12132 inst.instruction |= inst.operands[2].imm << 4;
b99bd4ef 12133 }
c19d1205 12134 else
b99bd4ef 12135 {
c19d1205
ZW
12136 constraint (inst.operands[2].present && inst.operands[2].imm != 0,
12137 _("Thumb encoding does not support rotation"));
12138 constraint (1, BAD_HIREG);
b99bd4ef 12139 }
c19d1205 12140}
b99bd4ef 12141
c19d1205
ZW
12142static void
12143do_t_swi (void)
12144{
b2a5fbdc
MGD
12145 /* We have to do the following check manually as ARM_EXT_OS only applies
12146 to ARM_EXT_V6M. */
12147 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v6m))
12148 {
ac7f631b
NC
12149 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_os)
12150 /* This only applies to the v6m howver, not later architectures. */
12151 && ! ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v7))
b2a5fbdc
MGD
12152 as_bad (_("SVC is not permitted on this architecture"));
12153 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used, arm_ext_os);
12154 }
12155
c19d1205
ZW
12156 inst.reloc.type = BFD_RELOC_ARM_SWI;
12157}
b99bd4ef 12158
92e90b6e
PB
12159static void
12160do_t_tb (void)
12161{
fdfde340 12162 unsigned Rn, Rm;
92e90b6e
PB
12163 int half;
12164
12165 half = (inst.instruction & 0x10) != 0;
e07e6e58 12166 set_it_insn_type_last ();
dfa9f0d5
PB
12167 constraint (inst.operands[0].immisreg,
12168 _("instruction requires register index"));
fdfde340
JM
12169
12170 Rn = inst.operands[0].reg;
12171 Rm = inst.operands[0].imm;
c921be7d 12172
fdfde340
JM
12173 constraint (Rn == REG_SP, BAD_SP);
12174 reject_bad_reg (Rm);
12175
92e90b6e
PB
12176 constraint (!half && inst.operands[0].shifted,
12177 _("instruction does not allow shifted index"));
fdfde340 12178 inst.instruction |= (Rn << 16) | Rm;
92e90b6e
PB
12179}
12180
c19d1205
ZW
12181static void
12182do_t_usat (void)
12183{
3a21c15a 12184 do_t_ssat_usat (0);
b99bd4ef
NC
12185}
12186
12187static void
c19d1205 12188do_t_usat16 (void)
b99bd4ef 12189{
fdfde340
JM
12190 unsigned Rd, Rn;
12191
12192 Rd = inst.operands[0].reg;
12193 Rn = inst.operands[2].reg;
12194
12195 reject_bad_reg (Rd);
12196 reject_bad_reg (Rn);
12197
12198 inst.instruction |= Rd << 8;
c19d1205 12199 inst.instruction |= inst.operands[1].imm;
fdfde340 12200 inst.instruction |= Rn << 16;
b99bd4ef 12201}
c19d1205 12202
5287ad62 12203/* Neon instruction encoder helpers. */
5f4273c7 12204
5287ad62 12205/* Encodings for the different types for various Neon opcodes. */
b99bd4ef 12206
5287ad62
JB
12207/* An "invalid" code for the following tables. */
12208#define N_INV -1u
12209
12210struct neon_tab_entry
b99bd4ef 12211{
5287ad62
JB
12212 unsigned integer;
12213 unsigned float_or_poly;
12214 unsigned scalar_or_imm;
12215};
5f4273c7 12216
5287ad62
JB
12217/* Map overloaded Neon opcodes to their respective encodings. */
12218#define NEON_ENC_TAB \
12219 X(vabd, 0x0000700, 0x1200d00, N_INV), \
12220 X(vmax, 0x0000600, 0x0000f00, N_INV), \
12221 X(vmin, 0x0000610, 0x0200f00, N_INV), \
12222 X(vpadd, 0x0000b10, 0x1000d00, N_INV), \
12223 X(vpmax, 0x0000a00, 0x1000f00, N_INV), \
12224 X(vpmin, 0x0000a10, 0x1200f00, N_INV), \
12225 X(vadd, 0x0000800, 0x0000d00, N_INV), \
12226 X(vsub, 0x1000800, 0x0200d00, N_INV), \
12227 X(vceq, 0x1000810, 0x0000e00, 0x1b10100), \
12228 X(vcge, 0x0000310, 0x1000e00, 0x1b10080), \
12229 X(vcgt, 0x0000300, 0x1200e00, 0x1b10000), \
12230 /* Register variants of the following two instructions are encoded as
e07e6e58 12231 vcge / vcgt with the operands reversed. */ \
92559b5b
PB
12232 X(vclt, 0x0000300, 0x1200e00, 0x1b10200), \
12233 X(vcle, 0x0000310, 0x1000e00, 0x1b10180), \
62f3b8c8
PB
12234 X(vfma, N_INV, 0x0000c10, N_INV), \
12235 X(vfms, N_INV, 0x0200c10, N_INV), \
5287ad62
JB
12236 X(vmla, 0x0000900, 0x0000d10, 0x0800040), \
12237 X(vmls, 0x1000900, 0x0200d10, 0x0800440), \
12238 X(vmul, 0x0000910, 0x1000d10, 0x0800840), \
12239 X(vmull, 0x0800c00, 0x0800e00, 0x0800a40), /* polynomial not float. */ \
12240 X(vmlal, 0x0800800, N_INV, 0x0800240), \
12241 X(vmlsl, 0x0800a00, N_INV, 0x0800640), \
12242 X(vqdmlal, 0x0800900, N_INV, 0x0800340), \
12243 X(vqdmlsl, 0x0800b00, N_INV, 0x0800740), \
12244 X(vqdmull, 0x0800d00, N_INV, 0x0800b40), \
12245 X(vqdmulh, 0x0000b00, N_INV, 0x0800c40), \
12246 X(vqrdmulh, 0x1000b00, N_INV, 0x0800d40), \
12247 X(vshl, 0x0000400, N_INV, 0x0800510), \
12248 X(vqshl, 0x0000410, N_INV, 0x0800710), \
12249 X(vand, 0x0000110, N_INV, 0x0800030), \
12250 X(vbic, 0x0100110, N_INV, 0x0800030), \
12251 X(veor, 0x1000110, N_INV, N_INV), \
12252 X(vorn, 0x0300110, N_INV, 0x0800010), \
12253 X(vorr, 0x0200110, N_INV, 0x0800010), \
12254 X(vmvn, 0x1b00580, N_INV, 0x0800030), \
12255 X(vshll, 0x1b20300, N_INV, 0x0800a10), /* max shift, immediate. */ \
12256 X(vcvt, 0x1b30600, N_INV, 0x0800e10), /* integer, fixed-point. */ \
12257 X(vdup, 0xe800b10, N_INV, 0x1b00c00), /* arm, scalar. */ \
12258 X(vld1, 0x0200000, 0x0a00000, 0x0a00c00), /* interlv, lane, dup. */ \
12259 X(vst1, 0x0000000, 0x0800000, N_INV), \
12260 X(vld2, 0x0200100, 0x0a00100, 0x0a00d00), \
12261 X(vst2, 0x0000100, 0x0800100, N_INV), \
12262 X(vld3, 0x0200200, 0x0a00200, 0x0a00e00), \
12263 X(vst3, 0x0000200, 0x0800200, N_INV), \
12264 X(vld4, 0x0200300, 0x0a00300, 0x0a00f00), \
12265 X(vst4, 0x0000300, 0x0800300, N_INV), \
12266 X(vmovn, 0x1b20200, N_INV, N_INV), \
12267 X(vtrn, 0x1b20080, N_INV, N_INV), \
12268 X(vqmovn, 0x1b20200, N_INV, N_INV), \
037e8744
JB
12269 X(vqmovun, 0x1b20240, N_INV, N_INV), \
12270 X(vnmul, 0xe200a40, 0xe200b40, N_INV), \
e6655fda
PB
12271 X(vnmla, 0xe100a40, 0xe100b40, N_INV), \
12272 X(vnmls, 0xe100a00, 0xe100b00, N_INV), \
62f3b8c8
PB
12273 X(vfnma, 0xe900a40, 0xe900b40, N_INV), \
12274 X(vfnms, 0xe900a00, 0xe900b00, N_INV), \
037e8744
JB
12275 X(vcmp, 0xeb40a40, 0xeb40b40, N_INV), \
12276 X(vcmpz, 0xeb50a40, 0xeb50b40, N_INV), \
12277 X(vcmpe, 0xeb40ac0, 0xeb40bc0, N_INV), \
12278 X(vcmpez, 0xeb50ac0, 0xeb50bc0, N_INV)
5287ad62
JB
12279
12280enum neon_opc
12281{
12282#define X(OPC,I,F,S) N_MNEM_##OPC
12283NEON_ENC_TAB
12284#undef X
12285};
b99bd4ef 12286
5287ad62
JB
12287static const struct neon_tab_entry neon_enc_tab[] =
12288{
12289#define X(OPC,I,F,S) { (I), (F), (S) }
12290NEON_ENC_TAB
12291#undef X
12292};
b99bd4ef 12293
88714cb8
DG
12294/* Do not use these macros; instead, use NEON_ENCODE defined below. */
12295#define NEON_ENC_INTEGER_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12296#define NEON_ENC_ARMREG_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12297#define NEON_ENC_POLY_(X) (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12298#define NEON_ENC_FLOAT_(X) (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12299#define NEON_ENC_SCALAR_(X) (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12300#define NEON_ENC_IMMED_(X) (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12301#define NEON_ENC_INTERLV_(X) (neon_enc_tab[(X) & 0x0fffffff].integer)
12302#define NEON_ENC_LANE_(X) (neon_enc_tab[(X) & 0x0fffffff].float_or_poly)
12303#define NEON_ENC_DUP_(X) (neon_enc_tab[(X) & 0x0fffffff].scalar_or_imm)
12304#define NEON_ENC_SINGLE_(X) \
037e8744 12305 ((neon_enc_tab[(X) & 0x0fffffff].integer) | ((X) & 0xf0000000))
88714cb8 12306#define NEON_ENC_DOUBLE_(X) \
037e8744 12307 ((neon_enc_tab[(X) & 0x0fffffff].float_or_poly) | ((X) & 0xf0000000))
5287ad62 12308
88714cb8
DG
12309#define NEON_ENCODE(type, inst) \
12310 do \
12311 { \
12312 inst.instruction = NEON_ENC_##type##_ (inst.instruction); \
12313 inst.is_neon = 1; \
12314 } \
12315 while (0)
12316
12317#define check_neon_suffixes \
12318 do \
12319 { \
12320 if (!inst.error && inst.vectype.elems > 0 && !inst.is_neon) \
12321 { \
12322 as_bad (_("invalid neon suffix for non neon instruction")); \
12323 return; \
12324 } \
12325 } \
12326 while (0)
12327
037e8744
JB
12328/* Define shapes for instruction operands. The following mnemonic characters
12329 are used in this table:
5287ad62 12330
037e8744 12331 F - VFP S<n> register
5287ad62
JB
12332 D - Neon D<n> register
12333 Q - Neon Q<n> register
12334 I - Immediate
12335 S - Scalar
12336 R - ARM register
12337 L - D<n> register list
5f4273c7 12338
037e8744
JB
12339 This table is used to generate various data:
12340 - enumerations of the form NS_DDR to be used as arguments to
12341 neon_select_shape.
12342 - a table classifying shapes into single, double, quad, mixed.
5f4273c7 12343 - a table used to drive neon_select_shape. */
b99bd4ef 12344
037e8744
JB
12345#define NEON_SHAPE_DEF \
12346 X(3, (D, D, D), DOUBLE), \
12347 X(3, (Q, Q, Q), QUAD), \
12348 X(3, (D, D, I), DOUBLE), \
12349 X(3, (Q, Q, I), QUAD), \
12350 X(3, (D, D, S), DOUBLE), \
12351 X(3, (Q, Q, S), QUAD), \
12352 X(2, (D, D), DOUBLE), \
12353 X(2, (Q, Q), QUAD), \
12354 X(2, (D, S), DOUBLE), \
12355 X(2, (Q, S), QUAD), \
12356 X(2, (D, R), DOUBLE), \
12357 X(2, (Q, R), QUAD), \
12358 X(2, (D, I), DOUBLE), \
12359 X(2, (Q, I), QUAD), \
12360 X(3, (D, L, D), DOUBLE), \
12361 X(2, (D, Q), MIXED), \
12362 X(2, (Q, D), MIXED), \
12363 X(3, (D, Q, I), MIXED), \
12364 X(3, (Q, D, I), MIXED), \
12365 X(3, (Q, D, D), MIXED), \
12366 X(3, (D, Q, Q), MIXED), \
12367 X(3, (Q, Q, D), MIXED), \
12368 X(3, (Q, D, S), MIXED), \
12369 X(3, (D, Q, S), MIXED), \
12370 X(4, (D, D, D, I), DOUBLE), \
12371 X(4, (Q, Q, Q, I), QUAD), \
12372 X(2, (F, F), SINGLE), \
12373 X(3, (F, F, F), SINGLE), \
12374 X(2, (F, I), SINGLE), \
12375 X(2, (F, D), MIXED), \
12376 X(2, (D, F), MIXED), \
12377 X(3, (F, F, I), MIXED), \
12378 X(4, (R, R, F, F), SINGLE), \
12379 X(4, (F, F, R, R), SINGLE), \
12380 X(3, (D, R, R), DOUBLE), \
12381 X(3, (R, R, D), DOUBLE), \
12382 X(2, (S, R), SINGLE), \
12383 X(2, (R, S), SINGLE), \
12384 X(2, (F, R), SINGLE), \
12385 X(2, (R, F), SINGLE)
12386
12387#define S2(A,B) NS_##A##B
12388#define S3(A,B,C) NS_##A##B##C
12389#define S4(A,B,C,D) NS_##A##B##C##D
12390
12391#define X(N, L, C) S##N L
12392
5287ad62
JB
12393enum neon_shape
12394{
037e8744
JB
12395 NEON_SHAPE_DEF,
12396 NS_NULL
5287ad62 12397};
b99bd4ef 12398
037e8744
JB
12399#undef X
12400#undef S2
12401#undef S3
12402#undef S4
12403
12404enum neon_shape_class
12405{
12406 SC_SINGLE,
12407 SC_DOUBLE,
12408 SC_QUAD,
12409 SC_MIXED
12410};
12411
12412#define X(N, L, C) SC_##C
12413
12414static enum neon_shape_class neon_shape_class[] =
12415{
12416 NEON_SHAPE_DEF
12417};
12418
12419#undef X
12420
12421enum neon_shape_el
12422{
12423 SE_F,
12424 SE_D,
12425 SE_Q,
12426 SE_I,
12427 SE_S,
12428 SE_R,
12429 SE_L
12430};
12431
12432/* Register widths of above. */
12433static unsigned neon_shape_el_size[] =
12434{
12435 32,
12436 64,
12437 128,
12438 0,
12439 32,
12440 32,
12441 0
12442};
12443
12444struct neon_shape_info
12445{
12446 unsigned els;
12447 enum neon_shape_el el[NEON_MAX_TYPE_ELS];
12448};
12449
12450#define S2(A,B) { SE_##A, SE_##B }
12451#define S3(A,B,C) { SE_##A, SE_##B, SE_##C }
12452#define S4(A,B,C,D) { SE_##A, SE_##B, SE_##C, SE_##D }
12453
12454#define X(N, L, C) { N, S##N L }
12455
12456static struct neon_shape_info neon_shape_tab[] =
12457{
12458 NEON_SHAPE_DEF
12459};
12460
12461#undef X
12462#undef S2
12463#undef S3
12464#undef S4
12465
5287ad62
JB
12466/* Bit masks used in type checking given instructions.
12467 'N_EQK' means the type must be the same as (or based on in some way) the key
12468 type, which itself is marked with the 'N_KEY' bit. If the 'N_EQK' bit is
12469 set, various other bits can be set as well in order to modify the meaning of
12470 the type constraint. */
12471
12472enum neon_type_mask
12473{
8e79c3df
CM
12474 N_S8 = 0x0000001,
12475 N_S16 = 0x0000002,
12476 N_S32 = 0x0000004,
12477 N_S64 = 0x0000008,
12478 N_U8 = 0x0000010,
12479 N_U16 = 0x0000020,
12480 N_U32 = 0x0000040,
12481 N_U64 = 0x0000080,
12482 N_I8 = 0x0000100,
12483 N_I16 = 0x0000200,
12484 N_I32 = 0x0000400,
12485 N_I64 = 0x0000800,
12486 N_8 = 0x0001000,
12487 N_16 = 0x0002000,
12488 N_32 = 0x0004000,
12489 N_64 = 0x0008000,
12490 N_P8 = 0x0010000,
12491 N_P16 = 0x0020000,
12492 N_F16 = 0x0040000,
12493 N_F32 = 0x0080000,
12494 N_F64 = 0x0100000,
c921be7d
NC
12495 N_KEY = 0x1000000, /* Key element (main type specifier). */
12496 N_EQK = 0x2000000, /* Given operand has the same type & size as the key. */
8e79c3df 12497 N_VFP = 0x4000000, /* VFP mode: operand size must match register width. */
c921be7d
NC
12498 N_DBL = 0x0000001, /* If N_EQK, this operand is twice the size. */
12499 N_HLF = 0x0000002, /* If N_EQK, this operand is half the size. */
12500 N_SGN = 0x0000004, /* If N_EQK, this operand is forced to be signed. */
12501 N_UNS = 0x0000008, /* If N_EQK, this operand is forced to be unsigned. */
12502 N_INT = 0x0000010, /* If N_EQK, this operand is forced to be integer. */
12503 N_FLT = 0x0000020, /* If N_EQK, this operand is forced to be float. */
12504 N_SIZ = 0x0000040, /* If N_EQK, this operand is forced to be size-only. */
5287ad62 12505 N_UTYP = 0,
037e8744 12506 N_MAX_NONSPECIAL = N_F64
5287ad62
JB
12507};
12508
dcbf9037
JB
12509#define N_ALLMODS (N_DBL | N_HLF | N_SGN | N_UNS | N_INT | N_FLT | N_SIZ)
12510
5287ad62
JB
12511#define N_SU_ALL (N_S8 | N_S16 | N_S32 | N_S64 | N_U8 | N_U16 | N_U32 | N_U64)
12512#define N_SU_32 (N_S8 | N_S16 | N_S32 | N_U8 | N_U16 | N_U32)
12513#define N_SU_16_64 (N_S16 | N_S32 | N_S64 | N_U16 | N_U32 | N_U64)
12514#define N_SUF_32 (N_SU_32 | N_F32)
12515#define N_I_ALL (N_I8 | N_I16 | N_I32 | N_I64)
12516#define N_IF_32 (N_I8 | N_I16 | N_I32 | N_F32)
12517
12518/* Pass this as the first type argument to neon_check_type to ignore types
12519 altogether. */
12520#define N_IGNORE_TYPE (N_KEY | N_EQK)
12521
037e8744
JB
12522/* Select a "shape" for the current instruction (describing register types or
12523 sizes) from a list of alternatives. Return NS_NULL if the current instruction
12524 doesn't fit. For non-polymorphic shapes, checking is usually done as a
12525 function of operand parsing, so this function doesn't need to be called.
12526 Shapes should be listed in order of decreasing length. */
5287ad62
JB
12527
12528static enum neon_shape
037e8744 12529neon_select_shape (enum neon_shape shape, ...)
5287ad62 12530{
037e8744
JB
12531 va_list ap;
12532 enum neon_shape first_shape = shape;
5287ad62
JB
12533
12534 /* Fix missing optional operands. FIXME: we don't know at this point how
12535 many arguments we should have, so this makes the assumption that we have
12536 > 1. This is true of all current Neon opcodes, I think, but may not be
12537 true in the future. */
12538 if (!inst.operands[1].present)
12539 inst.operands[1] = inst.operands[0];
12540
037e8744 12541 va_start (ap, shape);
5f4273c7 12542
21d799b5 12543 for (; shape != NS_NULL; shape = (enum neon_shape) va_arg (ap, int))
037e8744
JB
12544 {
12545 unsigned j;
12546 int matches = 1;
12547
12548 for (j = 0; j < neon_shape_tab[shape].els; j++)
12549 {
12550 if (!inst.operands[j].present)
12551 {
12552 matches = 0;
12553 break;
12554 }
12555
12556 switch (neon_shape_tab[shape].el[j])
12557 {
12558 case SE_F:
12559 if (!(inst.operands[j].isreg
12560 && inst.operands[j].isvec
12561 && inst.operands[j].issingle
12562 && !inst.operands[j].isquad))
12563 matches = 0;
12564 break;
12565
12566 case SE_D:
12567 if (!(inst.operands[j].isreg
12568 && inst.operands[j].isvec
12569 && !inst.operands[j].isquad
12570 && !inst.operands[j].issingle))
12571 matches = 0;
12572 break;
12573
12574 case SE_R:
12575 if (!(inst.operands[j].isreg
12576 && !inst.operands[j].isvec))
12577 matches = 0;
12578 break;
12579
12580 case SE_Q:
12581 if (!(inst.operands[j].isreg
12582 && inst.operands[j].isvec
12583 && inst.operands[j].isquad
12584 && !inst.operands[j].issingle))
12585 matches = 0;
12586 break;
12587
12588 case SE_I:
12589 if (!(!inst.operands[j].isreg
12590 && !inst.operands[j].isscalar))
12591 matches = 0;
12592 break;
12593
12594 case SE_S:
12595 if (!(!inst.operands[j].isreg
12596 && inst.operands[j].isscalar))
12597 matches = 0;
12598 break;
12599
12600 case SE_L:
12601 break;
12602 }
3fde54a2
JZ
12603 if (!matches)
12604 break;
037e8744 12605 }
ad6cec43
MGD
12606 if (matches && (j >= ARM_IT_MAX_OPERANDS || !inst.operands[j].present))
12607 /* We've matched all the entries in the shape table, and we don't
12608 have any left over operands which have not been matched. */
5287ad62 12609 break;
037e8744 12610 }
5f4273c7 12611
037e8744 12612 va_end (ap);
5287ad62 12613
037e8744
JB
12614 if (shape == NS_NULL && first_shape != NS_NULL)
12615 first_error (_("invalid instruction shape"));
5287ad62 12616
037e8744
JB
12617 return shape;
12618}
5287ad62 12619
037e8744
JB
12620/* True if SHAPE is predominantly a quadword operation (most of the time, this
12621 means the Q bit should be set). */
12622
12623static int
12624neon_quad (enum neon_shape shape)
12625{
12626 return neon_shape_class[shape] == SC_QUAD;
5287ad62 12627}
037e8744 12628
5287ad62
JB
12629static void
12630neon_modify_type_size (unsigned typebits, enum neon_el_type *g_type,
12631 unsigned *g_size)
12632{
12633 /* Allow modification to be made to types which are constrained to be
12634 based on the key element, based on bits set alongside N_EQK. */
12635 if ((typebits & N_EQK) != 0)
12636 {
12637 if ((typebits & N_HLF) != 0)
12638 *g_size /= 2;
12639 else if ((typebits & N_DBL) != 0)
12640 *g_size *= 2;
12641 if ((typebits & N_SGN) != 0)
12642 *g_type = NT_signed;
12643 else if ((typebits & N_UNS) != 0)
12644 *g_type = NT_unsigned;
12645 else if ((typebits & N_INT) != 0)
12646 *g_type = NT_integer;
12647 else if ((typebits & N_FLT) != 0)
12648 *g_type = NT_float;
dcbf9037
JB
12649 else if ((typebits & N_SIZ) != 0)
12650 *g_type = NT_untyped;
5287ad62
JB
12651 }
12652}
5f4273c7 12653
5287ad62
JB
12654/* Return operand OPNO promoted by bits set in THISARG. KEY should be the "key"
12655 operand type, i.e. the single type specified in a Neon instruction when it
12656 is the only one given. */
12657
12658static struct neon_type_el
12659neon_type_promote (struct neon_type_el *key, unsigned thisarg)
12660{
12661 struct neon_type_el dest = *key;
5f4273c7 12662
9c2799c2 12663 gas_assert ((thisarg & N_EQK) != 0);
5f4273c7 12664
5287ad62
JB
12665 neon_modify_type_size (thisarg, &dest.type, &dest.size);
12666
12667 return dest;
12668}
12669
12670/* Convert Neon type and size into compact bitmask representation. */
12671
12672static enum neon_type_mask
12673type_chk_of_el_type (enum neon_el_type type, unsigned size)
12674{
12675 switch (type)
12676 {
12677 case NT_untyped:
12678 switch (size)
12679 {
12680 case 8: return N_8;
12681 case 16: return N_16;
12682 case 32: return N_32;
12683 case 64: return N_64;
12684 default: ;
12685 }
12686 break;
12687
12688 case NT_integer:
12689 switch (size)
12690 {
12691 case 8: return N_I8;
12692 case 16: return N_I16;
12693 case 32: return N_I32;
12694 case 64: return N_I64;
12695 default: ;
12696 }
12697 break;
12698
12699 case NT_float:
037e8744
JB
12700 switch (size)
12701 {
8e79c3df 12702 case 16: return N_F16;
037e8744
JB
12703 case 32: return N_F32;
12704 case 64: return N_F64;
12705 default: ;
12706 }
5287ad62
JB
12707 break;
12708
12709 case NT_poly:
12710 switch (size)
12711 {
12712 case 8: return N_P8;
12713 case 16: return N_P16;
12714 default: ;
12715 }
12716 break;
12717
12718 case NT_signed:
12719 switch (size)
12720 {
12721 case 8: return N_S8;
12722 case 16: return N_S16;
12723 case 32: return N_S32;
12724 case 64: return N_S64;
12725 default: ;
12726 }
12727 break;
12728
12729 case NT_unsigned:
12730 switch (size)
12731 {
12732 case 8: return N_U8;
12733 case 16: return N_U16;
12734 case 32: return N_U32;
12735 case 64: return N_U64;
12736 default: ;
12737 }
12738 break;
12739
12740 default: ;
12741 }
5f4273c7 12742
5287ad62
JB
12743 return N_UTYP;
12744}
12745
12746/* Convert compact Neon bitmask type representation to a type and size. Only
12747 handles the case where a single bit is set in the mask. */
12748
dcbf9037 12749static int
5287ad62
JB
12750el_type_of_type_chk (enum neon_el_type *type, unsigned *size,
12751 enum neon_type_mask mask)
12752{
dcbf9037
JB
12753 if ((mask & N_EQK) != 0)
12754 return FAIL;
12755
5287ad62
JB
12756 if ((mask & (N_S8 | N_U8 | N_I8 | N_8 | N_P8)) != 0)
12757 *size = 8;
dcbf9037 12758 else if ((mask & (N_S16 | N_U16 | N_I16 | N_16 | N_P16)) != 0)
5287ad62 12759 *size = 16;
dcbf9037 12760 else if ((mask & (N_S32 | N_U32 | N_I32 | N_32 | N_F32)) != 0)
5287ad62 12761 *size = 32;
037e8744 12762 else if ((mask & (N_S64 | N_U64 | N_I64 | N_64 | N_F64)) != 0)
5287ad62 12763 *size = 64;
dcbf9037
JB
12764 else
12765 return FAIL;
12766
5287ad62
JB
12767 if ((mask & (N_S8 | N_S16 | N_S32 | N_S64)) != 0)
12768 *type = NT_signed;
dcbf9037 12769 else if ((mask & (N_U8 | N_U16 | N_U32 | N_U64)) != 0)
5287ad62 12770 *type = NT_unsigned;
dcbf9037 12771 else if ((mask & (N_I8 | N_I16 | N_I32 | N_I64)) != 0)
5287ad62 12772 *type = NT_integer;
dcbf9037 12773 else if ((mask & (N_8 | N_16 | N_32 | N_64)) != 0)
5287ad62 12774 *type = NT_untyped;
dcbf9037 12775 else if ((mask & (N_P8 | N_P16)) != 0)
5287ad62 12776 *type = NT_poly;
037e8744 12777 else if ((mask & (N_F32 | N_F64)) != 0)
5287ad62 12778 *type = NT_float;
dcbf9037
JB
12779 else
12780 return FAIL;
5f4273c7 12781
dcbf9037 12782 return SUCCESS;
5287ad62
JB
12783}
12784
12785/* Modify a bitmask of allowed types. This is only needed for type
12786 relaxation. */
12787
12788static unsigned
12789modify_types_allowed (unsigned allowed, unsigned mods)
12790{
12791 unsigned size;
12792 enum neon_el_type type;
12793 unsigned destmask;
12794 int i;
5f4273c7 12795
5287ad62 12796 destmask = 0;
5f4273c7 12797
5287ad62
JB
12798 for (i = 1; i <= N_MAX_NONSPECIAL; i <<= 1)
12799 {
21d799b5
NC
12800 if (el_type_of_type_chk (&type, &size,
12801 (enum neon_type_mask) (allowed & i)) == SUCCESS)
dcbf9037
JB
12802 {
12803 neon_modify_type_size (mods, &type, &size);
12804 destmask |= type_chk_of_el_type (type, size);
12805 }
5287ad62 12806 }
5f4273c7 12807
5287ad62
JB
12808 return destmask;
12809}
12810
12811/* Check type and return type classification.
12812 The manual states (paraphrase): If one datatype is given, it indicates the
12813 type given in:
12814 - the second operand, if there is one
12815 - the operand, if there is no second operand
12816 - the result, if there are no operands.
12817 This isn't quite good enough though, so we use a concept of a "key" datatype
12818 which is set on a per-instruction basis, which is the one which matters when
12819 only one data type is written.
12820 Note: this function has side-effects (e.g. filling in missing operands). All
037e8744 12821 Neon instructions should call it before performing bit encoding. */
5287ad62
JB
12822
12823static struct neon_type_el
12824neon_check_type (unsigned els, enum neon_shape ns, ...)
12825{
12826 va_list ap;
12827 unsigned i, pass, key_el = 0;
12828 unsigned types[NEON_MAX_TYPE_ELS];
12829 enum neon_el_type k_type = NT_invtype;
12830 unsigned k_size = -1u;
12831 struct neon_type_el badtype = {NT_invtype, -1};
12832 unsigned key_allowed = 0;
12833
12834 /* Optional registers in Neon instructions are always (not) in operand 1.
12835 Fill in the missing operand here, if it was omitted. */
12836 if (els > 1 && !inst.operands[1].present)
12837 inst.operands[1] = inst.operands[0];
12838
12839 /* Suck up all the varargs. */
12840 va_start (ap, ns);
12841 for (i = 0; i < els; i++)
12842 {
12843 unsigned thisarg = va_arg (ap, unsigned);
12844 if (thisarg == N_IGNORE_TYPE)
12845 {
12846 va_end (ap);
12847 return badtype;
12848 }
12849 types[i] = thisarg;
12850 if ((thisarg & N_KEY) != 0)
12851 key_el = i;
12852 }
12853 va_end (ap);
12854
dcbf9037
JB
12855 if (inst.vectype.elems > 0)
12856 for (i = 0; i < els; i++)
12857 if (inst.operands[i].vectype.type != NT_invtype)
12858 {
12859 first_error (_("types specified in both the mnemonic and operands"));
12860 return badtype;
12861 }
12862
5287ad62
JB
12863 /* Duplicate inst.vectype elements here as necessary.
12864 FIXME: No idea if this is exactly the same as the ARM assembler,
12865 particularly when an insn takes one register and one non-register
12866 operand. */
12867 if (inst.vectype.elems == 1 && els > 1)
12868 {
12869 unsigned j;
12870 inst.vectype.elems = els;
12871 inst.vectype.el[key_el] = inst.vectype.el[0];
12872 for (j = 0; j < els; j++)
dcbf9037
JB
12873 if (j != key_el)
12874 inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12875 types[j]);
12876 }
12877 else if (inst.vectype.elems == 0 && els > 0)
12878 {
12879 unsigned j;
12880 /* No types were given after the mnemonic, so look for types specified
12881 after each operand. We allow some flexibility here; as long as the
12882 "key" operand has a type, we can infer the others. */
12883 for (j = 0; j < els; j++)
12884 if (inst.operands[j].vectype.type != NT_invtype)
12885 inst.vectype.el[j] = inst.operands[j].vectype;
12886
12887 if (inst.operands[key_el].vectype.type != NT_invtype)
5287ad62 12888 {
dcbf9037
JB
12889 for (j = 0; j < els; j++)
12890 if (inst.operands[j].vectype.type == NT_invtype)
12891 inst.vectype.el[j] = neon_type_promote (&inst.vectype.el[key_el],
12892 types[j]);
12893 }
12894 else
12895 {
12896 first_error (_("operand types can't be inferred"));
12897 return badtype;
5287ad62
JB
12898 }
12899 }
12900 else if (inst.vectype.elems != els)
12901 {
dcbf9037 12902 first_error (_("type specifier has the wrong number of parts"));
5287ad62
JB
12903 return badtype;
12904 }
12905
12906 for (pass = 0; pass < 2; pass++)
12907 {
12908 for (i = 0; i < els; i++)
12909 {
12910 unsigned thisarg = types[i];
12911 unsigned types_allowed = ((thisarg & N_EQK) != 0 && pass != 0)
12912 ? modify_types_allowed (key_allowed, thisarg) : thisarg;
12913 enum neon_el_type g_type = inst.vectype.el[i].type;
12914 unsigned g_size = inst.vectype.el[i].size;
12915
12916 /* Decay more-specific signed & unsigned types to sign-insensitive
12917 integer types if sign-specific variants are unavailable. */
12918 if ((g_type == NT_signed || g_type == NT_unsigned)
12919 && (types_allowed & N_SU_ALL) == 0)
12920 g_type = NT_integer;
12921
12922 /* If only untyped args are allowed, decay any more specific types to
12923 them. Some instructions only care about signs for some element
12924 sizes, so handle that properly. */
12925 if ((g_size == 8 && (types_allowed & N_8) != 0)
12926 || (g_size == 16 && (types_allowed & N_16) != 0)
12927 || (g_size == 32 && (types_allowed & N_32) != 0)
12928 || (g_size == 64 && (types_allowed & N_64) != 0))
12929 g_type = NT_untyped;
12930
12931 if (pass == 0)
12932 {
12933 if ((thisarg & N_KEY) != 0)
12934 {
12935 k_type = g_type;
12936 k_size = g_size;
12937 key_allowed = thisarg & ~N_KEY;
12938 }
12939 }
12940 else
12941 {
037e8744
JB
12942 if ((thisarg & N_VFP) != 0)
12943 {
99b253c5
NC
12944 enum neon_shape_el regshape;
12945 unsigned regwidth, match;
12946
12947 /* PR 11136: Catch the case where we are passed a shape of NS_NULL. */
12948 if (ns == NS_NULL)
12949 {
12950 first_error (_("invalid instruction shape"));
12951 return badtype;
12952 }
12953 regshape = neon_shape_tab[ns].el[i];
12954 regwidth = neon_shape_el_size[regshape];
037e8744
JB
12955
12956 /* In VFP mode, operands must match register widths. If we
12957 have a key operand, use its width, else use the width of
12958 the current operand. */
12959 if (k_size != -1u)
12960 match = k_size;
12961 else
12962 match = g_size;
12963
12964 if (regwidth != match)
12965 {
12966 first_error (_("operand size must match register width"));
12967 return badtype;
12968 }
12969 }
5f4273c7 12970
5287ad62
JB
12971 if ((thisarg & N_EQK) == 0)
12972 {
12973 unsigned given_type = type_chk_of_el_type (g_type, g_size);
12974
12975 if ((given_type & types_allowed) == 0)
12976 {
dcbf9037 12977 first_error (_("bad type in Neon instruction"));
5287ad62
JB
12978 return badtype;
12979 }
12980 }
12981 else
12982 {
12983 enum neon_el_type mod_k_type = k_type;
12984 unsigned mod_k_size = k_size;
12985 neon_modify_type_size (thisarg, &mod_k_type, &mod_k_size);
12986 if (g_type != mod_k_type || g_size != mod_k_size)
12987 {
dcbf9037 12988 first_error (_("inconsistent types in Neon instruction"));
5287ad62
JB
12989 return badtype;
12990 }
12991 }
12992 }
12993 }
12994 }
12995
12996 return inst.vectype.el[key_el];
12997}
12998
037e8744 12999/* Neon-style VFP instruction forwarding. */
5287ad62 13000
037e8744
JB
13001/* Thumb VFP instructions have 0xE in the condition field. */
13002
13003static void
13004do_vfp_cond_or_thumb (void)
5287ad62 13005{
88714cb8
DG
13006 inst.is_neon = 1;
13007
5287ad62 13008 if (thumb_mode)
037e8744 13009 inst.instruction |= 0xe0000000;
5287ad62 13010 else
037e8744 13011 inst.instruction |= inst.cond << 28;
5287ad62
JB
13012}
13013
037e8744
JB
13014/* Look up and encode a simple mnemonic, for use as a helper function for the
13015 Neon-style VFP syntax. This avoids duplication of bits of the insns table,
13016 etc. It is assumed that operand parsing has already been done, and that the
13017 operands are in the form expected by the given opcode (this isn't necessarily
13018 the same as the form in which they were parsed, hence some massaging must
13019 take place before this function is called).
13020 Checks current arch version against that in the looked-up opcode. */
5287ad62 13021
037e8744
JB
13022static void
13023do_vfp_nsyn_opcode (const char *opname)
5287ad62 13024{
037e8744 13025 const struct asm_opcode *opcode;
5f4273c7 13026
21d799b5 13027 opcode = (const struct asm_opcode *) hash_find (arm_ops_hsh, opname);
5287ad62 13028
037e8744
JB
13029 if (!opcode)
13030 abort ();
5287ad62 13031
037e8744
JB
13032 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant,
13033 thumb_mode ? *opcode->tvariant : *opcode->avariant),
13034 _(BAD_FPU));
5287ad62 13035
88714cb8
DG
13036 inst.is_neon = 1;
13037
037e8744
JB
13038 if (thumb_mode)
13039 {
13040 inst.instruction = opcode->tvalue;
13041 opcode->tencode ();
13042 }
13043 else
13044 {
13045 inst.instruction = (inst.cond << 28) | opcode->avalue;
13046 opcode->aencode ();
13047 }
13048}
5287ad62
JB
13049
13050static void
037e8744 13051do_vfp_nsyn_add_sub (enum neon_shape rs)
5287ad62 13052{
037e8744
JB
13053 int is_add = (inst.instruction & 0x0fffffff) == N_MNEM_vadd;
13054
13055 if (rs == NS_FFF)
13056 {
13057 if (is_add)
13058 do_vfp_nsyn_opcode ("fadds");
13059 else
13060 do_vfp_nsyn_opcode ("fsubs");
13061 }
13062 else
13063 {
13064 if (is_add)
13065 do_vfp_nsyn_opcode ("faddd");
13066 else
13067 do_vfp_nsyn_opcode ("fsubd");
13068 }
13069}
13070
13071/* Check operand types to see if this is a VFP instruction, and if so call
13072 PFN (). */
13073
13074static int
13075try_vfp_nsyn (int args, void (*pfn) (enum neon_shape))
13076{
13077 enum neon_shape rs;
13078 struct neon_type_el et;
13079
13080 switch (args)
13081 {
13082 case 2:
13083 rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13084 et = neon_check_type (2, rs,
13085 N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13086 break;
5f4273c7 13087
037e8744
JB
13088 case 3:
13089 rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13090 et = neon_check_type (3, rs,
13091 N_EQK | N_VFP, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
13092 break;
13093
13094 default:
13095 abort ();
13096 }
13097
13098 if (et.type != NT_invtype)
13099 {
13100 pfn (rs);
13101 return SUCCESS;
13102 }
037e8744 13103
99b253c5 13104 inst.error = NULL;
037e8744
JB
13105 return FAIL;
13106}
13107
13108static void
13109do_vfp_nsyn_mla_mls (enum neon_shape rs)
13110{
13111 int is_mla = (inst.instruction & 0x0fffffff) == N_MNEM_vmla;
5f4273c7 13112
037e8744
JB
13113 if (rs == NS_FFF)
13114 {
13115 if (is_mla)
13116 do_vfp_nsyn_opcode ("fmacs");
13117 else
1ee69515 13118 do_vfp_nsyn_opcode ("fnmacs");
037e8744
JB
13119 }
13120 else
13121 {
13122 if (is_mla)
13123 do_vfp_nsyn_opcode ("fmacd");
13124 else
1ee69515 13125 do_vfp_nsyn_opcode ("fnmacd");
037e8744
JB
13126 }
13127}
13128
62f3b8c8
PB
13129static void
13130do_vfp_nsyn_fma_fms (enum neon_shape rs)
13131{
13132 int is_fma = (inst.instruction & 0x0fffffff) == N_MNEM_vfma;
13133
13134 if (rs == NS_FFF)
13135 {
13136 if (is_fma)
13137 do_vfp_nsyn_opcode ("ffmas");
13138 else
13139 do_vfp_nsyn_opcode ("ffnmas");
13140 }
13141 else
13142 {
13143 if (is_fma)
13144 do_vfp_nsyn_opcode ("ffmad");
13145 else
13146 do_vfp_nsyn_opcode ("ffnmad");
13147 }
13148}
13149
037e8744
JB
13150static void
13151do_vfp_nsyn_mul (enum neon_shape rs)
13152{
13153 if (rs == NS_FFF)
13154 do_vfp_nsyn_opcode ("fmuls");
13155 else
13156 do_vfp_nsyn_opcode ("fmuld");
13157}
13158
13159static void
13160do_vfp_nsyn_abs_neg (enum neon_shape rs)
13161{
13162 int is_neg = (inst.instruction & 0x80) != 0;
13163 neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_VFP | N_KEY);
13164
13165 if (rs == NS_FF)
13166 {
13167 if (is_neg)
13168 do_vfp_nsyn_opcode ("fnegs");
13169 else
13170 do_vfp_nsyn_opcode ("fabss");
13171 }
13172 else
13173 {
13174 if (is_neg)
13175 do_vfp_nsyn_opcode ("fnegd");
13176 else
13177 do_vfp_nsyn_opcode ("fabsd");
13178 }
13179}
13180
13181/* Encode single-precision (only!) VFP fldm/fstm instructions. Double precision
13182 insns belong to Neon, and are handled elsewhere. */
13183
13184static void
13185do_vfp_nsyn_ldm_stm (int is_dbmode)
13186{
13187 int is_ldm = (inst.instruction & (1 << 20)) != 0;
13188 if (is_ldm)
13189 {
13190 if (is_dbmode)
13191 do_vfp_nsyn_opcode ("fldmdbs");
13192 else
13193 do_vfp_nsyn_opcode ("fldmias");
13194 }
13195 else
13196 {
13197 if (is_dbmode)
13198 do_vfp_nsyn_opcode ("fstmdbs");
13199 else
13200 do_vfp_nsyn_opcode ("fstmias");
13201 }
13202}
13203
037e8744
JB
13204static void
13205do_vfp_nsyn_sqrt (void)
13206{
13207 enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13208 neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
5f4273c7 13209
037e8744
JB
13210 if (rs == NS_FF)
13211 do_vfp_nsyn_opcode ("fsqrts");
13212 else
13213 do_vfp_nsyn_opcode ("fsqrtd");
13214}
13215
13216static void
13217do_vfp_nsyn_div (void)
13218{
13219 enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13220 neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
13221 N_F32 | N_F64 | N_KEY | N_VFP);
5f4273c7 13222
037e8744
JB
13223 if (rs == NS_FFF)
13224 do_vfp_nsyn_opcode ("fdivs");
13225 else
13226 do_vfp_nsyn_opcode ("fdivd");
13227}
13228
13229static void
13230do_vfp_nsyn_nmul (void)
13231{
13232 enum neon_shape rs = neon_select_shape (NS_FFF, NS_DDD, NS_NULL);
13233 neon_check_type (3, rs, N_EQK | N_VFP, N_EQK | N_VFP,
13234 N_F32 | N_F64 | N_KEY | N_VFP);
5f4273c7 13235
037e8744
JB
13236 if (rs == NS_FFF)
13237 {
88714cb8 13238 NEON_ENCODE (SINGLE, inst);
037e8744
JB
13239 do_vfp_sp_dyadic ();
13240 }
13241 else
13242 {
88714cb8 13243 NEON_ENCODE (DOUBLE, inst);
037e8744
JB
13244 do_vfp_dp_rd_rn_rm ();
13245 }
13246 do_vfp_cond_or_thumb ();
13247}
13248
13249static void
13250do_vfp_nsyn_cmp (void)
13251{
13252 if (inst.operands[1].isreg)
13253 {
13254 enum neon_shape rs = neon_select_shape (NS_FF, NS_DD, NS_NULL);
13255 neon_check_type (2, rs, N_EQK | N_VFP, N_F32 | N_F64 | N_KEY | N_VFP);
5f4273c7 13256
037e8744
JB
13257 if (rs == NS_FF)
13258 {
88714cb8 13259 NEON_ENCODE (SINGLE, inst);
037e8744
JB
13260 do_vfp_sp_monadic ();
13261 }
13262 else
13263 {
88714cb8 13264 NEON_ENCODE (DOUBLE, inst);
037e8744
JB
13265 do_vfp_dp_rd_rm ();
13266 }
13267 }
13268 else
13269 {
13270 enum neon_shape rs = neon_select_shape (NS_FI, NS_DI, NS_NULL);
13271 neon_check_type (2, rs, N_F32 | N_F64 | N_KEY | N_VFP, N_EQK);
13272
13273 switch (inst.instruction & 0x0fffffff)
13274 {
13275 case N_MNEM_vcmp:
13276 inst.instruction += N_MNEM_vcmpz - N_MNEM_vcmp;
13277 break;
13278 case N_MNEM_vcmpe:
13279 inst.instruction += N_MNEM_vcmpez - N_MNEM_vcmpe;
13280 break;
13281 default:
13282 abort ();
13283 }
5f4273c7 13284
037e8744
JB
13285 if (rs == NS_FI)
13286 {
88714cb8 13287 NEON_ENCODE (SINGLE, inst);
037e8744
JB
13288 do_vfp_sp_compare_z ();
13289 }
13290 else
13291 {
88714cb8 13292 NEON_ENCODE (DOUBLE, inst);
037e8744
JB
13293 do_vfp_dp_rd ();
13294 }
13295 }
13296 do_vfp_cond_or_thumb ();
13297}
13298
13299static void
13300nsyn_insert_sp (void)
13301{
13302 inst.operands[1] = inst.operands[0];
13303 memset (&inst.operands[0], '\0', sizeof (inst.operands[0]));
fdfde340 13304 inst.operands[0].reg = REG_SP;
037e8744
JB
13305 inst.operands[0].isreg = 1;
13306 inst.operands[0].writeback = 1;
13307 inst.operands[0].present = 1;
13308}
13309
13310static void
13311do_vfp_nsyn_push (void)
13312{
13313 nsyn_insert_sp ();
13314 if (inst.operands[1].issingle)
13315 do_vfp_nsyn_opcode ("fstmdbs");
13316 else
13317 do_vfp_nsyn_opcode ("fstmdbd");
13318}
13319
13320static void
13321do_vfp_nsyn_pop (void)
13322{
13323 nsyn_insert_sp ();
13324 if (inst.operands[1].issingle)
22b5b651 13325 do_vfp_nsyn_opcode ("fldmias");
037e8744 13326 else
22b5b651 13327 do_vfp_nsyn_opcode ("fldmiad");
037e8744
JB
13328}
13329
13330/* Fix up Neon data-processing instructions, ORing in the correct bits for
13331 ARM mode or Thumb mode and moving the encoded bit 24 to bit 28. */
13332
88714cb8
DG
13333static void
13334neon_dp_fixup (struct arm_it* insn)
037e8744 13335{
88714cb8
DG
13336 unsigned int i = insn->instruction;
13337 insn->is_neon = 1;
13338
037e8744
JB
13339 if (thumb_mode)
13340 {
13341 /* The U bit is at bit 24 by default. Move to bit 28 in Thumb mode. */
13342 if (i & (1 << 24))
13343 i |= 1 << 28;
5f4273c7 13344
037e8744 13345 i &= ~(1 << 24);
5f4273c7 13346
037e8744
JB
13347 i |= 0xef000000;
13348 }
13349 else
13350 i |= 0xf2000000;
5f4273c7 13351
88714cb8 13352 insn->instruction = i;
037e8744
JB
13353}
13354
13355/* Turn a size (8, 16, 32, 64) into the respective bit number minus 3
13356 (0, 1, 2, 3). */
13357
13358static unsigned
13359neon_logbits (unsigned x)
13360{
13361 return ffs (x) - 4;
13362}
13363
13364#define LOW4(R) ((R) & 0xf)
13365#define HI1(R) (((R) >> 4) & 1)
13366
13367/* Encode insns with bit pattern:
13368
13369 |28/24|23|22 |21 20|19 16|15 12|11 8|7|6|5|4|3 0|
13370 | U |x |D |size | Rn | Rd |x x x x|N|Q|M|x| Rm |
5f4273c7 13371
037e8744
JB
13372 SIZE is passed in bits. -1 means size field isn't changed, in case it has a
13373 different meaning for some instruction. */
13374
13375static void
13376neon_three_same (int isquad, int ubit, int size)
13377{
13378 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13379 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13380 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
13381 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
13382 inst.instruction |= LOW4 (inst.operands[2].reg);
13383 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
13384 inst.instruction |= (isquad != 0) << 6;
13385 inst.instruction |= (ubit != 0) << 24;
13386 if (size != -1)
13387 inst.instruction |= neon_logbits (size) << 20;
5f4273c7 13388
88714cb8 13389 neon_dp_fixup (&inst);
037e8744
JB
13390}
13391
13392/* Encode instructions of the form:
13393
13394 |28/24|23|22|21 20|19 18|17 16|15 12|11 7|6|5|4|3 0|
13395 | U |x |D |x x |size |x x | Rd |x x x x x|Q|M|x| Rm |
5287ad62
JB
13396
13397 Don't write size if SIZE == -1. */
13398
13399static void
13400neon_two_same (int qbit, int ubit, int size)
13401{
13402 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13403 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13404 inst.instruction |= LOW4 (inst.operands[1].reg);
13405 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13406 inst.instruction |= (qbit != 0) << 6;
13407 inst.instruction |= (ubit != 0) << 24;
13408
13409 if (size != -1)
13410 inst.instruction |= neon_logbits (size) << 18;
13411
88714cb8 13412 neon_dp_fixup (&inst);
5287ad62
JB
13413}
13414
13415/* Neon instruction encoders, in approximate order of appearance. */
13416
13417static void
13418do_neon_dyadic_i_su (void)
13419{
037e8744 13420 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13421 struct neon_type_el et = neon_check_type (3, rs,
13422 N_EQK, N_EQK, N_SU_32 | N_KEY);
037e8744 13423 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
13424}
13425
13426static void
13427do_neon_dyadic_i64_su (void)
13428{
037e8744 13429 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13430 struct neon_type_el et = neon_check_type (3, rs,
13431 N_EQK, N_EQK, N_SU_ALL | N_KEY);
037e8744 13432 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
13433}
13434
13435static void
13436neon_imm_shift (int write_ubit, int uval, int isquad, struct neon_type_el et,
13437 unsigned immbits)
13438{
13439 unsigned size = et.size >> 3;
13440 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13441 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13442 inst.instruction |= LOW4 (inst.operands[1].reg);
13443 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
13444 inst.instruction |= (isquad != 0) << 6;
13445 inst.instruction |= immbits << 16;
13446 inst.instruction |= (size >> 3) << 7;
13447 inst.instruction |= (size & 0x7) << 19;
13448 if (write_ubit)
13449 inst.instruction |= (uval != 0) << 24;
13450
88714cb8 13451 neon_dp_fixup (&inst);
5287ad62
JB
13452}
13453
13454static void
13455do_neon_shl_imm (void)
13456{
13457 if (!inst.operands[2].isreg)
13458 {
037e8744 13459 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62 13460 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_KEY | N_I_ALL);
88714cb8 13461 NEON_ENCODE (IMMED, inst);
037e8744 13462 neon_imm_shift (FALSE, 0, neon_quad (rs), et, inst.operands[2].imm);
5287ad62
JB
13463 }
13464 else
13465 {
037e8744 13466 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13467 struct neon_type_el et = neon_check_type (3, rs,
13468 N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
627907b7
JB
13469 unsigned int tmp;
13470
13471 /* VSHL/VQSHL 3-register variants have syntax such as:
13472 vshl.xx Dd, Dm, Dn
13473 whereas other 3-register operations encoded by neon_three_same have
13474 syntax like:
13475 vadd.xx Dd, Dn, Dm
13476 (i.e. with Dn & Dm reversed). Swap operands[1].reg and operands[2].reg
13477 here. */
13478 tmp = inst.operands[2].reg;
13479 inst.operands[2].reg = inst.operands[1].reg;
13480 inst.operands[1].reg = tmp;
88714cb8 13481 NEON_ENCODE (INTEGER, inst);
037e8744 13482 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
13483 }
13484}
13485
13486static void
13487do_neon_qshl_imm (void)
13488{
13489 if (!inst.operands[2].isreg)
13490 {
037e8744 13491 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62 13492 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
627907b7 13493
88714cb8 13494 NEON_ENCODE (IMMED, inst);
037e8744 13495 neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
5287ad62
JB
13496 inst.operands[2].imm);
13497 }
13498 else
13499 {
037e8744 13500 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13501 struct neon_type_el et = neon_check_type (3, rs,
13502 N_EQK, N_SU_ALL | N_KEY, N_EQK | N_SGN);
627907b7
JB
13503 unsigned int tmp;
13504
13505 /* See note in do_neon_shl_imm. */
13506 tmp = inst.operands[2].reg;
13507 inst.operands[2].reg = inst.operands[1].reg;
13508 inst.operands[1].reg = tmp;
88714cb8 13509 NEON_ENCODE (INTEGER, inst);
037e8744 13510 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
5287ad62
JB
13511 }
13512}
13513
627907b7
JB
13514static void
13515do_neon_rshl (void)
13516{
13517 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
13518 struct neon_type_el et = neon_check_type (3, rs,
13519 N_EQK, N_EQK, N_SU_ALL | N_KEY);
13520 unsigned int tmp;
13521
13522 tmp = inst.operands[2].reg;
13523 inst.operands[2].reg = inst.operands[1].reg;
13524 inst.operands[1].reg = tmp;
13525 neon_three_same (neon_quad (rs), et.type == NT_unsigned, et.size);
13526}
13527
5287ad62
JB
13528static int
13529neon_cmode_for_logic_imm (unsigned immediate, unsigned *immbits, int size)
13530{
036dc3f7
PB
13531 /* Handle .I8 pseudo-instructions. */
13532 if (size == 8)
5287ad62 13533 {
5287ad62
JB
13534 /* Unfortunately, this will make everything apart from zero out-of-range.
13535 FIXME is this the intended semantics? There doesn't seem much point in
13536 accepting .I8 if so. */
13537 immediate |= immediate << 8;
13538 size = 16;
036dc3f7
PB
13539 }
13540
13541 if (size >= 32)
13542 {
13543 if (immediate == (immediate & 0x000000ff))
13544 {
13545 *immbits = immediate;
13546 return 0x1;
13547 }
13548 else if (immediate == (immediate & 0x0000ff00))
13549 {
13550 *immbits = immediate >> 8;
13551 return 0x3;
13552 }
13553 else if (immediate == (immediate & 0x00ff0000))
13554 {
13555 *immbits = immediate >> 16;
13556 return 0x5;
13557 }
13558 else if (immediate == (immediate & 0xff000000))
13559 {
13560 *immbits = immediate >> 24;
13561 return 0x7;
13562 }
13563 if ((immediate & 0xffff) != (immediate >> 16))
13564 goto bad_immediate;
13565 immediate &= 0xffff;
5287ad62
JB
13566 }
13567
13568 if (immediate == (immediate & 0x000000ff))
13569 {
13570 *immbits = immediate;
036dc3f7 13571 return 0x9;
5287ad62
JB
13572 }
13573 else if (immediate == (immediate & 0x0000ff00))
13574 {
13575 *immbits = immediate >> 8;
036dc3f7 13576 return 0xb;
5287ad62
JB
13577 }
13578
13579 bad_immediate:
dcbf9037 13580 first_error (_("immediate value out of range"));
5287ad62
JB
13581 return FAIL;
13582}
13583
13584/* True if IMM has form 0bAAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD for bits
13585 A, B, C, D. */
13586
13587static int
13588neon_bits_same_in_bytes (unsigned imm)
13589{
13590 return ((imm & 0x000000ff) == 0 || (imm & 0x000000ff) == 0x000000ff)
13591 && ((imm & 0x0000ff00) == 0 || (imm & 0x0000ff00) == 0x0000ff00)
13592 && ((imm & 0x00ff0000) == 0 || (imm & 0x00ff0000) == 0x00ff0000)
13593 && ((imm & 0xff000000) == 0 || (imm & 0xff000000) == 0xff000000);
13594}
13595
13596/* For immediate of above form, return 0bABCD. */
13597
13598static unsigned
13599neon_squash_bits (unsigned imm)
13600{
13601 return (imm & 0x01) | ((imm & 0x0100) >> 7) | ((imm & 0x010000) >> 14)
13602 | ((imm & 0x01000000) >> 21);
13603}
13604
136da414 13605/* Compress quarter-float representation to 0b...000 abcdefgh. */
5287ad62
JB
13606
13607static unsigned
13608neon_qfloat_bits (unsigned imm)
13609{
136da414 13610 return ((imm >> 19) & 0x7f) | ((imm >> 24) & 0x80);
5287ad62
JB
13611}
13612
13613/* Returns CMODE. IMMBITS [7:0] is set to bits suitable for inserting into
13614 the instruction. *OP is passed as the initial value of the op field, and
13615 may be set to a different value depending on the constant (i.e.
13616 "MOV I64, 0bAAAAAAAABBBB..." which uses OP = 1 despite being MOV not
5f4273c7 13617 MVN). If the immediate looks like a repeated pattern then also
036dc3f7 13618 try smaller element sizes. */
5287ad62
JB
13619
13620static int
c96612cc
JB
13621neon_cmode_for_move_imm (unsigned immlo, unsigned immhi, int float_p,
13622 unsigned *immbits, int *op, int size,
13623 enum neon_el_type type)
5287ad62 13624{
c96612cc
JB
13625 /* Only permit float immediates (including 0.0/-0.0) if the operand type is
13626 float. */
13627 if (type == NT_float && !float_p)
13628 return FAIL;
13629
136da414
JB
13630 if (type == NT_float && is_quarter_float (immlo) && immhi == 0)
13631 {
13632 if (size != 32 || *op == 1)
13633 return FAIL;
13634 *immbits = neon_qfloat_bits (immlo);
13635 return 0xf;
13636 }
036dc3f7
PB
13637
13638 if (size == 64)
5287ad62 13639 {
036dc3f7
PB
13640 if (neon_bits_same_in_bytes (immhi)
13641 && neon_bits_same_in_bytes (immlo))
13642 {
13643 if (*op == 1)
13644 return FAIL;
13645 *immbits = (neon_squash_bits (immhi) << 4)
13646 | neon_squash_bits (immlo);
13647 *op = 1;
13648 return 0xe;
13649 }
13650
13651 if (immhi != immlo)
13652 return FAIL;
5287ad62 13653 }
036dc3f7
PB
13654
13655 if (size >= 32)
5287ad62 13656 {
036dc3f7
PB
13657 if (immlo == (immlo & 0x000000ff))
13658 {
13659 *immbits = immlo;
13660 return 0x0;
13661 }
13662 else if (immlo == (immlo & 0x0000ff00))
13663 {
13664 *immbits = immlo >> 8;
13665 return 0x2;
13666 }
13667 else if (immlo == (immlo & 0x00ff0000))
13668 {
13669 *immbits = immlo >> 16;
13670 return 0x4;
13671 }
13672 else if (immlo == (immlo & 0xff000000))
13673 {
13674 *immbits = immlo >> 24;
13675 return 0x6;
13676 }
13677 else if (immlo == ((immlo & 0x0000ff00) | 0x000000ff))
13678 {
13679 *immbits = (immlo >> 8) & 0xff;
13680 return 0xc;
13681 }
13682 else if (immlo == ((immlo & 0x00ff0000) | 0x0000ffff))
13683 {
13684 *immbits = (immlo >> 16) & 0xff;
13685 return 0xd;
13686 }
13687
13688 if ((immlo & 0xffff) != (immlo >> 16))
13689 return FAIL;
13690 immlo &= 0xffff;
5287ad62 13691 }
036dc3f7
PB
13692
13693 if (size >= 16)
5287ad62 13694 {
036dc3f7
PB
13695 if (immlo == (immlo & 0x000000ff))
13696 {
13697 *immbits = immlo;
13698 return 0x8;
13699 }
13700 else if (immlo == (immlo & 0x0000ff00))
13701 {
13702 *immbits = immlo >> 8;
13703 return 0xa;
13704 }
13705
13706 if ((immlo & 0xff) != (immlo >> 8))
13707 return FAIL;
13708 immlo &= 0xff;
5287ad62 13709 }
036dc3f7
PB
13710
13711 if (immlo == (immlo & 0x000000ff))
5287ad62 13712 {
036dc3f7
PB
13713 /* Don't allow MVN with 8-bit immediate. */
13714 if (*op == 1)
13715 return FAIL;
13716 *immbits = immlo;
13717 return 0xe;
5287ad62 13718 }
5287ad62
JB
13719
13720 return FAIL;
13721}
13722
13723/* Write immediate bits [7:0] to the following locations:
13724
13725 |28/24|23 19|18 16|15 4|3 0|
13726 | 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|
13727
13728 This function is used by VMOV/VMVN/VORR/VBIC. */
13729
13730static void
13731neon_write_immbits (unsigned immbits)
13732{
13733 inst.instruction |= immbits & 0xf;
13734 inst.instruction |= ((immbits >> 4) & 0x7) << 16;
13735 inst.instruction |= ((immbits >> 7) & 0x1) << 24;
13736}
13737
13738/* Invert low-order SIZE bits of XHI:XLO. */
13739
13740static void
13741neon_invert_size (unsigned *xlo, unsigned *xhi, int size)
13742{
13743 unsigned immlo = xlo ? *xlo : 0;
13744 unsigned immhi = xhi ? *xhi : 0;
13745
13746 switch (size)
13747 {
13748 case 8:
13749 immlo = (~immlo) & 0xff;
13750 break;
13751
13752 case 16:
13753 immlo = (~immlo) & 0xffff;
13754 break;
13755
13756 case 64:
13757 immhi = (~immhi) & 0xffffffff;
13758 /* fall through. */
13759
13760 case 32:
13761 immlo = (~immlo) & 0xffffffff;
13762 break;
13763
13764 default:
13765 abort ();
13766 }
13767
13768 if (xlo)
13769 *xlo = immlo;
13770
13771 if (xhi)
13772 *xhi = immhi;
13773}
13774
13775static void
13776do_neon_logic (void)
13777{
13778 if (inst.operands[2].present && inst.operands[2].isreg)
13779 {
037e8744 13780 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
13781 neon_check_type (3, rs, N_IGNORE_TYPE);
13782 /* U bit and size field were set as part of the bitmask. */
88714cb8 13783 NEON_ENCODE (INTEGER, inst);
037e8744 13784 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
13785 }
13786 else
13787 {
4316f0d2
DG
13788 const int three_ops_form = (inst.operands[2].present
13789 && !inst.operands[2].isreg);
13790 const int immoperand = (three_ops_form ? 2 : 1);
13791 enum neon_shape rs = (three_ops_form
13792 ? neon_select_shape (NS_DDI, NS_QQI, NS_NULL)
13793 : neon_select_shape (NS_DI, NS_QI, NS_NULL));
037e8744
JB
13794 struct neon_type_el et = neon_check_type (2, rs,
13795 N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
21d799b5 13796 enum neon_opc opcode = (enum neon_opc) inst.instruction & 0x0fffffff;
5287ad62
JB
13797 unsigned immbits;
13798 int cmode;
5f4273c7 13799
5287ad62
JB
13800 if (et.type == NT_invtype)
13801 return;
5f4273c7 13802
4316f0d2
DG
13803 if (three_ops_form)
13804 constraint (inst.operands[0].reg != inst.operands[1].reg,
13805 _("first and second operands shall be the same register"));
13806
88714cb8 13807 NEON_ENCODE (IMMED, inst);
5287ad62 13808
4316f0d2 13809 immbits = inst.operands[immoperand].imm;
036dc3f7
PB
13810 if (et.size == 64)
13811 {
13812 /* .i64 is a pseudo-op, so the immediate must be a repeating
13813 pattern. */
4316f0d2
DG
13814 if (immbits != (inst.operands[immoperand].regisimm ?
13815 inst.operands[immoperand].reg : 0))
036dc3f7
PB
13816 {
13817 /* Set immbits to an invalid constant. */
13818 immbits = 0xdeadbeef;
13819 }
13820 }
13821
5287ad62
JB
13822 switch (opcode)
13823 {
13824 case N_MNEM_vbic:
036dc3f7 13825 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
5287ad62 13826 break;
5f4273c7 13827
5287ad62 13828 case N_MNEM_vorr:
036dc3f7 13829 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
5287ad62 13830 break;
5f4273c7 13831
5287ad62
JB
13832 case N_MNEM_vand:
13833 /* Pseudo-instruction for VBIC. */
5287ad62
JB
13834 neon_invert_size (&immbits, 0, et.size);
13835 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13836 break;
5f4273c7 13837
5287ad62
JB
13838 case N_MNEM_vorn:
13839 /* Pseudo-instruction for VORR. */
5287ad62
JB
13840 neon_invert_size (&immbits, 0, et.size);
13841 cmode = neon_cmode_for_logic_imm (immbits, &immbits, et.size);
13842 break;
5f4273c7 13843
5287ad62
JB
13844 default:
13845 abort ();
13846 }
13847
13848 if (cmode == FAIL)
13849 return;
13850
037e8744 13851 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
13852 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
13853 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
13854 inst.instruction |= cmode << 8;
13855 neon_write_immbits (immbits);
5f4273c7 13856
88714cb8 13857 neon_dp_fixup (&inst);
5287ad62
JB
13858 }
13859}
13860
13861static void
13862do_neon_bitfield (void)
13863{
037e8744 13864 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
dcbf9037 13865 neon_check_type (3, rs, N_IGNORE_TYPE);
037e8744 13866 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
13867}
13868
13869static void
dcbf9037
JB
13870neon_dyadic_misc (enum neon_el_type ubit_meaning, unsigned types,
13871 unsigned destbits)
5287ad62 13872{
037e8744 13873 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
dcbf9037
JB
13874 struct neon_type_el et = neon_check_type (3, rs, N_EQK | destbits, N_EQK,
13875 types | N_KEY);
5287ad62
JB
13876 if (et.type == NT_float)
13877 {
88714cb8 13878 NEON_ENCODE (FLOAT, inst);
037e8744 13879 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
13880 }
13881 else
13882 {
88714cb8 13883 NEON_ENCODE (INTEGER, inst);
037e8744 13884 neon_three_same (neon_quad (rs), et.type == ubit_meaning, et.size);
5287ad62
JB
13885 }
13886}
13887
13888static void
13889do_neon_dyadic_if_su (void)
13890{
dcbf9037 13891 neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
5287ad62
JB
13892}
13893
13894static void
13895do_neon_dyadic_if_su_d (void)
13896{
13897 /* This version only allow D registers, but that constraint is enforced during
13898 operand parsing so we don't need to do anything extra here. */
dcbf9037 13899 neon_dyadic_misc (NT_unsigned, N_SUF_32, 0);
5287ad62
JB
13900}
13901
5287ad62
JB
13902static void
13903do_neon_dyadic_if_i_d (void)
13904{
428e3f1f
PB
13905 /* The "untyped" case can't happen. Do this to stop the "U" bit being
13906 affected if we specify unsigned args. */
13907 neon_dyadic_misc (NT_untyped, N_IF_32, 0);
5287ad62
JB
13908}
13909
037e8744
JB
13910enum vfp_or_neon_is_neon_bits
13911{
13912 NEON_CHECK_CC = 1,
13913 NEON_CHECK_ARCH = 2
13914};
13915
13916/* Call this function if an instruction which may have belonged to the VFP or
13917 Neon instruction sets, but turned out to be a Neon instruction (due to the
13918 operand types involved, etc.). We have to check and/or fix-up a couple of
13919 things:
13920
13921 - Make sure the user hasn't attempted to make a Neon instruction
13922 conditional.
13923 - Alter the value in the condition code field if necessary.
13924 - Make sure that the arch supports Neon instructions.
13925
13926 Which of these operations take place depends on bits from enum
13927 vfp_or_neon_is_neon_bits.
13928
13929 WARNING: This function has side effects! If NEON_CHECK_CC is used and the
13930 current instruction's condition is COND_ALWAYS, the condition field is
13931 changed to inst.uncond_value. This is necessary because instructions shared
13932 between VFP and Neon may be conditional for the VFP variants only, and the
13933 unconditional Neon version must have, e.g., 0xF in the condition field. */
13934
13935static int
13936vfp_or_neon_is_neon (unsigned check)
13937{
13938 /* Conditions are always legal in Thumb mode (IT blocks). */
13939 if (!thumb_mode && (check & NEON_CHECK_CC))
13940 {
13941 if (inst.cond != COND_ALWAYS)
13942 {
13943 first_error (_(BAD_COND));
13944 return FAIL;
13945 }
13946 if (inst.uncond_value != -1)
13947 inst.instruction |= inst.uncond_value << 28;
13948 }
5f4273c7 13949
037e8744
JB
13950 if ((check & NEON_CHECK_ARCH)
13951 && !ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1))
13952 {
13953 first_error (_(BAD_FPU));
13954 return FAIL;
13955 }
5f4273c7 13956
037e8744
JB
13957 return SUCCESS;
13958}
13959
5287ad62
JB
13960static void
13961do_neon_addsub_if_i (void)
13962{
037e8744
JB
13963 if (try_vfp_nsyn (3, do_vfp_nsyn_add_sub) == SUCCESS)
13964 return;
13965
13966 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
13967 return;
13968
5287ad62
JB
13969 /* The "untyped" case can't happen. Do this to stop the "U" bit being
13970 affected if we specify unsigned args. */
dcbf9037 13971 neon_dyadic_misc (NT_untyped, N_IF_32 | N_I64, 0);
5287ad62
JB
13972}
13973
13974/* Swaps operands 1 and 2. If operand 1 (optional arg) was omitted, we want the
13975 result to be:
13976 V<op> A,B (A is operand 0, B is operand 2)
13977 to mean:
13978 V<op> A,B,A
13979 not:
13980 V<op> A,B,B
13981 so handle that case specially. */
13982
13983static void
13984neon_exchange_operands (void)
13985{
13986 void *scratch = alloca (sizeof (inst.operands[0]));
13987 if (inst.operands[1].present)
13988 {
13989 /* Swap operands[1] and operands[2]. */
13990 memcpy (scratch, &inst.operands[1], sizeof (inst.operands[0]));
13991 inst.operands[1] = inst.operands[2];
13992 memcpy (&inst.operands[2], scratch, sizeof (inst.operands[0]));
13993 }
13994 else
13995 {
13996 inst.operands[1] = inst.operands[2];
13997 inst.operands[2] = inst.operands[0];
13998 }
13999}
14000
14001static void
14002neon_compare (unsigned regtypes, unsigned immtypes, int invert)
14003{
14004 if (inst.operands[2].isreg)
14005 {
14006 if (invert)
14007 neon_exchange_operands ();
dcbf9037 14008 neon_dyadic_misc (NT_unsigned, regtypes, N_SIZ);
5287ad62
JB
14009 }
14010 else
14011 {
037e8744 14012 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
dcbf9037
JB
14013 struct neon_type_el et = neon_check_type (2, rs,
14014 N_EQK | N_SIZ, immtypes | N_KEY);
5287ad62 14015
88714cb8 14016 NEON_ENCODE (IMMED, inst);
5287ad62
JB
14017 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14018 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14019 inst.instruction |= LOW4 (inst.operands[1].reg);
14020 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
037e8744 14021 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
14022 inst.instruction |= (et.type == NT_float) << 10;
14023 inst.instruction |= neon_logbits (et.size) << 18;
5f4273c7 14024
88714cb8 14025 neon_dp_fixup (&inst);
5287ad62
JB
14026 }
14027}
14028
14029static void
14030do_neon_cmp (void)
14031{
14032 neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, FALSE);
14033}
14034
14035static void
14036do_neon_cmp_inv (void)
14037{
14038 neon_compare (N_SUF_32, N_S8 | N_S16 | N_S32 | N_F32, TRUE);
14039}
14040
14041static void
14042do_neon_ceq (void)
14043{
14044 neon_compare (N_IF_32, N_IF_32, FALSE);
14045}
14046
14047/* For multiply instructions, we have the possibility of 16-bit or 32-bit
14048 scalars, which are encoded in 5 bits, M : Rm.
14049 For 16-bit scalars, the register is encoded in Rm[2:0] and the index in
14050 M:Rm[3], and for 32-bit scalars, the register is encoded in Rm[3:0] and the
14051 index in M. */
14052
14053static unsigned
14054neon_scalar_for_mul (unsigned scalar, unsigned elsize)
14055{
dcbf9037
JB
14056 unsigned regno = NEON_SCALAR_REG (scalar);
14057 unsigned elno = NEON_SCALAR_INDEX (scalar);
5287ad62
JB
14058
14059 switch (elsize)
14060 {
14061 case 16:
14062 if (regno > 7 || elno > 3)
14063 goto bad_scalar;
14064 return regno | (elno << 3);
5f4273c7 14065
5287ad62
JB
14066 case 32:
14067 if (regno > 15 || elno > 1)
14068 goto bad_scalar;
14069 return regno | (elno << 4);
14070
14071 default:
14072 bad_scalar:
dcbf9037 14073 first_error (_("scalar out of range for multiply instruction"));
5287ad62
JB
14074 }
14075
14076 return 0;
14077}
14078
14079/* Encode multiply / multiply-accumulate scalar instructions. */
14080
14081static void
14082neon_mul_mac (struct neon_type_el et, int ubit)
14083{
dcbf9037
JB
14084 unsigned scalar;
14085
14086 /* Give a more helpful error message if we have an invalid type. */
14087 if (et.type == NT_invtype)
14088 return;
5f4273c7 14089
dcbf9037 14090 scalar = neon_scalar_for_mul (inst.operands[2].reg, et.size);
5287ad62
JB
14091 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14092 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14093 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14094 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14095 inst.instruction |= LOW4 (scalar);
14096 inst.instruction |= HI1 (scalar) << 5;
14097 inst.instruction |= (et.type == NT_float) << 8;
14098 inst.instruction |= neon_logbits (et.size) << 20;
14099 inst.instruction |= (ubit != 0) << 24;
14100
88714cb8 14101 neon_dp_fixup (&inst);
5287ad62
JB
14102}
14103
14104static void
14105do_neon_mac_maybe_scalar (void)
14106{
037e8744
JB
14107 if (try_vfp_nsyn (3, do_vfp_nsyn_mla_mls) == SUCCESS)
14108 return;
14109
14110 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14111 return;
14112
5287ad62
JB
14113 if (inst.operands[2].isscalar)
14114 {
037e8744 14115 enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
5287ad62
JB
14116 struct neon_type_el et = neon_check_type (3, rs,
14117 N_EQK, N_EQK, N_I16 | N_I32 | N_F32 | N_KEY);
88714cb8 14118 NEON_ENCODE (SCALAR, inst);
037e8744 14119 neon_mul_mac (et, neon_quad (rs));
5287ad62
JB
14120 }
14121 else
428e3f1f
PB
14122 {
14123 /* The "untyped" case can't happen. Do this to stop the "U" bit being
14124 affected if we specify unsigned args. */
14125 neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14126 }
5287ad62
JB
14127}
14128
62f3b8c8
PB
14129static void
14130do_neon_fmac (void)
14131{
14132 if (try_vfp_nsyn (3, do_vfp_nsyn_fma_fms) == SUCCESS)
14133 return;
14134
14135 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14136 return;
14137
14138 neon_dyadic_misc (NT_untyped, N_IF_32, 0);
14139}
14140
5287ad62
JB
14141static void
14142do_neon_tst (void)
14143{
037e8744 14144 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
14145 struct neon_type_el et = neon_check_type (3, rs,
14146 N_EQK, N_EQK, N_8 | N_16 | N_32 | N_KEY);
037e8744 14147 neon_three_same (neon_quad (rs), 0, et.size);
5287ad62
JB
14148}
14149
14150/* VMUL with 3 registers allows the P8 type. The scalar version supports the
14151 same types as the MAC equivalents. The polynomial type for this instruction
14152 is encoded the same as the integer type. */
14153
14154static void
14155do_neon_mul (void)
14156{
037e8744
JB
14157 if (try_vfp_nsyn (3, do_vfp_nsyn_mul) == SUCCESS)
14158 return;
14159
14160 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14161 return;
14162
5287ad62
JB
14163 if (inst.operands[2].isscalar)
14164 do_neon_mac_maybe_scalar ();
14165 else
dcbf9037 14166 neon_dyadic_misc (NT_poly, N_I8 | N_I16 | N_I32 | N_F32 | N_P8, 0);
5287ad62
JB
14167}
14168
14169static void
14170do_neon_qdmulh (void)
14171{
14172 if (inst.operands[2].isscalar)
14173 {
037e8744 14174 enum neon_shape rs = neon_select_shape (NS_DDS, NS_QQS, NS_NULL);
5287ad62
JB
14175 struct neon_type_el et = neon_check_type (3, rs,
14176 N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
88714cb8 14177 NEON_ENCODE (SCALAR, inst);
037e8744 14178 neon_mul_mac (et, neon_quad (rs));
5287ad62
JB
14179 }
14180 else
14181 {
037e8744 14182 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
14183 struct neon_type_el et = neon_check_type (3, rs,
14184 N_EQK, N_EQK, N_S16 | N_S32 | N_KEY);
88714cb8 14185 NEON_ENCODE (INTEGER, inst);
5287ad62 14186 /* The U bit (rounding) comes from bit mask. */
037e8744 14187 neon_three_same (neon_quad (rs), 0, et.size);
5287ad62
JB
14188 }
14189}
14190
14191static void
14192do_neon_fcmp_absolute (void)
14193{
037e8744 14194 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62
JB
14195 neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
14196 /* Size field comes from bit mask. */
037e8744 14197 neon_three_same (neon_quad (rs), 1, -1);
5287ad62
JB
14198}
14199
14200static void
14201do_neon_fcmp_absolute_inv (void)
14202{
14203 neon_exchange_operands ();
14204 do_neon_fcmp_absolute ();
14205}
14206
14207static void
14208do_neon_step (void)
14209{
037e8744 14210 enum neon_shape rs = neon_select_shape (NS_DDD, NS_QQQ, NS_NULL);
5287ad62 14211 neon_check_type (3, rs, N_EQK, N_EQK, N_F32 | N_KEY);
037e8744 14212 neon_three_same (neon_quad (rs), 0, -1);
5287ad62
JB
14213}
14214
14215static void
14216do_neon_abs_neg (void)
14217{
037e8744
JB
14218 enum neon_shape rs;
14219 struct neon_type_el et;
5f4273c7 14220
037e8744
JB
14221 if (try_vfp_nsyn (2, do_vfp_nsyn_abs_neg) == SUCCESS)
14222 return;
14223
14224 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14225 return;
14226
14227 rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
14228 et = neon_check_type (2, rs, N_EQK, N_S8 | N_S16 | N_S32 | N_F32 | N_KEY);
5f4273c7 14229
5287ad62
JB
14230 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14231 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14232 inst.instruction |= LOW4 (inst.operands[1].reg);
14233 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
037e8744 14234 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
14235 inst.instruction |= (et.type == NT_float) << 10;
14236 inst.instruction |= neon_logbits (et.size) << 18;
5f4273c7 14237
88714cb8 14238 neon_dp_fixup (&inst);
5287ad62
JB
14239}
14240
14241static void
14242do_neon_sli (void)
14243{
037e8744 14244 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
14245 struct neon_type_el et = neon_check_type (2, rs,
14246 N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14247 int imm = inst.operands[2].imm;
14248 constraint (imm < 0 || (unsigned)imm >= et.size,
14249 _("immediate out of range for insert"));
037e8744 14250 neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
5287ad62
JB
14251}
14252
14253static void
14254do_neon_sri (void)
14255{
037e8744 14256 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
14257 struct neon_type_el et = neon_check_type (2, rs,
14258 N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14259 int imm = inst.operands[2].imm;
14260 constraint (imm < 1 || (unsigned)imm > et.size,
14261 _("immediate out of range for insert"));
037e8744 14262 neon_imm_shift (FALSE, 0, neon_quad (rs), et, et.size - imm);
5287ad62
JB
14263}
14264
14265static void
14266do_neon_qshlu_imm (void)
14267{
037e8744 14268 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
14269 struct neon_type_el et = neon_check_type (2, rs,
14270 N_EQK | N_UNS, N_S8 | N_S16 | N_S32 | N_S64 | N_KEY);
14271 int imm = inst.operands[2].imm;
14272 constraint (imm < 0 || (unsigned)imm >= et.size,
14273 _("immediate out of range for shift"));
14274 /* Only encodes the 'U present' variant of the instruction.
14275 In this case, signed types have OP (bit 8) set to 0.
14276 Unsigned types have OP set to 1. */
14277 inst.instruction |= (et.type == NT_unsigned) << 8;
14278 /* The rest of the bits are the same as other immediate shifts. */
037e8744 14279 neon_imm_shift (FALSE, 0, neon_quad (rs), et, imm);
5287ad62
JB
14280}
14281
14282static void
14283do_neon_qmovn (void)
14284{
14285 struct neon_type_el et = neon_check_type (2, NS_DQ,
14286 N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14287 /* Saturating move where operands can be signed or unsigned, and the
14288 destination has the same signedness. */
88714cb8 14289 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14290 if (et.type == NT_unsigned)
14291 inst.instruction |= 0xc0;
14292 else
14293 inst.instruction |= 0x80;
14294 neon_two_same (0, 1, et.size / 2);
14295}
14296
14297static void
14298do_neon_qmovun (void)
14299{
14300 struct neon_type_el et = neon_check_type (2, NS_DQ,
14301 N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14302 /* Saturating move with unsigned results. Operands must be signed. */
88714cb8 14303 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14304 neon_two_same (0, 1, et.size / 2);
14305}
14306
14307static void
14308do_neon_rshift_sat_narrow (void)
14309{
14310 /* FIXME: Types for narrowing. If operands are signed, results can be signed
14311 or unsigned. If operands are unsigned, results must also be unsigned. */
14312 struct neon_type_el et = neon_check_type (2, NS_DQI,
14313 N_EQK | N_HLF, N_SU_16_64 | N_KEY);
14314 int imm = inst.operands[2].imm;
14315 /* This gets the bounds check, size encoding and immediate bits calculation
14316 right. */
14317 et.size /= 2;
5f4273c7 14318
5287ad62
JB
14319 /* VQ{R}SHRN.I<size> <Dd>, <Qm>, #0 is a synonym for
14320 VQMOVN.I<size> <Dd>, <Qm>. */
14321 if (imm == 0)
14322 {
14323 inst.operands[2].present = 0;
14324 inst.instruction = N_MNEM_vqmovn;
14325 do_neon_qmovn ();
14326 return;
14327 }
5f4273c7 14328
5287ad62
JB
14329 constraint (imm < 1 || (unsigned)imm > et.size,
14330 _("immediate out of range"));
14331 neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, et.size - imm);
14332}
14333
14334static void
14335do_neon_rshift_sat_narrow_u (void)
14336{
14337 /* FIXME: Types for narrowing. If operands are signed, results can be signed
14338 or unsigned. If operands are unsigned, results must also be unsigned. */
14339 struct neon_type_el et = neon_check_type (2, NS_DQI,
14340 N_EQK | N_HLF | N_UNS, N_S16 | N_S32 | N_S64 | N_KEY);
14341 int imm = inst.operands[2].imm;
14342 /* This gets the bounds check, size encoding and immediate bits calculation
14343 right. */
14344 et.size /= 2;
14345
14346 /* VQSHRUN.I<size> <Dd>, <Qm>, #0 is a synonym for
14347 VQMOVUN.I<size> <Dd>, <Qm>. */
14348 if (imm == 0)
14349 {
14350 inst.operands[2].present = 0;
14351 inst.instruction = N_MNEM_vqmovun;
14352 do_neon_qmovun ();
14353 return;
14354 }
14355
14356 constraint (imm < 1 || (unsigned)imm > et.size,
14357 _("immediate out of range"));
14358 /* FIXME: The manual is kind of unclear about what value U should have in
14359 VQ{R}SHRUN instructions, but U=0, op=0 definitely encodes VRSHR, so it
14360 must be 1. */
14361 neon_imm_shift (TRUE, 1, 0, et, et.size - imm);
14362}
14363
14364static void
14365do_neon_movn (void)
14366{
14367 struct neon_type_el et = neon_check_type (2, NS_DQ,
14368 N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
88714cb8 14369 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14370 neon_two_same (0, 1, et.size / 2);
14371}
14372
14373static void
14374do_neon_rshift_narrow (void)
14375{
14376 struct neon_type_el et = neon_check_type (2, NS_DQI,
14377 N_EQK | N_HLF, N_I16 | N_I32 | N_I64 | N_KEY);
14378 int imm = inst.operands[2].imm;
14379 /* This gets the bounds check, size encoding and immediate bits calculation
14380 right. */
14381 et.size /= 2;
5f4273c7 14382
5287ad62
JB
14383 /* If immediate is zero then we are a pseudo-instruction for
14384 VMOVN.I<size> <Dd>, <Qm> */
14385 if (imm == 0)
14386 {
14387 inst.operands[2].present = 0;
14388 inst.instruction = N_MNEM_vmovn;
14389 do_neon_movn ();
14390 return;
14391 }
5f4273c7 14392
5287ad62
JB
14393 constraint (imm < 1 || (unsigned)imm > et.size,
14394 _("immediate out of range for narrowing operation"));
14395 neon_imm_shift (FALSE, 0, 0, et, et.size - imm);
14396}
14397
14398static void
14399do_neon_shll (void)
14400{
14401 /* FIXME: Type checking when lengthening. */
14402 struct neon_type_el et = neon_check_type (2, NS_QDI,
14403 N_EQK | N_DBL, N_I8 | N_I16 | N_I32 | N_KEY);
14404 unsigned imm = inst.operands[2].imm;
14405
14406 if (imm == et.size)
14407 {
14408 /* Maximum shift variant. */
88714cb8 14409 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14410 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14411 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14412 inst.instruction |= LOW4 (inst.operands[1].reg);
14413 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14414 inst.instruction |= neon_logbits (et.size) << 18;
5f4273c7 14415
88714cb8 14416 neon_dp_fixup (&inst);
5287ad62
JB
14417 }
14418 else
14419 {
14420 /* A more-specific type check for non-max versions. */
14421 et = neon_check_type (2, NS_QDI,
14422 N_EQK | N_DBL, N_SU_32 | N_KEY);
88714cb8 14423 NEON_ENCODE (IMMED, inst);
5287ad62
JB
14424 neon_imm_shift (TRUE, et.type == NT_unsigned, 0, et, imm);
14425 }
14426}
14427
037e8744 14428/* Check the various types for the VCVT instruction, and return which version
5287ad62
JB
14429 the current instruction is. */
14430
14431static int
14432neon_cvt_flavour (enum neon_shape rs)
14433{
037e8744
JB
14434#define CVT_VAR(C,X,Y) \
14435 et = neon_check_type (2, rs, whole_reg | (X), whole_reg | (Y)); \
14436 if (et.type != NT_invtype) \
14437 { \
14438 inst.error = NULL; \
14439 return (C); \
5287ad62
JB
14440 }
14441 struct neon_type_el et;
037e8744
JB
14442 unsigned whole_reg = (rs == NS_FFI || rs == NS_FD || rs == NS_DF
14443 || rs == NS_FF) ? N_VFP : 0;
14444 /* The instruction versions which take an immediate take one register
14445 argument, which is extended to the width of the full register. Thus the
14446 "source" and "destination" registers must have the same width. Hack that
14447 here by making the size equal to the key (wider, in this case) operand. */
14448 unsigned key = (rs == NS_QQI || rs == NS_DDI || rs == NS_FFI) ? N_KEY : 0;
5f4273c7 14449
5287ad62
JB
14450 CVT_VAR (0, N_S32, N_F32);
14451 CVT_VAR (1, N_U32, N_F32);
14452 CVT_VAR (2, N_F32, N_S32);
14453 CVT_VAR (3, N_F32, N_U32);
8e79c3df
CM
14454 /* Half-precision conversions. */
14455 CVT_VAR (4, N_F32, N_F16);
14456 CVT_VAR (5, N_F16, N_F32);
5f4273c7 14457
037e8744 14458 whole_reg = N_VFP;
5f4273c7 14459
037e8744 14460 /* VFP instructions. */
8e79c3df
CM
14461 CVT_VAR (6, N_F32, N_F64);
14462 CVT_VAR (7, N_F64, N_F32);
14463 CVT_VAR (8, N_S32, N_F64 | key);
14464 CVT_VAR (9, N_U32, N_F64 | key);
14465 CVT_VAR (10, N_F64 | key, N_S32);
14466 CVT_VAR (11, N_F64 | key, N_U32);
037e8744 14467 /* VFP instructions with bitshift. */
8e79c3df
CM
14468 CVT_VAR (12, N_F32 | key, N_S16);
14469 CVT_VAR (13, N_F32 | key, N_U16);
14470 CVT_VAR (14, N_F64 | key, N_S16);
14471 CVT_VAR (15, N_F64 | key, N_U16);
14472 CVT_VAR (16, N_S16, N_F32 | key);
14473 CVT_VAR (17, N_U16, N_F32 | key);
14474 CVT_VAR (18, N_S16, N_F64 | key);
14475 CVT_VAR (19, N_U16, N_F64 | key);
5f4273c7 14476
5287ad62
JB
14477 return -1;
14478#undef CVT_VAR
14479}
14480
037e8744
JB
14481/* Neon-syntax VFP conversions. */
14482
5287ad62 14483static void
037e8744 14484do_vfp_nsyn_cvt (enum neon_shape rs, int flavour)
5287ad62 14485{
037e8744 14486 const char *opname = 0;
5f4273c7 14487
037e8744 14488 if (rs == NS_DDI || rs == NS_QQI || rs == NS_FFI)
5287ad62 14489 {
037e8744
JB
14490 /* Conversions with immediate bitshift. */
14491 const char *enc[] =
14492 {
14493 "ftosls",
14494 "ftouls",
14495 "fsltos",
14496 "fultos",
14497 NULL,
14498 NULL,
8e79c3df
CM
14499 NULL,
14500 NULL,
037e8744
JB
14501 "ftosld",
14502 "ftould",
14503 "fsltod",
14504 "fultod",
14505 "fshtos",
14506 "fuhtos",
14507 "fshtod",
14508 "fuhtod",
14509 "ftoshs",
14510 "ftouhs",
14511 "ftoshd",
14512 "ftouhd"
14513 };
14514
14515 if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
14516 {
14517 opname = enc[flavour];
14518 constraint (inst.operands[0].reg != inst.operands[1].reg,
14519 _("operands 0 and 1 must be the same register"));
14520 inst.operands[1] = inst.operands[2];
14521 memset (&inst.operands[2], '\0', sizeof (inst.operands[2]));
14522 }
5287ad62
JB
14523 }
14524 else
14525 {
037e8744
JB
14526 /* Conversions without bitshift. */
14527 const char *enc[] =
14528 {
14529 "ftosis",
14530 "ftouis",
14531 "fsitos",
14532 "fuitos",
8e79c3df
CM
14533 "NULL",
14534 "NULL",
037e8744
JB
14535 "fcvtsd",
14536 "fcvtds",
14537 "ftosid",
14538 "ftouid",
14539 "fsitod",
14540 "fuitod"
14541 };
14542
14543 if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc))
14544 opname = enc[flavour];
14545 }
14546
14547 if (opname)
14548 do_vfp_nsyn_opcode (opname);
14549}
14550
14551static void
14552do_vfp_nsyn_cvtz (void)
14553{
14554 enum neon_shape rs = neon_select_shape (NS_FF, NS_FD, NS_NULL);
14555 int flavour = neon_cvt_flavour (rs);
14556 const char *enc[] =
14557 {
14558 "ftosizs",
14559 "ftouizs",
14560 NULL,
14561 NULL,
14562 NULL,
14563 NULL,
8e79c3df
CM
14564 NULL,
14565 NULL,
037e8744
JB
14566 "ftosizd",
14567 "ftouizd"
14568 };
14569
14570 if (flavour >= 0 && flavour < (int) ARRAY_SIZE (enc) && enc[flavour])
14571 do_vfp_nsyn_opcode (enc[flavour]);
14572}
f31fef98 14573
037e8744 14574static void
e3e535bc 14575do_neon_cvt_1 (bfd_boolean round_to_zero ATTRIBUTE_UNUSED)
037e8744
JB
14576{
14577 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_FFI, NS_DD, NS_QQ,
8e79c3df 14578 NS_FD, NS_DF, NS_FF, NS_QD, NS_DQ, NS_NULL);
037e8744
JB
14579 int flavour = neon_cvt_flavour (rs);
14580
e3e535bc
NC
14581 /* PR11109: Handle round-to-zero for VCVT conversions. */
14582 if (round_to_zero
14583 && ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_vfp_v2)
14584 && (flavour == 0 || flavour == 1 || flavour == 8 || flavour == 9)
14585 && (rs == NS_FD || rs == NS_FF))
14586 {
14587 do_vfp_nsyn_cvtz ();
14588 return;
14589 }
14590
037e8744 14591 /* VFP rather than Neon conversions. */
8e79c3df 14592 if (flavour >= 6)
037e8744
JB
14593 {
14594 do_vfp_nsyn_cvt (rs, flavour);
14595 return;
14596 }
14597
14598 switch (rs)
14599 {
14600 case NS_DDI:
14601 case NS_QQI:
14602 {
35997600
NC
14603 unsigned immbits;
14604 unsigned enctab[] = { 0x0000100, 0x1000100, 0x0, 0x1000000 };
14605
037e8744
JB
14606 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14607 return;
14608
14609 /* Fixed-point conversion with #0 immediate is encoded as an
14610 integer conversion. */
14611 if (inst.operands[2].present && inst.operands[2].imm == 0)
14612 goto int_encode;
35997600 14613 immbits = 32 - inst.operands[2].imm;
88714cb8 14614 NEON_ENCODE (IMMED, inst);
037e8744
JB
14615 if (flavour != -1)
14616 inst.instruction |= enctab[flavour];
14617 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14618 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14619 inst.instruction |= LOW4 (inst.operands[1].reg);
14620 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14621 inst.instruction |= neon_quad (rs) << 6;
14622 inst.instruction |= 1 << 21;
14623 inst.instruction |= immbits << 16;
14624
88714cb8 14625 neon_dp_fixup (&inst);
037e8744
JB
14626 }
14627 break;
14628
14629 case NS_DD:
14630 case NS_QQ:
14631 int_encode:
14632 {
14633 unsigned enctab[] = { 0x100, 0x180, 0x0, 0x080 };
14634
88714cb8 14635 NEON_ENCODE (INTEGER, inst);
037e8744
JB
14636
14637 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
14638 return;
14639
14640 if (flavour != -1)
14641 inst.instruction |= enctab[flavour];
14642
14643 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14644 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14645 inst.instruction |= LOW4 (inst.operands[1].reg);
14646 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
14647 inst.instruction |= neon_quad (rs) << 6;
14648 inst.instruction |= 2 << 18;
14649
88714cb8 14650 neon_dp_fixup (&inst);
037e8744
JB
14651 }
14652 break;
14653
8e79c3df
CM
14654 /* Half-precision conversions for Advanced SIMD -- neon. */
14655 case NS_QD:
14656 case NS_DQ:
14657
14658 if ((rs == NS_DQ)
14659 && (inst.vectype.el[0].size != 16 || inst.vectype.el[1].size != 32))
14660 {
14661 as_bad (_("operand size must match register width"));
14662 break;
14663 }
14664
14665 if ((rs == NS_QD)
14666 && ((inst.vectype.el[0].size != 32 || inst.vectype.el[1].size != 16)))
14667 {
14668 as_bad (_("operand size must match register width"));
14669 break;
14670 }
14671
14672 if (rs == NS_DQ)
14673 inst.instruction = 0x3b60600;
14674 else
14675 inst.instruction = 0x3b60700;
14676
14677 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14678 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14679 inst.instruction |= LOW4 (inst.operands[1].reg);
14680 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
88714cb8 14681 neon_dp_fixup (&inst);
8e79c3df
CM
14682 break;
14683
037e8744
JB
14684 default:
14685 /* Some VFP conversions go here (s32 <-> f32, u32 <-> f32). */
14686 do_vfp_nsyn_cvt (rs, flavour);
5287ad62 14687 }
5287ad62
JB
14688}
14689
e3e535bc
NC
14690static void
14691do_neon_cvtr (void)
14692{
14693 do_neon_cvt_1 (FALSE);
14694}
14695
14696static void
14697do_neon_cvt (void)
14698{
14699 do_neon_cvt_1 (TRUE);
14700}
14701
8e79c3df
CM
14702static void
14703do_neon_cvtb (void)
14704{
14705 inst.instruction = 0xeb20a40;
14706
14707 /* The sizes are attached to the mnemonic. */
14708 if (inst.vectype.el[0].type != NT_invtype
14709 && inst.vectype.el[0].size == 16)
14710 inst.instruction |= 0x00010000;
14711
14712 /* Programmer's syntax: the sizes are attached to the operands. */
14713 else if (inst.operands[0].vectype.type != NT_invtype
14714 && inst.operands[0].vectype.size == 16)
14715 inst.instruction |= 0x00010000;
14716
14717 encode_arm_vfp_reg (inst.operands[0].reg, VFP_REG_Sd);
14718 encode_arm_vfp_reg (inst.operands[1].reg, VFP_REG_Sm);
14719 do_vfp_cond_or_thumb ();
14720}
14721
14722
14723static void
14724do_neon_cvtt (void)
14725{
14726 do_neon_cvtb ();
14727 inst.instruction |= 0x80;
14728}
14729
5287ad62
JB
14730static void
14731neon_move_immediate (void)
14732{
037e8744
JB
14733 enum neon_shape rs = neon_select_shape (NS_DI, NS_QI, NS_NULL);
14734 struct neon_type_el et = neon_check_type (2, rs,
14735 N_I8 | N_I16 | N_I32 | N_I64 | N_F32 | N_KEY, N_EQK);
5287ad62 14736 unsigned immlo, immhi = 0, immbits;
c96612cc 14737 int op, cmode, float_p;
5287ad62 14738
037e8744
JB
14739 constraint (et.type == NT_invtype,
14740 _("operand size must be specified for immediate VMOV"));
14741
5287ad62
JB
14742 /* We start out as an MVN instruction if OP = 1, MOV otherwise. */
14743 op = (inst.instruction & (1 << 5)) != 0;
14744
14745 immlo = inst.operands[1].imm;
14746 if (inst.operands[1].regisimm)
14747 immhi = inst.operands[1].reg;
14748
14749 constraint (et.size < 32 && (immlo & ~((1 << et.size) - 1)) != 0,
14750 _("immediate has bits set outside the operand size"));
14751
c96612cc
JB
14752 float_p = inst.operands[1].immisfloat;
14753
14754 if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits, &op,
136da414 14755 et.size, et.type)) == FAIL)
5287ad62
JB
14756 {
14757 /* Invert relevant bits only. */
14758 neon_invert_size (&immlo, &immhi, et.size);
14759 /* Flip from VMOV/VMVN to VMVN/VMOV. Some immediate types are unavailable
14760 with one or the other; those cases are caught by
14761 neon_cmode_for_move_imm. */
14762 op = !op;
c96612cc
JB
14763 if ((cmode = neon_cmode_for_move_imm (immlo, immhi, float_p, &immbits,
14764 &op, et.size, et.type)) == FAIL)
5287ad62 14765 {
dcbf9037 14766 first_error (_("immediate out of range"));
5287ad62
JB
14767 return;
14768 }
14769 }
14770
14771 inst.instruction &= ~(1 << 5);
14772 inst.instruction |= op << 5;
14773
14774 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14775 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
037e8744 14776 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
14777 inst.instruction |= cmode << 8;
14778
14779 neon_write_immbits (immbits);
14780}
14781
14782static void
14783do_neon_mvn (void)
14784{
14785 if (inst.operands[1].isreg)
14786 {
037e8744 14787 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5f4273c7 14788
88714cb8 14789 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14790 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14791 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14792 inst.instruction |= LOW4 (inst.operands[1].reg);
14793 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
037e8744 14794 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
14795 }
14796 else
14797 {
88714cb8 14798 NEON_ENCODE (IMMED, inst);
5287ad62
JB
14799 neon_move_immediate ();
14800 }
14801
88714cb8 14802 neon_dp_fixup (&inst);
5287ad62
JB
14803}
14804
14805/* Encode instructions of form:
14806
14807 |28/24|23|22|21 20|19 16|15 12|11 8|7|6|5|4|3 0|
5f4273c7 14808 | U |x |D |size | Rn | Rd |x x x x|N|x|M|x| Rm | */
5287ad62
JB
14809
14810static void
14811neon_mixed_length (struct neon_type_el et, unsigned size)
14812{
14813 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14814 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14815 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14816 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14817 inst.instruction |= LOW4 (inst.operands[2].reg);
14818 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
14819 inst.instruction |= (et.type == NT_unsigned) << 24;
14820 inst.instruction |= neon_logbits (size) << 20;
5f4273c7 14821
88714cb8 14822 neon_dp_fixup (&inst);
5287ad62
JB
14823}
14824
14825static void
14826do_neon_dyadic_long (void)
14827{
14828 /* FIXME: Type checking for lengthening op. */
14829 struct neon_type_el et = neon_check_type (3, NS_QDD,
14830 N_EQK | N_DBL, N_EQK, N_SU_32 | N_KEY);
14831 neon_mixed_length (et, et.size);
14832}
14833
14834static void
14835do_neon_abal (void)
14836{
14837 struct neon_type_el et = neon_check_type (3, NS_QDD,
14838 N_EQK | N_INT | N_DBL, N_EQK, N_SU_32 | N_KEY);
14839 neon_mixed_length (et, et.size);
14840}
14841
14842static void
14843neon_mac_reg_scalar_long (unsigned regtypes, unsigned scalartypes)
14844{
14845 if (inst.operands[2].isscalar)
14846 {
dcbf9037
JB
14847 struct neon_type_el et = neon_check_type (3, NS_QDS,
14848 N_EQK | N_DBL, N_EQK, regtypes | N_KEY);
88714cb8 14849 NEON_ENCODE (SCALAR, inst);
5287ad62
JB
14850 neon_mul_mac (et, et.type == NT_unsigned);
14851 }
14852 else
14853 {
14854 struct neon_type_el et = neon_check_type (3, NS_QDD,
14855 N_EQK | N_DBL, N_EQK, scalartypes | N_KEY);
88714cb8 14856 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14857 neon_mixed_length (et, et.size);
14858 }
14859}
14860
14861static void
14862do_neon_mac_maybe_scalar_long (void)
14863{
14864 neon_mac_reg_scalar_long (N_S16 | N_S32 | N_U16 | N_U32, N_SU_32);
14865}
14866
14867static void
14868do_neon_dyadic_wide (void)
14869{
14870 struct neon_type_el et = neon_check_type (3, NS_QQD,
14871 N_EQK | N_DBL, N_EQK | N_DBL, N_SU_32 | N_KEY);
14872 neon_mixed_length (et, et.size);
14873}
14874
14875static void
14876do_neon_dyadic_narrow (void)
14877{
14878 struct neon_type_el et = neon_check_type (3, NS_QDD,
14879 N_EQK | N_DBL, N_EQK, N_I16 | N_I32 | N_I64 | N_KEY);
428e3f1f
PB
14880 /* Operand sign is unimportant, and the U bit is part of the opcode,
14881 so force the operand type to integer. */
14882 et.type = NT_integer;
5287ad62
JB
14883 neon_mixed_length (et, et.size / 2);
14884}
14885
14886static void
14887do_neon_mul_sat_scalar_long (void)
14888{
14889 neon_mac_reg_scalar_long (N_S16 | N_S32, N_S16 | N_S32);
14890}
14891
14892static void
14893do_neon_vmull (void)
14894{
14895 if (inst.operands[2].isscalar)
14896 do_neon_mac_maybe_scalar_long ();
14897 else
14898 {
14899 struct neon_type_el et = neon_check_type (3, NS_QDD,
14900 N_EQK | N_DBL, N_EQK, N_SU_32 | N_P8 | N_KEY);
14901 if (et.type == NT_poly)
88714cb8 14902 NEON_ENCODE (POLY, inst);
5287ad62 14903 else
88714cb8 14904 NEON_ENCODE (INTEGER, inst);
5287ad62
JB
14905 /* For polynomial encoding, size field must be 0b00 and the U bit must be
14906 zero. Should be OK as-is. */
14907 neon_mixed_length (et, et.size);
14908 }
14909}
14910
14911static void
14912do_neon_ext (void)
14913{
037e8744 14914 enum neon_shape rs = neon_select_shape (NS_DDDI, NS_QQQI, NS_NULL);
5287ad62
JB
14915 struct neon_type_el et = neon_check_type (3, rs,
14916 N_EQK, N_EQK, N_8 | N_16 | N_32 | N_64 | N_KEY);
14917 unsigned imm = (inst.operands[3].imm * et.size) / 8;
35997600
NC
14918
14919 constraint (imm >= (unsigned) (neon_quad (rs) ? 16 : 8),
14920 _("shift out of range"));
5287ad62
JB
14921 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14922 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14923 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
14924 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
14925 inst.instruction |= LOW4 (inst.operands[2].reg);
14926 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
037e8744 14927 inst.instruction |= neon_quad (rs) << 6;
5287ad62 14928 inst.instruction |= imm << 8;
5f4273c7 14929
88714cb8 14930 neon_dp_fixup (&inst);
5287ad62
JB
14931}
14932
14933static void
14934do_neon_rev (void)
14935{
037e8744 14936 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
14937 struct neon_type_el et = neon_check_type (2, rs,
14938 N_EQK, N_8 | N_16 | N_32 | N_KEY);
14939 unsigned op = (inst.instruction >> 7) & 3;
14940 /* N (width of reversed regions) is encoded as part of the bitmask. We
14941 extract it here to check the elements to be reversed are smaller.
14942 Otherwise we'd get a reserved instruction. */
14943 unsigned elsize = (op == 2) ? 16 : (op == 1) ? 32 : (op == 0) ? 64 : 0;
9c2799c2 14944 gas_assert (elsize != 0);
5287ad62
JB
14945 constraint (et.size >= elsize,
14946 _("elements must be smaller than reversal region"));
037e8744 14947 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
14948}
14949
14950static void
14951do_neon_dup (void)
14952{
14953 if (inst.operands[1].isscalar)
14954 {
037e8744 14955 enum neon_shape rs = neon_select_shape (NS_DS, NS_QS, NS_NULL);
dcbf9037
JB
14956 struct neon_type_el et = neon_check_type (2, rs,
14957 N_EQK, N_8 | N_16 | N_32 | N_KEY);
5287ad62 14958 unsigned sizebits = et.size >> 3;
dcbf9037 14959 unsigned dm = NEON_SCALAR_REG (inst.operands[1].reg);
5287ad62 14960 int logsize = neon_logbits (et.size);
dcbf9037 14961 unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg) << logsize;
037e8744
JB
14962
14963 if (vfp_or_neon_is_neon (NEON_CHECK_CC) == FAIL)
14964 return;
14965
88714cb8 14966 NEON_ENCODE (SCALAR, inst);
5287ad62
JB
14967 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
14968 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
14969 inst.instruction |= LOW4 (dm);
14970 inst.instruction |= HI1 (dm) << 5;
037e8744 14971 inst.instruction |= neon_quad (rs) << 6;
5287ad62
JB
14972 inst.instruction |= x << 17;
14973 inst.instruction |= sizebits << 16;
5f4273c7 14974
88714cb8 14975 neon_dp_fixup (&inst);
5287ad62
JB
14976 }
14977 else
14978 {
037e8744
JB
14979 enum neon_shape rs = neon_select_shape (NS_DR, NS_QR, NS_NULL);
14980 struct neon_type_el et = neon_check_type (2, rs,
14981 N_8 | N_16 | N_32 | N_KEY, N_EQK);
5287ad62 14982 /* Duplicate ARM register to lanes of vector. */
88714cb8 14983 NEON_ENCODE (ARMREG, inst);
5287ad62
JB
14984 switch (et.size)
14985 {
14986 case 8: inst.instruction |= 0x400000; break;
14987 case 16: inst.instruction |= 0x000020; break;
14988 case 32: inst.instruction |= 0x000000; break;
14989 default: break;
14990 }
14991 inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
14992 inst.instruction |= LOW4 (inst.operands[0].reg) << 16;
14993 inst.instruction |= HI1 (inst.operands[0].reg) << 7;
037e8744 14994 inst.instruction |= neon_quad (rs) << 21;
5287ad62
JB
14995 /* The encoding for this instruction is identical for the ARM and Thumb
14996 variants, except for the condition field. */
037e8744 14997 do_vfp_cond_or_thumb ();
5287ad62
JB
14998 }
14999}
15000
15001/* VMOV has particularly many variations. It can be one of:
15002 0. VMOV<c><q> <Qd>, <Qm>
15003 1. VMOV<c><q> <Dd>, <Dm>
15004 (Register operations, which are VORR with Rm = Rn.)
15005 2. VMOV<c><q>.<dt> <Qd>, #<imm>
15006 3. VMOV<c><q>.<dt> <Dd>, #<imm>
15007 (Immediate loads.)
15008 4. VMOV<c><q>.<size> <Dn[x]>, <Rd>
15009 (ARM register to scalar.)
15010 5. VMOV<c><q> <Dm>, <Rd>, <Rn>
15011 (Two ARM registers to vector.)
15012 6. VMOV<c><q>.<dt> <Rd>, <Dn[x]>
15013 (Scalar to ARM register.)
15014 7. VMOV<c><q> <Rd>, <Rn>, <Dm>
15015 (Vector to two ARM registers.)
037e8744
JB
15016 8. VMOV.F32 <Sd>, <Sm>
15017 9. VMOV.F64 <Dd>, <Dm>
15018 (VFP register moves.)
15019 10. VMOV.F32 <Sd>, #imm
15020 11. VMOV.F64 <Dd>, #imm
15021 (VFP float immediate load.)
15022 12. VMOV <Rd>, <Sm>
15023 (VFP single to ARM reg.)
15024 13. VMOV <Sd>, <Rm>
15025 (ARM reg to VFP single.)
15026 14. VMOV <Rd>, <Re>, <Sn>, <Sm>
15027 (Two ARM regs to two VFP singles.)
15028 15. VMOV <Sd>, <Se>, <Rn>, <Rm>
15029 (Two VFP singles to two ARM regs.)
5f4273c7 15030
037e8744
JB
15031 These cases can be disambiguated using neon_select_shape, except cases 1/9
15032 and 3/11 which depend on the operand type too.
5f4273c7 15033
5287ad62 15034 All the encoded bits are hardcoded by this function.
5f4273c7 15035
b7fc2769
JB
15036 Cases 4, 6 may be used with VFPv1 and above (only 32-bit transfers!).
15037 Cases 5, 7 may be used with VFPv2 and above.
5f4273c7 15038
5287ad62 15039 FIXME: Some of the checking may be a bit sloppy (in a couple of cases you
5f4273c7 15040 can specify a type where it doesn't make sense to, and is ignored). */
5287ad62
JB
15041
15042static void
15043do_neon_mov (void)
15044{
037e8744
JB
15045 enum neon_shape rs = neon_select_shape (NS_RRFF, NS_FFRR, NS_DRR, NS_RRD,
15046 NS_QQ, NS_DD, NS_QI, NS_DI, NS_SR, NS_RS, NS_FF, NS_FI, NS_RF, NS_FR,
15047 NS_NULL);
15048 struct neon_type_el et;
15049 const char *ldconst = 0;
5287ad62 15050
037e8744 15051 switch (rs)
5287ad62 15052 {
037e8744
JB
15053 case NS_DD: /* case 1/9. */
15054 et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
15055 /* It is not an error here if no type is given. */
15056 inst.error = NULL;
15057 if (et.type == NT_float && et.size == 64)
5287ad62 15058 {
037e8744
JB
15059 do_vfp_nsyn_opcode ("fcpyd");
15060 break;
5287ad62 15061 }
037e8744 15062 /* fall through. */
5287ad62 15063
037e8744
JB
15064 case NS_QQ: /* case 0/1. */
15065 {
15066 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15067 return;
15068 /* The architecture manual I have doesn't explicitly state which
15069 value the U bit should have for register->register moves, but
15070 the equivalent VORR instruction has U = 0, so do that. */
15071 inst.instruction = 0x0200110;
15072 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15073 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15074 inst.instruction |= LOW4 (inst.operands[1].reg);
15075 inst.instruction |= HI1 (inst.operands[1].reg) << 5;
15076 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15077 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15078 inst.instruction |= neon_quad (rs) << 6;
15079
88714cb8 15080 neon_dp_fixup (&inst);
037e8744
JB
15081 }
15082 break;
5f4273c7 15083
037e8744
JB
15084 case NS_DI: /* case 3/11. */
15085 et = neon_check_type (2, rs, N_EQK, N_F64 | N_KEY);
15086 inst.error = NULL;
15087 if (et.type == NT_float && et.size == 64)
5287ad62 15088 {
037e8744
JB
15089 /* case 11 (fconstd). */
15090 ldconst = "fconstd";
15091 goto encode_fconstd;
5287ad62 15092 }
037e8744
JB
15093 /* fall through. */
15094
15095 case NS_QI: /* case 2/3. */
15096 if (vfp_or_neon_is_neon (NEON_CHECK_CC | NEON_CHECK_ARCH) == FAIL)
15097 return;
15098 inst.instruction = 0x0800010;
15099 neon_move_immediate ();
88714cb8 15100 neon_dp_fixup (&inst);
5287ad62 15101 break;
5f4273c7 15102
037e8744
JB
15103 case NS_SR: /* case 4. */
15104 {
15105 unsigned bcdebits = 0;
91d6fa6a 15106 int logsize;
037e8744
JB
15107 unsigned dn = NEON_SCALAR_REG (inst.operands[0].reg);
15108 unsigned x = NEON_SCALAR_INDEX (inst.operands[0].reg);
15109
91d6fa6a
NC
15110 et = neon_check_type (2, NS_NULL, N_8 | N_16 | N_32 | N_KEY, N_EQK);
15111 logsize = neon_logbits (et.size);
15112
037e8744
JB
15113 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
15114 _(BAD_FPU));
15115 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
15116 && et.size != 32, _(BAD_FPU));
15117 constraint (et.type == NT_invtype, _("bad type for scalar"));
15118 constraint (x >= 64 / et.size, _("scalar index out of range"));
15119
15120 switch (et.size)
15121 {
15122 case 8: bcdebits = 0x8; break;
15123 case 16: bcdebits = 0x1; break;
15124 case 32: bcdebits = 0x0; break;
15125 default: ;
15126 }
15127
15128 bcdebits |= x << logsize;
15129
15130 inst.instruction = 0xe000b10;
15131 do_vfp_cond_or_thumb ();
15132 inst.instruction |= LOW4 (dn) << 16;
15133 inst.instruction |= HI1 (dn) << 7;
15134 inst.instruction |= inst.operands[1].reg << 12;
15135 inst.instruction |= (bcdebits & 3) << 5;
15136 inst.instruction |= (bcdebits >> 2) << 21;
15137 }
15138 break;
5f4273c7 15139
037e8744 15140 case NS_DRR: /* case 5 (fmdrr). */
b7fc2769 15141 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
037e8744 15142 _(BAD_FPU));
b7fc2769 15143
037e8744
JB
15144 inst.instruction = 0xc400b10;
15145 do_vfp_cond_or_thumb ();
15146 inst.instruction |= LOW4 (inst.operands[0].reg);
15147 inst.instruction |= HI1 (inst.operands[0].reg) << 5;
15148 inst.instruction |= inst.operands[1].reg << 12;
15149 inst.instruction |= inst.operands[2].reg << 16;
15150 break;
5f4273c7 15151
037e8744
JB
15152 case NS_RS: /* case 6. */
15153 {
91d6fa6a 15154 unsigned logsize;
037e8744
JB
15155 unsigned dn = NEON_SCALAR_REG (inst.operands[1].reg);
15156 unsigned x = NEON_SCALAR_INDEX (inst.operands[1].reg);
15157 unsigned abcdebits = 0;
15158
91d6fa6a
NC
15159 et = neon_check_type (2, NS_NULL,
15160 N_EQK, N_S8 | N_S16 | N_U8 | N_U16 | N_32 | N_KEY);
15161 logsize = neon_logbits (et.size);
15162
037e8744
JB
15163 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v1),
15164 _(BAD_FPU));
15165 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_neon_ext_v1)
15166 && et.size != 32, _(BAD_FPU));
15167 constraint (et.type == NT_invtype, _("bad type for scalar"));
15168 constraint (x >= 64 / et.size, _("scalar index out of range"));
15169
15170 switch (et.size)
15171 {
15172 case 8: abcdebits = (et.type == NT_signed) ? 0x08 : 0x18; break;
15173 case 16: abcdebits = (et.type == NT_signed) ? 0x01 : 0x11; break;
15174 case 32: abcdebits = 0x00; break;
15175 default: ;
15176 }
15177
15178 abcdebits |= x << logsize;
15179 inst.instruction = 0xe100b10;
15180 do_vfp_cond_or_thumb ();
15181 inst.instruction |= LOW4 (dn) << 16;
15182 inst.instruction |= HI1 (dn) << 7;
15183 inst.instruction |= inst.operands[0].reg << 12;
15184 inst.instruction |= (abcdebits & 3) << 5;
15185 inst.instruction |= (abcdebits >> 2) << 21;
15186 }
15187 break;
5f4273c7 15188
037e8744
JB
15189 case NS_RRD: /* case 7 (fmrrd). */
15190 constraint (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_vfp_ext_v2),
15191 _(BAD_FPU));
15192
15193 inst.instruction = 0xc500b10;
15194 do_vfp_cond_or_thumb ();
15195 inst.instruction |= inst.operands[0].reg << 12;
15196 inst.instruction |= inst.operands[1].reg << 16;
15197 inst.instruction |= LOW4 (inst.operands[2].reg);
15198 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15199 break;
5f4273c7 15200
037e8744
JB
15201 case NS_FF: /* case 8 (fcpys). */
15202 do_vfp_nsyn_opcode ("fcpys");
15203 break;
5f4273c7 15204
037e8744
JB
15205 case NS_FI: /* case 10 (fconsts). */
15206 ldconst = "fconsts";
15207 encode_fconstd:
15208 if (is_quarter_float (inst.operands[1].imm))
5287ad62 15209 {
037e8744
JB
15210 inst.operands[1].imm = neon_qfloat_bits (inst.operands[1].imm);
15211 do_vfp_nsyn_opcode (ldconst);
5287ad62
JB
15212 }
15213 else
037e8744
JB
15214 first_error (_("immediate out of range"));
15215 break;
5f4273c7 15216
037e8744
JB
15217 case NS_RF: /* case 12 (fmrs). */
15218 do_vfp_nsyn_opcode ("fmrs");
15219 break;
5f4273c7 15220
037e8744
JB
15221 case NS_FR: /* case 13 (fmsr). */
15222 do_vfp_nsyn_opcode ("fmsr");
15223 break;
5f4273c7 15224
037e8744
JB
15225 /* The encoders for the fmrrs and fmsrr instructions expect three operands
15226 (one of which is a list), but we have parsed four. Do some fiddling to
15227 make the operands what do_vfp_reg2_from_sp2 and do_vfp_sp2_from_reg2
15228 expect. */
15229 case NS_RRFF: /* case 14 (fmrrs). */
15230 constraint (inst.operands[3].reg != inst.operands[2].reg + 1,
15231 _("VFP registers must be adjacent"));
15232 inst.operands[2].imm = 2;
15233 memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
15234 do_vfp_nsyn_opcode ("fmrrs");
15235 break;
5f4273c7 15236
037e8744
JB
15237 case NS_FFRR: /* case 15 (fmsrr). */
15238 constraint (inst.operands[1].reg != inst.operands[0].reg + 1,
15239 _("VFP registers must be adjacent"));
15240 inst.operands[1] = inst.operands[2];
15241 inst.operands[2] = inst.operands[3];
15242 inst.operands[0].imm = 2;
15243 memset (&inst.operands[3], '\0', sizeof (inst.operands[3]));
15244 do_vfp_nsyn_opcode ("fmsrr");
5287ad62 15245 break;
5f4273c7 15246
5287ad62
JB
15247 default:
15248 abort ();
15249 }
15250}
15251
15252static void
15253do_neon_rshift_round_imm (void)
15254{
037e8744 15255 enum neon_shape rs = neon_select_shape (NS_DDI, NS_QQI, NS_NULL);
5287ad62
JB
15256 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_ALL | N_KEY);
15257 int imm = inst.operands[2].imm;
15258
15259 /* imm == 0 case is encoded as VMOV for V{R}SHR. */
15260 if (imm == 0)
15261 {
15262 inst.operands[2].present = 0;
15263 do_neon_mov ();
15264 return;
15265 }
15266
15267 constraint (imm < 1 || (unsigned)imm > et.size,
15268 _("immediate out of range for shift"));
037e8744 15269 neon_imm_shift (TRUE, et.type == NT_unsigned, neon_quad (rs), et,
5287ad62
JB
15270 et.size - imm);
15271}
15272
15273static void
15274do_neon_movl (void)
15275{
15276 struct neon_type_el et = neon_check_type (2, NS_QD,
15277 N_EQK | N_DBL, N_SU_32 | N_KEY);
15278 unsigned sizebits = et.size >> 3;
15279 inst.instruction |= sizebits << 19;
15280 neon_two_same (0, et.type == NT_unsigned, -1);
15281}
15282
15283static void
15284do_neon_trn (void)
15285{
037e8744 15286 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15287 struct neon_type_el et = neon_check_type (2, rs,
15288 N_EQK, N_8 | N_16 | N_32 | N_KEY);
88714cb8 15289 NEON_ENCODE (INTEGER, inst);
037e8744 15290 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15291}
15292
15293static void
15294do_neon_zip_uzp (void)
15295{
037e8744 15296 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15297 struct neon_type_el et = neon_check_type (2, rs,
15298 N_EQK, N_8 | N_16 | N_32 | N_KEY);
15299 if (rs == NS_DD && et.size == 32)
15300 {
15301 /* Special case: encode as VTRN.32 <Dd>, <Dm>. */
15302 inst.instruction = N_MNEM_vtrn;
15303 do_neon_trn ();
15304 return;
15305 }
037e8744 15306 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15307}
15308
15309static void
15310do_neon_sat_abs_neg (void)
15311{
037e8744 15312 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15313 struct neon_type_el et = neon_check_type (2, rs,
15314 N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
037e8744 15315 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15316}
15317
15318static void
15319do_neon_pair_long (void)
15320{
037e8744 15321 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15322 struct neon_type_el et = neon_check_type (2, rs, N_EQK, N_SU_32 | N_KEY);
15323 /* Unsigned is encoded in OP field (bit 7) for these instruction. */
15324 inst.instruction |= (et.type == NT_unsigned) << 7;
037e8744 15325 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15326}
15327
15328static void
15329do_neon_recip_est (void)
15330{
037e8744 15331 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15332 struct neon_type_el et = neon_check_type (2, rs,
15333 N_EQK | N_FLT, N_F32 | N_U32 | N_KEY);
15334 inst.instruction |= (et.type == NT_float) << 8;
037e8744 15335 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15336}
15337
15338static void
15339do_neon_cls (void)
15340{
037e8744 15341 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15342 struct neon_type_el et = neon_check_type (2, rs,
15343 N_EQK, N_S8 | N_S16 | N_S32 | N_KEY);
037e8744 15344 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15345}
15346
15347static void
15348do_neon_clz (void)
15349{
037e8744 15350 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15351 struct neon_type_el et = neon_check_type (2, rs,
15352 N_EQK, N_I8 | N_I16 | N_I32 | N_KEY);
037e8744 15353 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15354}
15355
15356static void
15357do_neon_cnt (void)
15358{
037e8744 15359 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
5287ad62
JB
15360 struct neon_type_el et = neon_check_type (2, rs,
15361 N_EQK | N_INT, N_8 | N_KEY);
037e8744 15362 neon_two_same (neon_quad (rs), 1, et.size);
5287ad62
JB
15363}
15364
15365static void
15366do_neon_swp (void)
15367{
037e8744
JB
15368 enum neon_shape rs = neon_select_shape (NS_DD, NS_QQ, NS_NULL);
15369 neon_two_same (neon_quad (rs), 1, -1);
5287ad62
JB
15370}
15371
15372static void
15373do_neon_tbl_tbx (void)
15374{
15375 unsigned listlenbits;
dcbf9037 15376 neon_check_type (3, NS_DLD, N_EQK, N_EQK, N_8 | N_KEY);
5f4273c7 15377
5287ad62
JB
15378 if (inst.operands[1].imm < 1 || inst.operands[1].imm > 4)
15379 {
dcbf9037 15380 first_error (_("bad list length for table lookup"));
5287ad62
JB
15381 return;
15382 }
5f4273c7 15383
5287ad62
JB
15384 listlenbits = inst.operands[1].imm - 1;
15385 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15386 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15387 inst.instruction |= LOW4 (inst.operands[1].reg) << 16;
15388 inst.instruction |= HI1 (inst.operands[1].reg) << 7;
15389 inst.instruction |= LOW4 (inst.operands[2].reg);
15390 inst.instruction |= HI1 (inst.operands[2].reg) << 5;
15391 inst.instruction |= listlenbits << 8;
5f4273c7 15392
88714cb8 15393 neon_dp_fixup (&inst);
5287ad62
JB
15394}
15395
15396static void
15397do_neon_ldm_stm (void)
15398{
15399 /* P, U and L bits are part of bitmask. */
15400 int is_dbmode = (inst.instruction & (1 << 24)) != 0;
15401 unsigned offsetbits = inst.operands[1].imm * 2;
15402
037e8744
JB
15403 if (inst.operands[1].issingle)
15404 {
15405 do_vfp_nsyn_ldm_stm (is_dbmode);
15406 return;
15407 }
15408
5287ad62
JB
15409 constraint (is_dbmode && !inst.operands[0].writeback,
15410 _("writeback (!) must be used for VLDMDB and VSTMDB"));
15411
15412 constraint (inst.operands[1].imm < 1 || inst.operands[1].imm > 16,
15413 _("register list must contain at least 1 and at most 16 "
15414 "registers"));
15415
15416 inst.instruction |= inst.operands[0].reg << 16;
15417 inst.instruction |= inst.operands[0].writeback << 21;
15418 inst.instruction |= LOW4 (inst.operands[1].reg) << 12;
15419 inst.instruction |= HI1 (inst.operands[1].reg) << 22;
15420
15421 inst.instruction |= offsetbits;
5f4273c7 15422
037e8744 15423 do_vfp_cond_or_thumb ();
5287ad62
JB
15424}
15425
15426static void
15427do_neon_ldr_str (void)
15428{
5287ad62 15429 int is_ldr = (inst.instruction & (1 << 20)) != 0;
5f4273c7 15430
6844b2c2
MGD
15431 /* Use of PC in vstr in ARM mode is deprecated in ARMv7.
15432 And is UNPREDICTABLE in thumb mode. */
fa94de6b 15433 if (!is_ldr
6844b2c2
MGD
15434 && inst.operands[1].reg == REG_PC
15435 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v7))
15436 {
15437 if (!thumb_mode && warn_on_deprecated)
15438 as_warn (_("Use of PC here is deprecated"));
15439 else
15440 inst.error = _("Use of PC here is UNPREDICTABLE");
15441 }
15442
037e8744
JB
15443 if (inst.operands[0].issingle)
15444 {
cd2f129f
JB
15445 if (is_ldr)
15446 do_vfp_nsyn_opcode ("flds");
15447 else
15448 do_vfp_nsyn_opcode ("fsts");
5287ad62
JB
15449 }
15450 else
5287ad62 15451 {
cd2f129f
JB
15452 if (is_ldr)
15453 do_vfp_nsyn_opcode ("fldd");
5287ad62 15454 else
cd2f129f 15455 do_vfp_nsyn_opcode ("fstd");
5287ad62 15456 }
5287ad62
JB
15457}
15458
15459/* "interleave" version also handles non-interleaving register VLD1/VST1
15460 instructions. */
15461
15462static void
15463do_neon_ld_st_interleave (void)
15464{
037e8744 15465 struct neon_type_el et = neon_check_type (1, NS_NULL,
5287ad62
JB
15466 N_8 | N_16 | N_32 | N_64);
15467 unsigned alignbits = 0;
15468 unsigned idx;
15469 /* The bits in this table go:
15470 0: register stride of one (0) or two (1)
15471 1,2: register list length, minus one (1, 2, 3, 4).
15472 3,4: <n> in instruction type, minus one (VLD<n> / VST<n>).
15473 We use -1 for invalid entries. */
15474 const int typetable[] =
15475 {
15476 0x7, -1, 0xa, -1, 0x6, -1, 0x2, -1, /* VLD1 / VST1. */
15477 -1, -1, 0x8, 0x9, -1, -1, 0x3, -1, /* VLD2 / VST2. */
15478 -1, -1, -1, -1, 0x4, 0x5, -1, -1, /* VLD3 / VST3. */
15479 -1, -1, -1, -1, -1, -1, 0x0, 0x1 /* VLD4 / VST4. */
15480 };
15481 int typebits;
15482
dcbf9037
JB
15483 if (et.type == NT_invtype)
15484 return;
15485
5287ad62
JB
15486 if (inst.operands[1].immisalign)
15487 switch (inst.operands[1].imm >> 8)
15488 {
15489 case 64: alignbits = 1; break;
15490 case 128:
e23c0ad8
JZ
15491 if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2
15492 && NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
5287ad62
JB
15493 goto bad_alignment;
15494 alignbits = 2;
15495 break;
15496 case 256:
e23c0ad8 15497 if (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4)
5287ad62
JB
15498 goto bad_alignment;
15499 alignbits = 3;
15500 break;
15501 default:
15502 bad_alignment:
dcbf9037 15503 first_error (_("bad alignment"));
5287ad62
JB
15504 return;
15505 }
15506
15507 inst.instruction |= alignbits << 4;
15508 inst.instruction |= neon_logbits (et.size) << 6;
15509
15510 /* Bits [4:6] of the immediate in a list specifier encode register stride
15511 (minus 1) in bit 4, and list length in bits [5:6]. We put the <n> of
15512 VLD<n>/VST<n> in bits [9:8] of the initial bitmask. Suck it out here, look
15513 up the right value for "type" in a table based on this value and the given
15514 list style, then stick it back. */
15515 idx = ((inst.operands[0].imm >> 4) & 7)
15516 | (((inst.instruction >> 8) & 3) << 3);
15517
15518 typebits = typetable[idx];
5f4273c7 15519
5287ad62
JB
15520 constraint (typebits == -1, _("bad list type for instruction"));
15521
15522 inst.instruction &= ~0xf00;
15523 inst.instruction |= typebits << 8;
15524}
15525
15526/* Check alignment is valid for do_neon_ld_st_lane and do_neon_ld_dup.
15527 *DO_ALIGN is set to 1 if the relevant alignment bit should be set, 0
15528 otherwise. The variable arguments are a list of pairs of legal (size, align)
15529 values, terminated with -1. */
15530
15531static int
15532neon_alignment_bit (int size, int align, int *do_align, ...)
15533{
15534 va_list ap;
15535 int result = FAIL, thissize, thisalign;
5f4273c7 15536
5287ad62
JB
15537 if (!inst.operands[1].immisalign)
15538 {
15539 *do_align = 0;
15540 return SUCCESS;
15541 }
5f4273c7 15542
5287ad62
JB
15543 va_start (ap, do_align);
15544
15545 do
15546 {
15547 thissize = va_arg (ap, int);
15548 if (thissize == -1)
15549 break;
15550 thisalign = va_arg (ap, int);
15551
15552 if (size == thissize && align == thisalign)
15553 result = SUCCESS;
15554 }
15555 while (result != SUCCESS);
15556
15557 va_end (ap);
15558
15559 if (result == SUCCESS)
15560 *do_align = 1;
15561 else
dcbf9037 15562 first_error (_("unsupported alignment for instruction"));
5f4273c7 15563
5287ad62
JB
15564 return result;
15565}
15566
15567static void
15568do_neon_ld_st_lane (void)
15569{
037e8744 15570 struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
5287ad62
JB
15571 int align_good, do_align = 0;
15572 int logsize = neon_logbits (et.size);
15573 int align = inst.operands[1].imm >> 8;
15574 int n = (inst.instruction >> 8) & 3;
15575 int max_el = 64 / et.size;
5f4273c7 15576
dcbf9037
JB
15577 if (et.type == NT_invtype)
15578 return;
5f4273c7 15579
5287ad62
JB
15580 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != n + 1,
15581 _("bad list length"));
15582 constraint (NEON_LANE (inst.operands[0].imm) >= max_el,
15583 _("scalar index out of range"));
15584 constraint (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2
15585 && et.size == 8,
15586 _("stride of 2 unavailable when element size is 8"));
5f4273c7 15587
5287ad62
JB
15588 switch (n)
15589 {
15590 case 0: /* VLD1 / VST1. */
15591 align_good = neon_alignment_bit (et.size, align, &do_align, 16, 16,
15592 32, 32, -1);
15593 if (align_good == FAIL)
15594 return;
15595 if (do_align)
15596 {
15597 unsigned alignbits = 0;
15598 switch (et.size)
15599 {
15600 case 16: alignbits = 0x1; break;
15601 case 32: alignbits = 0x3; break;
15602 default: ;
15603 }
15604 inst.instruction |= alignbits << 4;
15605 }
15606 break;
15607
15608 case 1: /* VLD2 / VST2. */
15609 align_good = neon_alignment_bit (et.size, align, &do_align, 8, 16, 16, 32,
15610 32, 64, -1);
15611 if (align_good == FAIL)
15612 return;
15613 if (do_align)
15614 inst.instruction |= 1 << 4;
15615 break;
15616
15617 case 2: /* VLD3 / VST3. */
15618 constraint (inst.operands[1].immisalign,
15619 _("can't use alignment with this instruction"));
15620 break;
15621
15622 case 3: /* VLD4 / VST4. */
15623 align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15624 16, 64, 32, 64, 32, 128, -1);
15625 if (align_good == FAIL)
15626 return;
15627 if (do_align)
15628 {
15629 unsigned alignbits = 0;
15630 switch (et.size)
15631 {
15632 case 8: alignbits = 0x1; break;
15633 case 16: alignbits = 0x1; break;
15634 case 32: alignbits = (align == 64) ? 0x1 : 0x2; break;
15635 default: ;
15636 }
15637 inst.instruction |= alignbits << 4;
15638 }
15639 break;
15640
15641 default: ;
15642 }
15643
15644 /* Reg stride of 2 is encoded in bit 5 when size==16, bit 6 when size==32. */
15645 if (n != 0 && NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15646 inst.instruction |= 1 << (4 + logsize);
5f4273c7 15647
5287ad62
JB
15648 inst.instruction |= NEON_LANE (inst.operands[0].imm) << (logsize + 5);
15649 inst.instruction |= logsize << 10;
15650}
15651
15652/* Encode single n-element structure to all lanes VLD<n> instructions. */
15653
15654static void
15655do_neon_ld_dup (void)
15656{
037e8744 15657 struct neon_type_el et = neon_check_type (1, NS_NULL, N_8 | N_16 | N_32);
5287ad62
JB
15658 int align_good, do_align = 0;
15659
dcbf9037
JB
15660 if (et.type == NT_invtype)
15661 return;
15662
5287ad62
JB
15663 switch ((inst.instruction >> 8) & 3)
15664 {
15665 case 0: /* VLD1. */
9c2799c2 15666 gas_assert (NEON_REG_STRIDE (inst.operands[0].imm) != 2);
5287ad62
JB
15667 align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
15668 &do_align, 16, 16, 32, 32, -1);
15669 if (align_good == FAIL)
15670 return;
15671 switch (NEON_REGLIST_LENGTH (inst.operands[0].imm))
15672 {
15673 case 1: break;
15674 case 2: inst.instruction |= 1 << 5; break;
dcbf9037 15675 default: first_error (_("bad list length")); return;
5287ad62
JB
15676 }
15677 inst.instruction |= neon_logbits (et.size) << 6;
15678 break;
15679
15680 case 1: /* VLD2. */
15681 align_good = neon_alignment_bit (et.size, inst.operands[1].imm >> 8,
15682 &do_align, 8, 16, 16, 32, 32, 64, -1);
15683 if (align_good == FAIL)
15684 return;
15685 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 2,
15686 _("bad list length"));
15687 if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15688 inst.instruction |= 1 << 5;
15689 inst.instruction |= neon_logbits (et.size) << 6;
15690 break;
15691
15692 case 2: /* VLD3. */
15693 constraint (inst.operands[1].immisalign,
15694 _("can't use alignment with this instruction"));
15695 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 3,
15696 _("bad list length"));
15697 if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15698 inst.instruction |= 1 << 5;
15699 inst.instruction |= neon_logbits (et.size) << 6;
15700 break;
15701
15702 case 3: /* VLD4. */
15703 {
15704 int align = inst.operands[1].imm >> 8;
15705 align_good = neon_alignment_bit (et.size, align, &do_align, 8, 32,
15706 16, 64, 32, 64, 32, 128, -1);
15707 if (align_good == FAIL)
15708 return;
15709 constraint (NEON_REGLIST_LENGTH (inst.operands[0].imm) != 4,
15710 _("bad list length"));
15711 if (NEON_REG_STRIDE (inst.operands[0].imm) == 2)
15712 inst.instruction |= 1 << 5;
15713 if (et.size == 32 && align == 128)
15714 inst.instruction |= 0x3 << 6;
15715 else
15716 inst.instruction |= neon_logbits (et.size) << 6;
15717 }
15718 break;
15719
15720 default: ;
15721 }
15722
15723 inst.instruction |= do_align << 4;
15724}
15725
15726/* Disambiguate VLD<n> and VST<n> instructions, and fill in common bits (those
15727 apart from bits [11:4]. */
15728
15729static void
15730do_neon_ldx_stx (void)
15731{
b1a769ed
DG
15732 if (inst.operands[1].isreg)
15733 constraint (inst.operands[1].reg == REG_PC, BAD_PC);
15734
5287ad62
JB
15735 switch (NEON_LANE (inst.operands[0].imm))
15736 {
15737 case NEON_INTERLEAVE_LANES:
88714cb8 15738 NEON_ENCODE (INTERLV, inst);
5287ad62
JB
15739 do_neon_ld_st_interleave ();
15740 break;
5f4273c7 15741
5287ad62 15742 case NEON_ALL_LANES:
88714cb8 15743 NEON_ENCODE (DUP, inst);
5287ad62
JB
15744 do_neon_ld_dup ();
15745 break;
5f4273c7 15746
5287ad62 15747 default:
88714cb8 15748 NEON_ENCODE (LANE, inst);
5287ad62
JB
15749 do_neon_ld_st_lane ();
15750 }
15751
15752 /* L bit comes from bit mask. */
15753 inst.instruction |= LOW4 (inst.operands[0].reg) << 12;
15754 inst.instruction |= HI1 (inst.operands[0].reg) << 22;
15755 inst.instruction |= inst.operands[1].reg << 16;
5f4273c7 15756
5287ad62
JB
15757 if (inst.operands[1].postind)
15758 {
15759 int postreg = inst.operands[1].imm & 0xf;
15760 constraint (!inst.operands[1].immisreg,
15761 _("post-index must be a register"));
15762 constraint (postreg == 0xd || postreg == 0xf,
15763 _("bad register for post-index"));
15764 inst.instruction |= postreg;
15765 }
15766 else if (inst.operands[1].writeback)
15767 {
15768 inst.instruction |= 0xd;
15769 }
15770 else
5f4273c7
NC
15771 inst.instruction |= 0xf;
15772
5287ad62
JB
15773 if (thumb_mode)
15774 inst.instruction |= 0xf9000000;
15775 else
15776 inst.instruction |= 0xf4000000;
15777}
5287ad62
JB
15778\f
15779/* Overall per-instruction processing. */
15780
15781/* We need to be able to fix up arbitrary expressions in some statements.
15782 This is so that we can handle symbols that are an arbitrary distance from
15783 the pc. The most common cases are of the form ((+/-sym -/+ . - 8) & mask),
15784 which returns part of an address in a form which will be valid for
15785 a data instruction. We do this by pushing the expression into a symbol
15786 in the expr_section, and creating a fix for that. */
15787
15788static void
15789fix_new_arm (fragS * frag,
15790 int where,
15791 short int size,
15792 expressionS * exp,
15793 int pc_rel,
15794 int reloc)
15795{
15796 fixS * new_fix;
15797
15798 switch (exp->X_op)
15799 {
15800 case O_constant:
6e7ce2cd
PB
15801 if (pc_rel)
15802 {
15803 /* Create an absolute valued symbol, so we have something to
15804 refer to in the object file. Unfortunately for us, gas's
15805 generic expression parsing will already have folded out
15806 any use of .set foo/.type foo %function that may have
15807 been used to set type information of the target location,
15808 that's being specified symbolically. We have to presume
15809 the user knows what they are doing. */
15810 char name[16 + 8];
15811 symbolS *symbol;
15812
15813 sprintf (name, "*ABS*0x%lx", (unsigned long)exp->X_add_number);
15814
15815 symbol = symbol_find_or_make (name);
15816 S_SET_SEGMENT (symbol, absolute_section);
15817 symbol_set_frag (symbol, &zero_address_frag);
15818 S_SET_VALUE (symbol, exp->X_add_number);
15819 exp->X_op = O_symbol;
15820 exp->X_add_symbol = symbol;
15821 exp->X_add_number = 0;
15822 }
15823 /* FALLTHROUGH */
5287ad62
JB
15824 case O_symbol:
15825 case O_add:
15826 case O_subtract:
21d799b5
NC
15827 new_fix = fix_new_exp (frag, where, size, exp, pc_rel,
15828 (enum bfd_reloc_code_real) reloc);
5287ad62
JB
15829 break;
15830
15831 default:
21d799b5
NC
15832 new_fix = (fixS *) fix_new (frag, where, size, make_expr_symbol (exp), 0,
15833 pc_rel, (enum bfd_reloc_code_real) reloc);
5287ad62
JB
15834 break;
15835 }
15836
15837 /* Mark whether the fix is to a THUMB instruction, or an ARM
15838 instruction. */
15839 new_fix->tc_fix_data = thumb_mode;
15840}
15841
15842/* Create a frg for an instruction requiring relaxation. */
15843static void
15844output_relax_insn (void)
15845{
15846 char * to;
15847 symbolS *sym;
0110f2b8
PB
15848 int offset;
15849
6e1cb1a6
PB
15850 /* The size of the instruction is unknown, so tie the debug info to the
15851 start of the instruction. */
15852 dwarf2_emit_insn (0);
6e1cb1a6 15853
0110f2b8
PB
15854 switch (inst.reloc.exp.X_op)
15855 {
15856 case O_symbol:
15857 sym = inst.reloc.exp.X_add_symbol;
15858 offset = inst.reloc.exp.X_add_number;
15859 break;
15860 case O_constant:
15861 sym = NULL;
15862 offset = inst.reloc.exp.X_add_number;
15863 break;
15864 default:
15865 sym = make_expr_symbol (&inst.reloc.exp);
15866 offset = 0;
15867 break;
15868 }
15869 to = frag_var (rs_machine_dependent, INSN_SIZE, THUMB_SIZE,
15870 inst.relax, sym, offset, NULL/*offset, opcode*/);
15871 md_number_to_chars (to, inst.instruction, THUMB_SIZE);
0110f2b8
PB
15872}
15873
15874/* Write a 32-bit thumb instruction to buf. */
15875static void
15876put_thumb32_insn (char * buf, unsigned long insn)
15877{
15878 md_number_to_chars (buf, insn >> 16, THUMB_SIZE);
15879 md_number_to_chars (buf + THUMB_SIZE, insn, THUMB_SIZE);
15880}
15881
b99bd4ef 15882static void
c19d1205 15883output_inst (const char * str)
b99bd4ef 15884{
c19d1205 15885 char * to = NULL;
b99bd4ef 15886
c19d1205 15887 if (inst.error)
b99bd4ef 15888 {
c19d1205 15889 as_bad ("%s -- `%s'", inst.error, str);
b99bd4ef
NC
15890 return;
15891 }
5f4273c7
NC
15892 if (inst.relax)
15893 {
15894 output_relax_insn ();
0110f2b8 15895 return;
5f4273c7 15896 }
c19d1205
ZW
15897 if (inst.size == 0)
15898 return;
b99bd4ef 15899
c19d1205 15900 to = frag_more (inst.size);
8dc2430f
NC
15901 /* PR 9814: Record the thumb mode into the current frag so that we know
15902 what type of NOP padding to use, if necessary. We override any previous
15903 setting so that if the mode has changed then the NOPS that we use will
15904 match the encoding of the last instruction in the frag. */
cd000bff 15905 frag_now->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
c19d1205
ZW
15906
15907 if (thumb_mode && (inst.size > THUMB_SIZE))
b99bd4ef 15908 {
9c2799c2 15909 gas_assert (inst.size == (2 * THUMB_SIZE));
0110f2b8 15910 put_thumb32_insn (to, inst.instruction);
b99bd4ef 15911 }
c19d1205 15912 else if (inst.size > INSN_SIZE)
b99bd4ef 15913 {
9c2799c2 15914 gas_assert (inst.size == (2 * INSN_SIZE));
c19d1205
ZW
15915 md_number_to_chars (to, inst.instruction, INSN_SIZE);
15916 md_number_to_chars (to + INSN_SIZE, inst.instruction, INSN_SIZE);
b99bd4ef 15917 }
c19d1205
ZW
15918 else
15919 md_number_to_chars (to, inst.instruction, inst.size);
b99bd4ef 15920
c19d1205
ZW
15921 if (inst.reloc.type != BFD_RELOC_UNUSED)
15922 fix_new_arm (frag_now, to - frag_now->fr_literal,
15923 inst.size, & inst.reloc.exp, inst.reloc.pc_rel,
15924 inst.reloc.type);
b99bd4ef 15925
c19d1205 15926 dwarf2_emit_insn (inst.size);
c19d1205 15927}
b99bd4ef 15928
e07e6e58
NC
15929static char *
15930output_it_inst (int cond, int mask, char * to)
15931{
15932 unsigned long instruction = 0xbf00;
15933
15934 mask &= 0xf;
15935 instruction |= mask;
15936 instruction |= cond << 4;
15937
15938 if (to == NULL)
15939 {
15940 to = frag_more (2);
15941#ifdef OBJ_ELF
15942 dwarf2_emit_insn (2);
15943#endif
15944 }
15945
15946 md_number_to_chars (to, instruction, 2);
15947
15948 return to;
15949}
15950
c19d1205
ZW
15951/* Tag values used in struct asm_opcode's tag field. */
15952enum opcode_tag
15953{
15954 OT_unconditional, /* Instruction cannot be conditionalized.
15955 The ARM condition field is still 0xE. */
15956 OT_unconditionalF, /* Instruction cannot be conditionalized
15957 and carries 0xF in its ARM condition field. */
15958 OT_csuffix, /* Instruction takes a conditional suffix. */
037e8744
JB
15959 OT_csuffixF, /* Some forms of the instruction take a conditional
15960 suffix, others place 0xF where the condition field
15961 would be. */
c19d1205
ZW
15962 OT_cinfix3, /* Instruction takes a conditional infix,
15963 beginning at character index 3. (In
15964 unified mode, it becomes a suffix.) */
088fa78e
KH
15965 OT_cinfix3_deprecated, /* The same as OT_cinfix3. This is used for
15966 tsts, cmps, cmns, and teqs. */
e3cb604e
PB
15967 OT_cinfix3_legacy, /* Legacy instruction takes a conditional infix at
15968 character index 3, even in unified mode. Used for
15969 legacy instructions where suffix and infix forms
15970 may be ambiguous. */
c19d1205 15971 OT_csuf_or_in3, /* Instruction takes either a conditional
e3cb604e 15972 suffix or an infix at character index 3. */
c19d1205
ZW
15973 OT_odd_infix_unc, /* This is the unconditional variant of an
15974 instruction that takes a conditional infix
15975 at an unusual position. In unified mode,
15976 this variant will accept a suffix. */
15977 OT_odd_infix_0 /* Values greater than or equal to OT_odd_infix_0
15978 are the conditional variants of instructions that
15979 take conditional infixes in unusual positions.
15980 The infix appears at character index
15981 (tag - OT_odd_infix_0). These are not accepted
15982 in unified mode. */
15983};
b99bd4ef 15984
c19d1205
ZW
15985/* Subroutine of md_assemble, responsible for looking up the primary
15986 opcode from the mnemonic the user wrote. STR points to the
15987 beginning of the mnemonic.
15988
15989 This is not simply a hash table lookup, because of conditional
15990 variants. Most instructions have conditional variants, which are
15991 expressed with a _conditional affix_ to the mnemonic. If we were
15992 to encode each conditional variant as a literal string in the opcode
15993 table, it would have approximately 20,000 entries.
15994
15995 Most mnemonics take this affix as a suffix, and in unified syntax,
15996 'most' is upgraded to 'all'. However, in the divided syntax, some
15997 instructions take the affix as an infix, notably the s-variants of
15998 the arithmetic instructions. Of those instructions, all but six
15999 have the infix appear after the third character of the mnemonic.
16000
16001 Accordingly, the algorithm for looking up primary opcodes given
16002 an identifier is:
16003
16004 1. Look up the identifier in the opcode table.
16005 If we find a match, go to step U.
16006
16007 2. Look up the last two characters of the identifier in the
16008 conditions table. If we find a match, look up the first N-2
16009 characters of the identifier in the opcode table. If we
16010 find a match, go to step CE.
16011
16012 3. Look up the fourth and fifth characters of the identifier in
16013 the conditions table. If we find a match, extract those
16014 characters from the identifier, and look up the remaining
16015 characters in the opcode table. If we find a match, go
16016 to step CM.
16017
16018 4. Fail.
16019
16020 U. Examine the tag field of the opcode structure, in case this is
16021 one of the six instructions with its conditional infix in an
16022 unusual place. If it is, the tag tells us where to find the
16023 infix; look it up in the conditions table and set inst.cond
16024 accordingly. Otherwise, this is an unconditional instruction.
16025 Again set inst.cond accordingly. Return the opcode structure.
16026
16027 CE. Examine the tag field to make sure this is an instruction that
16028 should receive a conditional suffix. If it is not, fail.
16029 Otherwise, set inst.cond from the suffix we already looked up,
16030 and return the opcode structure.
16031
16032 CM. Examine the tag field to make sure this is an instruction that
16033 should receive a conditional infix after the third character.
16034 If it is not, fail. Otherwise, undo the edits to the current
16035 line of input and proceed as for case CE. */
16036
16037static const struct asm_opcode *
16038opcode_lookup (char **str)
16039{
16040 char *end, *base;
16041 char *affix;
16042 const struct asm_opcode *opcode;
16043 const struct asm_cond *cond;
e3cb604e 16044 char save[2];
c19d1205
ZW
16045
16046 /* Scan up to the end of the mnemonic, which must end in white space,
721a8186 16047 '.' (in unified mode, or for Neon/VFP instructions), or end of string. */
c19d1205 16048 for (base = end = *str; *end != '\0'; end++)
721a8186 16049 if (*end == ' ' || *end == '.')
c19d1205 16050 break;
b99bd4ef 16051
c19d1205 16052 if (end == base)
c921be7d 16053 return NULL;
b99bd4ef 16054
5287ad62 16055 /* Handle a possible width suffix and/or Neon type suffix. */
c19d1205 16056 if (end[0] == '.')
b99bd4ef 16057 {
5287ad62 16058 int offset = 2;
5f4273c7 16059
267d2029
JB
16060 /* The .w and .n suffixes are only valid if the unified syntax is in
16061 use. */
16062 if (unified_syntax && end[1] == 'w')
c19d1205 16063 inst.size_req = 4;
267d2029 16064 else if (unified_syntax && end[1] == 'n')
c19d1205
ZW
16065 inst.size_req = 2;
16066 else
5287ad62
JB
16067 offset = 0;
16068
16069 inst.vectype.elems = 0;
16070
16071 *str = end + offset;
b99bd4ef 16072
5f4273c7 16073 if (end[offset] == '.')
5287ad62 16074 {
267d2029
JB
16075 /* See if we have a Neon type suffix (possible in either unified or
16076 non-unified ARM syntax mode). */
dcbf9037 16077 if (parse_neon_type (&inst.vectype, str) == FAIL)
c921be7d 16078 return NULL;
5287ad62
JB
16079 }
16080 else if (end[offset] != '\0' && end[offset] != ' ')
c921be7d 16081 return NULL;
b99bd4ef 16082 }
c19d1205
ZW
16083 else
16084 *str = end;
b99bd4ef 16085
c19d1205 16086 /* Look for unaffixed or special-case affixed mnemonic. */
21d799b5
NC
16087 opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16088 end - base);
c19d1205 16089 if (opcode)
b99bd4ef 16090 {
c19d1205
ZW
16091 /* step U */
16092 if (opcode->tag < OT_odd_infix_0)
b99bd4ef 16093 {
c19d1205
ZW
16094 inst.cond = COND_ALWAYS;
16095 return opcode;
b99bd4ef 16096 }
b99bd4ef 16097
278df34e 16098 if (warn_on_deprecated && unified_syntax)
c19d1205
ZW
16099 as_warn (_("conditional infixes are deprecated in unified syntax"));
16100 affix = base + (opcode->tag - OT_odd_infix_0);
21d799b5 16101 cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
9c2799c2 16102 gas_assert (cond);
b99bd4ef 16103
c19d1205
ZW
16104 inst.cond = cond->value;
16105 return opcode;
16106 }
b99bd4ef 16107
c19d1205
ZW
16108 /* Cannot have a conditional suffix on a mnemonic of less than two
16109 characters. */
16110 if (end - base < 3)
c921be7d 16111 return NULL;
b99bd4ef 16112
c19d1205
ZW
16113 /* Look for suffixed mnemonic. */
16114 affix = end - 2;
21d799b5
NC
16115 cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
16116 opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16117 affix - base);
c19d1205
ZW
16118 if (opcode && cond)
16119 {
16120 /* step CE */
16121 switch (opcode->tag)
16122 {
e3cb604e
PB
16123 case OT_cinfix3_legacy:
16124 /* Ignore conditional suffixes matched on infix only mnemonics. */
16125 break;
16126
c19d1205 16127 case OT_cinfix3:
088fa78e 16128 case OT_cinfix3_deprecated:
c19d1205
ZW
16129 case OT_odd_infix_unc:
16130 if (!unified_syntax)
e3cb604e 16131 return 0;
c19d1205
ZW
16132 /* else fall through */
16133
16134 case OT_csuffix:
037e8744 16135 case OT_csuffixF:
c19d1205
ZW
16136 case OT_csuf_or_in3:
16137 inst.cond = cond->value;
16138 return opcode;
16139
16140 case OT_unconditional:
16141 case OT_unconditionalF:
dfa9f0d5 16142 if (thumb_mode)
c921be7d 16143 inst.cond = cond->value;
dfa9f0d5
PB
16144 else
16145 {
c921be7d 16146 /* Delayed diagnostic. */
dfa9f0d5
PB
16147 inst.error = BAD_COND;
16148 inst.cond = COND_ALWAYS;
16149 }
c19d1205 16150 return opcode;
b99bd4ef 16151
c19d1205 16152 default:
c921be7d 16153 return NULL;
c19d1205
ZW
16154 }
16155 }
b99bd4ef 16156
c19d1205
ZW
16157 /* Cannot have a usual-position infix on a mnemonic of less than
16158 six characters (five would be a suffix). */
16159 if (end - base < 6)
c921be7d 16160 return NULL;
b99bd4ef 16161
c19d1205
ZW
16162 /* Look for infixed mnemonic in the usual position. */
16163 affix = base + 3;
21d799b5 16164 cond = (const struct asm_cond *) hash_find_n (arm_cond_hsh, affix, 2);
e3cb604e 16165 if (!cond)
c921be7d 16166 return NULL;
e3cb604e
PB
16167
16168 memcpy (save, affix, 2);
16169 memmove (affix, affix + 2, (end - affix) - 2);
21d799b5
NC
16170 opcode = (const struct asm_opcode *) hash_find_n (arm_ops_hsh, base,
16171 (end - base) - 2);
e3cb604e
PB
16172 memmove (affix + 2, affix, (end - affix) - 2);
16173 memcpy (affix, save, 2);
16174
088fa78e
KH
16175 if (opcode
16176 && (opcode->tag == OT_cinfix3
16177 || opcode->tag == OT_cinfix3_deprecated
16178 || opcode->tag == OT_csuf_or_in3
16179 || opcode->tag == OT_cinfix3_legacy))
b99bd4ef 16180 {
c921be7d 16181 /* Step CM. */
278df34e 16182 if (warn_on_deprecated && unified_syntax
088fa78e
KH
16183 && (opcode->tag == OT_cinfix3
16184 || opcode->tag == OT_cinfix3_deprecated))
c19d1205
ZW
16185 as_warn (_("conditional infixes are deprecated in unified syntax"));
16186
16187 inst.cond = cond->value;
16188 return opcode;
b99bd4ef
NC
16189 }
16190
c921be7d 16191 return NULL;
b99bd4ef
NC
16192}
16193
e07e6e58
NC
16194/* This function generates an initial IT instruction, leaving its block
16195 virtually open for the new instructions. Eventually,
16196 the mask will be updated by now_it_add_mask () each time
16197 a new instruction needs to be included in the IT block.
16198 Finally, the block is closed with close_automatic_it_block ().
16199 The block closure can be requested either from md_assemble (),
16200 a tencode (), or due to a label hook. */
16201
16202static void
16203new_automatic_it_block (int cond)
16204{
16205 now_it.state = AUTOMATIC_IT_BLOCK;
16206 now_it.mask = 0x18;
16207 now_it.cc = cond;
16208 now_it.block_length = 1;
cd000bff 16209 mapping_state (MAP_THUMB);
e07e6e58 16210 now_it.insn = output_it_inst (cond, now_it.mask, NULL);
5a01bb1d
MGD
16211 now_it.warn_deprecated = FALSE;
16212 now_it.insn_cond = TRUE;
e07e6e58
NC
16213}
16214
16215/* Close an automatic IT block.
16216 See comments in new_automatic_it_block (). */
16217
16218static void
16219close_automatic_it_block (void)
16220{
16221 now_it.mask = 0x10;
16222 now_it.block_length = 0;
16223}
16224
16225/* Update the mask of the current automatically-generated IT
16226 instruction. See comments in new_automatic_it_block (). */
16227
16228static void
16229now_it_add_mask (int cond)
16230{
16231#define CLEAR_BIT(value, nbit) ((value) & ~(1 << (nbit)))
16232#define SET_BIT_VALUE(value, bitvalue, nbit) (CLEAR_BIT (value, nbit) \
16233 | ((bitvalue) << (nbit)))
e07e6e58 16234 const int resulting_bit = (cond & 1);
c921be7d 16235
e07e6e58
NC
16236 now_it.mask &= 0xf;
16237 now_it.mask = SET_BIT_VALUE (now_it.mask,
16238 resulting_bit,
16239 (5 - now_it.block_length));
16240 now_it.mask = SET_BIT_VALUE (now_it.mask,
16241 1,
16242 ((5 - now_it.block_length) - 1) );
16243 output_it_inst (now_it.cc, now_it.mask, now_it.insn);
16244
16245#undef CLEAR_BIT
16246#undef SET_BIT_VALUE
e07e6e58
NC
16247}
16248
16249/* The IT blocks handling machinery is accessed through the these functions:
16250 it_fsm_pre_encode () from md_assemble ()
16251 set_it_insn_type () optional, from the tencode functions
16252 set_it_insn_type_last () ditto
16253 in_it_block () ditto
16254 it_fsm_post_encode () from md_assemble ()
16255 force_automatic_it_block_close () from label habdling functions
16256
16257 Rationale:
16258 1) md_assemble () calls it_fsm_pre_encode () before calling tencode (),
16259 initializing the IT insn type with a generic initial value depending
16260 on the inst.condition.
16261 2) During the tencode function, two things may happen:
16262 a) The tencode function overrides the IT insn type by
16263 calling either set_it_insn_type (type) or set_it_insn_type_last ().
16264 b) The tencode function queries the IT block state by
16265 calling in_it_block () (i.e. to determine narrow/not narrow mode).
16266
16267 Both set_it_insn_type and in_it_block run the internal FSM state
16268 handling function (handle_it_state), because: a) setting the IT insn
16269 type may incur in an invalid state (exiting the function),
16270 and b) querying the state requires the FSM to be updated.
16271 Specifically we want to avoid creating an IT block for conditional
16272 branches, so it_fsm_pre_encode is actually a guess and we can't
16273 determine whether an IT block is required until the tencode () routine
16274 has decided what type of instruction this actually it.
16275 Because of this, if set_it_insn_type and in_it_block have to be used,
16276 set_it_insn_type has to be called first.
16277
16278 set_it_insn_type_last () is a wrapper of set_it_insn_type (type), that
16279 determines the insn IT type depending on the inst.cond code.
16280 When a tencode () routine encodes an instruction that can be
16281 either outside an IT block, or, in the case of being inside, has to be
16282 the last one, set_it_insn_type_last () will determine the proper
16283 IT instruction type based on the inst.cond code. Otherwise,
16284 set_it_insn_type can be called for overriding that logic or
16285 for covering other cases.
16286
16287 Calling handle_it_state () may not transition the IT block state to
16288 OUTSIDE_IT_BLOCK immediatelly, since the (current) state could be
16289 still queried. Instead, if the FSM determines that the state should
16290 be transitioned to OUTSIDE_IT_BLOCK, a flag is marked to be closed
16291 after the tencode () function: that's what it_fsm_post_encode () does.
16292
16293 Since in_it_block () calls the state handling function to get an
16294 updated state, an error may occur (due to invalid insns combination).
16295 In that case, inst.error is set.
16296 Therefore, inst.error has to be checked after the execution of
16297 the tencode () routine.
16298
16299 3) Back in md_assemble(), it_fsm_post_encode () is called to commit
16300 any pending state change (if any) that didn't take place in
16301 handle_it_state () as explained above. */
16302
16303static void
16304it_fsm_pre_encode (void)
16305{
16306 if (inst.cond != COND_ALWAYS)
16307 inst.it_insn_type = INSIDE_IT_INSN;
16308 else
16309 inst.it_insn_type = OUTSIDE_IT_INSN;
16310
16311 now_it.state_handled = 0;
16312}
16313
16314/* IT state FSM handling function. */
16315
16316static int
16317handle_it_state (void)
16318{
16319 now_it.state_handled = 1;
5a01bb1d 16320 now_it.insn_cond = FALSE;
e07e6e58
NC
16321
16322 switch (now_it.state)
16323 {
16324 case OUTSIDE_IT_BLOCK:
16325 switch (inst.it_insn_type)
16326 {
16327 case OUTSIDE_IT_INSN:
16328 break;
16329
16330 case INSIDE_IT_INSN:
16331 case INSIDE_IT_LAST_INSN:
16332 if (thumb_mode == 0)
16333 {
c921be7d 16334 if (unified_syntax
e07e6e58
NC
16335 && !(implicit_it_mode & IMPLICIT_IT_MODE_ARM))
16336 as_tsktsk (_("Warning: conditional outside an IT block"\
16337 " for Thumb."));
16338 }
16339 else
16340 {
16341 if ((implicit_it_mode & IMPLICIT_IT_MODE_THUMB)
16342 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2))
16343 {
16344 /* Automatically generate the IT instruction. */
16345 new_automatic_it_block (inst.cond);
16346 if (inst.it_insn_type == INSIDE_IT_LAST_INSN)
16347 close_automatic_it_block ();
16348 }
16349 else
16350 {
16351 inst.error = BAD_OUT_IT;
16352 return FAIL;
16353 }
16354 }
16355 break;
16356
16357 case IF_INSIDE_IT_LAST_INSN:
16358 case NEUTRAL_IT_INSN:
16359 break;
16360
16361 case IT_INSN:
16362 now_it.state = MANUAL_IT_BLOCK;
16363 now_it.block_length = 0;
16364 break;
16365 }
16366 break;
16367
16368 case AUTOMATIC_IT_BLOCK:
16369 /* Three things may happen now:
16370 a) We should increment current it block size;
16371 b) We should close current it block (closing insn or 4 insns);
16372 c) We should close current it block and start a new one (due
16373 to incompatible conditions or
16374 4 insns-length block reached). */
16375
16376 switch (inst.it_insn_type)
16377 {
16378 case OUTSIDE_IT_INSN:
16379 /* The closure of the block shall happen immediatelly,
16380 so any in_it_block () call reports the block as closed. */
16381 force_automatic_it_block_close ();
16382 break;
16383
16384 case INSIDE_IT_INSN:
16385 case INSIDE_IT_LAST_INSN:
16386 case IF_INSIDE_IT_LAST_INSN:
16387 now_it.block_length++;
16388
16389 if (now_it.block_length > 4
16390 || !now_it_compatible (inst.cond))
16391 {
16392 force_automatic_it_block_close ();
16393 if (inst.it_insn_type != IF_INSIDE_IT_LAST_INSN)
16394 new_automatic_it_block (inst.cond);
16395 }
16396 else
16397 {
5a01bb1d 16398 now_it.insn_cond = TRUE;
e07e6e58
NC
16399 now_it_add_mask (inst.cond);
16400 }
16401
16402 if (now_it.state == AUTOMATIC_IT_BLOCK
16403 && (inst.it_insn_type == INSIDE_IT_LAST_INSN
16404 || inst.it_insn_type == IF_INSIDE_IT_LAST_INSN))
16405 close_automatic_it_block ();
16406 break;
16407
16408 case NEUTRAL_IT_INSN:
16409 now_it.block_length++;
5a01bb1d 16410 now_it.insn_cond = TRUE;
e07e6e58
NC
16411
16412 if (now_it.block_length > 4)
16413 force_automatic_it_block_close ();
16414 else
16415 now_it_add_mask (now_it.cc & 1);
16416 break;
16417
16418 case IT_INSN:
16419 close_automatic_it_block ();
16420 now_it.state = MANUAL_IT_BLOCK;
16421 break;
16422 }
16423 break;
16424
16425 case MANUAL_IT_BLOCK:
16426 {
16427 /* Check conditional suffixes. */
16428 const int cond = now_it.cc ^ ((now_it.mask >> 4) & 1) ^ 1;
16429 int is_last;
16430 now_it.mask <<= 1;
16431 now_it.mask &= 0x1f;
16432 is_last = (now_it.mask == 0x10);
5a01bb1d 16433 now_it.insn_cond = TRUE;
e07e6e58
NC
16434
16435 switch (inst.it_insn_type)
16436 {
16437 case OUTSIDE_IT_INSN:
16438 inst.error = BAD_NOT_IT;
16439 return FAIL;
16440
16441 case INSIDE_IT_INSN:
16442 if (cond != inst.cond)
16443 {
16444 inst.error = BAD_IT_COND;
16445 return FAIL;
16446 }
16447 break;
16448
16449 case INSIDE_IT_LAST_INSN:
16450 case IF_INSIDE_IT_LAST_INSN:
16451 if (cond != inst.cond)
16452 {
16453 inst.error = BAD_IT_COND;
16454 return FAIL;
16455 }
16456 if (!is_last)
16457 {
16458 inst.error = BAD_BRANCH;
16459 return FAIL;
16460 }
16461 break;
16462
16463 case NEUTRAL_IT_INSN:
16464 /* The BKPT instruction is unconditional even in an IT block. */
16465 break;
16466
16467 case IT_INSN:
16468 inst.error = BAD_IT_IT;
16469 return FAIL;
16470 }
16471 }
16472 break;
16473 }
16474
16475 return SUCCESS;
16476}
16477
5a01bb1d
MGD
16478struct depr_insn_mask
16479{
16480 unsigned long pattern;
16481 unsigned long mask;
16482 const char* description;
16483};
16484
16485/* List of 16-bit instruction patterns deprecated in an IT block in
16486 ARMv8. */
16487static const struct depr_insn_mask depr_it_insns[] = {
16488 { 0xc000, 0xc000, N_("Short branches, Undefined, SVC, LDM/STM") },
16489 { 0xb000, 0xb000, N_("Miscellaneous 16-bit instructions") },
16490 { 0xa000, 0xb800, N_("ADR") },
16491 { 0x4800, 0xf800, N_("Literal loads") },
16492 { 0x4478, 0xf478, N_("Hi-register ADD, MOV, CMP, BX, BLX using pc") },
16493 { 0x4487, 0xfc87, N_("Hi-register ADD, MOV, CMP using pc") },
16494 { 0, 0, NULL }
16495};
16496
e07e6e58
NC
16497static void
16498it_fsm_post_encode (void)
16499{
16500 int is_last;
16501
16502 if (!now_it.state_handled)
16503 handle_it_state ();
16504
5a01bb1d
MGD
16505 if (now_it.insn_cond
16506 && !now_it.warn_deprecated
16507 && warn_on_deprecated
16508 && ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v8))
16509 {
16510 if (inst.instruction >= 0x10000)
16511 {
16512 as_warn (_("it blocks containing wide Thumb instructions are "
16513 "deprecated in ARMv8"));
16514 now_it.warn_deprecated = TRUE;
16515 }
16516 else
16517 {
16518 const struct depr_insn_mask *p = depr_it_insns;
16519
16520 while (p->mask != 0)
16521 {
16522 if ((inst.instruction & p->mask) == p->pattern)
16523 {
16524 as_warn (_("it blocks containing 16-bit Thumb intsructions "
16525 "of the following class are deprecated in ARMv8: "
16526 "%s"), p->description);
16527 now_it.warn_deprecated = TRUE;
16528 break;
16529 }
16530
16531 ++p;
16532 }
16533 }
16534
16535 if (now_it.block_length > 1)
16536 {
16537 as_warn (_("it blocks of more than one conditional instruction are "
16538 "deprecated in ARMv8"));
16539 now_it.warn_deprecated = TRUE;
16540 }
16541 }
16542
e07e6e58
NC
16543 is_last = (now_it.mask == 0x10);
16544 if (is_last)
16545 {
16546 now_it.state = OUTSIDE_IT_BLOCK;
16547 now_it.mask = 0;
16548 }
16549}
16550
16551static void
16552force_automatic_it_block_close (void)
16553{
16554 if (now_it.state == AUTOMATIC_IT_BLOCK)
16555 {
16556 close_automatic_it_block ();
16557 now_it.state = OUTSIDE_IT_BLOCK;
16558 now_it.mask = 0;
16559 }
16560}
16561
16562static int
16563in_it_block (void)
16564{
16565 if (!now_it.state_handled)
16566 handle_it_state ();
16567
16568 return now_it.state != OUTSIDE_IT_BLOCK;
16569}
16570
c19d1205
ZW
16571void
16572md_assemble (char *str)
b99bd4ef 16573{
c19d1205
ZW
16574 char *p = str;
16575 const struct asm_opcode * opcode;
b99bd4ef 16576
c19d1205
ZW
16577 /* Align the previous label if needed. */
16578 if (last_label_seen != NULL)
b99bd4ef 16579 {
c19d1205
ZW
16580 symbol_set_frag (last_label_seen, frag_now);
16581 S_SET_VALUE (last_label_seen, (valueT) frag_now_fix ());
16582 S_SET_SEGMENT (last_label_seen, now_seg);
b99bd4ef
NC
16583 }
16584
c19d1205
ZW
16585 memset (&inst, '\0', sizeof (inst));
16586 inst.reloc.type = BFD_RELOC_UNUSED;
b99bd4ef 16587
c19d1205
ZW
16588 opcode = opcode_lookup (&p);
16589 if (!opcode)
b99bd4ef 16590 {
c19d1205 16591 /* It wasn't an instruction, but it might be a register alias of
dcbf9037 16592 the form alias .req reg, or a Neon .dn/.qn directive. */
c921be7d
NC
16593 if (! create_register_alias (str, p)
16594 && ! create_neon_reg_alias (str, p))
c19d1205 16595 as_bad (_("bad instruction `%s'"), str);
b99bd4ef 16596
b99bd4ef
NC
16597 return;
16598 }
16599
278df34e 16600 if (warn_on_deprecated && opcode->tag == OT_cinfix3_deprecated)
088fa78e
KH
16601 as_warn (_("s suffix on comparison instruction is deprecated"));
16602
037e8744
JB
16603 /* The value which unconditional instructions should have in place of the
16604 condition field. */
16605 inst.uncond_value = (opcode->tag == OT_csuffixF) ? 0xf : -1;
16606
c19d1205 16607 if (thumb_mode)
b99bd4ef 16608 {
e74cfd16 16609 arm_feature_set variant;
8f06b2d8
PB
16610
16611 variant = cpu_variant;
16612 /* Only allow coprocessor instructions on Thumb-2 capable devices. */
e74cfd16
PB
16613 if (!ARM_CPU_HAS_FEATURE (variant, arm_arch_t2))
16614 ARM_CLEAR_FEATURE (variant, variant, fpu_any_hard);
c19d1205 16615 /* Check that this instruction is supported for this CPU. */
62b3e311
PB
16616 if (!opcode->tvariant
16617 || (thumb_mode == 1
16618 && !ARM_CPU_HAS_FEATURE (variant, *opcode->tvariant)))
b99bd4ef 16619 {
bf3eeda7 16620 as_bad (_("selected processor does not support Thumb mode `%s'"), str);
b99bd4ef
NC
16621 return;
16622 }
c19d1205
ZW
16623 if (inst.cond != COND_ALWAYS && !unified_syntax
16624 && opcode->tencode != do_t_branch)
b99bd4ef 16625 {
c19d1205 16626 as_bad (_("Thumb does not support conditional execution"));
b99bd4ef
NC
16627 return;
16628 }
16629
752d5da4 16630 if (!ARM_CPU_HAS_FEATURE (variant, arm_ext_v6t2))
076d447c 16631 {
7e806470 16632 if (opcode->tencode != do_t_blx && opcode->tencode != do_t_branch23
752d5da4
NC
16633 && !(ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_msr)
16634 || ARM_CPU_HAS_FEATURE(*opcode->tvariant, arm_ext_barrier)))
16635 {
16636 /* Two things are addressed here.
16637 1) Implicit require narrow instructions on Thumb-1.
16638 This avoids relaxation accidentally introducing Thumb-2
16639 instructions.
16640 2) Reject wide instructions in non Thumb-2 cores. */
16641 if (inst.size_req == 0)
16642 inst.size_req = 2;
16643 else if (inst.size_req == 4)
16644 {
bf3eeda7 16645 as_bad (_("selected processor does not support Thumb-2 mode `%s'"), str);
752d5da4
NC
16646 return;
16647 }
16648 }
076d447c
PB
16649 }
16650
c19d1205
ZW
16651 inst.instruction = opcode->tvalue;
16652
5be8be5d 16653 if (!parse_operands (p, opcode->operands, /*thumb=*/TRUE))
e07e6e58
NC
16654 {
16655 /* Prepare the it_insn_type for those encodings that don't set
16656 it. */
16657 it_fsm_pre_encode ();
c19d1205 16658
e07e6e58
NC
16659 opcode->tencode ();
16660
16661 it_fsm_post_encode ();
16662 }
e27ec89e 16663
0110f2b8 16664 if (!(inst.error || inst.relax))
b99bd4ef 16665 {
9c2799c2 16666 gas_assert (inst.instruction < 0xe800 || inst.instruction > 0xffff);
c19d1205
ZW
16667 inst.size = (inst.instruction > 0xffff ? 4 : 2);
16668 if (inst.size_req && inst.size_req != inst.size)
b99bd4ef 16669 {
c19d1205 16670 as_bad (_("cannot honor width suffix -- `%s'"), str);
b99bd4ef
NC
16671 return;
16672 }
16673 }
076d447c
PB
16674
16675 /* Something has gone badly wrong if we try to relax a fixed size
16676 instruction. */
9c2799c2 16677 gas_assert (inst.size_req == 0 || !inst.relax);
076d447c 16678
e74cfd16
PB
16679 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
16680 *opcode->tvariant);
ee065d83 16681 /* Many Thumb-2 instructions also have Thumb-1 variants, so explicitly
708587a4 16682 set those bits when Thumb-2 32-bit instructions are seen. ie.
7e806470 16683 anything other than bl/blx and v6-M instructions.
ee065d83 16684 This is overly pessimistic for relaxable instructions. */
7e806470
PB
16685 if (((inst.size == 4 && (inst.instruction & 0xf800e800) != 0xf000e800)
16686 || inst.relax)
e07e6e58
NC
16687 && !(ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_msr)
16688 || ARM_CPU_HAS_FEATURE (*opcode->tvariant, arm_ext_barrier)))
e74cfd16
PB
16689 ARM_MERGE_FEATURE_SETS (thumb_arch_used, thumb_arch_used,
16690 arm_ext_v6t2);
cd000bff 16691
88714cb8
DG
16692 check_neon_suffixes;
16693
cd000bff 16694 if (!inst.error)
c877a2f2
NC
16695 {
16696 mapping_state (MAP_THUMB);
16697 }
c19d1205 16698 }
3e9e4fcf 16699 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
c19d1205 16700 {
845b51d6
PB
16701 bfd_boolean is_bx;
16702
16703 /* bx is allowed on v5 cores, and sometimes on v4 cores. */
16704 is_bx = (opcode->aencode == do_bx);
16705
c19d1205 16706 /* Check that this instruction is supported for this CPU. */
845b51d6
PB
16707 if (!(is_bx && fix_v4bx)
16708 && !(opcode->avariant &&
16709 ARM_CPU_HAS_FEATURE (cpu_variant, *opcode->avariant)))
b99bd4ef 16710 {
bf3eeda7 16711 as_bad (_("selected processor does not support ARM mode `%s'"), str);
c19d1205 16712 return;
b99bd4ef 16713 }
c19d1205 16714 if (inst.size_req)
b99bd4ef 16715 {
c19d1205
ZW
16716 as_bad (_("width suffixes are invalid in ARM mode -- `%s'"), str);
16717 return;
b99bd4ef
NC
16718 }
16719
c19d1205
ZW
16720 inst.instruction = opcode->avalue;
16721 if (opcode->tag == OT_unconditionalF)
16722 inst.instruction |= 0xF << 28;
16723 else
16724 inst.instruction |= inst.cond << 28;
16725 inst.size = INSN_SIZE;
5be8be5d 16726 if (!parse_operands (p, opcode->operands, /*thumb=*/FALSE))
e07e6e58
NC
16727 {
16728 it_fsm_pre_encode ();
16729 opcode->aencode ();
16730 it_fsm_post_encode ();
16731 }
ee065d83
PB
16732 /* Arm mode bx is marked as both v4T and v5 because it's still required
16733 on a hypothetical non-thumb v5 core. */
845b51d6 16734 if (is_bx)
e74cfd16 16735 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used, arm_ext_v4t);
ee065d83 16736 else
e74cfd16
PB
16737 ARM_MERGE_FEATURE_SETS (arm_arch_used, arm_arch_used,
16738 *opcode->avariant);
88714cb8
DG
16739
16740 check_neon_suffixes;
16741
cd000bff 16742 if (!inst.error)
c877a2f2
NC
16743 {
16744 mapping_state (MAP_ARM);
16745 }
b99bd4ef 16746 }
3e9e4fcf
JB
16747 else
16748 {
16749 as_bad (_("attempt to use an ARM instruction on a Thumb-only processor "
16750 "-- `%s'"), str);
16751 return;
16752 }
c19d1205
ZW
16753 output_inst (str);
16754}
b99bd4ef 16755
e07e6e58
NC
16756static void
16757check_it_blocks_finished (void)
16758{
16759#ifdef OBJ_ELF
16760 asection *sect;
16761
16762 for (sect = stdoutput->sections; sect != NULL; sect = sect->next)
16763 if (seg_info (sect)->tc_segment_info_data.current_it.state
16764 == MANUAL_IT_BLOCK)
16765 {
16766 as_warn (_("section '%s' finished with an open IT block."),
16767 sect->name);
16768 }
16769#else
16770 if (now_it.state == MANUAL_IT_BLOCK)
16771 as_warn (_("file finished with an open IT block."));
16772#endif
16773}
16774
c19d1205
ZW
16775/* Various frobbings of labels and their addresses. */
16776
16777void
16778arm_start_line_hook (void)
16779{
16780 last_label_seen = NULL;
b99bd4ef
NC
16781}
16782
c19d1205
ZW
16783void
16784arm_frob_label (symbolS * sym)
b99bd4ef 16785{
c19d1205 16786 last_label_seen = sym;
b99bd4ef 16787
c19d1205 16788 ARM_SET_THUMB (sym, thumb_mode);
b99bd4ef 16789
c19d1205
ZW
16790#if defined OBJ_COFF || defined OBJ_ELF
16791 ARM_SET_INTERWORK (sym, support_interwork);
16792#endif
b99bd4ef 16793
e07e6e58
NC
16794 force_automatic_it_block_close ();
16795
5f4273c7 16796 /* Note - do not allow local symbols (.Lxxx) to be labelled
c19d1205
ZW
16797 as Thumb functions. This is because these labels, whilst
16798 they exist inside Thumb code, are not the entry points for
16799 possible ARM->Thumb calls. Also, these labels can be used
16800 as part of a computed goto or switch statement. eg gcc
16801 can generate code that looks like this:
b99bd4ef 16802
c19d1205
ZW
16803 ldr r2, [pc, .Laaa]
16804 lsl r3, r3, #2
16805 ldr r2, [r3, r2]
16806 mov pc, r2
b99bd4ef 16807
c19d1205
ZW
16808 .Lbbb: .word .Lxxx
16809 .Lccc: .word .Lyyy
16810 ..etc...
16811 .Laaa: .word Lbbb
b99bd4ef 16812
c19d1205
ZW
16813 The first instruction loads the address of the jump table.
16814 The second instruction converts a table index into a byte offset.
16815 The third instruction gets the jump address out of the table.
16816 The fourth instruction performs the jump.
b99bd4ef 16817
c19d1205
ZW
16818 If the address stored at .Laaa is that of a symbol which has the
16819 Thumb_Func bit set, then the linker will arrange for this address
16820 to have the bottom bit set, which in turn would mean that the
16821 address computation performed by the third instruction would end
16822 up with the bottom bit set. Since the ARM is capable of unaligned
16823 word loads, the instruction would then load the incorrect address
16824 out of the jump table, and chaos would ensue. */
16825 if (label_is_thumb_function_name
16826 && (S_GET_NAME (sym)[0] != '.' || S_GET_NAME (sym)[1] != 'L')
16827 && (bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE) != 0)
b99bd4ef 16828 {
c19d1205
ZW
16829 /* When the address of a Thumb function is taken the bottom
16830 bit of that address should be set. This will allow
16831 interworking between Arm and Thumb functions to work
16832 correctly. */
b99bd4ef 16833
c19d1205 16834 THUMB_SET_FUNC (sym, 1);
b99bd4ef 16835
c19d1205 16836 label_is_thumb_function_name = FALSE;
b99bd4ef 16837 }
07a53e5c 16838
07a53e5c 16839 dwarf2_emit_label (sym);
b99bd4ef
NC
16840}
16841
c921be7d 16842bfd_boolean
c19d1205 16843arm_data_in_code (void)
b99bd4ef 16844{
c19d1205 16845 if (thumb_mode && ! strncmp (input_line_pointer + 1, "data:", 5))
b99bd4ef 16846 {
c19d1205
ZW
16847 *input_line_pointer = '/';
16848 input_line_pointer += 5;
16849 *input_line_pointer = 0;
c921be7d 16850 return TRUE;
b99bd4ef
NC
16851 }
16852
c921be7d 16853 return FALSE;
b99bd4ef
NC
16854}
16855
c19d1205
ZW
16856char *
16857arm_canonicalize_symbol_name (char * name)
b99bd4ef 16858{
c19d1205 16859 int len;
b99bd4ef 16860
c19d1205
ZW
16861 if (thumb_mode && (len = strlen (name)) > 5
16862 && streq (name + len - 5, "/data"))
16863 *(name + len - 5) = 0;
b99bd4ef 16864
c19d1205 16865 return name;
b99bd4ef 16866}
c19d1205
ZW
16867\f
16868/* Table of all register names defined by default. The user can
16869 define additional names with .req. Note that all register names
16870 should appear in both upper and lowercase variants. Some registers
16871 also have mixed-case names. */
b99bd4ef 16872
dcbf9037 16873#define REGDEF(s,n,t) { #s, n, REG_TYPE_##t, TRUE, 0 }
c19d1205 16874#define REGNUM(p,n,t) REGDEF(p##n, n, t)
5287ad62 16875#define REGNUM2(p,n,t) REGDEF(p##n, 2 * n, t)
c19d1205
ZW
16876#define REGSET(p,t) \
16877 REGNUM(p, 0,t), REGNUM(p, 1,t), REGNUM(p, 2,t), REGNUM(p, 3,t), \
16878 REGNUM(p, 4,t), REGNUM(p, 5,t), REGNUM(p, 6,t), REGNUM(p, 7,t), \
16879 REGNUM(p, 8,t), REGNUM(p, 9,t), REGNUM(p,10,t), REGNUM(p,11,t), \
16880 REGNUM(p,12,t), REGNUM(p,13,t), REGNUM(p,14,t), REGNUM(p,15,t)
5287ad62
JB
16881#define REGSETH(p,t) \
16882 REGNUM(p,16,t), REGNUM(p,17,t), REGNUM(p,18,t), REGNUM(p,19,t), \
16883 REGNUM(p,20,t), REGNUM(p,21,t), REGNUM(p,22,t), REGNUM(p,23,t), \
16884 REGNUM(p,24,t), REGNUM(p,25,t), REGNUM(p,26,t), REGNUM(p,27,t), \
16885 REGNUM(p,28,t), REGNUM(p,29,t), REGNUM(p,30,t), REGNUM(p,31,t)
16886#define REGSET2(p,t) \
16887 REGNUM2(p, 0,t), REGNUM2(p, 1,t), REGNUM2(p, 2,t), REGNUM2(p, 3,t), \
16888 REGNUM2(p, 4,t), REGNUM2(p, 5,t), REGNUM2(p, 6,t), REGNUM2(p, 7,t), \
16889 REGNUM2(p, 8,t), REGNUM2(p, 9,t), REGNUM2(p,10,t), REGNUM2(p,11,t), \
16890 REGNUM2(p,12,t), REGNUM2(p,13,t), REGNUM2(p,14,t), REGNUM2(p,15,t)
90ec0d68
MGD
16891#define SPLRBANK(base,bank,t) \
16892 REGDEF(lr_##bank, 768|((base+0)<<16), t), \
16893 REGDEF(sp_##bank, 768|((base+1)<<16), t), \
16894 REGDEF(spsr_##bank, 768|(base<<16)|SPSR_BIT, t), \
16895 REGDEF(LR_##bank, 768|((base+0)<<16), t), \
16896 REGDEF(SP_##bank, 768|((base+1)<<16), t), \
16897 REGDEF(SPSR_##bank, 768|(base<<16)|SPSR_BIT, t)
7ed4c4c5 16898
c19d1205 16899static const struct reg_entry reg_names[] =
7ed4c4c5 16900{
c19d1205
ZW
16901 /* ARM integer registers. */
16902 REGSET(r, RN), REGSET(R, RN),
7ed4c4c5 16903
c19d1205
ZW
16904 /* ATPCS synonyms. */
16905 REGDEF(a1,0,RN), REGDEF(a2,1,RN), REGDEF(a3, 2,RN), REGDEF(a4, 3,RN),
16906 REGDEF(v1,4,RN), REGDEF(v2,5,RN), REGDEF(v3, 6,RN), REGDEF(v4, 7,RN),
16907 REGDEF(v5,8,RN), REGDEF(v6,9,RN), REGDEF(v7,10,RN), REGDEF(v8,11,RN),
7ed4c4c5 16908
c19d1205
ZW
16909 REGDEF(A1,0,RN), REGDEF(A2,1,RN), REGDEF(A3, 2,RN), REGDEF(A4, 3,RN),
16910 REGDEF(V1,4,RN), REGDEF(V2,5,RN), REGDEF(V3, 6,RN), REGDEF(V4, 7,RN),
16911 REGDEF(V5,8,RN), REGDEF(V6,9,RN), REGDEF(V7,10,RN), REGDEF(V8,11,RN),
7ed4c4c5 16912
c19d1205
ZW
16913 /* Well-known aliases. */
16914 REGDEF(wr, 7,RN), REGDEF(sb, 9,RN), REGDEF(sl,10,RN), REGDEF(fp,11,RN),
16915 REGDEF(ip,12,RN), REGDEF(sp,13,RN), REGDEF(lr,14,RN), REGDEF(pc,15,RN),
16916
16917 REGDEF(WR, 7,RN), REGDEF(SB, 9,RN), REGDEF(SL,10,RN), REGDEF(FP,11,RN),
16918 REGDEF(IP,12,RN), REGDEF(SP,13,RN), REGDEF(LR,14,RN), REGDEF(PC,15,RN),
16919
16920 /* Coprocessor numbers. */
16921 REGSET(p, CP), REGSET(P, CP),
16922
16923 /* Coprocessor register numbers. The "cr" variants are for backward
16924 compatibility. */
16925 REGSET(c, CN), REGSET(C, CN),
16926 REGSET(cr, CN), REGSET(CR, CN),
16927
90ec0d68
MGD
16928 /* ARM banked registers. */
16929 REGDEF(R8_usr,512|(0<<16),RNB), REGDEF(r8_usr,512|(0<<16),RNB),
16930 REGDEF(R9_usr,512|(1<<16),RNB), REGDEF(r9_usr,512|(1<<16),RNB),
16931 REGDEF(R10_usr,512|(2<<16),RNB), REGDEF(r10_usr,512|(2<<16),RNB),
16932 REGDEF(R11_usr,512|(3<<16),RNB), REGDEF(r11_usr,512|(3<<16),RNB),
16933 REGDEF(R12_usr,512|(4<<16),RNB), REGDEF(r12_usr,512|(4<<16),RNB),
16934 REGDEF(SP_usr,512|(5<<16),RNB), REGDEF(sp_usr,512|(5<<16),RNB),
16935 REGDEF(LR_usr,512|(6<<16),RNB), REGDEF(lr_usr,512|(6<<16),RNB),
16936
16937 REGDEF(R8_fiq,512|(8<<16),RNB), REGDEF(r8_fiq,512|(8<<16),RNB),
16938 REGDEF(R9_fiq,512|(9<<16),RNB), REGDEF(r9_fiq,512|(9<<16),RNB),
16939 REGDEF(R10_fiq,512|(10<<16),RNB), REGDEF(r10_fiq,512|(10<<16),RNB),
16940 REGDEF(R11_fiq,512|(11<<16),RNB), REGDEF(r11_fiq,512|(11<<16),RNB),
16941 REGDEF(R12_fiq,512|(12<<16),RNB), REGDEF(r12_fiq,512|(12<<16),RNB),
16942 REGDEF(SP_fiq,512|(13<<16),RNB), REGDEF(SP_fiq,512|(13<<16),RNB),
16943 REGDEF(LR_fiq,512|(14<<16),RNB), REGDEF(lr_fiq,512|(14<<16),RNB),
16944 REGDEF(SPSR_fiq,512|(14<<16)|SPSR_BIT,RNB), REGDEF(spsr_fiq,512|(14<<16)|SPSR_BIT,RNB),
16945
16946 SPLRBANK(0,IRQ,RNB), SPLRBANK(0,irq,RNB),
16947 SPLRBANK(2,SVC,RNB), SPLRBANK(2,svc,RNB),
16948 SPLRBANK(4,ABT,RNB), SPLRBANK(4,abt,RNB),
16949 SPLRBANK(6,UND,RNB), SPLRBANK(6,und,RNB),
16950 SPLRBANK(12,MON,RNB), SPLRBANK(12,mon,RNB),
16951 REGDEF(elr_hyp,768|(14<<16),RNB), REGDEF(ELR_hyp,768|(14<<16),RNB),
16952 REGDEF(sp_hyp,768|(15<<16),RNB), REGDEF(SP_hyp,768|(15<<16),RNB),
fa94de6b 16953 REGDEF(spsr_hyp,768|(14<<16)|SPSR_BIT,RNB),
90ec0d68
MGD
16954 REGDEF(SPSR_hyp,768|(14<<16)|SPSR_BIT,RNB),
16955
c19d1205
ZW
16956 /* FPA registers. */
16957 REGNUM(f,0,FN), REGNUM(f,1,FN), REGNUM(f,2,FN), REGNUM(f,3,FN),
16958 REGNUM(f,4,FN), REGNUM(f,5,FN), REGNUM(f,6,FN), REGNUM(f,7, FN),
16959
16960 REGNUM(F,0,FN), REGNUM(F,1,FN), REGNUM(F,2,FN), REGNUM(F,3,FN),
16961 REGNUM(F,4,FN), REGNUM(F,5,FN), REGNUM(F,6,FN), REGNUM(F,7, FN),
16962
16963 /* VFP SP registers. */
5287ad62
JB
16964 REGSET(s,VFS), REGSET(S,VFS),
16965 REGSETH(s,VFS), REGSETH(S,VFS),
c19d1205
ZW
16966
16967 /* VFP DP Registers. */
5287ad62
JB
16968 REGSET(d,VFD), REGSET(D,VFD),
16969 /* Extra Neon DP registers. */
16970 REGSETH(d,VFD), REGSETH(D,VFD),
16971
16972 /* Neon QP registers. */
16973 REGSET2(q,NQ), REGSET2(Q,NQ),
c19d1205
ZW
16974
16975 /* VFP control registers. */
16976 REGDEF(fpsid,0,VFC), REGDEF(fpscr,1,VFC), REGDEF(fpexc,8,VFC),
16977 REGDEF(FPSID,0,VFC), REGDEF(FPSCR,1,VFC), REGDEF(FPEXC,8,VFC),
cd2cf30b
PB
16978 REGDEF(fpinst,9,VFC), REGDEF(fpinst2,10,VFC),
16979 REGDEF(FPINST,9,VFC), REGDEF(FPINST2,10,VFC),
16980 REGDEF(mvfr0,7,VFC), REGDEF(mvfr1,6,VFC),
16981 REGDEF(MVFR0,7,VFC), REGDEF(MVFR1,6,VFC),
c19d1205
ZW
16982
16983 /* Maverick DSP coprocessor registers. */
16984 REGSET(mvf,MVF), REGSET(mvd,MVD), REGSET(mvfx,MVFX), REGSET(mvdx,MVDX),
16985 REGSET(MVF,MVF), REGSET(MVD,MVD), REGSET(MVFX,MVFX), REGSET(MVDX,MVDX),
16986
16987 REGNUM(mvax,0,MVAX), REGNUM(mvax,1,MVAX),
16988 REGNUM(mvax,2,MVAX), REGNUM(mvax,3,MVAX),
16989 REGDEF(dspsc,0,DSPSC),
16990
16991 REGNUM(MVAX,0,MVAX), REGNUM(MVAX,1,MVAX),
16992 REGNUM(MVAX,2,MVAX), REGNUM(MVAX,3,MVAX),
16993 REGDEF(DSPSC,0,DSPSC),
16994
16995 /* iWMMXt data registers - p0, c0-15. */
16996 REGSET(wr,MMXWR), REGSET(wR,MMXWR), REGSET(WR, MMXWR),
16997
16998 /* iWMMXt control registers - p1, c0-3. */
16999 REGDEF(wcid, 0,MMXWC), REGDEF(wCID, 0,MMXWC), REGDEF(WCID, 0,MMXWC),
17000 REGDEF(wcon, 1,MMXWC), REGDEF(wCon, 1,MMXWC), REGDEF(WCON, 1,MMXWC),
17001 REGDEF(wcssf, 2,MMXWC), REGDEF(wCSSF, 2,MMXWC), REGDEF(WCSSF, 2,MMXWC),
17002 REGDEF(wcasf, 3,MMXWC), REGDEF(wCASF, 3,MMXWC), REGDEF(WCASF, 3,MMXWC),
17003
17004 /* iWMMXt scalar (constant/offset) registers - p1, c8-11. */
17005 REGDEF(wcgr0, 8,MMXWCG), REGDEF(wCGR0, 8,MMXWCG), REGDEF(WCGR0, 8,MMXWCG),
17006 REGDEF(wcgr1, 9,MMXWCG), REGDEF(wCGR1, 9,MMXWCG), REGDEF(WCGR1, 9,MMXWCG),
17007 REGDEF(wcgr2,10,MMXWCG), REGDEF(wCGR2,10,MMXWCG), REGDEF(WCGR2,10,MMXWCG),
17008 REGDEF(wcgr3,11,MMXWCG), REGDEF(wCGR3,11,MMXWCG), REGDEF(WCGR3,11,MMXWCG),
17009
17010 /* XScale accumulator registers. */
17011 REGNUM(acc,0,XSCALE), REGNUM(ACC,0,XSCALE),
17012};
17013#undef REGDEF
17014#undef REGNUM
17015#undef REGSET
7ed4c4c5 17016
c19d1205
ZW
17017/* Table of all PSR suffixes. Bare "CPSR" and "SPSR" are handled
17018 within psr_required_here. */
17019static const struct asm_psr psrs[] =
17020{
17021 /* Backward compatibility notation. Note that "all" is no longer
17022 truly all possible PSR bits. */
17023 {"all", PSR_c | PSR_f},
17024 {"flg", PSR_f},
17025 {"ctl", PSR_c},
17026
17027 /* Individual flags. */
17028 {"f", PSR_f},
17029 {"c", PSR_c},
17030 {"x", PSR_x},
17031 {"s", PSR_s},
59b42a0d 17032
c19d1205
ZW
17033 /* Combinations of flags. */
17034 {"fs", PSR_f | PSR_s},
17035 {"fx", PSR_f | PSR_x},
17036 {"fc", PSR_f | PSR_c},
17037 {"sf", PSR_s | PSR_f},
17038 {"sx", PSR_s | PSR_x},
17039 {"sc", PSR_s | PSR_c},
17040 {"xf", PSR_x | PSR_f},
17041 {"xs", PSR_x | PSR_s},
17042 {"xc", PSR_x | PSR_c},
17043 {"cf", PSR_c | PSR_f},
17044 {"cs", PSR_c | PSR_s},
17045 {"cx", PSR_c | PSR_x},
17046 {"fsx", PSR_f | PSR_s | PSR_x},
17047 {"fsc", PSR_f | PSR_s | PSR_c},
17048 {"fxs", PSR_f | PSR_x | PSR_s},
17049 {"fxc", PSR_f | PSR_x | PSR_c},
17050 {"fcs", PSR_f | PSR_c | PSR_s},
17051 {"fcx", PSR_f | PSR_c | PSR_x},
17052 {"sfx", PSR_s | PSR_f | PSR_x},
17053 {"sfc", PSR_s | PSR_f | PSR_c},
17054 {"sxf", PSR_s | PSR_x | PSR_f},
17055 {"sxc", PSR_s | PSR_x | PSR_c},
17056 {"scf", PSR_s | PSR_c | PSR_f},
17057 {"scx", PSR_s | PSR_c | PSR_x},
17058 {"xfs", PSR_x | PSR_f | PSR_s},
17059 {"xfc", PSR_x | PSR_f | PSR_c},
17060 {"xsf", PSR_x | PSR_s | PSR_f},
17061 {"xsc", PSR_x | PSR_s | PSR_c},
17062 {"xcf", PSR_x | PSR_c | PSR_f},
17063 {"xcs", PSR_x | PSR_c | PSR_s},
17064 {"cfs", PSR_c | PSR_f | PSR_s},
17065 {"cfx", PSR_c | PSR_f | PSR_x},
17066 {"csf", PSR_c | PSR_s | PSR_f},
17067 {"csx", PSR_c | PSR_s | PSR_x},
17068 {"cxf", PSR_c | PSR_x | PSR_f},
17069 {"cxs", PSR_c | PSR_x | PSR_s},
17070 {"fsxc", PSR_f | PSR_s | PSR_x | PSR_c},
17071 {"fscx", PSR_f | PSR_s | PSR_c | PSR_x},
17072 {"fxsc", PSR_f | PSR_x | PSR_s | PSR_c},
17073 {"fxcs", PSR_f | PSR_x | PSR_c | PSR_s},
17074 {"fcsx", PSR_f | PSR_c | PSR_s | PSR_x},
17075 {"fcxs", PSR_f | PSR_c | PSR_x | PSR_s},
17076 {"sfxc", PSR_s | PSR_f | PSR_x | PSR_c},
17077 {"sfcx", PSR_s | PSR_f | PSR_c | PSR_x},
17078 {"sxfc", PSR_s | PSR_x | PSR_f | PSR_c},
17079 {"sxcf", PSR_s | PSR_x | PSR_c | PSR_f},
17080 {"scfx", PSR_s | PSR_c | PSR_f | PSR_x},
17081 {"scxf", PSR_s | PSR_c | PSR_x | PSR_f},
17082 {"xfsc", PSR_x | PSR_f | PSR_s | PSR_c},
17083 {"xfcs", PSR_x | PSR_f | PSR_c | PSR_s},
17084 {"xsfc", PSR_x | PSR_s | PSR_f | PSR_c},
17085 {"xscf", PSR_x | PSR_s | PSR_c | PSR_f},
17086 {"xcfs", PSR_x | PSR_c | PSR_f | PSR_s},
17087 {"xcsf", PSR_x | PSR_c | PSR_s | PSR_f},
17088 {"cfsx", PSR_c | PSR_f | PSR_s | PSR_x},
17089 {"cfxs", PSR_c | PSR_f | PSR_x | PSR_s},
17090 {"csfx", PSR_c | PSR_s | PSR_f | PSR_x},
17091 {"csxf", PSR_c | PSR_s | PSR_x | PSR_f},
17092 {"cxfs", PSR_c | PSR_x | PSR_f | PSR_s},
17093 {"cxsf", PSR_c | PSR_x | PSR_s | PSR_f},
17094};
17095
62b3e311
PB
17096/* Table of V7M psr names. */
17097static const struct asm_psr v7m_psrs[] =
17098{
2b744c99
PB
17099 {"apsr", 0 }, {"APSR", 0 },
17100 {"iapsr", 1 }, {"IAPSR", 1 },
17101 {"eapsr", 2 }, {"EAPSR", 2 },
17102 {"psr", 3 }, {"PSR", 3 },
17103 {"xpsr", 3 }, {"XPSR", 3 }, {"xPSR", 3 },
17104 {"ipsr", 5 }, {"IPSR", 5 },
17105 {"epsr", 6 }, {"EPSR", 6 },
17106 {"iepsr", 7 }, {"IEPSR", 7 },
17107 {"msp", 8 }, {"MSP", 8 },
17108 {"psp", 9 }, {"PSP", 9 },
17109 {"primask", 16}, {"PRIMASK", 16},
17110 {"basepri", 17}, {"BASEPRI", 17},
00bbc0bd
NC
17111 {"basepri_max", 18}, {"BASEPRI_MAX", 18},
17112 {"basepri_max", 18}, {"BASEPRI_MASK", 18}, /* Typo, preserved for backwards compatibility. */
2b744c99
PB
17113 {"faultmask", 19}, {"FAULTMASK", 19},
17114 {"control", 20}, {"CONTROL", 20}
62b3e311
PB
17115};
17116
c19d1205
ZW
17117/* Table of all shift-in-operand names. */
17118static const struct asm_shift_name shift_names [] =
b99bd4ef 17119{
c19d1205
ZW
17120 { "asl", SHIFT_LSL }, { "ASL", SHIFT_LSL },
17121 { "lsl", SHIFT_LSL }, { "LSL", SHIFT_LSL },
17122 { "lsr", SHIFT_LSR }, { "LSR", SHIFT_LSR },
17123 { "asr", SHIFT_ASR }, { "ASR", SHIFT_ASR },
17124 { "ror", SHIFT_ROR }, { "ROR", SHIFT_ROR },
17125 { "rrx", SHIFT_RRX }, { "RRX", SHIFT_RRX }
17126};
b99bd4ef 17127
c19d1205
ZW
17128/* Table of all explicit relocation names. */
17129#ifdef OBJ_ELF
17130static struct reloc_entry reloc_names[] =
17131{
17132 { "got", BFD_RELOC_ARM_GOT32 }, { "GOT", BFD_RELOC_ARM_GOT32 },
17133 { "gotoff", BFD_RELOC_ARM_GOTOFF }, { "GOTOFF", BFD_RELOC_ARM_GOTOFF },
17134 { "plt", BFD_RELOC_ARM_PLT32 }, { "PLT", BFD_RELOC_ARM_PLT32 },
17135 { "target1", BFD_RELOC_ARM_TARGET1 }, { "TARGET1", BFD_RELOC_ARM_TARGET1 },
17136 { "target2", BFD_RELOC_ARM_TARGET2 }, { "TARGET2", BFD_RELOC_ARM_TARGET2 },
17137 { "sbrel", BFD_RELOC_ARM_SBREL32 }, { "SBREL", BFD_RELOC_ARM_SBREL32 },
17138 { "tlsgd", BFD_RELOC_ARM_TLS_GD32}, { "TLSGD", BFD_RELOC_ARM_TLS_GD32},
17139 { "tlsldm", BFD_RELOC_ARM_TLS_LDM32}, { "TLSLDM", BFD_RELOC_ARM_TLS_LDM32},
17140 { "tlsldo", BFD_RELOC_ARM_TLS_LDO32}, { "TLSLDO", BFD_RELOC_ARM_TLS_LDO32},
17141 { "gottpoff",BFD_RELOC_ARM_TLS_IE32}, { "GOTTPOFF",BFD_RELOC_ARM_TLS_IE32},
b43420e6 17142 { "tpoff", BFD_RELOC_ARM_TLS_LE32}, { "TPOFF", BFD_RELOC_ARM_TLS_LE32},
0855e32b
NS
17143 { "got_prel", BFD_RELOC_ARM_GOT_PREL}, { "GOT_PREL", BFD_RELOC_ARM_GOT_PREL},
17144 { "tlsdesc", BFD_RELOC_ARM_TLS_GOTDESC},
17145 { "TLSDESC", BFD_RELOC_ARM_TLS_GOTDESC},
17146 { "tlscall", BFD_RELOC_ARM_TLS_CALL},
17147 { "TLSCALL", BFD_RELOC_ARM_TLS_CALL},
17148 { "tlsdescseq", BFD_RELOC_ARM_TLS_DESCSEQ},
17149 { "TLSDESCSEQ", BFD_RELOC_ARM_TLS_DESCSEQ}
c19d1205
ZW
17150};
17151#endif
b99bd4ef 17152
c19d1205
ZW
17153/* Table of all conditional affixes. 0xF is not defined as a condition code. */
17154static const struct asm_cond conds[] =
17155{
17156 {"eq", 0x0},
17157 {"ne", 0x1},
17158 {"cs", 0x2}, {"hs", 0x2},
17159 {"cc", 0x3}, {"ul", 0x3}, {"lo", 0x3},
17160 {"mi", 0x4},
17161 {"pl", 0x5},
17162 {"vs", 0x6},
17163 {"vc", 0x7},
17164 {"hi", 0x8},
17165 {"ls", 0x9},
17166 {"ge", 0xa},
17167 {"lt", 0xb},
17168 {"gt", 0xc},
17169 {"le", 0xd},
17170 {"al", 0xe}
17171};
bfae80f2 17172
62b3e311
PB
17173static struct asm_barrier_opt barrier_opt_names[] =
17174{
52e7f43d
RE
17175 { "sy", 0xf }, { "SY", 0xf },
17176 { "un", 0x7 }, { "UN", 0x7 },
17177 { "st", 0xe }, { "ST", 0xe },
17178 { "unst", 0x6 }, { "UNST", 0x6 },
17179 { "ish", 0xb }, { "ISH", 0xb },
17180 { "sh", 0xb }, { "SH", 0xb },
17181 { "ishst", 0xa }, { "ISHST", 0xa },
17182 { "shst", 0xa }, { "SHST", 0xa },
17183 { "nsh", 0x7 }, { "NSH", 0x7 },
17184 { "nshst", 0x6 }, { "NSHST", 0x6 },
17185 { "osh", 0x3 }, { "OSH", 0x3 },
17186 { "oshst", 0x2 }, { "OSHST", 0x2 }
62b3e311
PB
17187};
17188
c19d1205
ZW
17189/* Table of ARM-format instructions. */
17190
17191/* Macros for gluing together operand strings. N.B. In all cases
17192 other than OPS0, the trailing OP_stop comes from default
17193 zero-initialization of the unspecified elements of the array. */
17194#define OPS0() { OP_stop, }
17195#define OPS1(a) { OP_##a, }
17196#define OPS2(a,b) { OP_##a,OP_##b, }
17197#define OPS3(a,b,c) { OP_##a,OP_##b,OP_##c, }
17198#define OPS4(a,b,c,d) { OP_##a,OP_##b,OP_##c,OP_##d, }
17199#define OPS5(a,b,c,d,e) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e, }
17200#define OPS6(a,b,c,d,e,f) { OP_##a,OP_##b,OP_##c,OP_##d,OP_##e,OP_##f, }
17201
5be8be5d
DG
17202/* These macros are similar to the OPSn, but do not prepend the OP_ prefix.
17203 This is useful when mixing operands for ARM and THUMB, i.e. using the
17204 MIX_ARM_THUMB_OPERANDS macro.
17205 In order to use these macros, prefix the number of operands with _
17206 e.g. _3. */
17207#define OPS_1(a) { a, }
17208#define OPS_2(a,b) { a,b, }
17209#define OPS_3(a,b,c) { a,b,c, }
17210#define OPS_4(a,b,c,d) { a,b,c,d, }
17211#define OPS_5(a,b,c,d,e) { a,b,c,d,e, }
17212#define OPS_6(a,b,c,d,e,f) { a,b,c,d,e,f, }
17213
c19d1205
ZW
17214/* These macros abstract out the exact format of the mnemonic table and
17215 save some repeated characters. */
17216
17217/* The normal sort of mnemonic; has a Thumb variant; takes a conditional suffix. */
17218#define TxCE(mnem, op, top, nops, ops, ae, te) \
21d799b5 17219 { mnem, OPS##nops ops, OT_csuffix, 0x##op, top, ARM_VARIANT, \
1887dd22 17220 THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
17221
17222/* Two variants of the above - TCE for a numeric Thumb opcode, tCE for
17223 a T_MNEM_xyz enumerator. */
17224#define TCE(mnem, aop, top, nops, ops, ae, te) \
e07e6e58 17225 TxCE (mnem, aop, 0x##top, nops, ops, ae, te)
c19d1205 17226#define tCE(mnem, aop, top, nops, ops, ae, te) \
21d799b5 17227 TxCE (mnem, aop, T_MNEM##top, nops, ops, ae, te)
c19d1205
ZW
17228
17229/* Second most common sort of mnemonic: has a Thumb variant, takes a conditional
17230 infix after the third character. */
17231#define TxC3(mnem, op, top, nops, ops, ae, te) \
21d799b5 17232 { mnem, OPS##nops ops, OT_cinfix3, 0x##op, top, ARM_VARIANT, \
1887dd22 17233 THUMB_VARIANT, do_##ae, do_##te }
088fa78e 17234#define TxC3w(mnem, op, top, nops, ops, ae, te) \
21d799b5 17235 { mnem, OPS##nops ops, OT_cinfix3_deprecated, 0x##op, top, ARM_VARIANT, \
088fa78e 17236 THUMB_VARIANT, do_##ae, do_##te }
c19d1205 17237#define TC3(mnem, aop, top, nops, ops, ae, te) \
e07e6e58 17238 TxC3 (mnem, aop, 0x##top, nops, ops, ae, te)
088fa78e 17239#define TC3w(mnem, aop, top, nops, ops, ae, te) \
e07e6e58 17240 TxC3w (mnem, aop, 0x##top, nops, ops, ae, te)
c19d1205 17241#define tC3(mnem, aop, top, nops, ops, ae, te) \
21d799b5 17242 TxC3 (mnem, aop, T_MNEM##top, nops, ops, ae, te)
088fa78e 17243#define tC3w(mnem, aop, top, nops, ops, ae, te) \
21d799b5 17244 TxC3w (mnem, aop, T_MNEM##top, nops, ops, ae, te)
c19d1205
ZW
17245
17246/* Mnemonic with a conditional infix in an unusual place. Each and every variant has to
17247 appear in the condition table. */
17248#define TxCM_(m1, m2, m3, op, top, nops, ops, ae, te) \
21d799b5 17249 { m1 #m2 m3, OPS##nops ops, sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
1887dd22 17250 0x##op, top, ARM_VARIANT, THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
17251
17252#define TxCM(m1, m2, op, top, nops, ops, ae, te) \
e07e6e58
NC
17253 TxCM_ (m1, , m2, op, top, nops, ops, ae, te), \
17254 TxCM_ (m1, eq, m2, op, top, nops, ops, ae, te), \
17255 TxCM_ (m1, ne, m2, op, top, nops, ops, ae, te), \
17256 TxCM_ (m1, cs, m2, op, top, nops, ops, ae, te), \
17257 TxCM_ (m1, hs, m2, op, top, nops, ops, ae, te), \
17258 TxCM_ (m1, cc, m2, op, top, nops, ops, ae, te), \
17259 TxCM_ (m1, ul, m2, op, top, nops, ops, ae, te), \
17260 TxCM_ (m1, lo, m2, op, top, nops, ops, ae, te), \
17261 TxCM_ (m1, mi, m2, op, top, nops, ops, ae, te), \
17262 TxCM_ (m1, pl, m2, op, top, nops, ops, ae, te), \
17263 TxCM_ (m1, vs, m2, op, top, nops, ops, ae, te), \
17264 TxCM_ (m1, vc, m2, op, top, nops, ops, ae, te), \
17265 TxCM_ (m1, hi, m2, op, top, nops, ops, ae, te), \
17266 TxCM_ (m1, ls, m2, op, top, nops, ops, ae, te), \
17267 TxCM_ (m1, ge, m2, op, top, nops, ops, ae, te), \
17268 TxCM_ (m1, lt, m2, op, top, nops, ops, ae, te), \
17269 TxCM_ (m1, gt, m2, op, top, nops, ops, ae, te), \
17270 TxCM_ (m1, le, m2, op, top, nops, ops, ae, te), \
17271 TxCM_ (m1, al, m2, op, top, nops, ops, ae, te)
c19d1205
ZW
17272
17273#define TCM(m1,m2, aop, top, nops, ops, ae, te) \
e07e6e58
NC
17274 TxCM (m1,m2, aop, 0x##top, nops, ops, ae, te)
17275#define tCM(m1,m2, aop, top, nops, ops, ae, te) \
21d799b5 17276 TxCM (m1,m2, aop, T_MNEM##top, nops, ops, ae, te)
c19d1205
ZW
17277
17278/* Mnemonic that cannot be conditionalized. The ARM condition-code
dfa9f0d5
PB
17279 field is still 0xE. Many of the Thumb variants can be executed
17280 conditionally, so this is checked separately. */
c19d1205 17281#define TUE(mnem, op, top, nops, ops, ae, te) \
21d799b5 17282 { mnem, OPS##nops ops, OT_unconditional, 0x##op, 0x##top, ARM_VARIANT, \
1887dd22 17283 THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
17284
17285/* Mnemonic that cannot be conditionalized, and bears 0xF in its ARM
17286 condition code field. */
17287#define TUF(mnem, op, top, nops, ops, ae, te) \
21d799b5 17288 { mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##top, ARM_VARIANT, \
1887dd22 17289 THUMB_VARIANT, do_##ae, do_##te }
c19d1205
ZW
17290
17291/* ARM-only variants of all the above. */
6a86118a 17292#define CE(mnem, op, nops, ops, ae) \
21d799b5 17293 { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
6a86118a
NC
17294
17295#define C3(mnem, op, nops, ops, ae) \
17296 { #mnem, OPS##nops ops, OT_cinfix3, 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17297
e3cb604e
PB
17298/* Legacy mnemonics that always have conditional infix after the third
17299 character. */
17300#define CL(mnem, op, nops, ops, ae) \
21d799b5 17301 { mnem, OPS##nops ops, OT_cinfix3_legacy, \
e3cb604e
PB
17302 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17303
8f06b2d8
PB
17304/* Coprocessor instructions. Isomorphic between Arm and Thumb-2. */
17305#define cCE(mnem, op, nops, ops, ae) \
21d799b5 17306 { mnem, OPS##nops ops, OT_csuffix, 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
8f06b2d8 17307
e3cb604e
PB
17308/* Legacy coprocessor instructions where conditional infix and conditional
17309 suffix are ambiguous. For consistency this includes all FPA instructions,
17310 not just the potentially ambiguous ones. */
17311#define cCL(mnem, op, nops, ops, ae) \
21d799b5 17312 { mnem, OPS##nops ops, OT_cinfix3_legacy, \
e3cb604e
PB
17313 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
17314
17315/* Coprocessor, takes either a suffix or a position-3 infix
17316 (for an FPA corner case). */
17317#define C3E(mnem, op, nops, ops, ae) \
21d799b5 17318 { mnem, OPS##nops ops, OT_csuf_or_in3, \
e3cb604e 17319 0x##op, 0xe##op, ARM_VARIANT, ARM_VARIANT, do_##ae, do_##ae }
8f06b2d8 17320
6a86118a 17321#define xCM_(m1, m2, m3, op, nops, ops, ae) \
21d799b5
NC
17322 { m1 #m2 m3, OPS##nops ops, \
17323 sizeof (#m2) == 1 ? OT_odd_infix_unc : OT_odd_infix_0 + sizeof (m1) - 1, \
6a86118a
NC
17324 0x##op, 0x0, ARM_VARIANT, 0, do_##ae, NULL }
17325
17326#define CM(m1, m2, op, nops, ops, ae) \
e07e6e58
NC
17327 xCM_ (m1, , m2, op, nops, ops, ae), \
17328 xCM_ (m1, eq, m2, op, nops, ops, ae), \
17329 xCM_ (m1, ne, m2, op, nops, ops, ae), \
17330 xCM_ (m1, cs, m2, op, nops, ops, ae), \
17331 xCM_ (m1, hs, m2, op, nops, ops, ae), \
17332 xCM_ (m1, cc, m2, op, nops, ops, ae), \
17333 xCM_ (m1, ul, m2, op, nops, ops, ae), \
17334 xCM_ (m1, lo, m2, op, nops, ops, ae), \
17335 xCM_ (m1, mi, m2, op, nops, ops, ae), \
17336 xCM_ (m1, pl, m2, op, nops, ops, ae), \
17337 xCM_ (m1, vs, m2, op, nops, ops, ae), \
17338 xCM_ (m1, vc, m2, op, nops, ops, ae), \
17339 xCM_ (m1, hi, m2, op, nops, ops, ae), \
17340 xCM_ (m1, ls, m2, op, nops, ops, ae), \
17341 xCM_ (m1, ge, m2, op, nops, ops, ae), \
17342 xCM_ (m1, lt, m2, op, nops, ops, ae), \
17343 xCM_ (m1, gt, m2, op, nops, ops, ae), \
17344 xCM_ (m1, le, m2, op, nops, ops, ae), \
17345 xCM_ (m1, al, m2, op, nops, ops, ae)
6a86118a
NC
17346
17347#define UE(mnem, op, nops, ops, ae) \
17348 { #mnem, OPS##nops ops, OT_unconditional, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
17349
17350#define UF(mnem, op, nops, ops, ae) \
17351 { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0, ARM_VARIANT, 0, do_##ae, NULL }
17352
5287ad62
JB
17353/* Neon data-processing. ARM versions are unconditional with cond=0xf.
17354 The Thumb and ARM variants are mostly the same (bits 0-23 and 24/28), so we
17355 use the same encoding function for each. */
17356#define NUF(mnem, op, nops, ops, enc) \
17357 { #mnem, OPS##nops ops, OT_unconditionalF, 0x##op, 0x##op, \
17358 ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17359
17360/* Neon data processing, version which indirects through neon_enc_tab for
17361 the various overloaded versions of opcodes. */
17362#define nUF(mnem, op, nops, ops, enc) \
21d799b5 17363 { #mnem, OPS##nops ops, OT_unconditionalF, N_MNEM##op, N_MNEM##op, \
5287ad62
JB
17364 ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17365
17366/* Neon insn with conditional suffix for the ARM version, non-overloaded
17367 version. */
037e8744
JB
17368#define NCE_tag(mnem, op, nops, ops, enc, tag) \
17369 { #mnem, OPS##nops ops, tag, 0x##op, 0x##op, ARM_VARIANT, \
5287ad62
JB
17370 THUMB_VARIANT, do_##enc, do_##enc }
17371
037e8744 17372#define NCE(mnem, op, nops, ops, enc) \
e07e6e58 17373 NCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
037e8744
JB
17374
17375#define NCEF(mnem, op, nops, ops, enc) \
e07e6e58 17376 NCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
037e8744 17377
5287ad62 17378/* Neon insn with conditional suffix for the ARM version, overloaded types. */
037e8744 17379#define nCE_tag(mnem, op, nops, ops, enc, tag) \
21d799b5 17380 { #mnem, OPS##nops ops, tag, N_MNEM##op, N_MNEM##op, \
5287ad62
JB
17381 ARM_VARIANT, THUMB_VARIANT, do_##enc, do_##enc }
17382
037e8744 17383#define nCE(mnem, op, nops, ops, enc) \
e07e6e58 17384 nCE_tag (mnem, op, nops, ops, enc, OT_csuffix)
037e8744
JB
17385
17386#define nCEF(mnem, op, nops, ops, enc) \
e07e6e58 17387 nCE_tag (mnem, op, nops, ops, enc, OT_csuffixF)
037e8744 17388
c19d1205
ZW
17389#define do_0 0
17390
c19d1205 17391static const struct asm_opcode insns[] =
bfae80f2 17392{
e74cfd16
PB
17393#define ARM_VARIANT &arm_ext_v1 /* Core ARM Instructions. */
17394#define THUMB_VARIANT &arm_ext_v4t
21d799b5
NC
17395 tCE("and", 0000000, _and, 3, (RR, oRR, SH), arit, t_arit3c),
17396 tC3("ands", 0100000, _ands, 3, (RR, oRR, SH), arit, t_arit3c),
17397 tCE("eor", 0200000, _eor, 3, (RR, oRR, SH), arit, t_arit3c),
17398 tC3("eors", 0300000, _eors, 3, (RR, oRR, SH), arit, t_arit3c),
17399 tCE("sub", 0400000, _sub, 3, (RR, oRR, SH), arit, t_add_sub),
17400 tC3("subs", 0500000, _subs, 3, (RR, oRR, SH), arit, t_add_sub),
17401 tCE("add", 0800000, _add, 3, (RR, oRR, SHG), arit, t_add_sub),
17402 tC3("adds", 0900000, _adds, 3, (RR, oRR, SHG), arit, t_add_sub),
17403 tCE("adc", 0a00000, _adc, 3, (RR, oRR, SH), arit, t_arit3c),
17404 tC3("adcs", 0b00000, _adcs, 3, (RR, oRR, SH), arit, t_arit3c),
17405 tCE("sbc", 0c00000, _sbc, 3, (RR, oRR, SH), arit, t_arit3),
17406 tC3("sbcs", 0d00000, _sbcs, 3, (RR, oRR, SH), arit, t_arit3),
17407 tCE("orr", 1800000, _orr, 3, (RR, oRR, SH), arit, t_arit3c),
17408 tC3("orrs", 1900000, _orrs, 3, (RR, oRR, SH), arit, t_arit3c),
17409 tCE("bic", 1c00000, _bic, 3, (RR, oRR, SH), arit, t_arit3),
17410 tC3("bics", 1d00000, _bics, 3, (RR, oRR, SH), arit, t_arit3),
c19d1205
ZW
17411
17412 /* The p-variants of tst/cmp/cmn/teq (below) are the pre-V6 mechanism
17413 for setting PSR flag bits. They are obsolete in V6 and do not
17414 have Thumb equivalents. */
21d799b5
NC
17415 tCE("tst", 1100000, _tst, 2, (RR, SH), cmp, t_mvn_tst),
17416 tC3w("tsts", 1100000, _tst, 2, (RR, SH), cmp, t_mvn_tst),
17417 CL("tstp", 110f000, 2, (RR, SH), cmp),
17418 tCE("cmp", 1500000, _cmp, 2, (RR, SH), cmp, t_mov_cmp),
17419 tC3w("cmps", 1500000, _cmp, 2, (RR, SH), cmp, t_mov_cmp),
17420 CL("cmpp", 150f000, 2, (RR, SH), cmp),
17421 tCE("cmn", 1700000, _cmn, 2, (RR, SH), cmp, t_mvn_tst),
17422 tC3w("cmns", 1700000, _cmn, 2, (RR, SH), cmp, t_mvn_tst),
17423 CL("cmnp", 170f000, 2, (RR, SH), cmp),
17424
17425 tCE("mov", 1a00000, _mov, 2, (RR, SH), mov, t_mov_cmp),
17426 tC3("movs", 1b00000, _movs, 2, (RR, SH), mov, t_mov_cmp),
17427 tCE("mvn", 1e00000, _mvn, 2, (RR, SH), mov, t_mvn_tst),
17428 tC3("mvns", 1f00000, _mvns, 2, (RR, SH), mov, t_mvn_tst),
17429
17430 tCE("ldr", 4100000, _ldr, 2, (RR, ADDRGLDR),ldst, t_ldst),
5be8be5d
DG
17431 tC3("ldrb", 4500000, _ldrb, 2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
17432 tCE("str", 4000000, _str, _2, (MIX_ARM_THUMB_OPERANDS (OP_RR,
17433 OP_RRnpc),
17434 OP_ADDRGLDR),ldst, t_ldst),
17435 tC3("strb", 4400000, _strb, 2, (RRnpc_npcsp, ADDRGLDR),ldst, t_ldst),
21d799b5
NC
17436
17437 tCE("stm", 8800000, _stmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17438 tC3("stmia", 8800000, _stmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17439 tC3("stmea", 8800000, _stmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17440 tCE("ldm", 8900000, _ldmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17441 tC3("ldmia", 8900000, _ldmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17442 tC3("ldmfd", 8900000, _ldmia, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17443
17444 TCE("swi", f000000, df00, 1, (EXPi), swi, t_swi),
17445 TCE("svc", f000000, df00, 1, (EXPi), swi, t_swi),
17446 tCE("b", a000000, _b, 1, (EXPr), branch, t_branch),
17447 TCE("bl", b000000, f000f800, 1, (EXPr), bl, t_branch23),
bfae80f2 17448
c19d1205 17449 /* Pseudo ops. */
21d799b5 17450 tCE("adr", 28f0000, _adr, 2, (RR, EXP), adr, t_adr),
2fc8bdac 17451 C3(adrl, 28f0000, 2, (RR, EXP), adrl),
21d799b5 17452 tCE("nop", 1a00000, _nop, 1, (oI255c), nop, t_nop),
c19d1205
ZW
17453
17454 /* Thumb-compatibility pseudo ops. */
21d799b5
NC
17455 tCE("lsl", 1a00000, _lsl, 3, (RR, oRR, SH), shift, t_shift),
17456 tC3("lsls", 1b00000, _lsls, 3, (RR, oRR, SH), shift, t_shift),
17457 tCE("lsr", 1a00020, _lsr, 3, (RR, oRR, SH), shift, t_shift),
17458 tC3("lsrs", 1b00020, _lsrs, 3, (RR, oRR, SH), shift, t_shift),
17459 tCE("asr", 1a00040, _asr, 3, (RR, oRR, SH), shift, t_shift),
17460 tC3("asrs", 1b00040, _asrs, 3, (RR, oRR, SH), shift, t_shift),
17461 tCE("ror", 1a00060, _ror, 3, (RR, oRR, SH), shift, t_shift),
17462 tC3("rors", 1b00060, _rors, 3, (RR, oRR, SH), shift, t_shift),
17463 tCE("neg", 2600000, _neg, 2, (RR, RR), rd_rn, t_neg),
17464 tC3("negs", 2700000, _negs, 2, (RR, RR), rd_rn, t_neg),
17465 tCE("push", 92d0000, _push, 1, (REGLST), push_pop, t_push_pop),
17466 tCE("pop", 8bd0000, _pop, 1, (REGLST), push_pop, t_push_pop),
c19d1205 17467
16a4cf17 17468 /* These may simplify to neg. */
21d799b5
NC
17469 TCE("rsb", 0600000, ebc00000, 3, (RR, oRR, SH), arit, t_rsb),
17470 TC3("rsbs", 0700000, ebd00000, 3, (RR, oRR, SH), arit, t_rsb),
16a4cf17 17471
c921be7d
NC
17472#undef THUMB_VARIANT
17473#define THUMB_VARIANT & arm_ext_v6
17474
21d799b5 17475 TCE("cpy", 1a00000, 4600, 2, (RR, RR), rd_rm, t_cpy),
c19d1205
ZW
17476
17477 /* V1 instructions with no Thumb analogue prior to V6T2. */
c921be7d
NC
17478#undef THUMB_VARIANT
17479#define THUMB_VARIANT & arm_ext_v6t2
17480
21d799b5
NC
17481 TCE("teq", 1300000, ea900f00, 2, (RR, SH), cmp, t_mvn_tst),
17482 TC3w("teqs", 1300000, ea900f00, 2, (RR, SH), cmp, t_mvn_tst),
17483 CL("teqp", 130f000, 2, (RR, SH), cmp),
c19d1205 17484
5be8be5d
DG
17485 TC3("ldrt", 4300000, f8500e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
17486 TC3("ldrbt", 4700000, f8100e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
17487 TC3("strt", 4200000, f8400e00, 2, (RR_npcsp, ADDR), ldstt, t_ldstt),
17488 TC3("strbt", 4600000, f8000e00, 2, (RRnpc_npcsp, ADDR),ldstt, t_ldstt),
c19d1205 17489
21d799b5
NC
17490 TC3("stmdb", 9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17491 TC3("stmfd", 9000000, e9000000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
c19d1205 17492
21d799b5
NC
17493 TC3("ldmdb", 9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
17494 TC3("ldmea", 9100000, e9100000, 2, (RRw, REGLST), ldmstm, t_ldmstm),
c19d1205
ZW
17495
17496 /* V1 instructions with no Thumb analogue at all. */
21d799b5 17497 CE("rsc", 0e00000, 3, (RR, oRR, SH), arit),
c19d1205
ZW
17498 C3(rscs, 0f00000, 3, (RR, oRR, SH), arit),
17499
17500 C3(stmib, 9800000, 2, (RRw, REGLST), ldmstm),
17501 C3(stmfa, 9800000, 2, (RRw, REGLST), ldmstm),
17502 C3(stmda, 8000000, 2, (RRw, REGLST), ldmstm),
17503 C3(stmed, 8000000, 2, (RRw, REGLST), ldmstm),
17504 C3(ldmib, 9900000, 2, (RRw, REGLST), ldmstm),
17505 C3(ldmed, 9900000, 2, (RRw, REGLST), ldmstm),
17506 C3(ldmda, 8100000, 2, (RRw, REGLST), ldmstm),
17507 C3(ldmfa, 8100000, 2, (RRw, REGLST), ldmstm),
17508
c921be7d
NC
17509#undef ARM_VARIANT
17510#define ARM_VARIANT & arm_ext_v2 /* ARM 2 - multiplies. */
17511#undef THUMB_VARIANT
17512#define THUMB_VARIANT & arm_ext_v4t
17513
21d799b5
NC
17514 tCE("mul", 0000090, _mul, 3, (RRnpc, RRnpc, oRR), mul, t_mul),
17515 tC3("muls", 0100090, _muls, 3, (RRnpc, RRnpc, oRR), mul, t_mul),
c19d1205 17516
c921be7d
NC
17517#undef THUMB_VARIANT
17518#define THUMB_VARIANT & arm_ext_v6t2
17519
21d799b5 17520 TCE("mla", 0200090, fb000000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
c19d1205
ZW
17521 C3(mlas, 0300090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas),
17522
17523 /* Generic coprocessor instructions. */
21d799b5
NC
17524 TCE("cdp", e000000, ee000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp, cdp),
17525 TCE("ldc", c100000, ec100000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17526 TC3("ldcl", c500000, ec500000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17527 TCE("stc", c000000, ec000000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17528 TC3("stcl", c400000, ec400000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17529 TCE("mcr", e000010, ee000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
db472d6f 17530 TCE("mrc", e100010, ee100010, 6, (RCP, I7b, APSR_RR, RCN, RCN, oI7b), co_reg, co_reg),
c19d1205 17531
c921be7d
NC
17532#undef ARM_VARIANT
17533#define ARM_VARIANT & arm_ext_v2s /* ARM 3 - swp instructions. */
17534
21d799b5 17535 CE("swp", 1000090, 3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
c19d1205
ZW
17536 C3(swpb, 1400090, 3, (RRnpc, RRnpc, RRnpcb), rd_rm_rn),
17537
c921be7d
NC
17538#undef ARM_VARIANT
17539#define ARM_VARIANT & arm_ext_v3 /* ARM 6 Status register instructions. */
17540#undef THUMB_VARIANT
17541#define THUMB_VARIANT & arm_ext_msr
17542
d2cd1205
JB
17543 TCE("mrs", 1000000, f3e08000, 2, (RRnpc, rPSR), mrs, t_mrs),
17544 TCE("msr", 120f000, f3808000, 2, (wPSR, RR_EXi), msr, t_msr),
c19d1205 17545
c921be7d
NC
17546#undef ARM_VARIANT
17547#define ARM_VARIANT & arm_ext_v3m /* ARM 7M long multiplies. */
17548#undef THUMB_VARIANT
17549#define THUMB_VARIANT & arm_ext_v6t2
17550
21d799b5
NC
17551 TCE("smull", 0c00090, fb800000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17552 CM("smull","s", 0d00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17553 TCE("umull", 0800090, fba00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17554 CM("umull","s", 0900090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17555 TCE("smlal", 0e00090, fbc00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17556 CM("smlal","s", 0f00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
17557 TCE("umlal", 0a00090, fbe00000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull, t_mull),
17558 CM("umlal","s", 0b00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mull),
c19d1205 17559
c921be7d
NC
17560#undef ARM_VARIANT
17561#define ARM_VARIANT & arm_ext_v4 /* ARM Architecture 4. */
17562#undef THUMB_VARIANT
17563#define THUMB_VARIANT & arm_ext_v4t
17564
5be8be5d
DG
17565 tC3("ldrh", 01000b0, _ldrh, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17566 tC3("strh", 00000b0, _strh, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17567 tC3("ldrsh", 01000f0, _ldrsh, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17568 tC3("ldrsb", 01000d0, _ldrsb, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17569 tCM("ld","sh", 01000f0, _ldrsh, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
17570 tCM("ld","sb", 01000d0, _ldrsb, 2, (RRnpc_npcsp, ADDRGLDRS), ldstv4, t_ldst),
c19d1205 17571
c921be7d
NC
17572#undef ARM_VARIANT
17573#define ARM_VARIANT & arm_ext_v4t_5
17574
c19d1205
ZW
17575 /* ARM Architecture 4T. */
17576 /* Note: bx (and blx) are required on V5, even if the processor does
17577 not support Thumb. */
21d799b5 17578 TCE("bx", 12fff10, 4700, 1, (RR), bx, t_bx),
c19d1205 17579
c921be7d
NC
17580#undef ARM_VARIANT
17581#define ARM_VARIANT & arm_ext_v5 /* ARM Architecture 5T. */
17582#undef THUMB_VARIANT
17583#define THUMB_VARIANT & arm_ext_v5t
17584
c19d1205
ZW
17585 /* Note: blx has 2 variants; the .value coded here is for
17586 BLX(2). Only this variant has conditional execution. */
21d799b5
NC
17587 TCE("blx", 12fff30, 4780, 1, (RR_EXr), blx, t_blx),
17588 TUE("bkpt", 1200070, be00, 1, (oIffffb), bkpt, t_bkpt),
c19d1205 17589
c921be7d
NC
17590#undef THUMB_VARIANT
17591#define THUMB_VARIANT & arm_ext_v6t2
17592
21d799b5
NC
17593 TCE("clz", 16f0f10, fab0f080, 2, (RRnpc, RRnpc), rd_rm, t_clz),
17594 TUF("ldc2", c100000, fc100000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17595 TUF("ldc2l", c500000, fc500000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17596 TUF("stc2", c000000, fc000000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17597 TUF("stc2l", c400000, fc400000, 3, (RCP, RCN, ADDRGLDC), lstc, lstc),
17598 TUF("cdp2", e000000, fe000000, 6, (RCP, I15b, RCN, RCN, RCN, oI7b), cdp, cdp),
17599 TUF("mcr2", e000010, fe000010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
17600 TUF("mrc2", e100010, fe100010, 6, (RCP, I7b, RR, RCN, RCN, oI7b), co_reg, co_reg),
c19d1205 17601
c921be7d
NC
17602#undef ARM_VARIANT
17603#define ARM_VARIANT & arm_ext_v5exp /* ARM Architecture 5TExP. */
9e3c6df6
PB
17604#undef THUMB_VARIANT
17605#define THUMB_VARIANT &arm_ext_v5exp
c921be7d 17606
21d799b5
NC
17607 TCE("smlabb", 1000080, fb100000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
17608 TCE("smlatb", 10000a0, fb100020, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
17609 TCE("smlabt", 10000c0, fb100010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
17610 TCE("smlatt", 10000e0, fb100030, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
c19d1205 17611
21d799b5
NC
17612 TCE("smlawb", 1200080, fb300000, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
17613 TCE("smlawt", 12000c0, fb300010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smla, t_mla),
c19d1205 17614
21d799b5
NC
17615 TCE("smlalbb", 1400080, fbc00080, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
17616 TCE("smlaltb", 14000a0, fbc000a0, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
17617 TCE("smlalbt", 14000c0, fbc00090, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
17618 TCE("smlaltt", 14000e0, fbc000b0, 4, (RRnpc, RRnpc, RRnpc, RRnpc), smlal, t_mlal),
c19d1205 17619
21d799b5
NC
17620 TCE("smulbb", 1600080, fb10f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17621 TCE("smultb", 16000a0, fb10f020, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17622 TCE("smulbt", 16000c0, fb10f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17623 TCE("smultt", 16000e0, fb10f030, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
c19d1205 17624
21d799b5
NC
17625 TCE("smulwb", 12000a0, fb30f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17626 TCE("smulwt", 12000e0, fb30f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
c19d1205 17627
03ee1b7f
NC
17628 TCE("qadd", 1000050, fa80f080, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, t_simd2),
17629 TCE("qdadd", 1400050, fa80f090, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, t_simd2),
17630 TCE("qsub", 1200050, fa80f0a0, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, t_simd2),
17631 TCE("qdsub", 1600050, fa80f0b0, 3, (RRnpc, RRnpc, RRnpc), rd_rm_rn, t_simd2),
c19d1205 17632
c921be7d
NC
17633#undef ARM_VARIANT
17634#define ARM_VARIANT & arm_ext_v5e /* ARM Architecture 5TE. */
9e3c6df6
PB
17635#undef THUMB_VARIANT
17636#define THUMB_VARIANT &arm_ext_v6t2
c921be7d 17637
21d799b5 17638 TUF("pld", 450f000, f810f000, 1, (ADDR), pld, t_pld),
5be8be5d
DG
17639 TC3("ldrd", 00000d0, e8500000, 3, (RRnpc_npcsp, oRRnpc_npcsp, ADDRGLDRS),
17640 ldrd, t_ldstd),
17641 TC3("strd", 00000f0, e8400000, 3, (RRnpc_npcsp, oRRnpc_npcsp,
17642 ADDRGLDRS), ldrd, t_ldstd),
c19d1205 17643
21d799b5
NC
17644 TCE("mcrr", c400000, ec400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17645 TCE("mrrc", c500000, ec500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
c19d1205 17646
c921be7d
NC
17647#undef ARM_VARIANT
17648#define ARM_VARIANT & arm_ext_v5j /* ARM Architecture 5TEJ. */
17649
21d799b5 17650 TCE("bxj", 12fff20, f3c08f00, 1, (RR), bxj, t_bxj),
c19d1205 17651
c921be7d
NC
17652#undef ARM_VARIANT
17653#define ARM_VARIANT & arm_ext_v6 /* ARM V6. */
17654#undef THUMB_VARIANT
17655#define THUMB_VARIANT & arm_ext_v6
17656
21d799b5
NC
17657 TUF("cpsie", 1080000, b660, 2, (CPSF, oI31b), cpsi, t_cpsi),
17658 TUF("cpsid", 10c0000, b670, 2, (CPSF, oI31b), cpsi, t_cpsi),
17659 tCE("rev", 6bf0f30, _rev, 2, (RRnpc, RRnpc), rd_rm, t_rev),
17660 tCE("rev16", 6bf0fb0, _rev16, 2, (RRnpc, RRnpc), rd_rm, t_rev),
17661 tCE("revsh", 6ff0fb0, _revsh, 2, (RRnpc, RRnpc), rd_rm, t_rev),
17662 tCE("sxth", 6bf0070, _sxth, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
17663 tCE("uxth", 6ff0070, _uxth, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
17664 tCE("sxtb", 6af0070, _sxtb, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
17665 tCE("uxtb", 6ef0070, _uxtb, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
17666 TUF("setend", 1010000, b650, 1, (ENDI), setend, t_setend),
c19d1205 17667
c921be7d
NC
17668#undef THUMB_VARIANT
17669#define THUMB_VARIANT & arm_ext_v6t2
17670
5be8be5d
DG
17671 TCE("ldrex", 1900f9f, e8500f00, 2, (RRnpc_npcsp, ADDR), ldrex, t_ldrex),
17672 TCE("strex", 1800f90, e8400000, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
17673 strex, t_strex),
21d799b5
NC
17674 TUF("mcrr2", c400000, fc400000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
17675 TUF("mrrc2", c500000, fc500000, 5, (RCP, I15b, RRnpc, RRnpc, RCN), co_reg2c, co_reg2c),
62b3e311 17676
21d799b5
NC
17677 TCE("ssat", 6a00010, f3000000, 4, (RRnpc, I32, RRnpc, oSHllar),ssat, t_ssat),
17678 TCE("usat", 6e00010, f3800000, 4, (RRnpc, I31, RRnpc, oSHllar),usat, t_usat),
62b3e311 17679
9e3c6df6 17680/* ARM V6 not included in V7M. */
c921be7d
NC
17681#undef THUMB_VARIANT
17682#define THUMB_VARIANT & arm_ext_v6_notm
9e3c6df6
PB
17683 TUF("rfeia", 8900a00, e990c000, 1, (RRw), rfe, rfe),
17684 UF(rfeib, 9900a00, 1, (RRw), rfe),
17685 UF(rfeda, 8100a00, 1, (RRw), rfe),
17686 TUF("rfedb", 9100a00, e810c000, 1, (RRw), rfe, rfe),
17687 TUF("rfefd", 8900a00, e990c000, 1, (RRw), rfe, rfe),
17688 UF(rfefa, 9900a00, 1, (RRw), rfe),
17689 UF(rfeea, 8100a00, 1, (RRw), rfe),
17690 TUF("rfeed", 9100a00, e810c000, 1, (RRw), rfe, rfe),
17691 TUF("srsia", 8c00500, e980c000, 2, (oRRw, I31w), srs, srs),
17692 UF(srsib, 9c00500, 2, (oRRw, I31w), srs),
17693 UF(srsda, 8400500, 2, (oRRw, I31w), srs),
17694 TUF("srsdb", 9400500, e800c000, 2, (oRRw, I31w), srs, srs),
c921be7d 17695
9e3c6df6
PB
17696/* ARM V6 not included in V7M (eg. integer SIMD). */
17697#undef THUMB_VARIANT
17698#define THUMB_VARIANT & arm_ext_v6_dsp
21d799b5
NC
17699 TUF("cps", 1020000, f3af8100, 1, (I31b), imm0, t_cps),
17700 TCE("pkhbt", 6800010, eac00000, 4, (RRnpc, RRnpc, RRnpc, oSHll), pkhbt, t_pkhbt),
17701 TCE("pkhtb", 6800050, eac00020, 4, (RRnpc, RRnpc, RRnpc, oSHar), pkhtb, t_pkhtb),
17702 TCE("qadd16", 6200f10, fa90f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17703 TCE("qadd8", 6200f90, fa80f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17704 TCE("qasx", 6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17705 /* Old name for QASX. */
21d799b5
NC
17706 TCE("qaddsubx", 6200f30, faa0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17707 TCE("qsax", 6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17708 /* Old name for QSAX. */
21d799b5
NC
17709 TCE("qsubaddx", 6200f50, fae0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17710 TCE("qsub16", 6200f70, fad0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17711 TCE("qsub8", 6200ff0, fac0f010, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17712 TCE("sadd16", 6100f10, fa90f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17713 TCE("sadd8", 6100f90, fa80f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17714 TCE("sasx", 6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17715 /* Old name for SASX. */
21d799b5
NC
17716 TCE("saddsubx", 6100f30, faa0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17717 TCE("shadd16", 6300f10, fa90f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17718 TCE("shadd8", 6300f90, fa80f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17719 TCE("shasx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17720 /* Old name for SHASX. */
21d799b5
NC
17721 TCE("shaddsubx", 6300f30, faa0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17722 TCE("shsax", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17723 /* Old name for SHSAX. */
21d799b5
NC
17724 TCE("shsubaddx", 6300f50, fae0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17725 TCE("shsub16", 6300f70, fad0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17726 TCE("shsub8", 6300ff0, fac0f020, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17727 TCE("ssax", 6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17728 /* Old name for SSAX. */
21d799b5
NC
17729 TCE("ssubaddx", 6100f50, fae0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17730 TCE("ssub16", 6100f70, fad0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17731 TCE("ssub8", 6100ff0, fac0f000, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17732 TCE("uadd16", 6500f10, fa90f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17733 TCE("uadd8", 6500f90, fa80f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17734 TCE("uasx", 6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17735 /* Old name for UASX. */
21d799b5
NC
17736 TCE("uaddsubx", 6500f30, faa0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17737 TCE("uhadd16", 6700f10, fa90f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17738 TCE("uhadd8", 6700f90, fa80f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17739 TCE("uhasx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17740 /* Old name for UHASX. */
21d799b5
NC
17741 TCE("uhaddsubx", 6700f30, faa0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17742 TCE("uhsax", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17743 /* Old name for UHSAX. */
21d799b5
NC
17744 TCE("uhsubaddx", 6700f50, fae0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17745 TCE("uhsub16", 6700f70, fad0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17746 TCE("uhsub8", 6700ff0, fac0f060, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17747 TCE("uqadd16", 6600f10, fa90f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17748 TCE("uqadd8", 6600f90, fa80f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17749 TCE("uqasx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17750 /* Old name for UQASX. */
21d799b5
NC
17751 TCE("uqaddsubx", 6600f30, faa0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17752 TCE("uqsax", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17753 /* Old name for UQSAX. */
21d799b5
NC
17754 TCE("uqsubaddx", 6600f50, fae0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17755 TCE("uqsub16", 6600f70, fad0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17756 TCE("uqsub8", 6600ff0, fac0f050, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17757 TCE("usub16", 6500f70, fad0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17758 TCE("usax", 6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
4f80ef3e 17759 /* Old name for USAX. */
21d799b5
NC
17760 TCE("usubaddx", 6500f50, fae0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17761 TCE("usub8", 6500ff0, fac0f040, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
21d799b5
NC
17762 TCE("sxtah", 6b00070, fa00f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17763 TCE("sxtab16", 6800070, fa20f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17764 TCE("sxtab", 6a00070, fa40f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17765 TCE("sxtb16", 68f0070, fa2ff080, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
17766 TCE("uxtah", 6f00070, fa10f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17767 TCE("uxtab16", 6c00070, fa30f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17768 TCE("uxtab", 6e00070, fa50f080, 4, (RRnpc, RRnpc, RRnpc, oROR), sxtah, t_sxtah),
17769 TCE("uxtb16", 6cf0070, fa3ff080, 3, (RRnpc, RRnpc, oROR), sxth, t_sxth),
17770 TCE("sel", 6800fb0, faa0f080, 3, (RRnpc, RRnpc, RRnpc), rd_rn_rm, t_simd),
17771 TCE("smlad", 7000010, fb200000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17772 TCE("smladx", 7000030, fb200010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17773 TCE("smlald", 7400010, fbc000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17774 TCE("smlaldx", 7400030, fbc000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17775 TCE("smlsd", 7000050, fb400000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17776 TCE("smlsdx", 7000070, fb400010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17777 TCE("smlsld", 7400050, fbd000c0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17778 TCE("smlsldx", 7400070, fbd000d0, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal,t_mlal),
17779 TCE("smmla", 7500010, fb500000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17780 TCE("smmlar", 7500030, fb500010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17781 TCE("smmls", 75000d0, fb600000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17782 TCE("smmlsr", 75000f0, fb600010, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17783 TCE("smmul", 750f010, fb50f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17784 TCE("smmulr", 750f030, fb50f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17785 TCE("smuad", 700f010, fb20f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17786 TCE("smuadx", 700f030, fb20f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17787 TCE("smusd", 700f050, fb40f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17788 TCE("smusdx", 700f070, fb40f010, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
21d799b5
NC
17789 TCE("ssat16", 6a00f30, f3200000, 3, (RRnpc, I16, RRnpc), ssat16, t_ssat16),
17790 TCE("umaal", 0400090, fbe00060, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smlal, t_mlal),
17791 TCE("usad8", 780f010, fb70f000, 3, (RRnpc, RRnpc, RRnpc), smul, t_simd),
17792 TCE("usada8", 7800010, fb700000, 4, (RRnpc, RRnpc, RRnpc, RRnpc),smla, t_mla),
17793 TCE("usat16", 6e00f30, f3a00000, 3, (RRnpc, I15, RRnpc), usat16, t_usat16),
c19d1205 17794
c921be7d
NC
17795#undef ARM_VARIANT
17796#define ARM_VARIANT & arm_ext_v6k
17797#undef THUMB_VARIANT
17798#define THUMB_VARIANT & arm_ext_v6k
17799
21d799b5
NC
17800 tCE("yield", 320f001, _yield, 0, (), noargs, t_hint),
17801 tCE("wfe", 320f002, _wfe, 0, (), noargs, t_hint),
17802 tCE("wfi", 320f003, _wfi, 0, (), noargs, t_hint),
17803 tCE("sev", 320f004, _sev, 0, (), noargs, t_hint),
c19d1205 17804
c921be7d
NC
17805#undef THUMB_VARIANT
17806#define THUMB_VARIANT & arm_ext_v6_notm
5be8be5d
DG
17807 TCE("ldrexd", 1b00f9f, e8d0007f, 3, (RRnpc_npcsp, oRRnpc_npcsp, RRnpcb),
17808 ldrexd, t_ldrexd),
17809 TCE("strexd", 1a00f90, e8c00070, 4, (RRnpc_npcsp, RRnpc_npcsp, oRRnpc_npcsp,
17810 RRnpcb), strexd, t_strexd),
ebdca51a 17811
c921be7d
NC
17812#undef THUMB_VARIANT
17813#define THUMB_VARIANT & arm_ext_v6t2
5be8be5d
DG
17814 TCE("ldrexb", 1d00f9f, e8d00f4f, 2, (RRnpc_npcsp,RRnpcb),
17815 rd_rn, rd_rn),
17816 TCE("ldrexh", 1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
17817 rd_rn, rd_rn),
17818 TCE("strexb", 1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
877807f8 17819 strex, t_strexbh),
5be8be5d 17820 TCE("strexh", 1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
877807f8 17821 strex, t_strexbh),
21d799b5 17822 TUF("clrex", 57ff01f, f3bf8f2f, 0, (), noargs, noargs),
c19d1205 17823
c921be7d 17824#undef ARM_VARIANT
f4c65163
MGD
17825#define ARM_VARIANT & arm_ext_sec
17826#undef THUMB_VARIANT
17827#define THUMB_VARIANT & arm_ext_sec
c921be7d 17828
21d799b5 17829 TCE("smc", 1600070, f7f08000, 1, (EXPi), smc, t_smc),
c19d1205 17830
90ec0d68
MGD
17831#undef ARM_VARIANT
17832#define ARM_VARIANT & arm_ext_virt
17833#undef THUMB_VARIANT
17834#define THUMB_VARIANT & arm_ext_virt
17835
17836 TCE("hvc", 1400070, f7e08000, 1, (EXPi), hvc, t_hvc),
17837 TCE("eret", 160006e, f3de8f00, 0, (), noargs, noargs),
17838
c921be7d
NC
17839#undef ARM_VARIANT
17840#define ARM_VARIANT & arm_ext_v6t2
f4c65163
MGD
17841#undef THUMB_VARIANT
17842#define THUMB_VARIANT & arm_ext_v6t2
c921be7d 17843
21d799b5
NC
17844 TCE("bfc", 7c0001f, f36f0000, 3, (RRnpc, I31, I32), bfc, t_bfc),
17845 TCE("bfi", 7c00010, f3600000, 4, (RRnpc, RRnpc_I0, I31, I32), bfi, t_bfi),
17846 TCE("sbfx", 7a00050, f3400000, 4, (RR, RR, I31, I32), bfx, t_bfx),
17847 TCE("ubfx", 7e00050, f3c00000, 4, (RR, RR, I31, I32), bfx, t_bfx),
c19d1205 17848
21d799b5
NC
17849 TCE("mls", 0600090, fb000010, 4, (RRnpc, RRnpc, RRnpc, RRnpc), mlas, t_mla),
17850 TCE("movw", 3000000, f2400000, 2, (RRnpc, HALF), mov16, t_mov16),
17851 TCE("movt", 3400000, f2c00000, 2, (RRnpc, HALF), mov16, t_mov16),
17852 TCE("rbit", 6ff0f30, fa90f0a0, 2, (RR, RR), rd_rm, t_rbit),
c19d1205 17853
5be8be5d
DG
17854 TC3("ldrht", 03000b0, f8300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17855 TC3("ldrsht", 03000f0, f9300e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17856 TC3("ldrsbt", 03000d0, f9100e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
17857 TC3("strht", 02000b0, f8200e00, 2, (RRnpc_npcsp, ADDR), ldsttv4, t_ldstt),
c19d1205 17858
bf3eeda7
NS
17859 /* Thumb-only instructions. */
17860#undef ARM_VARIANT
17861#define ARM_VARIANT NULL
17862 TUE("cbnz", 0, b900, 2, (RR, EXP), 0, t_cbz),
17863 TUE("cbz", 0, b100, 2, (RR, EXP), 0, t_cbz),
c921be7d
NC
17864
17865 /* ARM does not really have an IT instruction, so always allow it.
17866 The opcode is copied from Thumb in order to allow warnings in
17867 -mimplicit-it=[never | arm] modes. */
17868#undef ARM_VARIANT
17869#define ARM_VARIANT & arm_ext_v1
17870
21d799b5
NC
17871 TUE("it", bf08, bf08, 1, (COND), it, t_it),
17872 TUE("itt", bf0c, bf0c, 1, (COND), it, t_it),
17873 TUE("ite", bf04, bf04, 1, (COND), it, t_it),
17874 TUE("ittt", bf0e, bf0e, 1, (COND), it, t_it),
17875 TUE("itet", bf06, bf06, 1, (COND), it, t_it),
17876 TUE("itte", bf0a, bf0a, 1, (COND), it, t_it),
17877 TUE("itee", bf02, bf02, 1, (COND), it, t_it),
17878 TUE("itttt", bf0f, bf0f, 1, (COND), it, t_it),
17879 TUE("itett", bf07, bf07, 1, (COND), it, t_it),
17880 TUE("ittet", bf0b, bf0b, 1, (COND), it, t_it),
17881 TUE("iteet", bf03, bf03, 1, (COND), it, t_it),
17882 TUE("ittte", bf0d, bf0d, 1, (COND), it, t_it),
17883 TUE("itete", bf05, bf05, 1, (COND), it, t_it),
17884 TUE("ittee", bf09, bf09, 1, (COND), it, t_it),
17885 TUE("iteee", bf01, bf01, 1, (COND), it, t_it),
1c444d06 17886 /* ARM/Thumb-2 instructions with no Thumb-1 equivalent. */
21d799b5
NC
17887 TC3("rrx", 01a00060, ea4f0030, 2, (RR, RR), rd_rm, t_rrx),
17888 TC3("rrxs", 01b00060, ea5f0030, 2, (RR, RR), rd_rm, t_rrx),
c19d1205 17889
92e90b6e 17890 /* Thumb2 only instructions. */
c921be7d
NC
17891#undef ARM_VARIANT
17892#define ARM_VARIANT NULL
92e90b6e 17893
21d799b5
NC
17894 TCE("addw", 0, f2000000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
17895 TCE("subw", 0, f2a00000, 3, (RR, RR, EXPi), 0, t_add_sub_w),
17896 TCE("orn", 0, ea600000, 3, (RR, oRR, SH), 0, t_orn),
17897 TCE("orns", 0, ea700000, 3, (RR, oRR, SH), 0, t_orn),
17898 TCE("tbb", 0, e8d0f000, 1, (TB), 0, t_tb),
17899 TCE("tbh", 0, e8d0f010, 1, (TB), 0, t_tb),
92e90b6e 17900
eea54501
MGD
17901 /* Hardware division instructions. */
17902#undef ARM_VARIANT
17903#define ARM_VARIANT & arm_ext_adiv
c921be7d
NC
17904#undef THUMB_VARIANT
17905#define THUMB_VARIANT & arm_ext_div
17906
eea54501
MGD
17907 TCE("sdiv", 710f010, fb90f0f0, 3, (RR, oRR, RR), div, t_div),
17908 TCE("udiv", 730f010, fbb0f0f0, 3, (RR, oRR, RR), div, t_div),
62b3e311 17909
7e806470 17910 /* ARM V6M/V7 instructions. */
c921be7d
NC
17911#undef ARM_VARIANT
17912#define ARM_VARIANT & arm_ext_barrier
17913#undef THUMB_VARIANT
17914#define THUMB_VARIANT & arm_ext_barrier
17915
52e7f43d
RE
17916 TUF("dmb", 57ff050, f3bf8f50, 1, (oBARRIER_I15), barrier, t_barrier),
17917 TUF("dsb", 57ff040, f3bf8f40, 1, (oBARRIER_I15), barrier, t_barrier),
17918 TUF("isb", 57ff060, f3bf8f60, 1, (oBARRIER_I15), barrier, t_barrier),
7e806470 17919
62b3e311 17920 /* ARM V7 instructions. */
c921be7d
NC
17921#undef ARM_VARIANT
17922#define ARM_VARIANT & arm_ext_v7
17923#undef THUMB_VARIANT
17924#define THUMB_VARIANT & arm_ext_v7
17925
21d799b5
NC
17926 TUF("pli", 450f000, f910f000, 1, (ADDR), pli, t_pld),
17927 TCE("dbg", 320f0f0, f3af80f0, 1, (I15), dbg, t_dbg),
62b3e311 17928
60e5ef9f
MGD
17929#undef ARM_VARIANT
17930#define ARM_VARIANT & arm_ext_mp
17931#undef THUMB_VARIANT
17932#define THUMB_VARIANT & arm_ext_mp
17933
17934 TUF("pldw", 410f000, f830f000, 1, (ADDR), pld, t_pld),
17935
c921be7d
NC
17936#undef ARM_VARIANT
17937#define ARM_VARIANT & fpu_fpa_ext_v1 /* Core FPA instruction set (V1). */
17938
21d799b5
NC
17939 cCE("wfs", e200110, 1, (RR), rd),
17940 cCE("rfs", e300110, 1, (RR), rd),
17941 cCE("wfc", e400110, 1, (RR), rd),
17942 cCE("rfc", e500110, 1, (RR), rd),
17943
17944 cCL("ldfs", c100100, 2, (RF, ADDRGLDC), rd_cpaddr),
17945 cCL("ldfd", c108100, 2, (RF, ADDRGLDC), rd_cpaddr),
17946 cCL("ldfe", c500100, 2, (RF, ADDRGLDC), rd_cpaddr),
17947 cCL("ldfp", c508100, 2, (RF, ADDRGLDC), rd_cpaddr),
17948
17949 cCL("stfs", c000100, 2, (RF, ADDRGLDC), rd_cpaddr),
17950 cCL("stfd", c008100, 2, (RF, ADDRGLDC), rd_cpaddr),
17951 cCL("stfe", c400100, 2, (RF, ADDRGLDC), rd_cpaddr),
17952 cCL("stfp", c408100, 2, (RF, ADDRGLDC), rd_cpaddr),
17953
17954 cCL("mvfs", e008100, 2, (RF, RF_IF), rd_rm),
17955 cCL("mvfsp", e008120, 2, (RF, RF_IF), rd_rm),
17956 cCL("mvfsm", e008140, 2, (RF, RF_IF), rd_rm),
17957 cCL("mvfsz", e008160, 2, (RF, RF_IF), rd_rm),
17958 cCL("mvfd", e008180, 2, (RF, RF_IF), rd_rm),
17959 cCL("mvfdp", e0081a0, 2, (RF, RF_IF), rd_rm),
17960 cCL("mvfdm", e0081c0, 2, (RF, RF_IF), rd_rm),
17961 cCL("mvfdz", e0081e0, 2, (RF, RF_IF), rd_rm),
17962 cCL("mvfe", e088100, 2, (RF, RF_IF), rd_rm),
17963 cCL("mvfep", e088120, 2, (RF, RF_IF), rd_rm),
17964 cCL("mvfem", e088140, 2, (RF, RF_IF), rd_rm),
17965 cCL("mvfez", e088160, 2, (RF, RF_IF), rd_rm),
17966
17967 cCL("mnfs", e108100, 2, (RF, RF_IF), rd_rm),
17968 cCL("mnfsp", e108120, 2, (RF, RF_IF), rd_rm),
17969 cCL("mnfsm", e108140, 2, (RF, RF_IF), rd_rm),
17970 cCL("mnfsz", e108160, 2, (RF, RF_IF), rd_rm),
17971 cCL("mnfd", e108180, 2, (RF, RF_IF), rd_rm),
17972 cCL("mnfdp", e1081a0, 2, (RF, RF_IF), rd_rm),
17973 cCL("mnfdm", e1081c0, 2, (RF, RF_IF), rd_rm),
17974 cCL("mnfdz", e1081e0, 2, (RF, RF_IF), rd_rm),
17975 cCL("mnfe", e188100, 2, (RF, RF_IF), rd_rm),
17976 cCL("mnfep", e188120, 2, (RF, RF_IF), rd_rm),
17977 cCL("mnfem", e188140, 2, (RF, RF_IF), rd_rm),
17978 cCL("mnfez", e188160, 2, (RF, RF_IF), rd_rm),
17979
17980 cCL("abss", e208100, 2, (RF, RF_IF), rd_rm),
17981 cCL("abssp", e208120, 2, (RF, RF_IF), rd_rm),
17982 cCL("abssm", e208140, 2, (RF, RF_IF), rd_rm),
17983 cCL("abssz", e208160, 2, (RF, RF_IF), rd_rm),
17984 cCL("absd", e208180, 2, (RF, RF_IF), rd_rm),
17985 cCL("absdp", e2081a0, 2, (RF, RF_IF), rd_rm),
17986 cCL("absdm", e2081c0, 2, (RF, RF_IF), rd_rm),
17987 cCL("absdz", e2081e0, 2, (RF, RF_IF), rd_rm),
17988 cCL("abse", e288100, 2, (RF, RF_IF), rd_rm),
17989 cCL("absep", e288120, 2, (RF, RF_IF), rd_rm),
17990 cCL("absem", e288140, 2, (RF, RF_IF), rd_rm),
17991 cCL("absez", e288160, 2, (RF, RF_IF), rd_rm),
17992
17993 cCL("rnds", e308100, 2, (RF, RF_IF), rd_rm),
17994 cCL("rndsp", e308120, 2, (RF, RF_IF), rd_rm),
17995 cCL("rndsm", e308140, 2, (RF, RF_IF), rd_rm),
17996 cCL("rndsz", e308160, 2, (RF, RF_IF), rd_rm),
17997 cCL("rndd", e308180, 2, (RF, RF_IF), rd_rm),
17998 cCL("rnddp", e3081a0, 2, (RF, RF_IF), rd_rm),
17999 cCL("rnddm", e3081c0, 2, (RF, RF_IF), rd_rm),
18000 cCL("rnddz", e3081e0, 2, (RF, RF_IF), rd_rm),
18001 cCL("rnde", e388100, 2, (RF, RF_IF), rd_rm),
18002 cCL("rndep", e388120, 2, (RF, RF_IF), rd_rm),
18003 cCL("rndem", e388140, 2, (RF, RF_IF), rd_rm),
18004 cCL("rndez", e388160, 2, (RF, RF_IF), rd_rm),
18005
18006 cCL("sqts", e408100, 2, (RF, RF_IF), rd_rm),
18007 cCL("sqtsp", e408120, 2, (RF, RF_IF), rd_rm),
18008 cCL("sqtsm", e408140, 2, (RF, RF_IF), rd_rm),
18009 cCL("sqtsz", e408160, 2, (RF, RF_IF), rd_rm),
18010 cCL("sqtd", e408180, 2, (RF, RF_IF), rd_rm),
18011 cCL("sqtdp", e4081a0, 2, (RF, RF_IF), rd_rm),
18012 cCL("sqtdm", e4081c0, 2, (RF, RF_IF), rd_rm),
18013 cCL("sqtdz", e4081e0, 2, (RF, RF_IF), rd_rm),
18014 cCL("sqte", e488100, 2, (RF, RF_IF), rd_rm),
18015 cCL("sqtep", e488120, 2, (RF, RF_IF), rd_rm),
18016 cCL("sqtem", e488140, 2, (RF, RF_IF), rd_rm),
18017 cCL("sqtez", e488160, 2, (RF, RF_IF), rd_rm),
18018
18019 cCL("logs", e508100, 2, (RF, RF_IF), rd_rm),
18020 cCL("logsp", e508120, 2, (RF, RF_IF), rd_rm),
18021 cCL("logsm", e508140, 2, (RF, RF_IF), rd_rm),
18022 cCL("logsz", e508160, 2, (RF, RF_IF), rd_rm),
18023 cCL("logd", e508180, 2, (RF, RF_IF), rd_rm),
18024 cCL("logdp", e5081a0, 2, (RF, RF_IF), rd_rm),
18025 cCL("logdm", e5081c0, 2, (RF, RF_IF), rd_rm),
18026 cCL("logdz", e5081e0, 2, (RF, RF_IF), rd_rm),
18027 cCL("loge", e588100, 2, (RF, RF_IF), rd_rm),
18028 cCL("logep", e588120, 2, (RF, RF_IF), rd_rm),
18029 cCL("logem", e588140, 2, (RF, RF_IF), rd_rm),
18030 cCL("logez", e588160, 2, (RF, RF_IF), rd_rm),
18031
18032 cCL("lgns", e608100, 2, (RF, RF_IF), rd_rm),
18033 cCL("lgnsp", e608120, 2, (RF, RF_IF), rd_rm),
18034 cCL("lgnsm", e608140, 2, (RF, RF_IF), rd_rm),
18035 cCL("lgnsz", e608160, 2, (RF, RF_IF), rd_rm),
18036 cCL("lgnd", e608180, 2, (RF, RF_IF), rd_rm),
18037 cCL("lgndp", e6081a0, 2, (RF, RF_IF), rd_rm),
18038 cCL("lgndm", e6081c0, 2, (RF, RF_IF), rd_rm),
18039 cCL("lgndz", e6081e0, 2, (RF, RF_IF), rd_rm),
18040 cCL("lgne", e688100, 2, (RF, RF_IF), rd_rm),
18041 cCL("lgnep", e688120, 2, (RF, RF_IF), rd_rm),
18042 cCL("lgnem", e688140, 2, (RF, RF_IF), rd_rm),
18043 cCL("lgnez", e688160, 2, (RF, RF_IF), rd_rm),
18044
18045 cCL("exps", e708100, 2, (RF, RF_IF), rd_rm),
18046 cCL("expsp", e708120, 2, (RF, RF_IF), rd_rm),
18047 cCL("expsm", e708140, 2, (RF, RF_IF), rd_rm),
18048 cCL("expsz", e708160, 2, (RF, RF_IF), rd_rm),
18049 cCL("expd", e708180, 2, (RF, RF_IF), rd_rm),
18050 cCL("expdp", e7081a0, 2, (RF, RF_IF), rd_rm),
18051 cCL("expdm", e7081c0, 2, (RF, RF_IF), rd_rm),
18052 cCL("expdz", e7081e0, 2, (RF, RF_IF), rd_rm),
18053 cCL("expe", e788100, 2, (RF, RF_IF), rd_rm),
18054 cCL("expep", e788120, 2, (RF, RF_IF), rd_rm),
18055 cCL("expem", e788140, 2, (RF, RF_IF), rd_rm),
18056 cCL("expdz", e788160, 2, (RF, RF_IF), rd_rm),
18057
18058 cCL("sins", e808100, 2, (RF, RF_IF), rd_rm),
18059 cCL("sinsp", e808120, 2, (RF, RF_IF), rd_rm),
18060 cCL("sinsm", e808140, 2, (RF, RF_IF), rd_rm),
18061 cCL("sinsz", e808160, 2, (RF, RF_IF), rd_rm),
18062 cCL("sind", e808180, 2, (RF, RF_IF), rd_rm),
18063 cCL("sindp", e8081a0, 2, (RF, RF_IF), rd_rm),
18064 cCL("sindm", e8081c0, 2, (RF, RF_IF), rd_rm),
18065 cCL("sindz", e8081e0, 2, (RF, RF_IF), rd_rm),
18066 cCL("sine", e888100, 2, (RF, RF_IF), rd_rm),
18067 cCL("sinep", e888120, 2, (RF, RF_IF), rd_rm),
18068 cCL("sinem", e888140, 2, (RF, RF_IF), rd_rm),
18069 cCL("sinez", e888160, 2, (RF, RF_IF), rd_rm),
18070
18071 cCL("coss", e908100, 2, (RF, RF_IF), rd_rm),
18072 cCL("cossp", e908120, 2, (RF, RF_IF), rd_rm),
18073 cCL("cossm", e908140, 2, (RF, RF_IF), rd_rm),
18074 cCL("cossz", e908160, 2, (RF, RF_IF), rd_rm),
18075 cCL("cosd", e908180, 2, (RF, RF_IF), rd_rm),
18076 cCL("cosdp", e9081a0, 2, (RF, RF_IF), rd_rm),
18077 cCL("cosdm", e9081c0, 2, (RF, RF_IF), rd_rm),
18078 cCL("cosdz", e9081e0, 2, (RF, RF_IF), rd_rm),
18079 cCL("cose", e988100, 2, (RF, RF_IF), rd_rm),
18080 cCL("cosep", e988120, 2, (RF, RF_IF), rd_rm),
18081 cCL("cosem", e988140, 2, (RF, RF_IF), rd_rm),
18082 cCL("cosez", e988160, 2, (RF, RF_IF), rd_rm),
18083
18084 cCL("tans", ea08100, 2, (RF, RF_IF), rd_rm),
18085 cCL("tansp", ea08120, 2, (RF, RF_IF), rd_rm),
18086 cCL("tansm", ea08140, 2, (RF, RF_IF), rd_rm),
18087 cCL("tansz", ea08160, 2, (RF, RF_IF), rd_rm),
18088 cCL("tand", ea08180, 2, (RF, RF_IF), rd_rm),
18089 cCL("tandp", ea081a0, 2, (RF, RF_IF), rd_rm),
18090 cCL("tandm", ea081c0, 2, (RF, RF_IF), rd_rm),
18091 cCL("tandz", ea081e0, 2, (RF, RF_IF), rd_rm),
18092 cCL("tane", ea88100, 2, (RF, RF_IF), rd_rm),
18093 cCL("tanep", ea88120, 2, (RF, RF_IF), rd_rm),
18094 cCL("tanem", ea88140, 2, (RF, RF_IF), rd_rm),
18095 cCL("tanez", ea88160, 2, (RF, RF_IF), rd_rm),
18096
18097 cCL("asns", eb08100, 2, (RF, RF_IF), rd_rm),
18098 cCL("asnsp", eb08120, 2, (RF, RF_IF), rd_rm),
18099 cCL("asnsm", eb08140, 2, (RF, RF_IF), rd_rm),
18100 cCL("asnsz", eb08160, 2, (RF, RF_IF), rd_rm),
18101 cCL("asnd", eb08180, 2, (RF, RF_IF), rd_rm),
18102 cCL("asndp", eb081a0, 2, (RF, RF_IF), rd_rm),
18103 cCL("asndm", eb081c0, 2, (RF, RF_IF), rd_rm),
18104 cCL("asndz", eb081e0, 2, (RF, RF_IF), rd_rm),
18105 cCL("asne", eb88100, 2, (RF, RF_IF), rd_rm),
18106 cCL("asnep", eb88120, 2, (RF, RF_IF), rd_rm),
18107 cCL("asnem", eb88140, 2, (RF, RF_IF), rd_rm),
18108 cCL("asnez", eb88160, 2, (RF, RF_IF), rd_rm),
18109
18110 cCL("acss", ec08100, 2, (RF, RF_IF), rd_rm),
18111 cCL("acssp", ec08120, 2, (RF, RF_IF), rd_rm),
18112 cCL("acssm", ec08140, 2, (RF, RF_IF), rd_rm),
18113 cCL("acssz", ec08160, 2, (RF, RF_IF), rd_rm),
18114 cCL("acsd", ec08180, 2, (RF, RF_IF), rd_rm),
18115 cCL("acsdp", ec081a0, 2, (RF, RF_IF), rd_rm),
18116 cCL("acsdm", ec081c0, 2, (RF, RF_IF), rd_rm),
18117 cCL("acsdz", ec081e0, 2, (RF, RF_IF), rd_rm),
18118 cCL("acse", ec88100, 2, (RF, RF_IF), rd_rm),
18119 cCL("acsep", ec88120, 2, (RF, RF_IF), rd_rm),
18120 cCL("acsem", ec88140, 2, (RF, RF_IF), rd_rm),
18121 cCL("acsez", ec88160, 2, (RF, RF_IF), rd_rm),
18122
18123 cCL("atns", ed08100, 2, (RF, RF_IF), rd_rm),
18124 cCL("atnsp", ed08120, 2, (RF, RF_IF), rd_rm),
18125 cCL("atnsm", ed08140, 2, (RF, RF_IF), rd_rm),
18126 cCL("atnsz", ed08160, 2, (RF, RF_IF), rd_rm),
18127 cCL("atnd", ed08180, 2, (RF, RF_IF), rd_rm),
18128 cCL("atndp", ed081a0, 2, (RF, RF_IF), rd_rm),
18129 cCL("atndm", ed081c0, 2, (RF, RF_IF), rd_rm),
18130 cCL("atndz", ed081e0, 2, (RF, RF_IF), rd_rm),
18131 cCL("atne", ed88100, 2, (RF, RF_IF), rd_rm),
18132 cCL("atnep", ed88120, 2, (RF, RF_IF), rd_rm),
18133 cCL("atnem", ed88140, 2, (RF, RF_IF), rd_rm),
18134 cCL("atnez", ed88160, 2, (RF, RF_IF), rd_rm),
18135
18136 cCL("urds", ee08100, 2, (RF, RF_IF), rd_rm),
18137 cCL("urdsp", ee08120, 2, (RF, RF_IF), rd_rm),
18138 cCL("urdsm", ee08140, 2, (RF, RF_IF), rd_rm),
18139 cCL("urdsz", ee08160, 2, (RF, RF_IF), rd_rm),
18140 cCL("urdd", ee08180, 2, (RF, RF_IF), rd_rm),
18141 cCL("urddp", ee081a0, 2, (RF, RF_IF), rd_rm),
18142 cCL("urddm", ee081c0, 2, (RF, RF_IF), rd_rm),
18143 cCL("urddz", ee081e0, 2, (RF, RF_IF), rd_rm),
18144 cCL("urde", ee88100, 2, (RF, RF_IF), rd_rm),
18145 cCL("urdep", ee88120, 2, (RF, RF_IF), rd_rm),
18146 cCL("urdem", ee88140, 2, (RF, RF_IF), rd_rm),
18147 cCL("urdez", ee88160, 2, (RF, RF_IF), rd_rm),
18148
18149 cCL("nrms", ef08100, 2, (RF, RF_IF), rd_rm),
18150 cCL("nrmsp", ef08120, 2, (RF, RF_IF), rd_rm),
18151 cCL("nrmsm", ef08140, 2, (RF, RF_IF), rd_rm),
18152 cCL("nrmsz", ef08160, 2, (RF, RF_IF), rd_rm),
18153 cCL("nrmd", ef08180, 2, (RF, RF_IF), rd_rm),
18154 cCL("nrmdp", ef081a0, 2, (RF, RF_IF), rd_rm),
18155 cCL("nrmdm", ef081c0, 2, (RF, RF_IF), rd_rm),
18156 cCL("nrmdz", ef081e0, 2, (RF, RF_IF), rd_rm),
18157 cCL("nrme", ef88100, 2, (RF, RF_IF), rd_rm),
18158 cCL("nrmep", ef88120, 2, (RF, RF_IF), rd_rm),
18159 cCL("nrmem", ef88140, 2, (RF, RF_IF), rd_rm),
18160 cCL("nrmez", ef88160, 2, (RF, RF_IF), rd_rm),
18161
18162 cCL("adfs", e000100, 3, (RF, RF, RF_IF), rd_rn_rm),
18163 cCL("adfsp", e000120, 3, (RF, RF, RF_IF), rd_rn_rm),
18164 cCL("adfsm", e000140, 3, (RF, RF, RF_IF), rd_rn_rm),
18165 cCL("adfsz", e000160, 3, (RF, RF, RF_IF), rd_rn_rm),
18166 cCL("adfd", e000180, 3, (RF, RF, RF_IF), rd_rn_rm),
18167 cCL("adfdp", e0001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18168 cCL("adfdm", e0001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18169 cCL("adfdz", e0001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18170 cCL("adfe", e080100, 3, (RF, RF, RF_IF), rd_rn_rm),
18171 cCL("adfep", e080120, 3, (RF, RF, RF_IF), rd_rn_rm),
18172 cCL("adfem", e080140, 3, (RF, RF, RF_IF), rd_rn_rm),
18173 cCL("adfez", e080160, 3, (RF, RF, RF_IF), rd_rn_rm),
18174
18175 cCL("sufs", e200100, 3, (RF, RF, RF_IF), rd_rn_rm),
18176 cCL("sufsp", e200120, 3, (RF, RF, RF_IF), rd_rn_rm),
18177 cCL("sufsm", e200140, 3, (RF, RF, RF_IF), rd_rn_rm),
18178 cCL("sufsz", e200160, 3, (RF, RF, RF_IF), rd_rn_rm),
18179 cCL("sufd", e200180, 3, (RF, RF, RF_IF), rd_rn_rm),
18180 cCL("sufdp", e2001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18181 cCL("sufdm", e2001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18182 cCL("sufdz", e2001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18183 cCL("sufe", e280100, 3, (RF, RF, RF_IF), rd_rn_rm),
18184 cCL("sufep", e280120, 3, (RF, RF, RF_IF), rd_rn_rm),
18185 cCL("sufem", e280140, 3, (RF, RF, RF_IF), rd_rn_rm),
18186 cCL("sufez", e280160, 3, (RF, RF, RF_IF), rd_rn_rm),
18187
18188 cCL("rsfs", e300100, 3, (RF, RF, RF_IF), rd_rn_rm),
18189 cCL("rsfsp", e300120, 3, (RF, RF, RF_IF), rd_rn_rm),
18190 cCL("rsfsm", e300140, 3, (RF, RF, RF_IF), rd_rn_rm),
18191 cCL("rsfsz", e300160, 3, (RF, RF, RF_IF), rd_rn_rm),
18192 cCL("rsfd", e300180, 3, (RF, RF, RF_IF), rd_rn_rm),
18193 cCL("rsfdp", e3001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18194 cCL("rsfdm", e3001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18195 cCL("rsfdz", e3001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18196 cCL("rsfe", e380100, 3, (RF, RF, RF_IF), rd_rn_rm),
18197 cCL("rsfep", e380120, 3, (RF, RF, RF_IF), rd_rn_rm),
18198 cCL("rsfem", e380140, 3, (RF, RF, RF_IF), rd_rn_rm),
18199 cCL("rsfez", e380160, 3, (RF, RF, RF_IF), rd_rn_rm),
18200
18201 cCL("mufs", e100100, 3, (RF, RF, RF_IF), rd_rn_rm),
18202 cCL("mufsp", e100120, 3, (RF, RF, RF_IF), rd_rn_rm),
18203 cCL("mufsm", e100140, 3, (RF, RF, RF_IF), rd_rn_rm),
18204 cCL("mufsz", e100160, 3, (RF, RF, RF_IF), rd_rn_rm),
18205 cCL("mufd", e100180, 3, (RF, RF, RF_IF), rd_rn_rm),
18206 cCL("mufdp", e1001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18207 cCL("mufdm", e1001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18208 cCL("mufdz", e1001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18209 cCL("mufe", e180100, 3, (RF, RF, RF_IF), rd_rn_rm),
18210 cCL("mufep", e180120, 3, (RF, RF, RF_IF), rd_rn_rm),
18211 cCL("mufem", e180140, 3, (RF, RF, RF_IF), rd_rn_rm),
18212 cCL("mufez", e180160, 3, (RF, RF, RF_IF), rd_rn_rm),
18213
18214 cCL("dvfs", e400100, 3, (RF, RF, RF_IF), rd_rn_rm),
18215 cCL("dvfsp", e400120, 3, (RF, RF, RF_IF), rd_rn_rm),
18216 cCL("dvfsm", e400140, 3, (RF, RF, RF_IF), rd_rn_rm),
18217 cCL("dvfsz", e400160, 3, (RF, RF, RF_IF), rd_rn_rm),
18218 cCL("dvfd", e400180, 3, (RF, RF, RF_IF), rd_rn_rm),
18219 cCL("dvfdp", e4001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18220 cCL("dvfdm", e4001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18221 cCL("dvfdz", e4001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18222 cCL("dvfe", e480100, 3, (RF, RF, RF_IF), rd_rn_rm),
18223 cCL("dvfep", e480120, 3, (RF, RF, RF_IF), rd_rn_rm),
18224 cCL("dvfem", e480140, 3, (RF, RF, RF_IF), rd_rn_rm),
18225 cCL("dvfez", e480160, 3, (RF, RF, RF_IF), rd_rn_rm),
18226
18227 cCL("rdfs", e500100, 3, (RF, RF, RF_IF), rd_rn_rm),
18228 cCL("rdfsp", e500120, 3, (RF, RF, RF_IF), rd_rn_rm),
18229 cCL("rdfsm", e500140, 3, (RF, RF, RF_IF), rd_rn_rm),
18230 cCL("rdfsz", e500160, 3, (RF, RF, RF_IF), rd_rn_rm),
18231 cCL("rdfd", e500180, 3, (RF, RF, RF_IF), rd_rn_rm),
18232 cCL("rdfdp", e5001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18233 cCL("rdfdm", e5001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18234 cCL("rdfdz", e5001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18235 cCL("rdfe", e580100, 3, (RF, RF, RF_IF), rd_rn_rm),
18236 cCL("rdfep", e580120, 3, (RF, RF, RF_IF), rd_rn_rm),
18237 cCL("rdfem", e580140, 3, (RF, RF, RF_IF), rd_rn_rm),
18238 cCL("rdfez", e580160, 3, (RF, RF, RF_IF), rd_rn_rm),
18239
18240 cCL("pows", e600100, 3, (RF, RF, RF_IF), rd_rn_rm),
18241 cCL("powsp", e600120, 3, (RF, RF, RF_IF), rd_rn_rm),
18242 cCL("powsm", e600140, 3, (RF, RF, RF_IF), rd_rn_rm),
18243 cCL("powsz", e600160, 3, (RF, RF, RF_IF), rd_rn_rm),
18244 cCL("powd", e600180, 3, (RF, RF, RF_IF), rd_rn_rm),
18245 cCL("powdp", e6001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18246 cCL("powdm", e6001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18247 cCL("powdz", e6001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18248 cCL("powe", e680100, 3, (RF, RF, RF_IF), rd_rn_rm),
18249 cCL("powep", e680120, 3, (RF, RF, RF_IF), rd_rn_rm),
18250 cCL("powem", e680140, 3, (RF, RF, RF_IF), rd_rn_rm),
18251 cCL("powez", e680160, 3, (RF, RF, RF_IF), rd_rn_rm),
18252
18253 cCL("rpws", e700100, 3, (RF, RF, RF_IF), rd_rn_rm),
18254 cCL("rpwsp", e700120, 3, (RF, RF, RF_IF), rd_rn_rm),
18255 cCL("rpwsm", e700140, 3, (RF, RF, RF_IF), rd_rn_rm),
18256 cCL("rpwsz", e700160, 3, (RF, RF, RF_IF), rd_rn_rm),
18257 cCL("rpwd", e700180, 3, (RF, RF, RF_IF), rd_rn_rm),
18258 cCL("rpwdp", e7001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18259 cCL("rpwdm", e7001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18260 cCL("rpwdz", e7001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18261 cCL("rpwe", e780100, 3, (RF, RF, RF_IF), rd_rn_rm),
18262 cCL("rpwep", e780120, 3, (RF, RF, RF_IF), rd_rn_rm),
18263 cCL("rpwem", e780140, 3, (RF, RF, RF_IF), rd_rn_rm),
18264 cCL("rpwez", e780160, 3, (RF, RF, RF_IF), rd_rn_rm),
18265
18266 cCL("rmfs", e800100, 3, (RF, RF, RF_IF), rd_rn_rm),
18267 cCL("rmfsp", e800120, 3, (RF, RF, RF_IF), rd_rn_rm),
18268 cCL("rmfsm", e800140, 3, (RF, RF, RF_IF), rd_rn_rm),
18269 cCL("rmfsz", e800160, 3, (RF, RF, RF_IF), rd_rn_rm),
18270 cCL("rmfd", e800180, 3, (RF, RF, RF_IF), rd_rn_rm),
18271 cCL("rmfdp", e8001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18272 cCL("rmfdm", e8001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18273 cCL("rmfdz", e8001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18274 cCL("rmfe", e880100, 3, (RF, RF, RF_IF), rd_rn_rm),
18275 cCL("rmfep", e880120, 3, (RF, RF, RF_IF), rd_rn_rm),
18276 cCL("rmfem", e880140, 3, (RF, RF, RF_IF), rd_rn_rm),
18277 cCL("rmfez", e880160, 3, (RF, RF, RF_IF), rd_rn_rm),
18278
18279 cCL("fmls", e900100, 3, (RF, RF, RF_IF), rd_rn_rm),
18280 cCL("fmlsp", e900120, 3, (RF, RF, RF_IF), rd_rn_rm),
18281 cCL("fmlsm", e900140, 3, (RF, RF, RF_IF), rd_rn_rm),
18282 cCL("fmlsz", e900160, 3, (RF, RF, RF_IF), rd_rn_rm),
18283 cCL("fmld", e900180, 3, (RF, RF, RF_IF), rd_rn_rm),
18284 cCL("fmldp", e9001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18285 cCL("fmldm", e9001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18286 cCL("fmldz", e9001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18287 cCL("fmle", e980100, 3, (RF, RF, RF_IF), rd_rn_rm),
18288 cCL("fmlep", e980120, 3, (RF, RF, RF_IF), rd_rn_rm),
18289 cCL("fmlem", e980140, 3, (RF, RF, RF_IF), rd_rn_rm),
18290 cCL("fmlez", e980160, 3, (RF, RF, RF_IF), rd_rn_rm),
18291
18292 cCL("fdvs", ea00100, 3, (RF, RF, RF_IF), rd_rn_rm),
18293 cCL("fdvsp", ea00120, 3, (RF, RF, RF_IF), rd_rn_rm),
18294 cCL("fdvsm", ea00140, 3, (RF, RF, RF_IF), rd_rn_rm),
18295 cCL("fdvsz", ea00160, 3, (RF, RF, RF_IF), rd_rn_rm),
18296 cCL("fdvd", ea00180, 3, (RF, RF, RF_IF), rd_rn_rm),
18297 cCL("fdvdp", ea001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18298 cCL("fdvdm", ea001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18299 cCL("fdvdz", ea001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18300 cCL("fdve", ea80100, 3, (RF, RF, RF_IF), rd_rn_rm),
18301 cCL("fdvep", ea80120, 3, (RF, RF, RF_IF), rd_rn_rm),
18302 cCL("fdvem", ea80140, 3, (RF, RF, RF_IF), rd_rn_rm),
18303 cCL("fdvez", ea80160, 3, (RF, RF, RF_IF), rd_rn_rm),
18304
18305 cCL("frds", eb00100, 3, (RF, RF, RF_IF), rd_rn_rm),
18306 cCL("frdsp", eb00120, 3, (RF, RF, RF_IF), rd_rn_rm),
18307 cCL("frdsm", eb00140, 3, (RF, RF, RF_IF), rd_rn_rm),
18308 cCL("frdsz", eb00160, 3, (RF, RF, RF_IF), rd_rn_rm),
18309 cCL("frdd", eb00180, 3, (RF, RF, RF_IF), rd_rn_rm),
18310 cCL("frddp", eb001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18311 cCL("frddm", eb001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18312 cCL("frddz", eb001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18313 cCL("frde", eb80100, 3, (RF, RF, RF_IF), rd_rn_rm),
18314 cCL("frdep", eb80120, 3, (RF, RF, RF_IF), rd_rn_rm),
18315 cCL("frdem", eb80140, 3, (RF, RF, RF_IF), rd_rn_rm),
18316 cCL("frdez", eb80160, 3, (RF, RF, RF_IF), rd_rn_rm),
18317
18318 cCL("pols", ec00100, 3, (RF, RF, RF_IF), rd_rn_rm),
18319 cCL("polsp", ec00120, 3, (RF, RF, RF_IF), rd_rn_rm),
18320 cCL("polsm", ec00140, 3, (RF, RF, RF_IF), rd_rn_rm),
18321 cCL("polsz", ec00160, 3, (RF, RF, RF_IF), rd_rn_rm),
18322 cCL("pold", ec00180, 3, (RF, RF, RF_IF), rd_rn_rm),
18323 cCL("poldp", ec001a0, 3, (RF, RF, RF_IF), rd_rn_rm),
18324 cCL("poldm", ec001c0, 3, (RF, RF, RF_IF), rd_rn_rm),
18325 cCL("poldz", ec001e0, 3, (RF, RF, RF_IF), rd_rn_rm),
18326 cCL("pole", ec80100, 3, (RF, RF, RF_IF), rd_rn_rm),
18327 cCL("polep", ec80120, 3, (RF, RF, RF_IF), rd_rn_rm),
18328 cCL("polem", ec80140, 3, (RF, RF, RF_IF), rd_rn_rm),
18329 cCL("polez", ec80160, 3, (RF, RF, RF_IF), rd_rn_rm),
18330
18331 cCE("cmf", e90f110, 2, (RF, RF_IF), fpa_cmp),
18332 C3E("cmfe", ed0f110, 2, (RF, RF_IF), fpa_cmp),
18333 cCE("cnf", eb0f110, 2, (RF, RF_IF), fpa_cmp),
18334 C3E("cnfe", ef0f110, 2, (RF, RF_IF), fpa_cmp),
18335
18336 cCL("flts", e000110, 2, (RF, RR), rn_rd),
18337 cCL("fltsp", e000130, 2, (RF, RR), rn_rd),
18338 cCL("fltsm", e000150, 2, (RF, RR), rn_rd),
18339 cCL("fltsz", e000170, 2, (RF, RR), rn_rd),
18340 cCL("fltd", e000190, 2, (RF, RR), rn_rd),
18341 cCL("fltdp", e0001b0, 2, (RF, RR), rn_rd),
18342 cCL("fltdm", e0001d0, 2, (RF, RR), rn_rd),
18343 cCL("fltdz", e0001f0, 2, (RF, RR), rn_rd),
18344 cCL("flte", e080110, 2, (RF, RR), rn_rd),
18345 cCL("fltep", e080130, 2, (RF, RR), rn_rd),
18346 cCL("fltem", e080150, 2, (RF, RR), rn_rd),
18347 cCL("fltez", e080170, 2, (RF, RR), rn_rd),
b99bd4ef 18348
c19d1205
ZW
18349 /* The implementation of the FIX instruction is broken on some
18350 assemblers, in that it accepts a precision specifier as well as a
18351 rounding specifier, despite the fact that this is meaningless.
18352 To be more compatible, we accept it as well, though of course it
18353 does not set any bits. */
21d799b5
NC
18354 cCE("fix", e100110, 2, (RR, RF), rd_rm),
18355 cCL("fixp", e100130, 2, (RR, RF), rd_rm),
18356 cCL("fixm", e100150, 2, (RR, RF), rd_rm),
18357 cCL("fixz", e100170, 2, (RR, RF), rd_rm),
18358 cCL("fixsp", e100130, 2, (RR, RF), rd_rm),
18359 cCL("fixsm", e100150, 2, (RR, RF), rd_rm),
18360 cCL("fixsz", e100170, 2, (RR, RF), rd_rm),
18361 cCL("fixdp", e100130, 2, (RR, RF), rd_rm),
18362 cCL("fixdm", e100150, 2, (RR, RF), rd_rm),
18363 cCL("fixdz", e100170, 2, (RR, RF), rd_rm),
18364 cCL("fixep", e100130, 2, (RR, RF), rd_rm),
18365 cCL("fixem", e100150, 2, (RR, RF), rd_rm),
18366 cCL("fixez", e100170, 2, (RR, RF), rd_rm),
bfae80f2 18367
c19d1205 18368 /* Instructions that were new with the real FPA, call them V2. */
c921be7d
NC
18369#undef ARM_VARIANT
18370#define ARM_VARIANT & fpu_fpa_ext_v2
18371
21d799b5
NC
18372 cCE("lfm", c100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18373 cCL("lfmfd", c900200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18374 cCL("lfmea", d100200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18375 cCE("sfm", c000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18376 cCL("sfmfd", d000200, 3, (RF, I4b, ADDR), fpa_ldmstm),
18377 cCL("sfmea", c800200, 3, (RF, I4b, ADDR), fpa_ldmstm),
c19d1205 18378
c921be7d
NC
18379#undef ARM_VARIANT
18380#define ARM_VARIANT & fpu_vfp_ext_v1xd /* VFP V1xD (single precision). */
18381
c19d1205 18382 /* Moves and type conversions. */
21d799b5
NC
18383 cCE("fcpys", eb00a40, 2, (RVS, RVS), vfp_sp_monadic),
18384 cCE("fmrs", e100a10, 2, (RR, RVS), vfp_reg_from_sp),
18385 cCE("fmsr", e000a10, 2, (RVS, RR), vfp_sp_from_reg),
18386 cCE("fmstat", ef1fa10, 0, (), noargs),
7465e07a
NC
18387 cCE("vmrs", ef00a10, 2, (APSR_RR, RVC), vmrs),
18388 cCE("vmsr", ee00a10, 2, (RVC, RR), vmsr),
21d799b5
NC
18389 cCE("fsitos", eb80ac0, 2, (RVS, RVS), vfp_sp_monadic),
18390 cCE("fuitos", eb80a40, 2, (RVS, RVS), vfp_sp_monadic),
18391 cCE("ftosis", ebd0a40, 2, (RVS, RVS), vfp_sp_monadic),
18392 cCE("ftosizs", ebd0ac0, 2, (RVS, RVS), vfp_sp_monadic),
18393 cCE("ftouis", ebc0a40, 2, (RVS, RVS), vfp_sp_monadic),
18394 cCE("ftouizs", ebc0ac0, 2, (RVS, RVS), vfp_sp_monadic),
18395 cCE("fmrx", ef00a10, 2, (RR, RVC), rd_rn),
18396 cCE("fmxr", ee00a10, 2, (RVC, RR), rn_rd),
c19d1205
ZW
18397
18398 /* Memory operations. */
21d799b5
NC
18399 cCE("flds", d100a00, 2, (RVS, ADDRGLDC), vfp_sp_ldst),
18400 cCE("fsts", d000a00, 2, (RVS, ADDRGLDC), vfp_sp_ldst),
55881a11
MGD
18401 cCE("fldmias", c900a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmia),
18402 cCE("fldmfds", c900a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmia),
18403 cCE("fldmdbs", d300a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmdb),
18404 cCE("fldmeas", d300a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmdb),
18405 cCE("fldmiax", c900b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmia),
18406 cCE("fldmfdx", c900b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmia),
18407 cCE("fldmdbx", d300b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmdb),
18408 cCE("fldmeax", d300b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmdb),
18409 cCE("fstmias", c800a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmia),
18410 cCE("fstmeas", c800a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmia),
18411 cCE("fstmdbs", d200a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmdb),
18412 cCE("fstmfds", d200a00, 2, (RRnpctw, VRSLST), vfp_sp_ldstmdb),
18413 cCE("fstmiax", c800b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmia),
18414 cCE("fstmeax", c800b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmia),
18415 cCE("fstmdbx", d200b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmdb),
18416 cCE("fstmfdx", d200b00, 2, (RRnpctw, VRDLST), vfp_xp_ldstmdb),
bfae80f2 18417
c19d1205 18418 /* Monadic operations. */
21d799b5
NC
18419 cCE("fabss", eb00ac0, 2, (RVS, RVS), vfp_sp_monadic),
18420 cCE("fnegs", eb10a40, 2, (RVS, RVS), vfp_sp_monadic),
18421 cCE("fsqrts", eb10ac0, 2, (RVS, RVS), vfp_sp_monadic),
c19d1205
ZW
18422
18423 /* Dyadic operations. */
21d799b5
NC
18424 cCE("fadds", e300a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18425 cCE("fsubs", e300a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18426 cCE("fmuls", e200a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18427 cCE("fdivs", e800a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18428 cCE("fmacs", e000a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18429 cCE("fmscs", e100a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18430 cCE("fnmuls", e200a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18431 cCE("fnmacs", e000a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18432 cCE("fnmscs", e100a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
b99bd4ef 18433
c19d1205 18434 /* Comparisons. */
21d799b5
NC
18435 cCE("fcmps", eb40a40, 2, (RVS, RVS), vfp_sp_monadic),
18436 cCE("fcmpzs", eb50a40, 1, (RVS), vfp_sp_compare_z),
18437 cCE("fcmpes", eb40ac0, 2, (RVS, RVS), vfp_sp_monadic),
18438 cCE("fcmpezs", eb50ac0, 1, (RVS), vfp_sp_compare_z),
b99bd4ef 18439
62f3b8c8
PB
18440 /* Double precision load/store are still present on single precision
18441 implementations. */
18442 cCE("fldd", d100b00, 2, (RVD, ADDRGLDC), vfp_dp_ldst),
18443 cCE("fstd", d000b00, 2, (RVD, ADDRGLDC), vfp_dp_ldst),
55881a11
MGD
18444 cCE("fldmiad", c900b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmia),
18445 cCE("fldmfdd", c900b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmia),
18446 cCE("fldmdbd", d300b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmdb),
18447 cCE("fldmead", d300b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmdb),
18448 cCE("fstmiad", c800b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmia),
18449 cCE("fstmead", c800b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmia),
18450 cCE("fstmdbd", d200b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmdb),
18451 cCE("fstmfdd", d200b00, 2, (RRnpctw, VRDLST), vfp_dp_ldstmdb),
62f3b8c8 18452
c921be7d
NC
18453#undef ARM_VARIANT
18454#define ARM_VARIANT & fpu_vfp_ext_v1 /* VFP V1 (Double precision). */
18455
c19d1205 18456 /* Moves and type conversions. */
21d799b5
NC
18457 cCE("fcpyd", eb00b40, 2, (RVD, RVD), vfp_dp_rd_rm),
18458 cCE("fcvtds", eb70ac0, 2, (RVD, RVS), vfp_dp_sp_cvt),
18459 cCE("fcvtsd", eb70bc0, 2, (RVS, RVD), vfp_sp_dp_cvt),
18460 cCE("fmdhr", e200b10, 2, (RVD, RR), vfp_dp_rn_rd),
18461 cCE("fmdlr", e000b10, 2, (RVD, RR), vfp_dp_rn_rd),
18462 cCE("fmrdh", e300b10, 2, (RR, RVD), vfp_dp_rd_rn),
18463 cCE("fmrdl", e100b10, 2, (RR, RVD), vfp_dp_rd_rn),
18464 cCE("fsitod", eb80bc0, 2, (RVD, RVS), vfp_dp_sp_cvt),
18465 cCE("fuitod", eb80b40, 2, (RVD, RVS), vfp_dp_sp_cvt),
18466 cCE("ftosid", ebd0b40, 2, (RVS, RVD), vfp_sp_dp_cvt),
18467 cCE("ftosizd", ebd0bc0, 2, (RVS, RVD), vfp_sp_dp_cvt),
18468 cCE("ftouid", ebc0b40, 2, (RVS, RVD), vfp_sp_dp_cvt),
18469 cCE("ftouizd", ebc0bc0, 2, (RVS, RVD), vfp_sp_dp_cvt),
c19d1205 18470
c19d1205 18471 /* Monadic operations. */
21d799b5
NC
18472 cCE("fabsd", eb00bc0, 2, (RVD, RVD), vfp_dp_rd_rm),
18473 cCE("fnegd", eb10b40, 2, (RVD, RVD), vfp_dp_rd_rm),
18474 cCE("fsqrtd", eb10bc0, 2, (RVD, RVD), vfp_dp_rd_rm),
c19d1205
ZW
18475
18476 /* Dyadic operations. */
21d799b5
NC
18477 cCE("faddd", e300b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18478 cCE("fsubd", e300b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18479 cCE("fmuld", e200b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18480 cCE("fdivd", e800b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18481 cCE("fmacd", e000b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18482 cCE("fmscd", e100b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18483 cCE("fnmuld", e200b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18484 cCE("fnmacd", e000b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18485 cCE("fnmscd", e100b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
b99bd4ef 18486
c19d1205 18487 /* Comparisons. */
21d799b5
NC
18488 cCE("fcmpd", eb40b40, 2, (RVD, RVD), vfp_dp_rd_rm),
18489 cCE("fcmpzd", eb50b40, 1, (RVD), vfp_dp_rd),
18490 cCE("fcmped", eb40bc0, 2, (RVD, RVD), vfp_dp_rd_rm),
18491 cCE("fcmpezd", eb50bc0, 1, (RVD), vfp_dp_rd),
c19d1205 18492
c921be7d
NC
18493#undef ARM_VARIANT
18494#define ARM_VARIANT & fpu_vfp_ext_v2
18495
21d799b5
NC
18496 cCE("fmsrr", c400a10, 3, (VRSLST, RR, RR), vfp_sp2_from_reg2),
18497 cCE("fmrrs", c500a10, 3, (RR, RR, VRSLST), vfp_reg2_from_sp2),
18498 cCE("fmdrr", c400b10, 3, (RVD, RR, RR), vfp_dp_rm_rd_rn),
18499 cCE("fmrrd", c500b10, 3, (RR, RR, RVD), vfp_dp_rd_rn_rm),
5287ad62 18500
037e8744
JB
18501/* Instructions which may belong to either the Neon or VFP instruction sets.
18502 Individual encoder functions perform additional architecture checks. */
c921be7d
NC
18503#undef ARM_VARIANT
18504#define ARM_VARIANT & fpu_vfp_ext_v1xd
18505#undef THUMB_VARIANT
18506#define THUMB_VARIANT & fpu_vfp_ext_v1xd
18507
037e8744
JB
18508 /* These mnemonics are unique to VFP. */
18509 NCE(vsqrt, 0, 2, (RVSD, RVSD), vfp_nsyn_sqrt),
18510 NCE(vdiv, 0, 3, (RVSD, RVSD, RVSD), vfp_nsyn_div),
21d799b5
NC
18511 nCE(vnmul, _vnmul, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18512 nCE(vnmla, _vnmla, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18513 nCE(vnmls, _vnmls, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18514 nCE(vcmp, _vcmp, 2, (RVSD, RVSD_I0), vfp_nsyn_cmp),
18515 nCE(vcmpe, _vcmpe, 2, (RVSD, RVSD_I0), vfp_nsyn_cmp),
037e8744
JB
18516 NCE(vpush, 0, 1, (VRSDLST), vfp_nsyn_push),
18517 NCE(vpop, 0, 1, (VRSDLST), vfp_nsyn_pop),
18518 NCE(vcvtz, 0, 2, (RVSD, RVSD), vfp_nsyn_cvtz),
18519
18520 /* Mnemonics shared by Neon and VFP. */
21d799b5
NC
18521 nCEF(vmul, _vmul, 3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mul),
18522 nCEF(vmla, _vmla, 3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
18523 nCEF(vmls, _vmls, 3, (RNSDQ, oRNSDQ, RNSDQ_RNSC), neon_mac_maybe_scalar),
037e8744 18524
21d799b5
NC
18525 nCEF(vadd, _vadd, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
18526 nCEF(vsub, _vsub, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_addsub_if_i),
037e8744
JB
18527
18528 NCEF(vabs, 1b10300, 2, (RNSDQ, RNSDQ), neon_abs_neg),
18529 NCEF(vneg, 1b10380, 2, (RNSDQ, RNSDQ), neon_abs_neg),
18530
55881a11
MGD
18531 NCE(vldm, c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18532 NCE(vldmia, c900b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18533 NCE(vldmdb, d100b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18534 NCE(vstm, c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18535 NCE(vstmia, c800b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
18536 NCE(vstmdb, d000b00, 2, (RRnpctw, VRSDLST), neon_ldm_stm),
4962c51a
MS
18537 NCE(vldr, d100b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
18538 NCE(vstr, d000b00, 2, (RVSD, ADDRGLDC), neon_ldr_str),
037e8744 18539
5f1af56b 18540 nCEF(vcvt, _vcvt, 3, (RNSDQ, RNSDQ, oI32z), neon_cvt),
e3e535bc 18541 nCEF(vcvtr, _vcvt, 2, (RNSDQ, RNSDQ), neon_cvtr),
21d799b5
NC
18542 nCEF(vcvtb, _vcvt, 2, (RVS, RVS), neon_cvtb),
18543 nCEF(vcvtt, _vcvt, 2, (RVS, RVS), neon_cvtt),
f31fef98 18544
037e8744
JB
18545
18546 /* NOTE: All VMOV encoding is special-cased! */
18547 NCE(vmov, 0, 1, (VMOV), neon_mov),
18548 NCE(vmovq, 0, 1, (VMOV), neon_mov),
18549
c921be7d
NC
18550#undef THUMB_VARIANT
18551#define THUMB_VARIANT & fpu_neon_ext_v1
18552#undef ARM_VARIANT
18553#define ARM_VARIANT & fpu_neon_ext_v1
18554
5287ad62
JB
18555 /* Data processing with three registers of the same length. */
18556 /* integer ops, valid types S8 S16 S32 U8 U16 U32. */
18557 NUF(vaba, 0000710, 3, (RNDQ, RNDQ, RNDQ), neon_dyadic_i_su),
18558 NUF(vabaq, 0000710, 3, (RNQ, RNQ, RNQ), neon_dyadic_i_su),
18559 NUF(vhadd, 0000000, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
18560 NUF(vhaddq, 0000000, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i_su),
18561 NUF(vrhadd, 0000100, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
18562 NUF(vrhaddq, 0000100, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i_su),
18563 NUF(vhsub, 0000200, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i_su),
18564 NUF(vhsubq, 0000200, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i_su),
18565 /* integer ops, valid types S8 S16 S32 S64 U8 U16 U32 U64. */
18566 NUF(vqadd, 0000010, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
18567 NUF(vqaddq, 0000010, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i64_su),
18568 NUF(vqsub, 0000210, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_i64_su),
18569 NUF(vqsubq, 0000210, 3, (RNQ, oRNQ, RNQ), neon_dyadic_i64_su),
627907b7
JB
18570 NUF(vrshl, 0000500, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
18571 NUF(vrshlq, 0000500, 3, (RNQ, oRNQ, RNQ), neon_rshl),
18572 NUF(vqrshl, 0000510, 3, (RNDQ, oRNDQ, RNDQ), neon_rshl),
18573 NUF(vqrshlq, 0000510, 3, (RNQ, oRNQ, RNQ), neon_rshl),
5287ad62
JB
18574 /* If not immediate, fall back to neon_dyadic_i64_su.
18575 shl_imm should accept I8 I16 I32 I64,
18576 qshl_imm should accept S8 S16 S32 S64 U8 U16 U32 U64. */
21d799b5
NC
18577 nUF(vshl, _vshl, 3, (RNDQ, oRNDQ, RNDQ_I63b), neon_shl_imm),
18578 nUF(vshlq, _vshl, 3, (RNQ, oRNQ, RNDQ_I63b), neon_shl_imm),
18579 nUF(vqshl, _vqshl, 3, (RNDQ, oRNDQ, RNDQ_I63b), neon_qshl_imm),
18580 nUF(vqshlq, _vqshl, 3, (RNQ, oRNQ, RNDQ_I63b), neon_qshl_imm),
5287ad62 18581 /* Logic ops, types optional & ignored. */
4316f0d2
DG
18582 nUF(vand, _vand, 3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18583 nUF(vandq, _vand, 3, (RNQ, oRNQ, RNDQ_Ibig), neon_logic),
18584 nUF(vbic, _vbic, 3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18585 nUF(vbicq, _vbic, 3, (RNQ, oRNQ, RNDQ_Ibig), neon_logic),
18586 nUF(vorr, _vorr, 3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18587 nUF(vorrq, _vorr, 3, (RNQ, oRNQ, RNDQ_Ibig), neon_logic),
18588 nUF(vorn, _vorn, 3, (RNDQ, oRNDQ, RNDQ_Ibig), neon_logic),
18589 nUF(vornq, _vorn, 3, (RNQ, oRNQ, RNDQ_Ibig), neon_logic),
18590 nUF(veor, _veor, 3, (RNDQ, oRNDQ, RNDQ), neon_logic),
18591 nUF(veorq, _veor, 3, (RNQ, oRNQ, RNQ), neon_logic),
5287ad62
JB
18592 /* Bitfield ops, untyped. */
18593 NUF(vbsl, 1100110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
18594 NUF(vbslq, 1100110, 3, (RNQ, RNQ, RNQ), neon_bitfield),
18595 NUF(vbit, 1200110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
18596 NUF(vbitq, 1200110, 3, (RNQ, RNQ, RNQ), neon_bitfield),
18597 NUF(vbif, 1300110, 3, (RNDQ, RNDQ, RNDQ), neon_bitfield),
18598 NUF(vbifq, 1300110, 3, (RNQ, RNQ, RNQ), neon_bitfield),
18599 /* Int and float variants, types S8 S16 S32 U8 U16 U32 F32. */
21d799b5
NC
18600 nUF(vabd, _vabd, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
18601 nUF(vabdq, _vabd, 3, (RNQ, oRNQ, RNQ), neon_dyadic_if_su),
18602 nUF(vmax, _vmax, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
18603 nUF(vmaxq, _vmax, 3, (RNQ, oRNQ, RNQ), neon_dyadic_if_su),
18604 nUF(vmin, _vmin, 3, (RNDQ, oRNDQ, RNDQ), neon_dyadic_if_su),
18605 nUF(vminq, _vmin, 3, (RNQ, oRNQ, RNQ), neon_dyadic_if_su),
5287ad62
JB
18606 /* Comparisons. Types S8 S16 S32 U8 U16 U32 F32. Non-immediate versions fall
18607 back to neon_dyadic_if_su. */
21d799b5
NC
18608 nUF(vcge, _vcge, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
18609 nUF(vcgeq, _vcge, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp),
18610 nUF(vcgt, _vcgt, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp),
18611 nUF(vcgtq, _vcgt, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp),
18612 nUF(vclt, _vclt, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
18613 nUF(vcltq, _vclt, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp_inv),
18614 nUF(vcle, _vcle, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_cmp_inv),
18615 nUF(vcleq, _vcle, 3, (RNQ, oRNQ, RNDQ_I0), neon_cmp_inv),
428e3f1f 18616 /* Comparison. Type I8 I16 I32 F32. */
21d799b5
NC
18617 nUF(vceq, _vceq, 3, (RNDQ, oRNDQ, RNDQ_I0), neon_ceq),
18618 nUF(vceqq, _vceq, 3, (RNQ, oRNQ, RNDQ_I0), neon_ceq),
5287ad62 18619 /* As above, D registers only. */
21d799b5
NC
18620 nUF(vpmax, _vpmax, 3, (RND, oRND, RND), neon_dyadic_if_su_d),
18621 nUF(vpmin, _vpmin, 3, (RND, oRND, RND), neon_dyadic_if_su_d),
5287ad62 18622 /* Int and float variants, signedness unimportant. */
21d799b5
NC
18623 nUF(vmlaq, _vmla, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_mac_maybe_scalar),
18624 nUF(vmlsq, _vmls, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_mac_maybe_scalar),
18625 nUF(vpadd, _vpadd, 3, (RND, oRND, RND), neon_dyadic_if_i_d),
5287ad62 18626 /* Add/sub take types I8 I16 I32 I64 F32. */
21d799b5
NC
18627 nUF(vaddq, _vadd, 3, (RNQ, oRNQ, RNQ), neon_addsub_if_i),
18628 nUF(vsubq, _vsub, 3, (RNQ, oRNQ, RNQ), neon_addsub_if_i),
5287ad62
JB
18629 /* vtst takes sizes 8, 16, 32. */
18630 NUF(vtst, 0000810, 3, (RNDQ, oRNDQ, RNDQ), neon_tst),
18631 NUF(vtstq, 0000810, 3, (RNQ, oRNQ, RNQ), neon_tst),
18632 /* VMUL takes I8 I16 I32 F32 P8. */
21d799b5 18633 nUF(vmulq, _vmul, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_mul),
5287ad62 18634 /* VQD{R}MULH takes S16 S32. */
21d799b5
NC
18635 nUF(vqdmulh, _vqdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
18636 nUF(vqdmulhq, _vqdmulh, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_qdmulh),
18637 nUF(vqrdmulh, _vqrdmulh, 3, (RNDQ, oRNDQ, RNDQ_RNSC), neon_qdmulh),
18638 nUF(vqrdmulhq, _vqrdmulh, 3, (RNQ, oRNQ, RNDQ_RNSC), neon_qdmulh),
5287ad62
JB
18639 NUF(vacge, 0000e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
18640 NUF(vacgeq, 0000e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute),
18641 NUF(vacgt, 0200e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute),
18642 NUF(vacgtq, 0200e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute),
92559b5b
PB
18643 NUF(vaclt, 0200e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
18644 NUF(vacltq, 0200e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute_inv),
18645 NUF(vacle, 0000e10, 3, (RNDQ, oRNDQ, RNDQ), neon_fcmp_absolute_inv),
18646 NUF(vacleq, 0000e10, 3, (RNQ, oRNQ, RNQ), neon_fcmp_absolute_inv),
5287ad62
JB
18647 NUF(vrecps, 0000f10, 3, (RNDQ, oRNDQ, RNDQ), neon_step),
18648 NUF(vrecpsq, 0000f10, 3, (RNQ, oRNQ, RNQ), neon_step),
18649 NUF(vrsqrts, 0200f10, 3, (RNDQ, oRNDQ, RNDQ), neon_step),
18650 NUF(vrsqrtsq, 0200f10, 3, (RNQ, oRNQ, RNQ), neon_step),
18651
18652 /* Two address, int/float. Types S8 S16 S32 F32. */
5287ad62 18653 NUF(vabsq, 1b10300, 2, (RNQ, RNQ), neon_abs_neg),
5287ad62
JB
18654 NUF(vnegq, 1b10380, 2, (RNQ, RNQ), neon_abs_neg),
18655
18656 /* Data processing with two registers and a shift amount. */
18657 /* Right shifts, and variants with rounding.
18658 Types accepted S8 S16 S32 S64 U8 U16 U32 U64. */
18659 NUF(vshr, 0800010, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
18660 NUF(vshrq, 0800010, 3, (RNQ, oRNQ, I64z), neon_rshift_round_imm),
18661 NUF(vrshr, 0800210, 3, (RNDQ, oRNDQ, I64z), neon_rshift_round_imm),
18662 NUF(vrshrq, 0800210, 3, (RNQ, oRNQ, I64z), neon_rshift_round_imm),
18663 NUF(vsra, 0800110, 3, (RNDQ, oRNDQ, I64), neon_rshift_round_imm),
18664 NUF(vsraq, 0800110, 3, (RNQ, oRNQ, I64), neon_rshift_round_imm),
18665 NUF(vrsra, 0800310, 3, (RNDQ, oRNDQ, I64), neon_rshift_round_imm),
18666 NUF(vrsraq, 0800310, 3, (RNQ, oRNQ, I64), neon_rshift_round_imm),
18667 /* Shift and insert. Sizes accepted 8 16 32 64. */
18668 NUF(vsli, 1800510, 3, (RNDQ, oRNDQ, I63), neon_sli),
18669 NUF(vsliq, 1800510, 3, (RNQ, oRNQ, I63), neon_sli),
18670 NUF(vsri, 1800410, 3, (RNDQ, oRNDQ, I64), neon_sri),
18671 NUF(vsriq, 1800410, 3, (RNQ, oRNQ, I64), neon_sri),
18672 /* QSHL{U} immediate accepts S8 S16 S32 S64 U8 U16 U32 U64. */
18673 NUF(vqshlu, 1800610, 3, (RNDQ, oRNDQ, I63), neon_qshlu_imm),
18674 NUF(vqshluq, 1800610, 3, (RNQ, oRNQ, I63), neon_qshlu_imm),
18675 /* Right shift immediate, saturating & narrowing, with rounding variants.
18676 Types accepted S16 S32 S64 U16 U32 U64. */
18677 NUF(vqshrn, 0800910, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
18678 NUF(vqrshrn, 0800950, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow),
18679 /* As above, unsigned. Types accepted S16 S32 S64. */
18680 NUF(vqshrun, 0800810, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
18681 NUF(vqrshrun, 0800850, 3, (RND, RNQ, I32z), neon_rshift_sat_narrow_u),
18682 /* Right shift narrowing. Types accepted I16 I32 I64. */
18683 NUF(vshrn, 0800810, 3, (RND, RNQ, I32z), neon_rshift_narrow),
18684 NUF(vrshrn, 0800850, 3, (RND, RNQ, I32z), neon_rshift_narrow),
18685 /* Special case. Types S8 S16 S32 U8 U16 U32. Handles max shift variant. */
21d799b5 18686 nUF(vshll, _vshll, 3, (RNQ, RND, I32), neon_shll),
5287ad62 18687 /* CVT with optional immediate for fixed-point variant. */
21d799b5 18688 nUF(vcvtq, _vcvt, 3, (RNQ, RNQ, oI32b), neon_cvt),
b7fc2769 18689
4316f0d2
DG
18690 nUF(vmvn, _vmvn, 2, (RNDQ, RNDQ_Ibig), neon_mvn),
18691 nUF(vmvnq, _vmvn, 2, (RNQ, RNDQ_Ibig), neon_mvn),
5287ad62
JB
18692
18693 /* Data processing, three registers of different lengths. */
18694 /* Dyadic, long insns. Types S8 S16 S32 U8 U16 U32. */
18695 NUF(vabal, 0800500, 3, (RNQ, RND, RND), neon_abal),
18696 NUF(vabdl, 0800700, 3, (RNQ, RND, RND), neon_dyadic_long),
18697 NUF(vaddl, 0800000, 3, (RNQ, RND, RND), neon_dyadic_long),
18698 NUF(vsubl, 0800200, 3, (RNQ, RND, RND), neon_dyadic_long),
18699 /* If not scalar, fall back to neon_dyadic_long.
18700 Vector types as above, scalar types S16 S32 U16 U32. */
21d799b5
NC
18701 nUF(vmlal, _vmlal, 3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
18702 nUF(vmlsl, _vmlsl, 3, (RNQ, RND, RND_RNSC), neon_mac_maybe_scalar_long),
5287ad62
JB
18703 /* Dyadic, widening insns. Types S8 S16 S32 U8 U16 U32. */
18704 NUF(vaddw, 0800100, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
18705 NUF(vsubw, 0800300, 3, (RNQ, oRNQ, RND), neon_dyadic_wide),
18706 /* Dyadic, narrowing insns. Types I16 I32 I64. */
18707 NUF(vaddhn, 0800400, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
18708 NUF(vraddhn, 1800400, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
18709 NUF(vsubhn, 0800600, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
18710 NUF(vrsubhn, 1800600, 3, (RND, RNQ, RNQ), neon_dyadic_narrow),
18711 /* Saturating doubling multiplies. Types S16 S32. */
21d799b5
NC
18712 nUF(vqdmlal, _vqdmlal, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18713 nUF(vqdmlsl, _vqdmlsl, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
18714 nUF(vqdmull, _vqdmull, 3, (RNQ, RND, RND_RNSC), neon_mul_sat_scalar_long),
5287ad62
JB
18715 /* VMULL. Vector types S8 S16 S32 U8 U16 U32 P8, scalar types
18716 S16 S32 U16 U32. */
21d799b5 18717 nUF(vmull, _vmull, 3, (RNQ, RND, RND_RNSC), neon_vmull),
5287ad62
JB
18718
18719 /* Extract. Size 8. */
3b8d421e
PB
18720 NUF(vext, 0b00000, 4, (RNDQ, oRNDQ, RNDQ, I15), neon_ext),
18721 NUF(vextq, 0b00000, 4, (RNQ, oRNQ, RNQ, I15), neon_ext),
5287ad62
JB
18722
18723 /* Two registers, miscellaneous. */
18724 /* Reverse. Sizes 8 16 32 (must be < size in opcode). */
18725 NUF(vrev64, 1b00000, 2, (RNDQ, RNDQ), neon_rev),
18726 NUF(vrev64q, 1b00000, 2, (RNQ, RNQ), neon_rev),
18727 NUF(vrev32, 1b00080, 2, (RNDQ, RNDQ), neon_rev),
18728 NUF(vrev32q, 1b00080, 2, (RNQ, RNQ), neon_rev),
18729 NUF(vrev16, 1b00100, 2, (RNDQ, RNDQ), neon_rev),
18730 NUF(vrev16q, 1b00100, 2, (RNQ, RNQ), neon_rev),
18731 /* Vector replicate. Sizes 8 16 32. */
21d799b5
NC
18732 nCE(vdup, _vdup, 2, (RNDQ, RR_RNSC), neon_dup),
18733 nCE(vdupq, _vdup, 2, (RNQ, RR_RNSC), neon_dup),
5287ad62
JB
18734 /* VMOVL. Types S8 S16 S32 U8 U16 U32. */
18735 NUF(vmovl, 0800a10, 2, (RNQ, RND), neon_movl),
18736 /* VMOVN. Types I16 I32 I64. */
21d799b5 18737 nUF(vmovn, _vmovn, 2, (RND, RNQ), neon_movn),
5287ad62 18738 /* VQMOVN. Types S16 S32 S64 U16 U32 U64. */
21d799b5 18739 nUF(vqmovn, _vqmovn, 2, (RND, RNQ), neon_qmovn),
5287ad62 18740 /* VQMOVUN. Types S16 S32 S64. */
21d799b5 18741 nUF(vqmovun, _vqmovun, 2, (RND, RNQ), neon_qmovun),
5287ad62
JB
18742 /* VZIP / VUZP. Sizes 8 16 32. */
18743 NUF(vzip, 1b20180, 2, (RNDQ, RNDQ), neon_zip_uzp),
18744 NUF(vzipq, 1b20180, 2, (RNQ, RNQ), neon_zip_uzp),
18745 NUF(vuzp, 1b20100, 2, (RNDQ, RNDQ), neon_zip_uzp),
18746 NUF(vuzpq, 1b20100, 2, (RNQ, RNQ), neon_zip_uzp),
18747 /* VQABS / VQNEG. Types S8 S16 S32. */
18748 NUF(vqabs, 1b00700, 2, (RNDQ, RNDQ), neon_sat_abs_neg),
18749 NUF(vqabsq, 1b00700, 2, (RNQ, RNQ), neon_sat_abs_neg),
18750 NUF(vqneg, 1b00780, 2, (RNDQ, RNDQ), neon_sat_abs_neg),
18751 NUF(vqnegq, 1b00780, 2, (RNQ, RNQ), neon_sat_abs_neg),
18752 /* Pairwise, lengthening. Types S8 S16 S32 U8 U16 U32. */
18753 NUF(vpadal, 1b00600, 2, (RNDQ, RNDQ), neon_pair_long),
18754 NUF(vpadalq, 1b00600, 2, (RNQ, RNQ), neon_pair_long),
18755 NUF(vpaddl, 1b00200, 2, (RNDQ, RNDQ), neon_pair_long),
18756 NUF(vpaddlq, 1b00200, 2, (RNQ, RNQ), neon_pair_long),
18757 /* Reciprocal estimates. Types U32 F32. */
18758 NUF(vrecpe, 1b30400, 2, (RNDQ, RNDQ), neon_recip_est),
18759 NUF(vrecpeq, 1b30400, 2, (RNQ, RNQ), neon_recip_est),
18760 NUF(vrsqrte, 1b30480, 2, (RNDQ, RNDQ), neon_recip_est),
18761 NUF(vrsqrteq, 1b30480, 2, (RNQ, RNQ), neon_recip_est),
18762 /* VCLS. Types S8 S16 S32. */
18763 NUF(vcls, 1b00400, 2, (RNDQ, RNDQ), neon_cls),
18764 NUF(vclsq, 1b00400, 2, (RNQ, RNQ), neon_cls),
18765 /* VCLZ. Types I8 I16 I32. */
18766 NUF(vclz, 1b00480, 2, (RNDQ, RNDQ), neon_clz),
18767 NUF(vclzq, 1b00480, 2, (RNQ, RNQ), neon_clz),
18768 /* VCNT. Size 8. */
18769 NUF(vcnt, 1b00500, 2, (RNDQ, RNDQ), neon_cnt),
18770 NUF(vcntq, 1b00500, 2, (RNQ, RNQ), neon_cnt),
18771 /* Two address, untyped. */
18772 NUF(vswp, 1b20000, 2, (RNDQ, RNDQ), neon_swp),
18773 NUF(vswpq, 1b20000, 2, (RNQ, RNQ), neon_swp),
18774 /* VTRN. Sizes 8 16 32. */
21d799b5
NC
18775 nUF(vtrn, _vtrn, 2, (RNDQ, RNDQ), neon_trn),
18776 nUF(vtrnq, _vtrn, 2, (RNQ, RNQ), neon_trn),
5287ad62
JB
18777
18778 /* Table lookup. Size 8. */
18779 NUF(vtbl, 1b00800, 3, (RND, NRDLST, RND), neon_tbl_tbx),
18780 NUF(vtbx, 1b00840, 3, (RND, NRDLST, RND), neon_tbl_tbx),
18781
c921be7d
NC
18782#undef THUMB_VARIANT
18783#define THUMB_VARIANT & fpu_vfp_v3_or_neon_ext
18784#undef ARM_VARIANT
18785#define ARM_VARIANT & fpu_vfp_v3_or_neon_ext
18786
5287ad62 18787 /* Neon element/structure load/store. */
21d799b5
NC
18788 nUF(vld1, _vld1, 2, (NSTRLST, ADDR), neon_ldx_stx),
18789 nUF(vst1, _vst1, 2, (NSTRLST, ADDR), neon_ldx_stx),
18790 nUF(vld2, _vld2, 2, (NSTRLST, ADDR), neon_ldx_stx),
18791 nUF(vst2, _vst2, 2, (NSTRLST, ADDR), neon_ldx_stx),
18792 nUF(vld3, _vld3, 2, (NSTRLST, ADDR), neon_ldx_stx),
18793 nUF(vst3, _vst3, 2, (NSTRLST, ADDR), neon_ldx_stx),
18794 nUF(vld4, _vld4, 2, (NSTRLST, ADDR), neon_ldx_stx),
18795 nUF(vst4, _vst4, 2, (NSTRLST, ADDR), neon_ldx_stx),
5287ad62 18796
c921be7d 18797#undef THUMB_VARIANT
62f3b8c8
PB
18798#define THUMB_VARIANT &fpu_vfp_ext_v3xd
18799#undef ARM_VARIANT
18800#define ARM_VARIANT &fpu_vfp_ext_v3xd
18801 cCE("fconsts", eb00a00, 2, (RVS, I255), vfp_sp_const),
18802 cCE("fshtos", eba0a40, 2, (RVS, I16z), vfp_sp_conv_16),
18803 cCE("fsltos", eba0ac0, 2, (RVS, I32), vfp_sp_conv_32),
18804 cCE("fuhtos", ebb0a40, 2, (RVS, I16z), vfp_sp_conv_16),
18805 cCE("fultos", ebb0ac0, 2, (RVS, I32), vfp_sp_conv_32),
18806 cCE("ftoshs", ebe0a40, 2, (RVS, I16z), vfp_sp_conv_16),
18807 cCE("ftosls", ebe0ac0, 2, (RVS, I32), vfp_sp_conv_32),
18808 cCE("ftouhs", ebf0a40, 2, (RVS, I16z), vfp_sp_conv_16),
18809 cCE("ftouls", ebf0ac0, 2, (RVS, I32), vfp_sp_conv_32),
18810
18811#undef THUMB_VARIANT
c921be7d
NC
18812#define THUMB_VARIANT & fpu_vfp_ext_v3
18813#undef ARM_VARIANT
18814#define ARM_VARIANT & fpu_vfp_ext_v3
18815
21d799b5 18816 cCE("fconstd", eb00b00, 2, (RVD, I255), vfp_dp_const),
21d799b5 18817 cCE("fshtod", eba0b40, 2, (RVD, I16z), vfp_dp_conv_16),
21d799b5 18818 cCE("fsltod", eba0bc0, 2, (RVD, I32), vfp_dp_conv_32),
21d799b5 18819 cCE("fuhtod", ebb0b40, 2, (RVD, I16z), vfp_dp_conv_16),
21d799b5 18820 cCE("fultod", ebb0bc0, 2, (RVD, I32), vfp_dp_conv_32),
21d799b5 18821 cCE("ftoshd", ebe0b40, 2, (RVD, I16z), vfp_dp_conv_16),
21d799b5 18822 cCE("ftosld", ebe0bc0, 2, (RVD, I32), vfp_dp_conv_32),
21d799b5 18823 cCE("ftouhd", ebf0b40, 2, (RVD, I16z), vfp_dp_conv_16),
21d799b5 18824 cCE("ftould", ebf0bc0, 2, (RVD, I32), vfp_dp_conv_32),
c19d1205 18825
62f3b8c8
PB
18826#undef ARM_VARIANT
18827#define ARM_VARIANT &fpu_vfp_ext_fma
18828#undef THUMB_VARIANT
18829#define THUMB_VARIANT &fpu_vfp_ext_fma
18830 /* Mnemonics shared by Neon and VFP. These are included in the
18831 VFP FMA variant; NEON and VFP FMA always includes the NEON
18832 FMA instructions. */
18833 nCEF(vfma, _vfma, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
18834 nCEF(vfms, _vfms, 3, (RNSDQ, oRNSDQ, RNSDQ), neon_fmac),
18835 /* ffmas/ffmad/ffmss/ffmsd are dummy mnemonics to satisfy gas;
18836 the v form should always be used. */
18837 cCE("ffmas", ea00a00, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18838 cCE("ffnmas", ea00a40, 3, (RVS, RVS, RVS), vfp_sp_dyadic),
18839 cCE("ffmad", ea00b00, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18840 cCE("ffnmad", ea00b40, 3, (RVD, RVD, RVD), vfp_dp_rd_rn_rm),
18841 nCE(vfnma, _vfnma, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18842 nCE(vfnms, _vfnms, 3, (RVSD, RVSD, RVSD), vfp_nsyn_nmul),
18843
5287ad62 18844#undef THUMB_VARIANT
c921be7d
NC
18845#undef ARM_VARIANT
18846#define ARM_VARIANT & arm_cext_xscale /* Intel XScale extensions. */
18847
21d799b5
NC
18848 cCE("mia", e200010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18849 cCE("miaph", e280010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18850 cCE("miabb", e2c0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18851 cCE("miabt", e2d0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18852 cCE("miatb", e2e0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18853 cCE("miatt", e2f0010, 3, (RXA, RRnpc, RRnpc), xsc_mia),
18854 cCE("mar", c400000, 3, (RXA, RRnpc, RRnpc), xsc_mar),
18855 cCE("mra", c500000, 3, (RRnpc, RRnpc, RXA), xsc_mra),
c19d1205 18856
c921be7d
NC
18857#undef ARM_VARIANT
18858#define ARM_VARIANT & arm_cext_iwmmxt /* Intel Wireless MMX technology. */
18859
21d799b5
NC
18860 cCE("tandcb", e13f130, 1, (RR), iwmmxt_tandorc),
18861 cCE("tandch", e53f130, 1, (RR), iwmmxt_tandorc),
18862 cCE("tandcw", e93f130, 1, (RR), iwmmxt_tandorc),
18863 cCE("tbcstb", e400010, 2, (RIWR, RR), rn_rd),
18864 cCE("tbcsth", e400050, 2, (RIWR, RR), rn_rd),
18865 cCE("tbcstw", e400090, 2, (RIWR, RR), rn_rd),
18866 cCE("textrcb", e130170, 2, (RR, I7), iwmmxt_textrc),
18867 cCE("textrch", e530170, 2, (RR, I7), iwmmxt_textrc),
18868 cCE("textrcw", e930170, 2, (RR, I7), iwmmxt_textrc),
18869 cCE("textrmub", e100070, 3, (RR, RIWR, I7), iwmmxt_textrm),
18870 cCE("textrmuh", e500070, 3, (RR, RIWR, I7), iwmmxt_textrm),
18871 cCE("textrmuw", e900070, 3, (RR, RIWR, I7), iwmmxt_textrm),
18872 cCE("textrmsb", e100078, 3, (RR, RIWR, I7), iwmmxt_textrm),
18873 cCE("textrmsh", e500078, 3, (RR, RIWR, I7), iwmmxt_textrm),
18874 cCE("textrmsw", e900078, 3, (RR, RIWR, I7), iwmmxt_textrm),
18875 cCE("tinsrb", e600010, 3, (RIWR, RR, I7), iwmmxt_tinsr),
18876 cCE("tinsrh", e600050, 3, (RIWR, RR, I7), iwmmxt_tinsr),
18877 cCE("tinsrw", e600090, 3, (RIWR, RR, I7), iwmmxt_tinsr),
18878 cCE("tmcr", e000110, 2, (RIWC_RIWG, RR), rn_rd),
18879 cCE("tmcrr", c400000, 3, (RIWR, RR, RR), rm_rd_rn),
18880 cCE("tmia", e200010, 3, (RIWR, RR, RR), iwmmxt_tmia),
18881 cCE("tmiaph", e280010, 3, (RIWR, RR, RR), iwmmxt_tmia),
18882 cCE("tmiabb", e2c0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
18883 cCE("tmiabt", e2d0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
18884 cCE("tmiatb", e2e0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
18885 cCE("tmiatt", e2f0010, 3, (RIWR, RR, RR), iwmmxt_tmia),
18886 cCE("tmovmskb", e100030, 2, (RR, RIWR), rd_rn),
18887 cCE("tmovmskh", e500030, 2, (RR, RIWR), rd_rn),
18888 cCE("tmovmskw", e900030, 2, (RR, RIWR), rd_rn),
18889 cCE("tmrc", e100110, 2, (RR, RIWC_RIWG), rd_rn),
18890 cCE("tmrrc", c500000, 3, (RR, RR, RIWR), rd_rn_rm),
18891 cCE("torcb", e13f150, 1, (RR), iwmmxt_tandorc),
18892 cCE("torch", e53f150, 1, (RR), iwmmxt_tandorc),
18893 cCE("torcw", e93f150, 1, (RR), iwmmxt_tandorc),
18894 cCE("waccb", e0001c0, 2, (RIWR, RIWR), rd_rn),
18895 cCE("wacch", e4001c0, 2, (RIWR, RIWR), rd_rn),
18896 cCE("waccw", e8001c0, 2, (RIWR, RIWR), rd_rn),
18897 cCE("waddbss", e300180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18898 cCE("waddb", e000180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18899 cCE("waddbus", e100180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18900 cCE("waddhss", e700180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18901 cCE("waddh", e400180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18902 cCE("waddhus", e500180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18903 cCE("waddwss", eb00180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18904 cCE("waddw", e800180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18905 cCE("waddwus", e900180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18906 cCE("waligni", e000020, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_waligni),
18907 cCE("walignr0", e800020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18908 cCE("walignr1", e900020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18909 cCE("walignr2", ea00020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18910 cCE("walignr3", eb00020, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18911 cCE("wand", e200000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18912 cCE("wandn", e300000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18913 cCE("wavg2b", e800000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18914 cCE("wavg2br", e900000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18915 cCE("wavg2h", ec00000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18916 cCE("wavg2hr", ed00000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18917 cCE("wcmpeqb", e000060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18918 cCE("wcmpeqh", e400060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18919 cCE("wcmpeqw", e800060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18920 cCE("wcmpgtub", e100060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18921 cCE("wcmpgtuh", e500060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18922 cCE("wcmpgtuw", e900060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18923 cCE("wcmpgtsb", e300060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18924 cCE("wcmpgtsh", e700060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18925 cCE("wcmpgtsw", eb00060, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18926 cCE("wldrb", c100000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
18927 cCE("wldrh", c500000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
18928 cCE("wldrw", c100100, 2, (RIWR_RIWC, ADDR), iwmmxt_wldstw),
18929 cCE("wldrd", c500100, 2, (RIWR, ADDR), iwmmxt_wldstd),
18930 cCE("wmacs", e600100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18931 cCE("wmacsz", e700100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18932 cCE("wmacu", e400100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18933 cCE("wmacuz", e500100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18934 cCE("wmadds", ea00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18935 cCE("wmaddu", e800100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18936 cCE("wmaxsb", e200160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18937 cCE("wmaxsh", e600160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18938 cCE("wmaxsw", ea00160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18939 cCE("wmaxub", e000160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18940 cCE("wmaxuh", e400160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18941 cCE("wmaxuw", e800160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18942 cCE("wminsb", e300160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18943 cCE("wminsh", e700160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18944 cCE("wminsw", eb00160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18945 cCE("wminub", e100160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18946 cCE("wminuh", e500160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18947 cCE("wminuw", e900160, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18948 cCE("wmov", e000000, 2, (RIWR, RIWR), iwmmxt_wmov),
18949 cCE("wmulsm", e300100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18950 cCE("wmulsl", e200100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18951 cCE("wmulum", e100100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18952 cCE("wmulul", e000100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18953 cCE("wor", e000000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18954 cCE("wpackhss", e700080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18955 cCE("wpackhus", e500080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18956 cCE("wpackwss", eb00080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18957 cCE("wpackwus", e900080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18958 cCE("wpackdss", ef00080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18959 cCE("wpackdus", ed00080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18960 cCE("wrorh", e700040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18961 cCE("wrorhg", e700148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18962 cCE("wrorw", eb00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18963 cCE("wrorwg", eb00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18964 cCE("wrord", ef00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18965 cCE("wrordg", ef00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18966 cCE("wsadb", e000120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18967 cCE("wsadbz", e100120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18968 cCE("wsadh", e400120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18969 cCE("wsadhz", e500120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18970 cCE("wshufh", e0001e0, 3, (RIWR, RIWR, I255), iwmmxt_wshufh),
18971 cCE("wsllh", e500040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18972 cCE("wsllhg", e500148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18973 cCE("wsllw", e900040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18974 cCE("wsllwg", e900148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18975 cCE("wslld", ed00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18976 cCE("wslldg", ed00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18977 cCE("wsrah", e400040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18978 cCE("wsrahg", e400148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18979 cCE("wsraw", e800040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18980 cCE("wsrawg", e800148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18981 cCE("wsrad", ec00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18982 cCE("wsradg", ec00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18983 cCE("wsrlh", e600040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18984 cCE("wsrlhg", e600148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18985 cCE("wsrlw", ea00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18986 cCE("wsrlwg", ea00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18987 cCE("wsrld", ee00040, 3, (RIWR, RIWR, RIWR_I32z),iwmmxt_wrwrwr_or_imm5),
18988 cCE("wsrldg", ee00148, 3, (RIWR, RIWR, RIWG), rd_rn_rm),
18989 cCE("wstrb", c000000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
18990 cCE("wstrh", c400000, 2, (RIWR, ADDR), iwmmxt_wldstbh),
18991 cCE("wstrw", c000100, 2, (RIWR_RIWC, ADDR), iwmmxt_wldstw),
18992 cCE("wstrd", c400100, 2, (RIWR, ADDR), iwmmxt_wldstd),
18993 cCE("wsubbss", e3001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18994 cCE("wsubb", e0001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18995 cCE("wsubbus", e1001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18996 cCE("wsubhss", e7001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18997 cCE("wsubh", e4001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18998 cCE("wsubhus", e5001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
18999 cCE("wsubwss", eb001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19000 cCE("wsubw", e8001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19001 cCE("wsubwus", e9001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19002 cCE("wunpckehub",e0000c0, 2, (RIWR, RIWR), rd_rn),
19003 cCE("wunpckehuh",e4000c0, 2, (RIWR, RIWR), rd_rn),
19004 cCE("wunpckehuw",e8000c0, 2, (RIWR, RIWR), rd_rn),
19005 cCE("wunpckehsb",e2000c0, 2, (RIWR, RIWR), rd_rn),
19006 cCE("wunpckehsh",e6000c0, 2, (RIWR, RIWR), rd_rn),
19007 cCE("wunpckehsw",ea000c0, 2, (RIWR, RIWR), rd_rn),
19008 cCE("wunpckihb", e1000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19009 cCE("wunpckihh", e5000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19010 cCE("wunpckihw", e9000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19011 cCE("wunpckelub",e0000e0, 2, (RIWR, RIWR), rd_rn),
19012 cCE("wunpckeluh",e4000e0, 2, (RIWR, RIWR), rd_rn),
19013 cCE("wunpckeluw",e8000e0, 2, (RIWR, RIWR), rd_rn),
19014 cCE("wunpckelsb",e2000e0, 2, (RIWR, RIWR), rd_rn),
19015 cCE("wunpckelsh",e6000e0, 2, (RIWR, RIWR), rd_rn),
19016 cCE("wunpckelsw",ea000e0, 2, (RIWR, RIWR), rd_rn),
19017 cCE("wunpckilb", e1000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19018 cCE("wunpckilh", e5000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19019 cCE("wunpckilw", e9000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19020 cCE("wxor", e100000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19021 cCE("wzero", e300000, 1, (RIWR), iwmmxt_wzero),
c19d1205 19022
c921be7d
NC
19023#undef ARM_VARIANT
19024#define ARM_VARIANT & arm_cext_iwmmxt2 /* Intel Wireless MMX technology, version 2. */
19025
21d799b5
NC
19026 cCE("torvscb", e12f190, 1, (RR), iwmmxt_tandorc),
19027 cCE("torvsch", e52f190, 1, (RR), iwmmxt_tandorc),
19028 cCE("torvscw", e92f190, 1, (RR), iwmmxt_tandorc),
19029 cCE("wabsb", e2001c0, 2, (RIWR, RIWR), rd_rn),
19030 cCE("wabsh", e6001c0, 2, (RIWR, RIWR), rd_rn),
19031 cCE("wabsw", ea001c0, 2, (RIWR, RIWR), rd_rn),
19032 cCE("wabsdiffb", e1001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19033 cCE("wabsdiffh", e5001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19034 cCE("wabsdiffw", e9001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19035 cCE("waddbhusl", e2001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19036 cCE("waddbhusm", e6001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19037 cCE("waddhc", e600180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19038 cCE("waddwc", ea00180, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19039 cCE("waddsubhx", ea001a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19040 cCE("wavg4", e400000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19041 cCE("wavg4r", e500000, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19042 cCE("wmaddsn", ee00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19043 cCE("wmaddsx", eb00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19044 cCE("wmaddun", ec00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19045 cCE("wmaddux", e900100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19046 cCE("wmerge", e000080, 4, (RIWR, RIWR, RIWR, I7), iwmmxt_wmerge),
19047 cCE("wmiabb", e0000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19048 cCE("wmiabt", e1000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19049 cCE("wmiatb", e2000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19050 cCE("wmiatt", e3000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19051 cCE("wmiabbn", e4000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19052 cCE("wmiabtn", e5000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19053 cCE("wmiatbn", e6000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19054 cCE("wmiattn", e7000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19055 cCE("wmiawbb", e800120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19056 cCE("wmiawbt", e900120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19057 cCE("wmiawtb", ea00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19058 cCE("wmiawtt", eb00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19059 cCE("wmiawbbn", ec00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19060 cCE("wmiawbtn", ed00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19061 cCE("wmiawtbn", ee00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19062 cCE("wmiawttn", ef00120, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19063 cCE("wmulsmr", ef00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19064 cCE("wmulumr", ed00100, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19065 cCE("wmulwumr", ec000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19066 cCE("wmulwsmr", ee000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19067 cCE("wmulwum", ed000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19068 cCE("wmulwsm", ef000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19069 cCE("wmulwl", eb000c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19070 cCE("wqmiabb", e8000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19071 cCE("wqmiabt", e9000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19072 cCE("wqmiatb", ea000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19073 cCE("wqmiatt", eb000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19074 cCE("wqmiabbn", ec000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19075 cCE("wqmiabtn", ed000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19076 cCE("wqmiatbn", ee000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19077 cCE("wqmiattn", ef000a0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19078 cCE("wqmulm", e100080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19079 cCE("wqmulmr", e300080, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19080 cCE("wqmulwm", ec000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19081 cCE("wqmulwmr", ee000e0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
19082 cCE("wsubaddhx", ed001c0, 3, (RIWR, RIWR, RIWR), rd_rn_rm),
2d447fca 19083
c921be7d
NC
19084#undef ARM_VARIANT
19085#define ARM_VARIANT & arm_cext_maverick /* Cirrus Maverick instructions. */
19086
21d799b5
NC
19087 cCE("cfldrs", c100400, 2, (RMF, ADDRGLDC), rd_cpaddr),
19088 cCE("cfldrd", c500400, 2, (RMD, ADDRGLDC), rd_cpaddr),
19089 cCE("cfldr32", c100500, 2, (RMFX, ADDRGLDC), rd_cpaddr),
19090 cCE("cfldr64", c500500, 2, (RMDX, ADDRGLDC), rd_cpaddr),
19091 cCE("cfstrs", c000400, 2, (RMF, ADDRGLDC), rd_cpaddr),
19092 cCE("cfstrd", c400400, 2, (RMD, ADDRGLDC), rd_cpaddr),
19093 cCE("cfstr32", c000500, 2, (RMFX, ADDRGLDC), rd_cpaddr),
19094 cCE("cfstr64", c400500, 2, (RMDX, ADDRGLDC), rd_cpaddr),
19095 cCE("cfmvsr", e000450, 2, (RMF, RR), rn_rd),
19096 cCE("cfmvrs", e100450, 2, (RR, RMF), rd_rn),
19097 cCE("cfmvdlr", e000410, 2, (RMD, RR), rn_rd),
19098 cCE("cfmvrdl", e100410, 2, (RR, RMD), rd_rn),
19099 cCE("cfmvdhr", e000430, 2, (RMD, RR), rn_rd),
19100 cCE("cfmvrdh", e100430, 2, (RR, RMD), rd_rn),
19101 cCE("cfmv64lr", e000510, 2, (RMDX, RR), rn_rd),
19102 cCE("cfmvr64l", e100510, 2, (RR, RMDX), rd_rn),
19103 cCE("cfmv64hr", e000530, 2, (RMDX, RR), rn_rd),
19104 cCE("cfmvr64h", e100530, 2, (RR, RMDX), rd_rn),
19105 cCE("cfmval32", e200440, 2, (RMAX, RMFX), rd_rn),
19106 cCE("cfmv32al", e100440, 2, (RMFX, RMAX), rd_rn),
19107 cCE("cfmvam32", e200460, 2, (RMAX, RMFX), rd_rn),
19108 cCE("cfmv32am", e100460, 2, (RMFX, RMAX), rd_rn),
19109 cCE("cfmvah32", e200480, 2, (RMAX, RMFX), rd_rn),
19110 cCE("cfmv32ah", e100480, 2, (RMFX, RMAX), rd_rn),
19111 cCE("cfmva32", e2004a0, 2, (RMAX, RMFX), rd_rn),
19112 cCE("cfmv32a", e1004a0, 2, (RMFX, RMAX), rd_rn),
19113 cCE("cfmva64", e2004c0, 2, (RMAX, RMDX), rd_rn),
19114 cCE("cfmv64a", e1004c0, 2, (RMDX, RMAX), rd_rn),
19115 cCE("cfmvsc32", e2004e0, 2, (RMDS, RMDX), mav_dspsc),
19116 cCE("cfmv32sc", e1004e0, 2, (RMDX, RMDS), rd),
19117 cCE("cfcpys", e000400, 2, (RMF, RMF), rd_rn),
19118 cCE("cfcpyd", e000420, 2, (RMD, RMD), rd_rn),
19119 cCE("cfcvtsd", e000460, 2, (RMD, RMF), rd_rn),
19120 cCE("cfcvtds", e000440, 2, (RMF, RMD), rd_rn),
19121 cCE("cfcvt32s", e000480, 2, (RMF, RMFX), rd_rn),
19122 cCE("cfcvt32d", e0004a0, 2, (RMD, RMFX), rd_rn),
19123 cCE("cfcvt64s", e0004c0, 2, (RMF, RMDX), rd_rn),
19124 cCE("cfcvt64d", e0004e0, 2, (RMD, RMDX), rd_rn),
19125 cCE("cfcvts32", e100580, 2, (RMFX, RMF), rd_rn),
19126 cCE("cfcvtd32", e1005a0, 2, (RMFX, RMD), rd_rn),
19127 cCE("cftruncs32",e1005c0, 2, (RMFX, RMF), rd_rn),
19128 cCE("cftruncd32",e1005e0, 2, (RMFX, RMD), rd_rn),
19129 cCE("cfrshl32", e000550, 3, (RMFX, RMFX, RR), mav_triple),
19130 cCE("cfrshl64", e000570, 3, (RMDX, RMDX, RR), mav_triple),
19131 cCE("cfsh32", e000500, 3, (RMFX, RMFX, I63s), mav_shift),
19132 cCE("cfsh64", e200500, 3, (RMDX, RMDX, I63s), mav_shift),
19133 cCE("cfcmps", e100490, 3, (RR, RMF, RMF), rd_rn_rm),
19134 cCE("cfcmpd", e1004b0, 3, (RR, RMD, RMD), rd_rn_rm),
19135 cCE("cfcmp32", e100590, 3, (RR, RMFX, RMFX), rd_rn_rm),
19136 cCE("cfcmp64", e1005b0, 3, (RR, RMDX, RMDX), rd_rn_rm),
19137 cCE("cfabss", e300400, 2, (RMF, RMF), rd_rn),
19138 cCE("cfabsd", e300420, 2, (RMD, RMD), rd_rn),
19139 cCE("cfnegs", e300440, 2, (RMF, RMF), rd_rn),
19140 cCE("cfnegd", e300460, 2, (RMD, RMD), rd_rn),
19141 cCE("cfadds", e300480, 3, (RMF, RMF, RMF), rd_rn_rm),
19142 cCE("cfaddd", e3004a0, 3, (RMD, RMD, RMD), rd_rn_rm),
19143 cCE("cfsubs", e3004c0, 3, (RMF, RMF, RMF), rd_rn_rm),
19144 cCE("cfsubd", e3004e0, 3, (RMD, RMD, RMD), rd_rn_rm),
19145 cCE("cfmuls", e100400, 3, (RMF, RMF, RMF), rd_rn_rm),
19146 cCE("cfmuld", e100420, 3, (RMD, RMD, RMD), rd_rn_rm),
19147 cCE("cfabs32", e300500, 2, (RMFX, RMFX), rd_rn),
19148 cCE("cfabs64", e300520, 2, (RMDX, RMDX), rd_rn),
19149 cCE("cfneg32", e300540, 2, (RMFX, RMFX), rd_rn),
19150 cCE("cfneg64", e300560, 2, (RMDX, RMDX), rd_rn),
19151 cCE("cfadd32", e300580, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
19152 cCE("cfadd64", e3005a0, 3, (RMDX, RMDX, RMDX), rd_rn_rm),
19153 cCE("cfsub32", e3005c0, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
19154 cCE("cfsub64", e3005e0, 3, (RMDX, RMDX, RMDX), rd_rn_rm),
19155 cCE("cfmul32", e100500, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
19156 cCE("cfmul64", e100520, 3, (RMDX, RMDX, RMDX), rd_rn_rm),
19157 cCE("cfmac32", e100540, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
19158 cCE("cfmsc32", e100560, 3, (RMFX, RMFX, RMFX), rd_rn_rm),
19159 cCE("cfmadd32", e000600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
19160 cCE("cfmsub32", e100600, 4, (RMAX, RMFX, RMFX, RMFX), mav_quad),
19161 cCE("cfmadda32", e200600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
19162 cCE("cfmsuba32", e300600, 4, (RMAX, RMAX, RMFX, RMFX), mav_quad),
c19d1205
ZW
19163};
19164#undef ARM_VARIANT
19165#undef THUMB_VARIANT
19166#undef TCE
19167#undef TCM
19168#undef TUE
19169#undef TUF
19170#undef TCC
8f06b2d8 19171#undef cCE
e3cb604e
PB
19172#undef cCL
19173#undef C3E
c19d1205
ZW
19174#undef CE
19175#undef CM
19176#undef UE
19177#undef UF
19178#undef UT
5287ad62
JB
19179#undef NUF
19180#undef nUF
19181#undef NCE
19182#undef nCE
c19d1205
ZW
19183#undef OPS0
19184#undef OPS1
19185#undef OPS2
19186#undef OPS3
19187#undef OPS4
19188#undef OPS5
19189#undef OPS6
19190#undef do_0
19191\f
19192/* MD interface: bits in the object file. */
bfae80f2 19193
c19d1205
ZW
19194/* Turn an integer of n bytes (in val) into a stream of bytes appropriate
19195 for use in the a.out file, and stores them in the array pointed to by buf.
19196 This knows about the endian-ness of the target machine and does
19197 THE RIGHT THING, whatever it is. Possible values for n are 1 (byte)
19198 2 (short) and 4 (long) Floating numbers are put out as a series of
19199 LITTLENUMS (shorts, here at least). */
b99bd4ef 19200
c19d1205
ZW
19201void
19202md_number_to_chars (char * buf, valueT val, int n)
19203{
19204 if (target_big_endian)
19205 number_to_chars_bigendian (buf, val, n);
19206 else
19207 number_to_chars_littleendian (buf, val, n);
bfae80f2
RE
19208}
19209
c19d1205
ZW
19210static valueT
19211md_chars_to_number (char * buf, int n)
bfae80f2 19212{
c19d1205
ZW
19213 valueT result = 0;
19214 unsigned char * where = (unsigned char *) buf;
bfae80f2 19215
c19d1205 19216 if (target_big_endian)
b99bd4ef 19217 {
c19d1205
ZW
19218 while (n--)
19219 {
19220 result <<= 8;
19221 result |= (*where++ & 255);
19222 }
b99bd4ef 19223 }
c19d1205 19224 else
b99bd4ef 19225 {
c19d1205
ZW
19226 while (n--)
19227 {
19228 result <<= 8;
19229 result |= (where[n] & 255);
19230 }
bfae80f2 19231 }
b99bd4ef 19232
c19d1205 19233 return result;
bfae80f2 19234}
b99bd4ef 19235
c19d1205 19236/* MD interface: Sections. */
b99bd4ef 19237
fa94de6b
RM
19238/* Calculate the maximum variable size (i.e., excluding fr_fix)
19239 that an rs_machine_dependent frag may reach. */
19240
19241unsigned int
19242arm_frag_max_var (fragS *fragp)
19243{
19244 /* We only use rs_machine_dependent for variable-size Thumb instructions,
19245 which are either THUMB_SIZE (2) or INSN_SIZE (4).
19246
19247 Note that we generate relaxable instructions even for cases that don't
19248 really need it, like an immediate that's a trivial constant. So we're
19249 overestimating the instruction size for some of those cases. Rather
19250 than putting more intelligence here, it would probably be better to
19251 avoid generating a relaxation frag in the first place when it can be
19252 determined up front that a short instruction will suffice. */
19253
19254 gas_assert (fragp->fr_type == rs_machine_dependent);
19255 return INSN_SIZE;
19256}
19257
0110f2b8
PB
19258/* Estimate the size of a frag before relaxing. Assume everything fits in
19259 2 bytes. */
19260
c19d1205 19261int
0110f2b8 19262md_estimate_size_before_relax (fragS * fragp,
c19d1205
ZW
19263 segT segtype ATTRIBUTE_UNUSED)
19264{
0110f2b8
PB
19265 fragp->fr_var = 2;
19266 return 2;
19267}
19268
19269/* Convert a machine dependent frag. */
19270
19271void
19272md_convert_frag (bfd *abfd, segT asec ATTRIBUTE_UNUSED, fragS *fragp)
19273{
19274 unsigned long insn;
19275 unsigned long old_op;
19276 char *buf;
19277 expressionS exp;
19278 fixS *fixp;
19279 int reloc_type;
19280 int pc_rel;
19281 int opcode;
19282
19283 buf = fragp->fr_literal + fragp->fr_fix;
19284
19285 old_op = bfd_get_16(abfd, buf);
5f4273c7
NC
19286 if (fragp->fr_symbol)
19287 {
0110f2b8
PB
19288 exp.X_op = O_symbol;
19289 exp.X_add_symbol = fragp->fr_symbol;
5f4273c7
NC
19290 }
19291 else
19292 {
0110f2b8 19293 exp.X_op = O_constant;
5f4273c7 19294 }
0110f2b8
PB
19295 exp.X_add_number = fragp->fr_offset;
19296 opcode = fragp->fr_subtype;
19297 switch (opcode)
19298 {
19299 case T_MNEM_ldr_pc:
19300 case T_MNEM_ldr_pc2:
19301 case T_MNEM_ldr_sp:
19302 case T_MNEM_str_sp:
19303 case T_MNEM_ldr:
19304 case T_MNEM_ldrb:
19305 case T_MNEM_ldrh:
19306 case T_MNEM_str:
19307 case T_MNEM_strb:
19308 case T_MNEM_strh:
19309 if (fragp->fr_var == 4)
19310 {
5f4273c7 19311 insn = THUMB_OP32 (opcode);
0110f2b8
PB
19312 if ((old_op >> 12) == 4 || (old_op >> 12) == 9)
19313 {
19314 insn |= (old_op & 0x700) << 4;
19315 }
19316 else
19317 {
19318 insn |= (old_op & 7) << 12;
19319 insn |= (old_op & 0x38) << 13;
19320 }
19321 insn |= 0x00000c00;
19322 put_thumb32_insn (buf, insn);
19323 reloc_type = BFD_RELOC_ARM_T32_OFFSET_IMM;
19324 }
19325 else
19326 {
19327 reloc_type = BFD_RELOC_ARM_THUMB_OFFSET;
19328 }
19329 pc_rel = (opcode == T_MNEM_ldr_pc2);
19330 break;
19331 case T_MNEM_adr:
19332 if (fragp->fr_var == 4)
19333 {
19334 insn = THUMB_OP32 (opcode);
19335 insn |= (old_op & 0xf0) << 4;
19336 put_thumb32_insn (buf, insn);
19337 reloc_type = BFD_RELOC_ARM_T32_ADD_PC12;
19338 }
19339 else
19340 {
19341 reloc_type = BFD_RELOC_ARM_THUMB_ADD;
19342 exp.X_add_number -= 4;
19343 }
19344 pc_rel = 1;
19345 break;
19346 case T_MNEM_mov:
19347 case T_MNEM_movs:
19348 case T_MNEM_cmp:
19349 case T_MNEM_cmn:
19350 if (fragp->fr_var == 4)
19351 {
19352 int r0off = (opcode == T_MNEM_mov
19353 || opcode == T_MNEM_movs) ? 0 : 8;
19354 insn = THUMB_OP32 (opcode);
19355 insn = (insn & 0xe1ffffff) | 0x10000000;
19356 insn |= (old_op & 0x700) << r0off;
19357 put_thumb32_insn (buf, insn);
19358 reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
19359 }
19360 else
19361 {
19362 reloc_type = BFD_RELOC_ARM_THUMB_IMM;
19363 }
19364 pc_rel = 0;
19365 break;
19366 case T_MNEM_b:
19367 if (fragp->fr_var == 4)
19368 {
19369 insn = THUMB_OP32(opcode);
19370 put_thumb32_insn (buf, insn);
19371 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH25;
19372 }
19373 else
19374 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH12;
19375 pc_rel = 1;
19376 break;
19377 case T_MNEM_bcond:
19378 if (fragp->fr_var == 4)
19379 {
19380 insn = THUMB_OP32(opcode);
19381 insn |= (old_op & 0xf00) << 14;
19382 put_thumb32_insn (buf, insn);
19383 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH20;
19384 }
19385 else
19386 reloc_type = BFD_RELOC_THUMB_PCREL_BRANCH9;
19387 pc_rel = 1;
19388 break;
19389 case T_MNEM_add_sp:
19390 case T_MNEM_add_pc:
19391 case T_MNEM_inc_sp:
19392 case T_MNEM_dec_sp:
19393 if (fragp->fr_var == 4)
19394 {
19395 /* ??? Choose between add and addw. */
19396 insn = THUMB_OP32 (opcode);
19397 insn |= (old_op & 0xf0) << 4;
19398 put_thumb32_insn (buf, insn);
16805f35
PB
19399 if (opcode == T_MNEM_add_pc)
19400 reloc_type = BFD_RELOC_ARM_T32_IMM12;
19401 else
19402 reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
0110f2b8
PB
19403 }
19404 else
19405 reloc_type = BFD_RELOC_ARM_THUMB_ADD;
19406 pc_rel = 0;
19407 break;
19408
19409 case T_MNEM_addi:
19410 case T_MNEM_addis:
19411 case T_MNEM_subi:
19412 case T_MNEM_subis:
19413 if (fragp->fr_var == 4)
19414 {
19415 insn = THUMB_OP32 (opcode);
19416 insn |= (old_op & 0xf0) << 4;
19417 insn |= (old_op & 0xf) << 16;
19418 put_thumb32_insn (buf, insn);
16805f35
PB
19419 if (insn & (1 << 20))
19420 reloc_type = BFD_RELOC_ARM_T32_ADD_IMM;
19421 else
19422 reloc_type = BFD_RELOC_ARM_T32_IMMEDIATE;
0110f2b8
PB
19423 }
19424 else
19425 reloc_type = BFD_RELOC_ARM_THUMB_ADD;
19426 pc_rel = 0;
19427 break;
19428 default:
5f4273c7 19429 abort ();
0110f2b8
PB
19430 }
19431 fixp = fix_new_exp (fragp, fragp->fr_fix, fragp->fr_var, &exp, pc_rel,
21d799b5 19432 (enum bfd_reloc_code_real) reloc_type);
0110f2b8
PB
19433 fixp->fx_file = fragp->fr_file;
19434 fixp->fx_line = fragp->fr_line;
19435 fragp->fr_fix += fragp->fr_var;
19436}
19437
19438/* Return the size of a relaxable immediate operand instruction.
19439 SHIFT and SIZE specify the form of the allowable immediate. */
19440static int
19441relax_immediate (fragS *fragp, int size, int shift)
19442{
19443 offsetT offset;
19444 offsetT mask;
19445 offsetT low;
19446
19447 /* ??? Should be able to do better than this. */
19448 if (fragp->fr_symbol)
19449 return 4;
19450
19451 low = (1 << shift) - 1;
19452 mask = (1 << (shift + size)) - (1 << shift);
19453 offset = fragp->fr_offset;
19454 /* Force misaligned offsets to 32-bit variant. */
19455 if (offset & low)
5e77afaa 19456 return 4;
0110f2b8
PB
19457 if (offset & ~mask)
19458 return 4;
19459 return 2;
19460}
19461
5e77afaa
PB
19462/* Get the address of a symbol during relaxation. */
19463static addressT
5f4273c7 19464relaxed_symbol_addr (fragS *fragp, long stretch)
5e77afaa
PB
19465{
19466 fragS *sym_frag;
19467 addressT addr;
19468 symbolS *sym;
19469
19470 sym = fragp->fr_symbol;
19471 sym_frag = symbol_get_frag (sym);
19472 know (S_GET_SEGMENT (sym) != absolute_section
19473 || sym_frag == &zero_address_frag);
19474 addr = S_GET_VALUE (sym) + fragp->fr_offset;
19475
19476 /* If frag has yet to be reached on this pass, assume it will
19477 move by STRETCH just as we did. If this is not so, it will
19478 be because some frag between grows, and that will force
19479 another pass. */
19480
19481 if (stretch != 0
19482 && sym_frag->relax_marker != fragp->relax_marker)
4396b686
PB
19483 {
19484 fragS *f;
19485
19486 /* Adjust stretch for any alignment frag. Note that if have
19487 been expanding the earlier code, the symbol may be
19488 defined in what appears to be an earlier frag. FIXME:
19489 This doesn't handle the fr_subtype field, which specifies
19490 a maximum number of bytes to skip when doing an
19491 alignment. */
19492 for (f = fragp; f != NULL && f != sym_frag; f = f->fr_next)
19493 {
19494 if (f->fr_type == rs_align || f->fr_type == rs_align_code)
19495 {
19496 if (stretch < 0)
19497 stretch = - ((- stretch)
19498 & ~ ((1 << (int) f->fr_offset) - 1));
19499 else
19500 stretch &= ~ ((1 << (int) f->fr_offset) - 1);
19501 if (stretch == 0)
19502 break;
19503 }
19504 }
19505 if (f != NULL)
19506 addr += stretch;
19507 }
5e77afaa
PB
19508
19509 return addr;
19510}
19511
0110f2b8
PB
19512/* Return the size of a relaxable adr pseudo-instruction or PC-relative
19513 load. */
19514static int
5e77afaa 19515relax_adr (fragS *fragp, asection *sec, long stretch)
0110f2b8
PB
19516{
19517 addressT addr;
19518 offsetT val;
19519
19520 /* Assume worst case for symbols not known to be in the same section. */
974da60d
NC
19521 if (fragp->fr_symbol == NULL
19522 || !S_IS_DEFINED (fragp->fr_symbol)
77db8e2e
NC
19523 || sec != S_GET_SEGMENT (fragp->fr_symbol)
19524 || S_IS_WEAK (fragp->fr_symbol))
0110f2b8
PB
19525 return 4;
19526
5f4273c7 19527 val = relaxed_symbol_addr (fragp, stretch);
0110f2b8
PB
19528 addr = fragp->fr_address + fragp->fr_fix;
19529 addr = (addr + 4) & ~3;
5e77afaa 19530 /* Force misaligned targets to 32-bit variant. */
0110f2b8 19531 if (val & 3)
5e77afaa 19532 return 4;
0110f2b8
PB
19533 val -= addr;
19534 if (val < 0 || val > 1020)
19535 return 4;
19536 return 2;
19537}
19538
19539/* Return the size of a relaxable add/sub immediate instruction. */
19540static int
19541relax_addsub (fragS *fragp, asection *sec)
19542{
19543 char *buf;
19544 int op;
19545
19546 buf = fragp->fr_literal + fragp->fr_fix;
19547 op = bfd_get_16(sec->owner, buf);
19548 if ((op & 0xf) == ((op >> 4) & 0xf))
19549 return relax_immediate (fragp, 8, 0);
19550 else
19551 return relax_immediate (fragp, 3, 0);
19552}
19553
19554
19555/* Return the size of a relaxable branch instruction. BITS is the
19556 size of the offset field in the narrow instruction. */
19557
19558static int
5e77afaa 19559relax_branch (fragS *fragp, asection *sec, int bits, long stretch)
0110f2b8
PB
19560{
19561 addressT addr;
19562 offsetT val;
19563 offsetT limit;
19564
19565 /* Assume worst case for symbols not known to be in the same section. */
5f4273c7 19566 if (!S_IS_DEFINED (fragp->fr_symbol)
77db8e2e
NC
19567 || sec != S_GET_SEGMENT (fragp->fr_symbol)
19568 || S_IS_WEAK (fragp->fr_symbol))
0110f2b8
PB
19569 return 4;
19570
267bf995
RR
19571#ifdef OBJ_ELF
19572 if (S_IS_DEFINED (fragp->fr_symbol)
19573 && ARM_IS_FUNC (fragp->fr_symbol))
19574 return 4;
0d9b4b55
NC
19575
19576 /* PR 12532. Global symbols with default visibility might
19577 be preempted, so do not relax relocations to them. */
19578 if ((ELF_ST_VISIBILITY (S_GET_OTHER (fragp->fr_symbol)) == STV_DEFAULT)
19579 && (! S_IS_LOCAL (fragp->fr_symbol)))
19580 return 4;
267bf995
RR
19581#endif
19582
5f4273c7 19583 val = relaxed_symbol_addr (fragp, stretch);
0110f2b8
PB
19584 addr = fragp->fr_address + fragp->fr_fix + 4;
19585 val -= addr;
19586
19587 /* Offset is a signed value *2 */
19588 limit = 1 << bits;
19589 if (val >= limit || val < -limit)
19590 return 4;
19591 return 2;
19592}
19593
19594
19595/* Relax a machine dependent frag. This returns the amount by which
19596 the current size of the frag should change. */
19597
19598int
5e77afaa 19599arm_relax_frag (asection *sec, fragS *fragp, long stretch)
0110f2b8
PB
19600{
19601 int oldsize;
19602 int newsize;
19603
19604 oldsize = fragp->fr_var;
19605 switch (fragp->fr_subtype)
19606 {
19607 case T_MNEM_ldr_pc2:
5f4273c7 19608 newsize = relax_adr (fragp, sec, stretch);
0110f2b8
PB
19609 break;
19610 case T_MNEM_ldr_pc:
19611 case T_MNEM_ldr_sp:
19612 case T_MNEM_str_sp:
5f4273c7 19613 newsize = relax_immediate (fragp, 8, 2);
0110f2b8
PB
19614 break;
19615 case T_MNEM_ldr:
19616 case T_MNEM_str:
5f4273c7 19617 newsize = relax_immediate (fragp, 5, 2);
0110f2b8
PB
19618 break;
19619 case T_MNEM_ldrh:
19620 case T_MNEM_strh:
5f4273c7 19621 newsize = relax_immediate (fragp, 5, 1);
0110f2b8
PB
19622 break;
19623 case T_MNEM_ldrb:
19624 case T_MNEM_strb:
5f4273c7 19625 newsize = relax_immediate (fragp, 5, 0);
0110f2b8
PB
19626 break;
19627 case T_MNEM_adr:
5f4273c7 19628 newsize = relax_adr (fragp, sec, stretch);
0110f2b8
PB
19629 break;
19630 case T_MNEM_mov:
19631 case T_MNEM_movs:
19632 case T_MNEM_cmp:
19633 case T_MNEM_cmn:
5f4273c7 19634 newsize = relax_immediate (fragp, 8, 0);
0110f2b8
PB
19635 break;
19636 case T_MNEM_b:
5f4273c7 19637 newsize = relax_branch (fragp, sec, 11, stretch);
0110f2b8
PB
19638 break;
19639 case T_MNEM_bcond:
5f4273c7 19640 newsize = relax_branch (fragp, sec, 8, stretch);
0110f2b8
PB
19641 break;
19642 case T_MNEM_add_sp:
19643 case T_MNEM_add_pc:
19644 newsize = relax_immediate (fragp, 8, 2);
19645 break;
19646 case T_MNEM_inc_sp:
19647 case T_MNEM_dec_sp:
19648 newsize = relax_immediate (fragp, 7, 2);
19649 break;
19650 case T_MNEM_addi:
19651 case T_MNEM_addis:
19652 case T_MNEM_subi:
19653 case T_MNEM_subis:
19654 newsize = relax_addsub (fragp, sec);
19655 break;
19656 default:
5f4273c7 19657 abort ();
0110f2b8 19658 }
5e77afaa
PB
19659
19660 fragp->fr_var = newsize;
19661 /* Freeze wide instructions that are at or before the same location as
19662 in the previous pass. This avoids infinite loops.
5f4273c7
NC
19663 Don't freeze them unconditionally because targets may be artificially
19664 misaligned by the expansion of preceding frags. */
5e77afaa 19665 if (stretch <= 0 && newsize > 2)
0110f2b8 19666 {
0110f2b8 19667 md_convert_frag (sec->owner, sec, fragp);
5f4273c7 19668 frag_wane (fragp);
0110f2b8 19669 }
5e77afaa 19670
0110f2b8 19671 return newsize - oldsize;
c19d1205 19672}
b99bd4ef 19673
c19d1205 19674/* Round up a section size to the appropriate boundary. */
b99bd4ef 19675
c19d1205
ZW
19676valueT
19677md_section_align (segT segment ATTRIBUTE_UNUSED,
19678 valueT size)
19679{
f0927246
NC
19680#if (defined (OBJ_AOUT) || defined (OBJ_MAYBE_AOUT))
19681 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
19682 {
19683 /* For a.out, force the section size to be aligned. If we don't do
19684 this, BFD will align it for us, but it will not write out the
19685 final bytes of the section. This may be a bug in BFD, but it is
19686 easier to fix it here since that is how the other a.out targets
19687 work. */
19688 int align;
19689
19690 align = bfd_get_section_alignment (stdoutput, segment);
19691 size = ((size + (1 << align) - 1) & ((valueT) -1 << align));
19692 }
c19d1205 19693#endif
f0927246
NC
19694
19695 return size;
bfae80f2 19696}
b99bd4ef 19697
c19d1205
ZW
19698/* This is called from HANDLE_ALIGN in write.c. Fill in the contents
19699 of an rs_align_code fragment. */
19700
19701void
19702arm_handle_align (fragS * fragP)
bfae80f2 19703{
e7495e45
NS
19704 static char const arm_noop[2][2][4] =
19705 {
19706 { /* ARMv1 */
19707 {0x00, 0x00, 0xa0, 0xe1}, /* LE */
19708 {0xe1, 0xa0, 0x00, 0x00}, /* BE */
19709 },
19710 { /* ARMv6k */
19711 {0x00, 0xf0, 0x20, 0xe3}, /* LE */
19712 {0xe3, 0x20, 0xf0, 0x00}, /* BE */
19713 },
19714 };
19715 static char const thumb_noop[2][2][2] =
19716 {
19717 { /* Thumb-1 */
19718 {0xc0, 0x46}, /* LE */
19719 {0x46, 0xc0}, /* BE */
19720 },
19721 { /* Thumb-2 */
19722 {0x00, 0xbf}, /* LE */
19723 {0xbf, 0x00} /* BE */
19724 }
19725 };
19726 static char const wide_thumb_noop[2][4] =
19727 { /* Wide Thumb-2 */
19728 {0xaf, 0xf3, 0x00, 0x80}, /* LE */
19729 {0xf3, 0xaf, 0x80, 0x00}, /* BE */
19730 };
c921be7d 19731
e7495e45 19732 unsigned bytes, fix, noop_size;
c19d1205
ZW
19733 char * p;
19734 const char * noop;
e7495e45 19735 const char *narrow_noop = NULL;
cd000bff
DJ
19736#ifdef OBJ_ELF
19737 enum mstate state;
19738#endif
bfae80f2 19739
c19d1205 19740 if (fragP->fr_type != rs_align_code)
bfae80f2
RE
19741 return;
19742
c19d1205
ZW
19743 bytes = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
19744 p = fragP->fr_literal + fragP->fr_fix;
19745 fix = 0;
bfae80f2 19746
c19d1205
ZW
19747 if (bytes > MAX_MEM_FOR_RS_ALIGN_CODE)
19748 bytes &= MAX_MEM_FOR_RS_ALIGN_CODE;
bfae80f2 19749
cd000bff 19750 gas_assert ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) != 0);
8dc2430f 19751
cd000bff 19752 if (fragP->tc_frag_data.thumb_mode & (~ MODE_RECORDED))
a737bd4d 19753 {
e7495e45
NS
19754 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6t2))
19755 {
19756 narrow_noop = thumb_noop[1][target_big_endian];
19757 noop = wide_thumb_noop[target_big_endian];
19758 }
c19d1205 19759 else
e7495e45
NS
19760 noop = thumb_noop[0][target_big_endian];
19761 noop_size = 2;
cd000bff
DJ
19762#ifdef OBJ_ELF
19763 state = MAP_THUMB;
19764#endif
7ed4c4c5
NC
19765 }
19766 else
19767 {
e7495e45
NS
19768 noop = arm_noop[ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v6k) != 0]
19769 [target_big_endian];
19770 noop_size = 4;
cd000bff
DJ
19771#ifdef OBJ_ELF
19772 state = MAP_ARM;
19773#endif
7ed4c4c5 19774 }
c921be7d 19775
e7495e45 19776 fragP->fr_var = noop_size;
c921be7d 19777
c19d1205 19778 if (bytes & (noop_size - 1))
7ed4c4c5 19779 {
c19d1205 19780 fix = bytes & (noop_size - 1);
cd000bff
DJ
19781#ifdef OBJ_ELF
19782 insert_data_mapping_symbol (state, fragP->fr_fix, fragP, fix);
19783#endif
c19d1205
ZW
19784 memset (p, 0, fix);
19785 p += fix;
19786 bytes -= fix;
a737bd4d 19787 }
a737bd4d 19788
e7495e45
NS
19789 if (narrow_noop)
19790 {
19791 if (bytes & noop_size)
19792 {
19793 /* Insert a narrow noop. */
19794 memcpy (p, narrow_noop, noop_size);
19795 p += noop_size;
19796 bytes -= noop_size;
19797 fix += noop_size;
19798 }
19799
19800 /* Use wide noops for the remainder */
19801 noop_size = 4;
19802 }
19803
c19d1205 19804 while (bytes >= noop_size)
a737bd4d 19805 {
c19d1205
ZW
19806 memcpy (p, noop, noop_size);
19807 p += noop_size;
19808 bytes -= noop_size;
19809 fix += noop_size;
a737bd4d
NC
19810 }
19811
c19d1205 19812 fragP->fr_fix += fix;
a737bd4d
NC
19813}
19814
c19d1205
ZW
19815/* Called from md_do_align. Used to create an alignment
19816 frag in a code section. */
19817
19818void
19819arm_frag_align_code (int n, int max)
bfae80f2 19820{
c19d1205 19821 char * p;
7ed4c4c5 19822
c19d1205 19823 /* We assume that there will never be a requirement
6ec8e702 19824 to support alignments greater than MAX_MEM_FOR_RS_ALIGN_CODE bytes. */
c19d1205 19825 if (max > MAX_MEM_FOR_RS_ALIGN_CODE)
6ec8e702
NC
19826 {
19827 char err_msg[128];
19828
fa94de6b 19829 sprintf (err_msg,
6ec8e702
NC
19830 _("alignments greater than %d bytes not supported in .text sections."),
19831 MAX_MEM_FOR_RS_ALIGN_CODE + 1);
20203fb9 19832 as_fatal ("%s", err_msg);
6ec8e702 19833 }
bfae80f2 19834
c19d1205
ZW
19835 p = frag_var (rs_align_code,
19836 MAX_MEM_FOR_RS_ALIGN_CODE,
19837 1,
19838 (relax_substateT) max,
19839 (symbolS *) NULL,
19840 (offsetT) n,
19841 (char *) NULL);
19842 *p = 0;
19843}
bfae80f2 19844
8dc2430f
NC
19845/* Perform target specific initialisation of a frag.
19846 Note - despite the name this initialisation is not done when the frag
19847 is created, but only when its type is assigned. A frag can be created
19848 and used a long time before its type is set, so beware of assuming that
19849 this initialisationis performed first. */
bfae80f2 19850
cd000bff
DJ
19851#ifndef OBJ_ELF
19852void
19853arm_init_frag (fragS * fragP, int max_chars ATTRIBUTE_UNUSED)
19854{
19855 /* Record whether this frag is in an ARM or a THUMB area. */
2e98972e 19856 fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
cd000bff
DJ
19857}
19858
19859#else /* OBJ_ELF is defined. */
c19d1205 19860void
cd000bff 19861arm_init_frag (fragS * fragP, int max_chars)
c19d1205 19862{
8dc2430f
NC
19863 /* If the current ARM vs THUMB mode has not already
19864 been recorded into this frag then do so now. */
cd000bff
DJ
19865 if ((fragP->tc_frag_data.thumb_mode & MODE_RECORDED) == 0)
19866 {
19867 fragP->tc_frag_data.thumb_mode = thumb_mode | MODE_RECORDED;
19868
19869 /* Record a mapping symbol for alignment frags. We will delete this
19870 later if the alignment ends up empty. */
19871 switch (fragP->fr_type)
19872 {
19873 case rs_align:
19874 case rs_align_test:
19875 case rs_fill:
19876 mapping_state_2 (MAP_DATA, max_chars);
19877 break;
19878 case rs_align_code:
19879 mapping_state_2 (thumb_mode ? MAP_THUMB : MAP_ARM, max_chars);
19880 break;
19881 default:
19882 break;
19883 }
19884 }
bfae80f2
RE
19885}
19886
c19d1205
ZW
19887/* When we change sections we need to issue a new mapping symbol. */
19888
19889void
19890arm_elf_change_section (void)
bfae80f2 19891{
c19d1205
ZW
19892 /* Link an unlinked unwind index table section to the .text section. */
19893 if (elf_section_type (now_seg) == SHT_ARM_EXIDX
19894 && elf_linked_to_section (now_seg) == NULL)
19895 elf_linked_to_section (now_seg) = text_section;
bfae80f2
RE
19896}
19897
c19d1205
ZW
19898int
19899arm_elf_section_type (const char * str, size_t len)
e45d0630 19900{
c19d1205
ZW
19901 if (len == 5 && strncmp (str, "exidx", 5) == 0)
19902 return SHT_ARM_EXIDX;
e45d0630 19903
c19d1205
ZW
19904 return -1;
19905}
19906\f
19907/* Code to deal with unwinding tables. */
e45d0630 19908
c19d1205 19909static void add_unwind_adjustsp (offsetT);
e45d0630 19910
5f4273c7 19911/* Generate any deferred unwind frame offset. */
e45d0630 19912
bfae80f2 19913static void
c19d1205 19914flush_pending_unwind (void)
bfae80f2 19915{
c19d1205 19916 offsetT offset;
bfae80f2 19917
c19d1205
ZW
19918 offset = unwind.pending_offset;
19919 unwind.pending_offset = 0;
19920 if (offset != 0)
19921 add_unwind_adjustsp (offset);
bfae80f2
RE
19922}
19923
c19d1205
ZW
19924/* Add an opcode to this list for this function. Two-byte opcodes should
19925 be passed as op[0] << 8 | op[1]. The list of opcodes is built in reverse
19926 order. */
19927
bfae80f2 19928static void
c19d1205 19929add_unwind_opcode (valueT op, int length)
bfae80f2 19930{
c19d1205
ZW
19931 /* Add any deferred stack adjustment. */
19932 if (unwind.pending_offset)
19933 flush_pending_unwind ();
bfae80f2 19934
c19d1205 19935 unwind.sp_restored = 0;
bfae80f2 19936
c19d1205 19937 if (unwind.opcode_count + length > unwind.opcode_alloc)
bfae80f2 19938 {
c19d1205
ZW
19939 unwind.opcode_alloc += ARM_OPCODE_CHUNK_SIZE;
19940 if (unwind.opcodes)
21d799b5
NC
19941 unwind.opcodes = (unsigned char *) xrealloc (unwind.opcodes,
19942 unwind.opcode_alloc);
c19d1205 19943 else
21d799b5 19944 unwind.opcodes = (unsigned char *) xmalloc (unwind.opcode_alloc);
bfae80f2 19945 }
c19d1205 19946 while (length > 0)
bfae80f2 19947 {
c19d1205
ZW
19948 length--;
19949 unwind.opcodes[unwind.opcode_count] = op & 0xff;
19950 op >>= 8;
19951 unwind.opcode_count++;
bfae80f2 19952 }
bfae80f2
RE
19953}
19954
c19d1205
ZW
19955/* Add unwind opcodes to adjust the stack pointer. */
19956
bfae80f2 19957static void
c19d1205 19958add_unwind_adjustsp (offsetT offset)
bfae80f2 19959{
c19d1205 19960 valueT op;
bfae80f2 19961
c19d1205 19962 if (offset > 0x200)
bfae80f2 19963 {
c19d1205
ZW
19964 /* We need at most 5 bytes to hold a 32-bit value in a uleb128. */
19965 char bytes[5];
19966 int n;
19967 valueT o;
bfae80f2 19968
c19d1205
ZW
19969 /* Long form: 0xb2, uleb128. */
19970 /* This might not fit in a word so add the individual bytes,
19971 remembering the list is built in reverse order. */
19972 o = (valueT) ((offset - 0x204) >> 2);
19973 if (o == 0)
19974 add_unwind_opcode (0, 1);
bfae80f2 19975
c19d1205
ZW
19976 /* Calculate the uleb128 encoding of the offset. */
19977 n = 0;
19978 while (o)
19979 {
19980 bytes[n] = o & 0x7f;
19981 o >>= 7;
19982 if (o)
19983 bytes[n] |= 0x80;
19984 n++;
19985 }
19986 /* Add the insn. */
19987 for (; n; n--)
19988 add_unwind_opcode (bytes[n - 1], 1);
19989 add_unwind_opcode (0xb2, 1);
19990 }
19991 else if (offset > 0x100)
bfae80f2 19992 {
c19d1205
ZW
19993 /* Two short opcodes. */
19994 add_unwind_opcode (0x3f, 1);
19995 op = (offset - 0x104) >> 2;
19996 add_unwind_opcode (op, 1);
bfae80f2 19997 }
c19d1205
ZW
19998 else if (offset > 0)
19999 {
20000 /* Short opcode. */
20001 op = (offset - 4) >> 2;
20002 add_unwind_opcode (op, 1);
20003 }
20004 else if (offset < 0)
bfae80f2 20005 {
c19d1205
ZW
20006 offset = -offset;
20007 while (offset > 0x100)
bfae80f2 20008 {
c19d1205
ZW
20009 add_unwind_opcode (0x7f, 1);
20010 offset -= 0x100;
bfae80f2 20011 }
c19d1205
ZW
20012 op = ((offset - 4) >> 2) | 0x40;
20013 add_unwind_opcode (op, 1);
bfae80f2 20014 }
bfae80f2
RE
20015}
20016
c19d1205
ZW
20017/* Finish the list of unwind opcodes for this function. */
20018static void
20019finish_unwind_opcodes (void)
bfae80f2 20020{
c19d1205 20021 valueT op;
bfae80f2 20022
c19d1205 20023 if (unwind.fp_used)
bfae80f2 20024 {
708587a4 20025 /* Adjust sp as necessary. */
c19d1205
ZW
20026 unwind.pending_offset += unwind.fp_offset - unwind.frame_size;
20027 flush_pending_unwind ();
bfae80f2 20028
c19d1205
ZW
20029 /* After restoring sp from the frame pointer. */
20030 op = 0x90 | unwind.fp_reg;
20031 add_unwind_opcode (op, 1);
20032 }
20033 else
20034 flush_pending_unwind ();
bfae80f2
RE
20035}
20036
bfae80f2 20037
c19d1205
ZW
20038/* Start an exception table entry. If idx is nonzero this is an index table
20039 entry. */
bfae80f2
RE
20040
20041static void
c19d1205 20042start_unwind_section (const segT text_seg, int idx)
bfae80f2 20043{
c19d1205
ZW
20044 const char * text_name;
20045 const char * prefix;
20046 const char * prefix_once;
20047 const char * group_name;
20048 size_t prefix_len;
20049 size_t text_len;
20050 char * sec_name;
20051 size_t sec_name_len;
20052 int type;
20053 int flags;
20054 int linkonce;
bfae80f2 20055
c19d1205 20056 if (idx)
bfae80f2 20057 {
c19d1205
ZW
20058 prefix = ELF_STRING_ARM_unwind;
20059 prefix_once = ELF_STRING_ARM_unwind_once;
20060 type = SHT_ARM_EXIDX;
bfae80f2 20061 }
c19d1205 20062 else
bfae80f2 20063 {
c19d1205
ZW
20064 prefix = ELF_STRING_ARM_unwind_info;
20065 prefix_once = ELF_STRING_ARM_unwind_info_once;
20066 type = SHT_PROGBITS;
bfae80f2
RE
20067 }
20068
c19d1205
ZW
20069 text_name = segment_name (text_seg);
20070 if (streq (text_name, ".text"))
20071 text_name = "";
20072
20073 if (strncmp (text_name, ".gnu.linkonce.t.",
20074 strlen (".gnu.linkonce.t.")) == 0)
bfae80f2 20075 {
c19d1205
ZW
20076 prefix = prefix_once;
20077 text_name += strlen (".gnu.linkonce.t.");
bfae80f2
RE
20078 }
20079
c19d1205
ZW
20080 prefix_len = strlen (prefix);
20081 text_len = strlen (text_name);
20082 sec_name_len = prefix_len + text_len;
21d799b5 20083 sec_name = (char *) xmalloc (sec_name_len + 1);
c19d1205
ZW
20084 memcpy (sec_name, prefix, prefix_len);
20085 memcpy (sec_name + prefix_len, text_name, text_len);
20086 sec_name[prefix_len + text_len] = '\0';
bfae80f2 20087
c19d1205
ZW
20088 flags = SHF_ALLOC;
20089 linkonce = 0;
20090 group_name = 0;
bfae80f2 20091
c19d1205
ZW
20092 /* Handle COMDAT group. */
20093 if (prefix != prefix_once && (text_seg->flags & SEC_LINK_ONCE) != 0)
bfae80f2 20094 {
c19d1205
ZW
20095 group_name = elf_group_name (text_seg);
20096 if (group_name == NULL)
20097 {
bd3ba5d1 20098 as_bad (_("Group section `%s' has no group signature"),
c19d1205
ZW
20099 segment_name (text_seg));
20100 ignore_rest_of_line ();
20101 return;
20102 }
20103 flags |= SHF_GROUP;
20104 linkonce = 1;
bfae80f2
RE
20105 }
20106
c19d1205 20107 obj_elf_change_section (sec_name, type, flags, 0, group_name, linkonce, 0);
bfae80f2 20108
5f4273c7 20109 /* Set the section link for index tables. */
c19d1205
ZW
20110 if (idx)
20111 elf_linked_to_section (now_seg) = text_seg;
bfae80f2
RE
20112}
20113
bfae80f2 20114
c19d1205
ZW
20115/* Start an unwind table entry. HAVE_DATA is nonzero if we have additional
20116 personality routine data. Returns zero, or the index table value for
20117 and inline entry. */
20118
20119static valueT
20120create_unwind_entry (int have_data)
bfae80f2 20121{
c19d1205
ZW
20122 int size;
20123 addressT where;
20124 char *ptr;
20125 /* The current word of data. */
20126 valueT data;
20127 /* The number of bytes left in this word. */
20128 int n;
bfae80f2 20129
c19d1205 20130 finish_unwind_opcodes ();
bfae80f2 20131
c19d1205
ZW
20132 /* Remember the current text section. */
20133 unwind.saved_seg = now_seg;
20134 unwind.saved_subseg = now_subseg;
bfae80f2 20135
c19d1205 20136 start_unwind_section (now_seg, 0);
bfae80f2 20137
c19d1205 20138 if (unwind.personality_routine == NULL)
bfae80f2 20139 {
c19d1205
ZW
20140 if (unwind.personality_index == -2)
20141 {
20142 if (have_data)
5f4273c7 20143 as_bad (_("handlerdata in cantunwind frame"));
c19d1205
ZW
20144 return 1; /* EXIDX_CANTUNWIND. */
20145 }
bfae80f2 20146
c19d1205
ZW
20147 /* Use a default personality routine if none is specified. */
20148 if (unwind.personality_index == -1)
20149 {
20150 if (unwind.opcode_count > 3)
20151 unwind.personality_index = 1;
20152 else
20153 unwind.personality_index = 0;
20154 }
bfae80f2 20155
c19d1205
ZW
20156 /* Space for the personality routine entry. */
20157 if (unwind.personality_index == 0)
20158 {
20159 if (unwind.opcode_count > 3)
20160 as_bad (_("too many unwind opcodes for personality routine 0"));
bfae80f2 20161
c19d1205
ZW
20162 if (!have_data)
20163 {
20164 /* All the data is inline in the index table. */
20165 data = 0x80;
20166 n = 3;
20167 while (unwind.opcode_count > 0)
20168 {
20169 unwind.opcode_count--;
20170 data = (data << 8) | unwind.opcodes[unwind.opcode_count];
20171 n--;
20172 }
bfae80f2 20173
c19d1205
ZW
20174 /* Pad with "finish" opcodes. */
20175 while (n--)
20176 data = (data << 8) | 0xb0;
bfae80f2 20177
c19d1205
ZW
20178 return data;
20179 }
20180 size = 0;
20181 }
20182 else
20183 /* We get two opcodes "free" in the first word. */
20184 size = unwind.opcode_count - 2;
20185 }
20186 else
5011093d
NC
20187 {
20188 gas_assert (unwind.personality_index == -1);
20189
20190 /* An extra byte is required for the opcode count. */
20191 size = unwind.opcode_count + 1;
20192 }
bfae80f2 20193
c19d1205
ZW
20194 size = (size + 3) >> 2;
20195 if (size > 0xff)
20196 as_bad (_("too many unwind opcodes"));
bfae80f2 20197
c19d1205
ZW
20198 frag_align (2, 0, 0);
20199 record_alignment (now_seg, 2);
20200 unwind.table_entry = expr_build_dot ();
20201
20202 /* Allocate the table entry. */
20203 ptr = frag_more ((size << 2) + 4);
74929e7b
NC
20204 /* PR 13449: Zero the table entries in case some of them are not used. */
20205 memset (ptr, 0, (size << 2) + 4);
c19d1205 20206 where = frag_now_fix () - ((size << 2) + 4);
bfae80f2 20207
c19d1205 20208 switch (unwind.personality_index)
bfae80f2 20209 {
c19d1205
ZW
20210 case -1:
20211 /* ??? Should this be a PLT generating relocation? */
20212 /* Custom personality routine. */
20213 fix_new (frag_now, where, 4, unwind.personality_routine, 0, 1,
20214 BFD_RELOC_ARM_PREL31);
bfae80f2 20215
c19d1205
ZW
20216 where += 4;
20217 ptr += 4;
bfae80f2 20218
c19d1205 20219 /* Set the first byte to the number of additional words. */
5011093d 20220 data = size > 0 ? size - 1 : 0;
c19d1205
ZW
20221 n = 3;
20222 break;
bfae80f2 20223
c19d1205
ZW
20224 /* ABI defined personality routines. */
20225 case 0:
20226 /* Three opcodes bytes are packed into the first word. */
20227 data = 0x80;
20228 n = 3;
20229 break;
bfae80f2 20230
c19d1205
ZW
20231 case 1:
20232 case 2:
20233 /* The size and first two opcode bytes go in the first word. */
20234 data = ((0x80 + unwind.personality_index) << 8) | size;
20235 n = 2;
20236 break;
bfae80f2 20237
c19d1205
ZW
20238 default:
20239 /* Should never happen. */
20240 abort ();
20241 }
bfae80f2 20242
c19d1205
ZW
20243 /* Pack the opcodes into words (MSB first), reversing the list at the same
20244 time. */
20245 while (unwind.opcode_count > 0)
20246 {
20247 if (n == 0)
20248 {
20249 md_number_to_chars (ptr, data, 4);
20250 ptr += 4;
20251 n = 4;
20252 data = 0;
20253 }
20254 unwind.opcode_count--;
20255 n--;
20256 data = (data << 8) | unwind.opcodes[unwind.opcode_count];
20257 }
20258
20259 /* Finish off the last word. */
20260 if (n < 4)
20261 {
20262 /* Pad with "finish" opcodes. */
20263 while (n--)
20264 data = (data << 8) | 0xb0;
20265
20266 md_number_to_chars (ptr, data, 4);
20267 }
20268
20269 if (!have_data)
20270 {
20271 /* Add an empty descriptor if there is no user-specified data. */
20272 ptr = frag_more (4);
20273 md_number_to_chars (ptr, 0, 4);
20274 }
20275
20276 return 0;
bfae80f2
RE
20277}
20278
f0927246
NC
20279
20280/* Initialize the DWARF-2 unwind information for this procedure. */
20281
20282void
20283tc_arm_frame_initial_instructions (void)
20284{
20285 cfi_add_CFA_def_cfa (REG_SP, 0);
20286}
20287#endif /* OBJ_ELF */
20288
c19d1205
ZW
20289/* Convert REGNAME to a DWARF-2 register number. */
20290
20291int
1df69f4f 20292tc_arm_regname_to_dw2regnum (char *regname)
bfae80f2 20293{
1df69f4f 20294 int reg = arm_reg_parse (&regname, REG_TYPE_RN);
c19d1205
ZW
20295
20296 if (reg == FAIL)
20297 return -1;
20298
20299 return reg;
bfae80f2
RE
20300}
20301
f0927246 20302#ifdef TE_PE
c19d1205 20303void
f0927246 20304tc_pe_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
bfae80f2 20305{
91d6fa6a 20306 expressionS exp;
bfae80f2 20307
91d6fa6a
NC
20308 exp.X_op = O_secrel;
20309 exp.X_add_symbol = symbol;
20310 exp.X_add_number = 0;
20311 emit_expr (&exp, size);
f0927246
NC
20312}
20313#endif
bfae80f2 20314
c19d1205 20315/* MD interface: Symbol and relocation handling. */
bfae80f2 20316
2fc8bdac
ZW
20317/* Return the address within the segment that a PC-relative fixup is
20318 relative to. For ARM, PC-relative fixups applied to instructions
20319 are generally relative to the location of the fixup plus 8 bytes.
20320 Thumb branches are offset by 4, and Thumb loads relative to PC
20321 require special handling. */
bfae80f2 20322
c19d1205 20323long
2fc8bdac 20324md_pcrel_from_section (fixS * fixP, segT seg)
bfae80f2 20325{
2fc8bdac
ZW
20326 offsetT base = fixP->fx_where + fixP->fx_frag->fr_address;
20327
20328 /* If this is pc-relative and we are going to emit a relocation
20329 then we just want to put out any pipeline compensation that the linker
53baae48
NC
20330 will need. Otherwise we want to use the calculated base.
20331 For WinCE we skip the bias for externals as well, since this
20332 is how the MS ARM-CE assembler behaves and we want to be compatible. */
5f4273c7 20333 if (fixP->fx_pcrel
2fc8bdac 20334 && ((fixP->fx_addsy && S_GET_SEGMENT (fixP->fx_addsy) != seg)
53baae48
NC
20335 || (arm_force_relocation (fixP)
20336#ifdef TE_WINCE
20337 && !S_IS_EXTERNAL (fixP->fx_addsy)
20338#endif
20339 )))
2fc8bdac 20340 base = 0;
bfae80f2 20341
267bf995 20342
c19d1205 20343 switch (fixP->fx_r_type)
bfae80f2 20344 {
2fc8bdac
ZW
20345 /* PC relative addressing on the Thumb is slightly odd as the
20346 bottom two bits of the PC are forced to zero for the
20347 calculation. This happens *after* application of the
20348 pipeline offset. However, Thumb adrl already adjusts for
20349 this, so we need not do it again. */
c19d1205 20350 case BFD_RELOC_ARM_THUMB_ADD:
2fc8bdac 20351 return base & ~3;
c19d1205
ZW
20352
20353 case BFD_RELOC_ARM_THUMB_OFFSET:
20354 case BFD_RELOC_ARM_T32_OFFSET_IMM:
e9f89963 20355 case BFD_RELOC_ARM_T32_ADD_PC12:
8f06b2d8 20356 case BFD_RELOC_ARM_T32_CP_OFF_IMM:
2fc8bdac 20357 return (base + 4) & ~3;
c19d1205 20358
2fc8bdac
ZW
20359 /* Thumb branches are simply offset by +4. */
20360 case BFD_RELOC_THUMB_PCREL_BRANCH7:
20361 case BFD_RELOC_THUMB_PCREL_BRANCH9:
20362 case BFD_RELOC_THUMB_PCREL_BRANCH12:
20363 case BFD_RELOC_THUMB_PCREL_BRANCH20:
2fc8bdac 20364 case BFD_RELOC_THUMB_PCREL_BRANCH25:
2fc8bdac 20365 return base + 4;
bfae80f2 20366
267bf995 20367 case BFD_RELOC_THUMB_PCREL_BRANCH23:
486499d0
CL
20368 if (fixP->fx_addsy
20369 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 20370 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
20371 && ARM_IS_FUNC (fixP->fx_addsy)
20372 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20373 base = fixP->fx_where + fixP->fx_frag->fr_address;
20374 return base + 4;
20375
00adf2d4
JB
20376 /* BLX is like branches above, but forces the low two bits of PC to
20377 zero. */
486499d0
CL
20378 case BFD_RELOC_THUMB_PCREL_BLX:
20379 if (fixP->fx_addsy
20380 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 20381 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
20382 && THUMB_IS_FUNC (fixP->fx_addsy)
20383 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20384 base = fixP->fx_where + fixP->fx_frag->fr_address;
00adf2d4
JB
20385 return (base + 4) & ~3;
20386
2fc8bdac
ZW
20387 /* ARM mode branches are offset by +8. However, the Windows CE
20388 loader expects the relocation not to take this into account. */
267bf995 20389 case BFD_RELOC_ARM_PCREL_BLX:
486499d0
CL
20390 if (fixP->fx_addsy
20391 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 20392 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
20393 && ARM_IS_FUNC (fixP->fx_addsy)
20394 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20395 base = fixP->fx_where + fixP->fx_frag->fr_address;
486499d0 20396 return base + 8;
267bf995 20397
486499d0
CL
20398 case BFD_RELOC_ARM_PCREL_CALL:
20399 if (fixP->fx_addsy
20400 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 20401 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
20402 && THUMB_IS_FUNC (fixP->fx_addsy)
20403 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
20404 base = fixP->fx_where + fixP->fx_frag->fr_address;
486499d0 20405 return base + 8;
267bf995 20406
2fc8bdac 20407 case BFD_RELOC_ARM_PCREL_BRANCH:
39b41c9c 20408 case BFD_RELOC_ARM_PCREL_JUMP:
2fc8bdac 20409 case BFD_RELOC_ARM_PLT32:
c19d1205 20410#ifdef TE_WINCE
5f4273c7 20411 /* When handling fixups immediately, because we have already
53baae48
NC
20412 discovered the value of a symbol, or the address of the frag involved
20413 we must account for the offset by +8, as the OS loader will never see the reloc.
20414 see fixup_segment() in write.c
20415 The S_IS_EXTERNAL test handles the case of global symbols.
20416 Those need the calculated base, not just the pipe compensation the linker will need. */
20417 if (fixP->fx_pcrel
20418 && fixP->fx_addsy != NULL
20419 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
20420 && (S_IS_EXTERNAL (fixP->fx_addsy) || !arm_force_relocation (fixP)))
20421 return base + 8;
2fc8bdac 20422 return base;
c19d1205 20423#else
2fc8bdac 20424 return base + 8;
c19d1205 20425#endif
2fc8bdac 20426
267bf995 20427
2fc8bdac
ZW
20428 /* ARM mode loads relative to PC are also offset by +8. Unlike
20429 branches, the Windows CE loader *does* expect the relocation
20430 to take this into account. */
20431 case BFD_RELOC_ARM_OFFSET_IMM:
20432 case BFD_RELOC_ARM_OFFSET_IMM8:
20433 case BFD_RELOC_ARM_HWLITERAL:
20434 case BFD_RELOC_ARM_LITERAL:
20435 case BFD_RELOC_ARM_CP_OFF_IMM:
20436 return base + 8;
20437
20438
20439 /* Other PC-relative relocations are un-offset. */
20440 default:
20441 return base;
20442 }
bfae80f2
RE
20443}
20444
c19d1205
ZW
20445/* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
20446 Otherwise we have no need to default values of symbols. */
20447
20448symbolS *
20449md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
bfae80f2 20450{
c19d1205
ZW
20451#ifdef OBJ_ELF
20452 if (name[0] == '_' && name[1] == 'G'
20453 && streq (name, GLOBAL_OFFSET_TABLE_NAME))
20454 {
20455 if (!GOT_symbol)
20456 {
20457 if (symbol_find (name))
bd3ba5d1 20458 as_bad (_("GOT already in the symbol table"));
bfae80f2 20459
c19d1205
ZW
20460 GOT_symbol = symbol_new (name, undefined_section,
20461 (valueT) 0, & zero_address_frag);
20462 }
bfae80f2 20463
c19d1205 20464 return GOT_symbol;
bfae80f2 20465 }
c19d1205 20466#endif
bfae80f2 20467
c921be7d 20468 return NULL;
bfae80f2
RE
20469}
20470
55cf6793 20471/* Subroutine of md_apply_fix. Check to see if an immediate can be
c19d1205
ZW
20472 computed as two separate immediate values, added together. We
20473 already know that this value cannot be computed by just one ARM
20474 instruction. */
20475
20476static unsigned int
20477validate_immediate_twopart (unsigned int val,
20478 unsigned int * highpart)
bfae80f2 20479{
c19d1205
ZW
20480 unsigned int a;
20481 unsigned int i;
bfae80f2 20482
c19d1205
ZW
20483 for (i = 0; i < 32; i += 2)
20484 if (((a = rotate_left (val, i)) & 0xff) != 0)
20485 {
20486 if (a & 0xff00)
20487 {
20488 if (a & ~ 0xffff)
20489 continue;
20490 * highpart = (a >> 8) | ((i + 24) << 7);
20491 }
20492 else if (a & 0xff0000)
20493 {
20494 if (a & 0xff000000)
20495 continue;
20496 * highpart = (a >> 16) | ((i + 16) << 7);
20497 }
20498 else
20499 {
9c2799c2 20500 gas_assert (a & 0xff000000);
c19d1205
ZW
20501 * highpart = (a >> 24) | ((i + 8) << 7);
20502 }
bfae80f2 20503
c19d1205
ZW
20504 return (a & 0xff) | (i << 7);
20505 }
bfae80f2 20506
c19d1205 20507 return FAIL;
bfae80f2
RE
20508}
20509
c19d1205
ZW
20510static int
20511validate_offset_imm (unsigned int val, int hwse)
20512{
20513 if ((hwse && val > 255) || val > 4095)
20514 return FAIL;
20515 return val;
20516}
bfae80f2 20517
55cf6793 20518/* Subroutine of md_apply_fix. Do those data_ops which can take a
c19d1205
ZW
20519 negative immediate constant by altering the instruction. A bit of
20520 a hack really.
20521 MOV <-> MVN
20522 AND <-> BIC
20523 ADC <-> SBC
20524 by inverting the second operand, and
20525 ADD <-> SUB
20526 CMP <-> CMN
20527 by negating the second operand. */
bfae80f2 20528
c19d1205
ZW
20529static int
20530negate_data_op (unsigned long * instruction,
20531 unsigned long value)
bfae80f2 20532{
c19d1205
ZW
20533 int op, new_inst;
20534 unsigned long negated, inverted;
bfae80f2 20535
c19d1205
ZW
20536 negated = encode_arm_immediate (-value);
20537 inverted = encode_arm_immediate (~value);
bfae80f2 20538
c19d1205
ZW
20539 op = (*instruction >> DATA_OP_SHIFT) & 0xf;
20540 switch (op)
bfae80f2 20541 {
c19d1205
ZW
20542 /* First negates. */
20543 case OPCODE_SUB: /* ADD <-> SUB */
20544 new_inst = OPCODE_ADD;
20545 value = negated;
20546 break;
bfae80f2 20547
c19d1205
ZW
20548 case OPCODE_ADD:
20549 new_inst = OPCODE_SUB;
20550 value = negated;
20551 break;
bfae80f2 20552
c19d1205
ZW
20553 case OPCODE_CMP: /* CMP <-> CMN */
20554 new_inst = OPCODE_CMN;
20555 value = negated;
20556 break;
bfae80f2 20557
c19d1205
ZW
20558 case OPCODE_CMN:
20559 new_inst = OPCODE_CMP;
20560 value = negated;
20561 break;
bfae80f2 20562
c19d1205
ZW
20563 /* Now Inverted ops. */
20564 case OPCODE_MOV: /* MOV <-> MVN */
20565 new_inst = OPCODE_MVN;
20566 value = inverted;
20567 break;
bfae80f2 20568
c19d1205
ZW
20569 case OPCODE_MVN:
20570 new_inst = OPCODE_MOV;
20571 value = inverted;
20572 break;
bfae80f2 20573
c19d1205
ZW
20574 case OPCODE_AND: /* AND <-> BIC */
20575 new_inst = OPCODE_BIC;
20576 value = inverted;
20577 break;
bfae80f2 20578
c19d1205
ZW
20579 case OPCODE_BIC:
20580 new_inst = OPCODE_AND;
20581 value = inverted;
20582 break;
bfae80f2 20583
c19d1205
ZW
20584 case OPCODE_ADC: /* ADC <-> SBC */
20585 new_inst = OPCODE_SBC;
20586 value = inverted;
20587 break;
bfae80f2 20588
c19d1205
ZW
20589 case OPCODE_SBC:
20590 new_inst = OPCODE_ADC;
20591 value = inverted;
20592 break;
bfae80f2 20593
c19d1205
ZW
20594 /* We cannot do anything. */
20595 default:
20596 return FAIL;
b99bd4ef
NC
20597 }
20598
c19d1205
ZW
20599 if (value == (unsigned) FAIL)
20600 return FAIL;
20601
20602 *instruction &= OPCODE_MASK;
20603 *instruction |= new_inst << DATA_OP_SHIFT;
20604 return value;
b99bd4ef
NC
20605}
20606
ef8d22e6
PB
20607/* Like negate_data_op, but for Thumb-2. */
20608
20609static unsigned int
16dd5e42 20610thumb32_negate_data_op (offsetT *instruction, unsigned int value)
ef8d22e6
PB
20611{
20612 int op, new_inst;
20613 int rd;
16dd5e42 20614 unsigned int negated, inverted;
ef8d22e6
PB
20615
20616 negated = encode_thumb32_immediate (-value);
20617 inverted = encode_thumb32_immediate (~value);
20618
20619 rd = (*instruction >> 8) & 0xf;
20620 op = (*instruction >> T2_DATA_OP_SHIFT) & 0xf;
20621 switch (op)
20622 {
20623 /* ADD <-> SUB. Includes CMP <-> CMN. */
20624 case T2_OPCODE_SUB:
20625 new_inst = T2_OPCODE_ADD;
20626 value = negated;
20627 break;
20628
20629 case T2_OPCODE_ADD:
20630 new_inst = T2_OPCODE_SUB;
20631 value = negated;
20632 break;
20633
20634 /* ORR <-> ORN. Includes MOV <-> MVN. */
20635 case T2_OPCODE_ORR:
20636 new_inst = T2_OPCODE_ORN;
20637 value = inverted;
20638 break;
20639
20640 case T2_OPCODE_ORN:
20641 new_inst = T2_OPCODE_ORR;
20642 value = inverted;
20643 break;
20644
20645 /* AND <-> BIC. TST has no inverted equivalent. */
20646 case T2_OPCODE_AND:
20647 new_inst = T2_OPCODE_BIC;
20648 if (rd == 15)
20649 value = FAIL;
20650 else
20651 value = inverted;
20652 break;
20653
20654 case T2_OPCODE_BIC:
20655 new_inst = T2_OPCODE_AND;
20656 value = inverted;
20657 break;
20658
20659 /* ADC <-> SBC */
20660 case T2_OPCODE_ADC:
20661 new_inst = T2_OPCODE_SBC;
20662 value = inverted;
20663 break;
20664
20665 case T2_OPCODE_SBC:
20666 new_inst = T2_OPCODE_ADC;
20667 value = inverted;
20668 break;
20669
20670 /* We cannot do anything. */
20671 default:
20672 return FAIL;
20673 }
20674
16dd5e42 20675 if (value == (unsigned int)FAIL)
ef8d22e6
PB
20676 return FAIL;
20677
20678 *instruction &= T2_OPCODE_MASK;
20679 *instruction |= new_inst << T2_DATA_OP_SHIFT;
20680 return value;
20681}
20682
8f06b2d8
PB
20683/* Read a 32-bit thumb instruction from buf. */
20684static unsigned long
20685get_thumb32_insn (char * buf)
20686{
20687 unsigned long insn;
20688 insn = md_chars_to_number (buf, THUMB_SIZE) << 16;
20689 insn |= md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20690
20691 return insn;
20692}
20693
a8bc6c78
PB
20694
20695/* We usually want to set the low bit on the address of thumb function
20696 symbols. In particular .word foo - . should have the low bit set.
20697 Generic code tries to fold the difference of two symbols to
20698 a constant. Prevent this and force a relocation when the first symbols
20699 is a thumb function. */
c921be7d
NC
20700
20701bfd_boolean
a8bc6c78
PB
20702arm_optimize_expr (expressionS *l, operatorT op, expressionS *r)
20703{
20704 if (op == O_subtract
20705 && l->X_op == O_symbol
20706 && r->X_op == O_symbol
20707 && THUMB_IS_FUNC (l->X_add_symbol))
20708 {
20709 l->X_op = O_subtract;
20710 l->X_op_symbol = r->X_add_symbol;
20711 l->X_add_number -= r->X_add_number;
c921be7d 20712 return TRUE;
a8bc6c78 20713 }
c921be7d 20714
a8bc6c78 20715 /* Process as normal. */
c921be7d 20716 return FALSE;
a8bc6c78
PB
20717}
20718
4a42ebbc
RR
20719/* Encode Thumb2 unconditional branches and calls. The encoding
20720 for the 2 are identical for the immediate values. */
20721
20722static void
20723encode_thumb2_b_bl_offset (char * buf, offsetT value)
20724{
20725#define T2I1I2MASK ((1 << 13) | (1 << 11))
20726 offsetT newval;
20727 offsetT newval2;
20728 addressT S, I1, I2, lo, hi;
20729
20730 S = (value >> 24) & 0x01;
20731 I1 = (value >> 23) & 0x01;
20732 I2 = (value >> 22) & 0x01;
20733 hi = (value >> 12) & 0x3ff;
fa94de6b 20734 lo = (value >> 1) & 0x7ff;
4a42ebbc
RR
20735 newval = md_chars_to_number (buf, THUMB_SIZE);
20736 newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
20737 newval |= (S << 10) | hi;
20738 newval2 &= ~T2I1I2MASK;
20739 newval2 |= (((I1 ^ S) << 13) | ((I2 ^ S) << 11) | lo) ^ T2I1I2MASK;
20740 md_number_to_chars (buf, newval, THUMB_SIZE);
20741 md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
20742}
20743
c19d1205 20744void
55cf6793 20745md_apply_fix (fixS * fixP,
c19d1205
ZW
20746 valueT * valP,
20747 segT seg)
20748{
20749 offsetT value = * valP;
20750 offsetT newval;
20751 unsigned int newimm;
20752 unsigned long temp;
20753 int sign;
20754 char * buf = fixP->fx_where + fixP->fx_frag->fr_literal;
b99bd4ef 20755
9c2799c2 20756 gas_assert (fixP->fx_r_type <= BFD_RELOC_UNUSED);
b99bd4ef 20757
c19d1205 20758 /* Note whether this will delete the relocation. */
4962c51a 20759
c19d1205
ZW
20760 if (fixP->fx_addsy == 0 && !fixP->fx_pcrel)
20761 fixP->fx_done = 1;
b99bd4ef 20762
adbaf948 20763 /* On a 64-bit host, silently truncate 'value' to 32 bits for
5f4273c7 20764 consistency with the behaviour on 32-bit hosts. Remember value
adbaf948
ZW
20765 for emit_reloc. */
20766 value &= 0xffffffff;
20767 value ^= 0x80000000;
5f4273c7 20768 value -= 0x80000000;
adbaf948
ZW
20769
20770 *valP = value;
c19d1205 20771 fixP->fx_addnumber = value;
b99bd4ef 20772
adbaf948
ZW
20773 /* Same treatment for fixP->fx_offset. */
20774 fixP->fx_offset &= 0xffffffff;
20775 fixP->fx_offset ^= 0x80000000;
20776 fixP->fx_offset -= 0x80000000;
20777
c19d1205 20778 switch (fixP->fx_r_type)
b99bd4ef 20779 {
c19d1205
ZW
20780 case BFD_RELOC_NONE:
20781 /* This will need to go in the object file. */
20782 fixP->fx_done = 0;
20783 break;
b99bd4ef 20784
c19d1205
ZW
20785 case BFD_RELOC_ARM_IMMEDIATE:
20786 /* We claim that this fixup has been processed here,
20787 even if in fact we generate an error because we do
20788 not have a reloc for it, so tc_gen_reloc will reject it. */
20789 fixP->fx_done = 1;
b99bd4ef 20790
77db8e2e 20791 if (fixP->fx_addsy)
b99bd4ef 20792 {
77db8e2e 20793 const char *msg = 0;
b99bd4ef 20794
77db8e2e
NC
20795 if (! S_IS_DEFINED (fixP->fx_addsy))
20796 msg = _("undefined symbol %s used as an immediate value");
20797 else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
20798 msg = _("symbol %s is in a different section");
20799 else if (S_IS_WEAK (fixP->fx_addsy))
20800 msg = _("symbol %s is weak and may be overridden later");
20801
20802 if (msg)
20803 {
20804 as_bad_where (fixP->fx_file, fixP->fx_line,
20805 msg, S_GET_NAME (fixP->fx_addsy));
20806 break;
20807 }
42e5fcbf
AS
20808 }
20809
c19d1205
ZW
20810 temp = md_chars_to_number (buf, INSN_SIZE);
20811
5e73442d
SL
20812 /* If the offset is negative, we should use encoding A2 for ADR. */
20813 if ((temp & 0xfff0000) == 0x28f0000 && value < 0)
20814 newimm = negate_data_op (&temp, value);
20815 else
20816 {
20817 newimm = encode_arm_immediate (value);
20818
20819 /* If the instruction will fail, see if we can fix things up by
20820 changing the opcode. */
20821 if (newimm == (unsigned int) FAIL)
20822 newimm = negate_data_op (&temp, value);
20823 }
20824
20825 if (newimm == (unsigned int) FAIL)
b99bd4ef 20826 {
c19d1205
ZW
20827 as_bad_where (fixP->fx_file, fixP->fx_line,
20828 _("invalid constant (%lx) after fixup"),
20829 (unsigned long) value);
20830 break;
b99bd4ef 20831 }
b99bd4ef 20832
c19d1205
ZW
20833 newimm |= (temp & 0xfffff000);
20834 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
20835 break;
b99bd4ef 20836
c19d1205
ZW
20837 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
20838 {
20839 unsigned int highpart = 0;
20840 unsigned int newinsn = 0xe1a00000; /* nop. */
b99bd4ef 20841
77db8e2e 20842 if (fixP->fx_addsy)
42e5fcbf 20843 {
77db8e2e 20844 const char *msg = 0;
42e5fcbf 20845
77db8e2e
NC
20846 if (! S_IS_DEFINED (fixP->fx_addsy))
20847 msg = _("undefined symbol %s used as an immediate value");
20848 else if (S_GET_SEGMENT (fixP->fx_addsy) != seg)
20849 msg = _("symbol %s is in a different section");
20850 else if (S_IS_WEAK (fixP->fx_addsy))
20851 msg = _("symbol %s is weak and may be overridden later");
42e5fcbf 20852
77db8e2e
NC
20853 if (msg)
20854 {
20855 as_bad_where (fixP->fx_file, fixP->fx_line,
20856 msg, S_GET_NAME (fixP->fx_addsy));
20857 break;
20858 }
20859 }
fa94de6b 20860
c19d1205
ZW
20861 newimm = encode_arm_immediate (value);
20862 temp = md_chars_to_number (buf, INSN_SIZE);
b99bd4ef 20863
c19d1205
ZW
20864 /* If the instruction will fail, see if we can fix things up by
20865 changing the opcode. */
20866 if (newimm == (unsigned int) FAIL
20867 && (newimm = negate_data_op (& temp, value)) == (unsigned int) FAIL)
20868 {
20869 /* No ? OK - try using two ADD instructions to generate
20870 the value. */
20871 newimm = validate_immediate_twopart (value, & highpart);
b99bd4ef 20872
c19d1205
ZW
20873 /* Yes - then make sure that the second instruction is
20874 also an add. */
20875 if (newimm != (unsigned int) FAIL)
20876 newinsn = temp;
20877 /* Still No ? Try using a negated value. */
20878 else if ((newimm = validate_immediate_twopart (- value, & highpart)) != (unsigned int) FAIL)
20879 temp = newinsn = (temp & OPCODE_MASK) | OPCODE_SUB << DATA_OP_SHIFT;
20880 /* Otherwise - give up. */
20881 else
20882 {
20883 as_bad_where (fixP->fx_file, fixP->fx_line,
20884 _("unable to compute ADRL instructions for PC offset of 0x%lx"),
20885 (long) value);
20886 break;
20887 }
b99bd4ef 20888
c19d1205
ZW
20889 /* Replace the first operand in the 2nd instruction (which
20890 is the PC) with the destination register. We have
20891 already added in the PC in the first instruction and we
20892 do not want to do it again. */
20893 newinsn &= ~ 0xf0000;
20894 newinsn |= ((newinsn & 0x0f000) << 4);
20895 }
b99bd4ef 20896
c19d1205
ZW
20897 newimm |= (temp & 0xfffff000);
20898 md_number_to_chars (buf, (valueT) newimm, INSN_SIZE);
b99bd4ef 20899
c19d1205
ZW
20900 highpart |= (newinsn & 0xfffff000);
20901 md_number_to_chars (buf + INSN_SIZE, (valueT) highpart, INSN_SIZE);
20902 }
20903 break;
b99bd4ef 20904
c19d1205 20905 case BFD_RELOC_ARM_OFFSET_IMM:
00a97672
RS
20906 if (!fixP->fx_done && seg->use_rela_p)
20907 value = 0;
20908
c19d1205 20909 case BFD_RELOC_ARM_LITERAL:
26d97720 20910 sign = value > 0;
b99bd4ef 20911
c19d1205
ZW
20912 if (value < 0)
20913 value = - value;
b99bd4ef 20914
c19d1205 20915 if (validate_offset_imm (value, 0) == FAIL)
f03698e6 20916 {
c19d1205
ZW
20917 if (fixP->fx_r_type == BFD_RELOC_ARM_LITERAL)
20918 as_bad_where (fixP->fx_file, fixP->fx_line,
20919 _("invalid literal constant: pool needs to be closer"));
20920 else
20921 as_bad_where (fixP->fx_file, fixP->fx_line,
20922 _("bad immediate value for offset (%ld)"),
20923 (long) value);
20924 break;
f03698e6
RE
20925 }
20926
c19d1205 20927 newval = md_chars_to_number (buf, INSN_SIZE);
26d97720
NS
20928 if (value == 0)
20929 newval &= 0xfffff000;
20930 else
20931 {
20932 newval &= 0xff7ff000;
20933 newval |= value | (sign ? INDEX_UP : 0);
20934 }
c19d1205
ZW
20935 md_number_to_chars (buf, newval, INSN_SIZE);
20936 break;
b99bd4ef 20937
c19d1205
ZW
20938 case BFD_RELOC_ARM_OFFSET_IMM8:
20939 case BFD_RELOC_ARM_HWLITERAL:
26d97720 20940 sign = value > 0;
b99bd4ef 20941
c19d1205
ZW
20942 if (value < 0)
20943 value = - value;
b99bd4ef 20944
c19d1205 20945 if (validate_offset_imm (value, 1) == FAIL)
b99bd4ef 20946 {
c19d1205
ZW
20947 if (fixP->fx_r_type == BFD_RELOC_ARM_HWLITERAL)
20948 as_bad_where (fixP->fx_file, fixP->fx_line,
20949 _("invalid literal constant: pool needs to be closer"));
20950 else
f9d4405b 20951 as_bad (_("bad immediate value for 8-bit offset (%ld)"),
c19d1205
ZW
20952 (long) value);
20953 break;
b99bd4ef
NC
20954 }
20955
c19d1205 20956 newval = md_chars_to_number (buf, INSN_SIZE);
26d97720
NS
20957 if (value == 0)
20958 newval &= 0xfffff0f0;
20959 else
20960 {
20961 newval &= 0xff7ff0f0;
20962 newval |= ((value >> 4) << 8) | (value & 0xf) | (sign ? INDEX_UP : 0);
20963 }
c19d1205
ZW
20964 md_number_to_chars (buf, newval, INSN_SIZE);
20965 break;
b99bd4ef 20966
c19d1205
ZW
20967 case BFD_RELOC_ARM_T32_OFFSET_U8:
20968 if (value < 0 || value > 1020 || value % 4 != 0)
20969 as_bad_where (fixP->fx_file, fixP->fx_line,
20970 _("bad immediate value for offset (%ld)"), (long) value);
20971 value /= 4;
b99bd4ef 20972
c19d1205 20973 newval = md_chars_to_number (buf+2, THUMB_SIZE);
c19d1205
ZW
20974 newval |= value;
20975 md_number_to_chars (buf+2, newval, THUMB_SIZE);
20976 break;
b99bd4ef 20977
c19d1205
ZW
20978 case BFD_RELOC_ARM_T32_OFFSET_IMM:
20979 /* This is a complicated relocation used for all varieties of Thumb32
20980 load/store instruction with immediate offset:
20981
20982 1110 100P u1WL NNNN XXXX YYYY iiii iiii - +/-(U) pre/post(P) 8-bit,
20983 *4, optional writeback(W)
20984 (doubleword load/store)
20985
20986 1111 100S uTTL 1111 XXXX iiii iiii iiii - +/-(U) 12-bit PC-rel
20987 1111 100S 0TTL NNNN XXXX 1Pu1 iiii iiii - +/-(U) pre/post(P) 8-bit
20988 1111 100S 0TTL NNNN XXXX 1110 iiii iiii - positive 8-bit (T instruction)
20989 1111 100S 1TTL NNNN XXXX iiii iiii iiii - positive 12-bit
20990 1111 100S 0TTL NNNN XXXX 1100 iiii iiii - negative 8-bit
20991
20992 Uppercase letters indicate bits that are already encoded at
20993 this point. Lowercase letters are our problem. For the
20994 second block of instructions, the secondary opcode nybble
20995 (bits 8..11) is present, and bit 23 is zero, even if this is
20996 a PC-relative operation. */
20997 newval = md_chars_to_number (buf, THUMB_SIZE);
20998 newval <<= 16;
20999 newval |= md_chars_to_number (buf+THUMB_SIZE, THUMB_SIZE);
b99bd4ef 21000
c19d1205 21001 if ((newval & 0xf0000000) == 0xe0000000)
b99bd4ef 21002 {
c19d1205
ZW
21003 /* Doubleword load/store: 8-bit offset, scaled by 4. */
21004 if (value >= 0)
21005 newval |= (1 << 23);
21006 else
21007 value = -value;
21008 if (value % 4 != 0)
21009 {
21010 as_bad_where (fixP->fx_file, fixP->fx_line,
21011 _("offset not a multiple of 4"));
21012 break;
21013 }
21014 value /= 4;
216d22bc 21015 if (value > 0xff)
c19d1205
ZW
21016 {
21017 as_bad_where (fixP->fx_file, fixP->fx_line,
21018 _("offset out of range"));
21019 break;
21020 }
21021 newval &= ~0xff;
b99bd4ef 21022 }
c19d1205 21023 else if ((newval & 0x000f0000) == 0x000f0000)
b99bd4ef 21024 {
c19d1205
ZW
21025 /* PC-relative, 12-bit offset. */
21026 if (value >= 0)
21027 newval |= (1 << 23);
21028 else
21029 value = -value;
216d22bc 21030 if (value > 0xfff)
c19d1205
ZW
21031 {
21032 as_bad_where (fixP->fx_file, fixP->fx_line,
21033 _("offset out of range"));
21034 break;
21035 }
21036 newval &= ~0xfff;
b99bd4ef 21037 }
c19d1205 21038 else if ((newval & 0x00000100) == 0x00000100)
b99bd4ef 21039 {
c19d1205
ZW
21040 /* Writeback: 8-bit, +/- offset. */
21041 if (value >= 0)
21042 newval |= (1 << 9);
21043 else
21044 value = -value;
216d22bc 21045 if (value > 0xff)
c19d1205
ZW
21046 {
21047 as_bad_where (fixP->fx_file, fixP->fx_line,
21048 _("offset out of range"));
21049 break;
21050 }
21051 newval &= ~0xff;
b99bd4ef 21052 }
c19d1205 21053 else if ((newval & 0x00000f00) == 0x00000e00)
b99bd4ef 21054 {
c19d1205 21055 /* T-instruction: positive 8-bit offset. */
216d22bc 21056 if (value < 0 || value > 0xff)
b99bd4ef 21057 {
c19d1205
ZW
21058 as_bad_where (fixP->fx_file, fixP->fx_line,
21059 _("offset out of range"));
21060 break;
b99bd4ef 21061 }
c19d1205
ZW
21062 newval &= ~0xff;
21063 newval |= value;
b99bd4ef
NC
21064 }
21065 else
b99bd4ef 21066 {
c19d1205
ZW
21067 /* Positive 12-bit or negative 8-bit offset. */
21068 int limit;
21069 if (value >= 0)
b99bd4ef 21070 {
c19d1205
ZW
21071 newval |= (1 << 23);
21072 limit = 0xfff;
21073 }
21074 else
21075 {
21076 value = -value;
21077 limit = 0xff;
21078 }
21079 if (value > limit)
21080 {
21081 as_bad_where (fixP->fx_file, fixP->fx_line,
21082 _("offset out of range"));
21083 break;
b99bd4ef 21084 }
c19d1205 21085 newval &= ~limit;
b99bd4ef 21086 }
b99bd4ef 21087
c19d1205
ZW
21088 newval |= value;
21089 md_number_to_chars (buf, (newval >> 16) & 0xffff, THUMB_SIZE);
21090 md_number_to_chars (buf + THUMB_SIZE, newval & 0xffff, THUMB_SIZE);
21091 break;
404ff6b5 21092
c19d1205
ZW
21093 case BFD_RELOC_ARM_SHIFT_IMM:
21094 newval = md_chars_to_number (buf, INSN_SIZE);
21095 if (((unsigned long) value) > 32
21096 || (value == 32
21097 && (((newval & 0x60) == 0) || (newval & 0x60) == 0x60)))
21098 {
21099 as_bad_where (fixP->fx_file, fixP->fx_line,
21100 _("shift expression is too large"));
21101 break;
21102 }
404ff6b5 21103
c19d1205
ZW
21104 if (value == 0)
21105 /* Shifts of zero must be done as lsl. */
21106 newval &= ~0x60;
21107 else if (value == 32)
21108 value = 0;
21109 newval &= 0xfffff07f;
21110 newval |= (value & 0x1f) << 7;
21111 md_number_to_chars (buf, newval, INSN_SIZE);
21112 break;
404ff6b5 21113
c19d1205 21114 case BFD_RELOC_ARM_T32_IMMEDIATE:
16805f35 21115 case BFD_RELOC_ARM_T32_ADD_IMM:
92e90b6e 21116 case BFD_RELOC_ARM_T32_IMM12:
e9f89963 21117 case BFD_RELOC_ARM_T32_ADD_PC12:
c19d1205
ZW
21118 /* We claim that this fixup has been processed here,
21119 even if in fact we generate an error because we do
21120 not have a reloc for it, so tc_gen_reloc will reject it. */
21121 fixP->fx_done = 1;
404ff6b5 21122
c19d1205
ZW
21123 if (fixP->fx_addsy
21124 && ! S_IS_DEFINED (fixP->fx_addsy))
21125 {
21126 as_bad_where (fixP->fx_file, fixP->fx_line,
21127 _("undefined symbol %s used as an immediate value"),
21128 S_GET_NAME (fixP->fx_addsy));
21129 break;
21130 }
404ff6b5 21131
c19d1205
ZW
21132 newval = md_chars_to_number (buf, THUMB_SIZE);
21133 newval <<= 16;
21134 newval |= md_chars_to_number (buf+2, THUMB_SIZE);
404ff6b5 21135
16805f35
PB
21136 newimm = FAIL;
21137 if (fixP->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
21138 || fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
ef8d22e6
PB
21139 {
21140 newimm = encode_thumb32_immediate (value);
21141 if (newimm == (unsigned int) FAIL)
21142 newimm = thumb32_negate_data_op (&newval, value);
21143 }
16805f35
PB
21144 if (fixP->fx_r_type != BFD_RELOC_ARM_T32_IMMEDIATE
21145 && newimm == (unsigned int) FAIL)
92e90b6e 21146 {
16805f35
PB
21147 /* Turn add/sum into addw/subw. */
21148 if (fixP->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM)
21149 newval = (newval & 0xfeffffff) | 0x02000000;
40f246e3
NC
21150 /* No flat 12-bit imm encoding for addsw/subsw. */
21151 if ((newval & 0x00100000) == 0)
e9f89963 21152 {
40f246e3
NC
21153 /* 12 bit immediate for addw/subw. */
21154 if (value < 0)
21155 {
21156 value = -value;
21157 newval ^= 0x00a00000;
21158 }
21159 if (value > 0xfff)
21160 newimm = (unsigned int) FAIL;
21161 else
21162 newimm = value;
e9f89963 21163 }
92e90b6e 21164 }
cc8a6dd0 21165
c19d1205 21166 if (newimm == (unsigned int)FAIL)
3631a3c8 21167 {
c19d1205
ZW
21168 as_bad_where (fixP->fx_file, fixP->fx_line,
21169 _("invalid constant (%lx) after fixup"),
21170 (unsigned long) value);
21171 break;
3631a3c8
NC
21172 }
21173
c19d1205
ZW
21174 newval |= (newimm & 0x800) << 15;
21175 newval |= (newimm & 0x700) << 4;
21176 newval |= (newimm & 0x0ff);
cc8a6dd0 21177
c19d1205
ZW
21178 md_number_to_chars (buf, (valueT) ((newval >> 16) & 0xffff), THUMB_SIZE);
21179 md_number_to_chars (buf+2, (valueT) (newval & 0xffff), THUMB_SIZE);
21180 break;
a737bd4d 21181
3eb17e6b 21182 case BFD_RELOC_ARM_SMC:
c19d1205
ZW
21183 if (((unsigned long) value) > 0xffff)
21184 as_bad_where (fixP->fx_file, fixP->fx_line,
3eb17e6b 21185 _("invalid smc expression"));
2fc8bdac 21186 newval = md_chars_to_number (buf, INSN_SIZE);
c19d1205
ZW
21187 newval |= (value & 0xf) | ((value & 0xfff0) << 4);
21188 md_number_to_chars (buf, newval, INSN_SIZE);
21189 break;
a737bd4d 21190
90ec0d68
MGD
21191 case BFD_RELOC_ARM_HVC:
21192 if (((unsigned long) value) > 0xffff)
21193 as_bad_where (fixP->fx_file, fixP->fx_line,
21194 _("invalid hvc expression"));
21195 newval = md_chars_to_number (buf, INSN_SIZE);
21196 newval |= (value & 0xf) | ((value & 0xfff0) << 4);
21197 md_number_to_chars (buf, newval, INSN_SIZE);
21198 break;
21199
c19d1205 21200 case BFD_RELOC_ARM_SWI:
adbaf948 21201 if (fixP->tc_fix_data != 0)
c19d1205
ZW
21202 {
21203 if (((unsigned long) value) > 0xff)
21204 as_bad_where (fixP->fx_file, fixP->fx_line,
21205 _("invalid swi expression"));
2fc8bdac 21206 newval = md_chars_to_number (buf, THUMB_SIZE);
c19d1205
ZW
21207 newval |= value;
21208 md_number_to_chars (buf, newval, THUMB_SIZE);
21209 }
21210 else
21211 {
21212 if (((unsigned long) value) > 0x00ffffff)
21213 as_bad_where (fixP->fx_file, fixP->fx_line,
21214 _("invalid swi expression"));
2fc8bdac 21215 newval = md_chars_to_number (buf, INSN_SIZE);
c19d1205
ZW
21216 newval |= value;
21217 md_number_to_chars (buf, newval, INSN_SIZE);
21218 }
21219 break;
a737bd4d 21220
c19d1205
ZW
21221 case BFD_RELOC_ARM_MULTI:
21222 if (((unsigned long) value) > 0xffff)
21223 as_bad_where (fixP->fx_file, fixP->fx_line,
21224 _("invalid expression in load/store multiple"));
21225 newval = value | md_chars_to_number (buf, INSN_SIZE);
21226 md_number_to_chars (buf, newval, INSN_SIZE);
21227 break;
a737bd4d 21228
c19d1205 21229#ifdef OBJ_ELF
39b41c9c 21230 case BFD_RELOC_ARM_PCREL_CALL:
267bf995
RR
21231
21232 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
21233 && fixP->fx_addsy
34e77a92 21234 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
21235 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21236 && THUMB_IS_FUNC (fixP->fx_addsy))
21237 /* Flip the bl to blx. This is a simple flip
21238 bit here because we generate PCREL_CALL for
21239 unconditional bls. */
21240 {
21241 newval = md_chars_to_number (buf, INSN_SIZE);
21242 newval = newval | 0x10000000;
21243 md_number_to_chars (buf, newval, INSN_SIZE);
21244 temp = 1;
21245 fixP->fx_done = 1;
21246 }
39b41c9c
PB
21247 else
21248 temp = 3;
21249 goto arm_branch_common;
21250
21251 case BFD_RELOC_ARM_PCREL_JUMP:
267bf995
RR
21252 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
21253 && fixP->fx_addsy
34e77a92 21254 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
21255 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21256 && THUMB_IS_FUNC (fixP->fx_addsy))
21257 {
21258 /* This would map to a bl<cond>, b<cond>,
21259 b<always> to a Thumb function. We
21260 need to force a relocation for this particular
21261 case. */
21262 newval = md_chars_to_number (buf, INSN_SIZE);
21263 fixP->fx_done = 0;
21264 }
21265
2fc8bdac 21266 case BFD_RELOC_ARM_PLT32:
c19d1205 21267#endif
39b41c9c
PB
21268 case BFD_RELOC_ARM_PCREL_BRANCH:
21269 temp = 3;
21270 goto arm_branch_common;
a737bd4d 21271
39b41c9c 21272 case BFD_RELOC_ARM_PCREL_BLX:
267bf995 21273
39b41c9c 21274 temp = 1;
267bf995
RR
21275 if (ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
21276 && fixP->fx_addsy
34e77a92 21277 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
21278 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21279 && ARM_IS_FUNC (fixP->fx_addsy))
21280 {
21281 /* Flip the blx to a bl and warn. */
21282 const char *name = S_GET_NAME (fixP->fx_addsy);
21283 newval = 0xeb000000;
21284 as_warn_where (fixP->fx_file, fixP->fx_line,
21285 _("blx to '%s' an ARM ISA state function changed to bl"),
21286 name);
21287 md_number_to_chars (buf, newval, INSN_SIZE);
21288 temp = 3;
21289 fixP->fx_done = 1;
21290 }
21291
21292#ifdef OBJ_ELF
21293 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
21294 fixP->fx_r_type = BFD_RELOC_ARM_PCREL_CALL;
21295#endif
21296
39b41c9c 21297 arm_branch_common:
c19d1205 21298 /* We are going to store value (shifted right by two) in the
39b41c9c
PB
21299 instruction, in a 24 bit, signed field. Bits 26 through 32 either
21300 all clear or all set and bit 0 must be clear. For B/BL bit 1 must
21301 also be be clear. */
21302 if (value & temp)
c19d1205 21303 as_bad_where (fixP->fx_file, fixP->fx_line,
2fc8bdac
ZW
21304 _("misaligned branch destination"));
21305 if ((value & (offsetT)0xfe000000) != (offsetT)0
21306 && (value & (offsetT)0xfe000000) != (offsetT)0xfe000000)
08f10d51 21307 as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
a737bd4d 21308
2fc8bdac 21309 if (fixP->fx_done || !seg->use_rela_p)
c19d1205 21310 {
2fc8bdac
ZW
21311 newval = md_chars_to_number (buf, INSN_SIZE);
21312 newval |= (value >> 2) & 0x00ffffff;
7ae2971b
PB
21313 /* Set the H bit on BLX instructions. */
21314 if (temp == 1)
21315 {
21316 if (value & 2)
21317 newval |= 0x01000000;
21318 else
21319 newval &= ~0x01000000;
21320 }
2fc8bdac 21321 md_number_to_chars (buf, newval, INSN_SIZE);
c19d1205 21322 }
c19d1205 21323 break;
a737bd4d 21324
25fe350b
MS
21325 case BFD_RELOC_THUMB_PCREL_BRANCH7: /* CBZ */
21326 /* CBZ can only branch forward. */
a737bd4d 21327
738755b0
MS
21328 /* Attempts to use CBZ to branch to the next instruction
21329 (which, strictly speaking, are prohibited) will be turned into
21330 no-ops.
21331
21332 FIXME: It may be better to remove the instruction completely and
21333 perform relaxation. */
21334 if (value == -2)
2fc8bdac
ZW
21335 {
21336 newval = md_chars_to_number (buf, THUMB_SIZE);
738755b0 21337 newval = 0xbf00; /* NOP encoding T1 */
2fc8bdac
ZW
21338 md_number_to_chars (buf, newval, THUMB_SIZE);
21339 }
738755b0
MS
21340 else
21341 {
21342 if (value & ~0x7e)
08f10d51 21343 as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
738755b0
MS
21344
21345 if (fixP->fx_done || !seg->use_rela_p)
21346 {
21347 newval = md_chars_to_number (buf, THUMB_SIZE);
21348 newval |= ((value & 0x3e) << 2) | ((value & 0x40) << 3);
21349 md_number_to_chars (buf, newval, THUMB_SIZE);
21350 }
21351 }
c19d1205 21352 break;
a737bd4d 21353
c19d1205 21354 case BFD_RELOC_THUMB_PCREL_BRANCH9: /* Conditional branch. */
2fc8bdac 21355 if ((value & ~0xff) && ((value & ~0xff) != ~0xff))
08f10d51 21356 as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
a737bd4d 21357
2fc8bdac
ZW
21358 if (fixP->fx_done || !seg->use_rela_p)
21359 {
21360 newval = md_chars_to_number (buf, THUMB_SIZE);
21361 newval |= (value & 0x1ff) >> 1;
21362 md_number_to_chars (buf, newval, THUMB_SIZE);
21363 }
c19d1205 21364 break;
a737bd4d 21365
c19d1205 21366 case BFD_RELOC_THUMB_PCREL_BRANCH12: /* Unconditional branch. */
2fc8bdac 21367 if ((value & ~0x7ff) && ((value & ~0x7ff) != ~0x7ff))
08f10d51 21368 as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
a737bd4d 21369
2fc8bdac
ZW
21370 if (fixP->fx_done || !seg->use_rela_p)
21371 {
21372 newval = md_chars_to_number (buf, THUMB_SIZE);
21373 newval |= (value & 0xfff) >> 1;
21374 md_number_to_chars (buf, newval, THUMB_SIZE);
21375 }
c19d1205 21376 break;
a737bd4d 21377
c19d1205 21378 case BFD_RELOC_THUMB_PCREL_BRANCH20:
267bf995
RR
21379 if (fixP->fx_addsy
21380 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 21381 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
21382 && ARM_IS_FUNC (fixP->fx_addsy)
21383 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21384 {
21385 /* Force a relocation for a branch 20 bits wide. */
21386 fixP->fx_done = 0;
21387 }
08f10d51 21388 if ((value & ~0x1fffff) && ((value & ~0x0fffff) != ~0x0fffff))
2fc8bdac
ZW
21389 as_bad_where (fixP->fx_file, fixP->fx_line,
21390 _("conditional branch out of range"));
404ff6b5 21391
2fc8bdac
ZW
21392 if (fixP->fx_done || !seg->use_rela_p)
21393 {
21394 offsetT newval2;
21395 addressT S, J1, J2, lo, hi;
404ff6b5 21396
2fc8bdac
ZW
21397 S = (value & 0x00100000) >> 20;
21398 J2 = (value & 0x00080000) >> 19;
21399 J1 = (value & 0x00040000) >> 18;
21400 hi = (value & 0x0003f000) >> 12;
21401 lo = (value & 0x00000ffe) >> 1;
6c43fab6 21402
2fc8bdac
ZW
21403 newval = md_chars_to_number (buf, THUMB_SIZE);
21404 newval2 = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21405 newval |= (S << 10) | hi;
21406 newval2 |= (J1 << 13) | (J2 << 11) | lo;
21407 md_number_to_chars (buf, newval, THUMB_SIZE);
21408 md_number_to_chars (buf + THUMB_SIZE, newval2, THUMB_SIZE);
21409 }
c19d1205 21410 break;
6c43fab6 21411
c19d1205 21412 case BFD_RELOC_THUMB_PCREL_BLX:
267bf995
RR
21413 /* If there is a blx from a thumb state function to
21414 another thumb function flip this to a bl and warn
21415 about it. */
21416
21417 if (fixP->fx_addsy
34e77a92 21418 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
21419 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
21420 && THUMB_IS_FUNC (fixP->fx_addsy))
21421 {
21422 const char *name = S_GET_NAME (fixP->fx_addsy);
21423 as_warn_where (fixP->fx_file, fixP->fx_line,
21424 _("blx to Thumb func '%s' from Thumb ISA state changed to bl"),
21425 name);
21426 newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21427 newval = newval | 0x1000;
21428 md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
21429 fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
21430 fixP->fx_done = 1;
21431 }
21432
21433
21434 goto thumb_bl_common;
21435
c19d1205 21436 case BFD_RELOC_THUMB_PCREL_BRANCH23:
267bf995
RR
21437 /* A bl from Thumb state ISA to an internal ARM state function
21438 is converted to a blx. */
21439 if (fixP->fx_addsy
21440 && (S_GET_SEGMENT (fixP->fx_addsy) == seg)
34e77a92 21441 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE)
267bf995
RR
21442 && ARM_IS_FUNC (fixP->fx_addsy)
21443 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t))
21444 {
21445 newval = md_chars_to_number (buf + THUMB_SIZE, THUMB_SIZE);
21446 newval = newval & ~0x1000;
21447 md_number_to_chars (buf+THUMB_SIZE, newval, THUMB_SIZE);
21448 fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BLX;
21449 fixP->fx_done = 1;
21450 }
21451
21452 thumb_bl_common:
21453
21454#ifdef OBJ_ELF
2b2f5df9
NC
21455 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4
21456 && fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
267bf995
RR
21457 fixP->fx_r_type = BFD_RELOC_THUMB_PCREL_BRANCH23;
21458#endif
21459
2fc8bdac
ZW
21460 if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BLX)
21461 /* For a BLX instruction, make sure that the relocation is rounded up
21462 to a word boundary. This follows the semantics of the instruction
21463 which specifies that bit 1 of the target address will come from bit
21464 1 of the base address. */
21465 value = (value + 1) & ~ 1;
404ff6b5 21466
2b2f5df9
NC
21467 if ((value & ~0x3fffff) && ((value & ~0x3fffff) != ~0x3fffff))
21468 {
21469 if (!(ARM_CPU_HAS_FEATURE (cpu_variant, arm_arch_t2)))
21470 as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
21471 else if ((value & ~0x1ffffff)
21472 && ((value & ~0x1ffffff) != ~0x1ffffff))
21473 as_bad_where (fixP->fx_file, fixP->fx_line,
21474 _("Thumb2 branch out of range"));
21475 }
4a42ebbc
RR
21476
21477 if (fixP->fx_done || !seg->use_rela_p)
21478 encode_thumb2_b_bl_offset (buf, value);
21479
c19d1205 21480 break;
404ff6b5 21481
c19d1205 21482 case BFD_RELOC_THUMB_PCREL_BRANCH25:
08f10d51
NC
21483 if ((value & ~0x0ffffff) && ((value & ~0x0ffffff) != ~0x0ffffff))
21484 as_bad_where (fixP->fx_file, fixP->fx_line, BAD_RANGE);
6c43fab6 21485
2fc8bdac 21486 if (fixP->fx_done || !seg->use_rela_p)
4a42ebbc 21487 encode_thumb2_b_bl_offset (buf, value);
6c43fab6 21488
2fc8bdac 21489 break;
a737bd4d 21490
2fc8bdac
ZW
21491 case BFD_RELOC_8:
21492 if (fixP->fx_done || !seg->use_rela_p)
21493 md_number_to_chars (buf, value, 1);
c19d1205 21494 break;
a737bd4d 21495
c19d1205 21496 case BFD_RELOC_16:
2fc8bdac 21497 if (fixP->fx_done || !seg->use_rela_p)
c19d1205 21498 md_number_to_chars (buf, value, 2);
c19d1205 21499 break;
a737bd4d 21500
c19d1205 21501#ifdef OBJ_ELF
0855e32b
NS
21502 case BFD_RELOC_ARM_TLS_CALL:
21503 case BFD_RELOC_ARM_THM_TLS_CALL:
21504 case BFD_RELOC_ARM_TLS_DESCSEQ:
21505 case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
21506 S_SET_THREAD_LOCAL (fixP->fx_addsy);
21507 break;
21508
21509 case BFD_RELOC_ARM_TLS_GOTDESC:
c19d1205
ZW
21510 case BFD_RELOC_ARM_TLS_GD32:
21511 case BFD_RELOC_ARM_TLS_LE32:
21512 case BFD_RELOC_ARM_TLS_IE32:
21513 case BFD_RELOC_ARM_TLS_LDM32:
21514 case BFD_RELOC_ARM_TLS_LDO32:
21515 S_SET_THREAD_LOCAL (fixP->fx_addsy);
21516 /* fall through */
6c43fab6 21517
c19d1205
ZW
21518 case BFD_RELOC_ARM_GOT32:
21519 case BFD_RELOC_ARM_GOTOFF:
2fc8bdac
ZW
21520 if (fixP->fx_done || !seg->use_rela_p)
21521 md_number_to_chars (buf, 0, 4);
c19d1205 21522 break;
b43420e6
NC
21523
21524 case BFD_RELOC_ARM_GOT_PREL:
21525 if (fixP->fx_done || !seg->use_rela_p)
21526 md_number_to_chars (buf, value, 4);
21527 break;
21528
9a6f4e97
NS
21529 case BFD_RELOC_ARM_TARGET2:
21530 /* TARGET2 is not partial-inplace, so we need to write the
21531 addend here for REL targets, because it won't be written out
21532 during reloc processing later. */
21533 if (fixP->fx_done || !seg->use_rela_p)
21534 md_number_to_chars (buf, fixP->fx_offset, 4);
21535 break;
c19d1205 21536#endif
6c43fab6 21537
c19d1205
ZW
21538 case BFD_RELOC_RVA:
21539 case BFD_RELOC_32:
21540 case BFD_RELOC_ARM_TARGET1:
21541 case BFD_RELOC_ARM_ROSEGREL32:
21542 case BFD_RELOC_ARM_SBREL32:
21543 case BFD_RELOC_32_PCREL:
f0927246
NC
21544#ifdef TE_PE
21545 case BFD_RELOC_32_SECREL:
21546#endif
2fc8bdac 21547 if (fixP->fx_done || !seg->use_rela_p)
53baae48
NC
21548#ifdef TE_WINCE
21549 /* For WinCE we only do this for pcrel fixups. */
21550 if (fixP->fx_done || fixP->fx_pcrel)
21551#endif
21552 md_number_to_chars (buf, value, 4);
c19d1205 21553 break;
6c43fab6 21554
c19d1205
ZW
21555#ifdef OBJ_ELF
21556 case BFD_RELOC_ARM_PREL31:
2fc8bdac 21557 if (fixP->fx_done || !seg->use_rela_p)
c19d1205
ZW
21558 {
21559 newval = md_chars_to_number (buf, 4) & 0x80000000;
21560 if ((value ^ (value >> 1)) & 0x40000000)
21561 {
21562 as_bad_where (fixP->fx_file, fixP->fx_line,
21563 _("rel31 relocation overflow"));
21564 }
21565 newval |= value & 0x7fffffff;
21566 md_number_to_chars (buf, newval, 4);
21567 }
21568 break;
c19d1205 21569#endif
a737bd4d 21570
c19d1205 21571 case BFD_RELOC_ARM_CP_OFF_IMM:
8f06b2d8 21572 case BFD_RELOC_ARM_T32_CP_OFF_IMM:
c19d1205
ZW
21573 if (value < -1023 || value > 1023 || (value & 3))
21574 as_bad_where (fixP->fx_file, fixP->fx_line,
21575 _("co-processor offset out of range"));
21576 cp_off_common:
26d97720 21577 sign = value > 0;
c19d1205
ZW
21578 if (value < 0)
21579 value = -value;
8f06b2d8
PB
21580 if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
21581 || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
21582 newval = md_chars_to_number (buf, INSN_SIZE);
21583 else
21584 newval = get_thumb32_insn (buf);
26d97720
NS
21585 if (value == 0)
21586 newval &= 0xffffff00;
21587 else
21588 {
21589 newval &= 0xff7fff00;
21590 newval |= (value >> 2) | (sign ? INDEX_UP : 0);
21591 }
8f06b2d8
PB
21592 if (fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
21593 || fixP->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2)
21594 md_number_to_chars (buf, newval, INSN_SIZE);
21595 else
21596 put_thumb32_insn (buf, newval);
c19d1205 21597 break;
a737bd4d 21598
c19d1205 21599 case BFD_RELOC_ARM_CP_OFF_IMM_S2:
8f06b2d8 21600 case BFD_RELOC_ARM_T32_CP_OFF_IMM_S2:
c19d1205
ZW
21601 if (value < -255 || value > 255)
21602 as_bad_where (fixP->fx_file, fixP->fx_line,
21603 _("co-processor offset out of range"));
df7849c5 21604 value *= 4;
c19d1205 21605 goto cp_off_common;
6c43fab6 21606
c19d1205
ZW
21607 case BFD_RELOC_ARM_THUMB_OFFSET:
21608 newval = md_chars_to_number (buf, THUMB_SIZE);
21609 /* Exactly what ranges, and where the offset is inserted depends
21610 on the type of instruction, we can establish this from the
21611 top 4 bits. */
21612 switch (newval >> 12)
21613 {
21614 case 4: /* PC load. */
21615 /* Thumb PC loads are somewhat odd, bit 1 of the PC is
21616 forced to zero for these loads; md_pcrel_from has already
21617 compensated for this. */
21618 if (value & 3)
21619 as_bad_where (fixP->fx_file, fixP->fx_line,
21620 _("invalid offset, target not word aligned (0x%08lX)"),
0359e808
NC
21621 (((unsigned long) fixP->fx_frag->fr_address
21622 + (unsigned long) fixP->fx_where) & ~3)
21623 + (unsigned long) value);
a737bd4d 21624
c19d1205
ZW
21625 if (value & ~0x3fc)
21626 as_bad_where (fixP->fx_file, fixP->fx_line,
21627 _("invalid offset, value too big (0x%08lX)"),
21628 (long) value);
a737bd4d 21629
c19d1205
ZW
21630 newval |= value >> 2;
21631 break;
a737bd4d 21632
c19d1205
ZW
21633 case 9: /* SP load/store. */
21634 if (value & ~0x3fc)
21635 as_bad_where (fixP->fx_file, fixP->fx_line,
21636 _("invalid offset, value too big (0x%08lX)"),
21637 (long) value);
21638 newval |= value >> 2;
21639 break;
6c43fab6 21640
c19d1205
ZW
21641 case 6: /* Word load/store. */
21642 if (value & ~0x7c)
21643 as_bad_where (fixP->fx_file, fixP->fx_line,
21644 _("invalid offset, value too big (0x%08lX)"),
21645 (long) value);
21646 newval |= value << 4; /* 6 - 2. */
21647 break;
a737bd4d 21648
c19d1205
ZW
21649 case 7: /* Byte load/store. */
21650 if (value & ~0x1f)
21651 as_bad_where (fixP->fx_file, fixP->fx_line,
21652 _("invalid offset, value too big (0x%08lX)"),
21653 (long) value);
21654 newval |= value << 6;
21655 break;
a737bd4d 21656
c19d1205
ZW
21657 case 8: /* Halfword load/store. */
21658 if (value & ~0x3e)
21659 as_bad_where (fixP->fx_file, fixP->fx_line,
21660 _("invalid offset, value too big (0x%08lX)"),
21661 (long) value);
21662 newval |= value << 5; /* 6 - 1. */
21663 break;
a737bd4d 21664
c19d1205
ZW
21665 default:
21666 as_bad_where (fixP->fx_file, fixP->fx_line,
21667 "Unable to process relocation for thumb opcode: %lx",
21668 (unsigned long) newval);
21669 break;
21670 }
21671 md_number_to_chars (buf, newval, THUMB_SIZE);
21672 break;
a737bd4d 21673
c19d1205
ZW
21674 case BFD_RELOC_ARM_THUMB_ADD:
21675 /* This is a complicated relocation, since we use it for all of
21676 the following immediate relocations:
a737bd4d 21677
c19d1205
ZW
21678 3bit ADD/SUB
21679 8bit ADD/SUB
21680 9bit ADD/SUB SP word-aligned
21681 10bit ADD PC/SP word-aligned
a737bd4d 21682
c19d1205
ZW
21683 The type of instruction being processed is encoded in the
21684 instruction field:
a737bd4d 21685
c19d1205
ZW
21686 0x8000 SUB
21687 0x00F0 Rd
21688 0x000F Rs
21689 */
21690 newval = md_chars_to_number (buf, THUMB_SIZE);
21691 {
21692 int rd = (newval >> 4) & 0xf;
21693 int rs = newval & 0xf;
21694 int subtract = !!(newval & 0x8000);
a737bd4d 21695
c19d1205
ZW
21696 /* Check for HI regs, only very restricted cases allowed:
21697 Adjusting SP, and using PC or SP to get an address. */
21698 if ((rd > 7 && (rd != REG_SP || rs != REG_SP))
21699 || (rs > 7 && rs != REG_SP && rs != REG_PC))
21700 as_bad_where (fixP->fx_file, fixP->fx_line,
21701 _("invalid Hi register with immediate"));
a737bd4d 21702
c19d1205
ZW
21703 /* If value is negative, choose the opposite instruction. */
21704 if (value < 0)
21705 {
21706 value = -value;
21707 subtract = !subtract;
21708 if (value < 0)
21709 as_bad_where (fixP->fx_file, fixP->fx_line,
21710 _("immediate value out of range"));
21711 }
a737bd4d 21712
c19d1205
ZW
21713 if (rd == REG_SP)
21714 {
21715 if (value & ~0x1fc)
21716 as_bad_where (fixP->fx_file, fixP->fx_line,
21717 _("invalid immediate for stack address calculation"));
21718 newval = subtract ? T_OPCODE_SUB_ST : T_OPCODE_ADD_ST;
21719 newval |= value >> 2;
21720 }
21721 else if (rs == REG_PC || rs == REG_SP)
21722 {
21723 if (subtract || value & ~0x3fc)
21724 as_bad_where (fixP->fx_file, fixP->fx_line,
21725 _("invalid immediate for address calculation (value = 0x%08lX)"),
21726 (unsigned long) value);
21727 newval = (rs == REG_PC ? T_OPCODE_ADD_PC : T_OPCODE_ADD_SP);
21728 newval |= rd << 8;
21729 newval |= value >> 2;
21730 }
21731 else if (rs == rd)
21732 {
21733 if (value & ~0xff)
21734 as_bad_where (fixP->fx_file, fixP->fx_line,
21735 _("immediate value out of range"));
21736 newval = subtract ? T_OPCODE_SUB_I8 : T_OPCODE_ADD_I8;
21737 newval |= (rd << 8) | value;
21738 }
21739 else
21740 {
21741 if (value & ~0x7)
21742 as_bad_where (fixP->fx_file, fixP->fx_line,
21743 _("immediate value out of range"));
21744 newval = subtract ? T_OPCODE_SUB_I3 : T_OPCODE_ADD_I3;
21745 newval |= rd | (rs << 3) | (value << 6);
21746 }
21747 }
21748 md_number_to_chars (buf, newval, THUMB_SIZE);
21749 break;
a737bd4d 21750
c19d1205
ZW
21751 case BFD_RELOC_ARM_THUMB_IMM:
21752 newval = md_chars_to_number (buf, THUMB_SIZE);
21753 if (value < 0 || value > 255)
21754 as_bad_where (fixP->fx_file, fixP->fx_line,
4e6e072b 21755 _("invalid immediate: %ld is out of range"),
c19d1205
ZW
21756 (long) value);
21757 newval |= value;
21758 md_number_to_chars (buf, newval, THUMB_SIZE);
21759 break;
a737bd4d 21760
c19d1205
ZW
21761 case BFD_RELOC_ARM_THUMB_SHIFT:
21762 /* 5bit shift value (0..32). LSL cannot take 32. */
21763 newval = md_chars_to_number (buf, THUMB_SIZE) & 0xf83f;
21764 temp = newval & 0xf800;
21765 if (value < 0 || value > 32 || (value == 32 && temp == T_OPCODE_LSL_I))
21766 as_bad_where (fixP->fx_file, fixP->fx_line,
21767 _("invalid shift value: %ld"), (long) value);
21768 /* Shifts of zero must be encoded as LSL. */
21769 if (value == 0)
21770 newval = (newval & 0x003f) | T_OPCODE_LSL_I;
21771 /* Shifts of 32 are encoded as zero. */
21772 else if (value == 32)
21773 value = 0;
21774 newval |= value << 6;
21775 md_number_to_chars (buf, newval, THUMB_SIZE);
21776 break;
a737bd4d 21777
c19d1205
ZW
21778 case BFD_RELOC_VTABLE_INHERIT:
21779 case BFD_RELOC_VTABLE_ENTRY:
21780 fixP->fx_done = 0;
21781 return;
6c43fab6 21782
b6895b4f
PB
21783 case BFD_RELOC_ARM_MOVW:
21784 case BFD_RELOC_ARM_MOVT:
21785 case BFD_RELOC_ARM_THUMB_MOVW:
21786 case BFD_RELOC_ARM_THUMB_MOVT:
21787 if (fixP->fx_done || !seg->use_rela_p)
21788 {
21789 /* REL format relocations are limited to a 16-bit addend. */
21790 if (!fixP->fx_done)
21791 {
39623e12 21792 if (value < -0x8000 || value > 0x7fff)
b6895b4f 21793 as_bad_where (fixP->fx_file, fixP->fx_line,
ff5075ca 21794 _("offset out of range"));
b6895b4f
PB
21795 }
21796 else if (fixP->fx_r_type == BFD_RELOC_ARM_MOVT
21797 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
21798 {
21799 value >>= 16;
21800 }
21801
21802 if (fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
21803 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT)
21804 {
21805 newval = get_thumb32_insn (buf);
21806 newval &= 0xfbf08f00;
21807 newval |= (value & 0xf000) << 4;
21808 newval |= (value & 0x0800) << 15;
21809 newval |= (value & 0x0700) << 4;
21810 newval |= (value & 0x00ff);
21811 put_thumb32_insn (buf, newval);
21812 }
21813 else
21814 {
21815 newval = md_chars_to_number (buf, 4);
21816 newval &= 0xfff0f000;
21817 newval |= value & 0x0fff;
21818 newval |= (value & 0xf000) << 4;
21819 md_number_to_chars (buf, newval, 4);
21820 }
21821 }
21822 return;
21823
4962c51a
MS
21824 case BFD_RELOC_ARM_ALU_PC_G0_NC:
21825 case BFD_RELOC_ARM_ALU_PC_G0:
21826 case BFD_RELOC_ARM_ALU_PC_G1_NC:
21827 case BFD_RELOC_ARM_ALU_PC_G1:
21828 case BFD_RELOC_ARM_ALU_PC_G2:
21829 case BFD_RELOC_ARM_ALU_SB_G0_NC:
21830 case BFD_RELOC_ARM_ALU_SB_G0:
21831 case BFD_RELOC_ARM_ALU_SB_G1_NC:
21832 case BFD_RELOC_ARM_ALU_SB_G1:
21833 case BFD_RELOC_ARM_ALU_SB_G2:
9c2799c2 21834 gas_assert (!fixP->fx_done);
4962c51a
MS
21835 if (!seg->use_rela_p)
21836 {
21837 bfd_vma insn;
21838 bfd_vma encoded_addend;
21839 bfd_vma addend_abs = abs (value);
21840
21841 /* Check that the absolute value of the addend can be
21842 expressed as an 8-bit constant plus a rotation. */
21843 encoded_addend = encode_arm_immediate (addend_abs);
21844 if (encoded_addend == (unsigned int) FAIL)
21845 as_bad_where (fixP->fx_file, fixP->fx_line,
21846 _("the offset 0x%08lX is not representable"),
495bde8e 21847 (unsigned long) addend_abs);
4962c51a
MS
21848
21849 /* Extract the instruction. */
21850 insn = md_chars_to_number (buf, INSN_SIZE);
21851
21852 /* If the addend is positive, use an ADD instruction.
21853 Otherwise use a SUB. Take care not to destroy the S bit. */
21854 insn &= 0xff1fffff;
21855 if (value < 0)
21856 insn |= 1 << 22;
21857 else
21858 insn |= 1 << 23;
21859
21860 /* Place the encoded addend into the first 12 bits of the
21861 instruction. */
21862 insn &= 0xfffff000;
21863 insn |= encoded_addend;
5f4273c7
NC
21864
21865 /* Update the instruction. */
4962c51a
MS
21866 md_number_to_chars (buf, insn, INSN_SIZE);
21867 }
21868 break;
21869
21870 case BFD_RELOC_ARM_LDR_PC_G0:
21871 case BFD_RELOC_ARM_LDR_PC_G1:
21872 case BFD_RELOC_ARM_LDR_PC_G2:
21873 case BFD_RELOC_ARM_LDR_SB_G0:
21874 case BFD_RELOC_ARM_LDR_SB_G1:
21875 case BFD_RELOC_ARM_LDR_SB_G2:
9c2799c2 21876 gas_assert (!fixP->fx_done);
4962c51a
MS
21877 if (!seg->use_rela_p)
21878 {
21879 bfd_vma insn;
21880 bfd_vma addend_abs = abs (value);
21881
21882 /* Check that the absolute value of the addend can be
21883 encoded in 12 bits. */
21884 if (addend_abs >= 0x1000)
21885 as_bad_where (fixP->fx_file, fixP->fx_line,
21886 _("bad offset 0x%08lX (only 12 bits available for the magnitude)"),
495bde8e 21887 (unsigned long) addend_abs);
4962c51a
MS
21888
21889 /* Extract the instruction. */
21890 insn = md_chars_to_number (buf, INSN_SIZE);
21891
21892 /* If the addend is negative, clear bit 23 of the instruction.
21893 Otherwise set it. */
21894 if (value < 0)
21895 insn &= ~(1 << 23);
21896 else
21897 insn |= 1 << 23;
21898
21899 /* Place the absolute value of the addend into the first 12 bits
21900 of the instruction. */
21901 insn &= 0xfffff000;
21902 insn |= addend_abs;
5f4273c7
NC
21903
21904 /* Update the instruction. */
4962c51a
MS
21905 md_number_to_chars (buf, insn, INSN_SIZE);
21906 }
21907 break;
21908
21909 case BFD_RELOC_ARM_LDRS_PC_G0:
21910 case BFD_RELOC_ARM_LDRS_PC_G1:
21911 case BFD_RELOC_ARM_LDRS_PC_G2:
21912 case BFD_RELOC_ARM_LDRS_SB_G0:
21913 case BFD_RELOC_ARM_LDRS_SB_G1:
21914 case BFD_RELOC_ARM_LDRS_SB_G2:
9c2799c2 21915 gas_assert (!fixP->fx_done);
4962c51a
MS
21916 if (!seg->use_rela_p)
21917 {
21918 bfd_vma insn;
21919 bfd_vma addend_abs = abs (value);
21920
21921 /* Check that the absolute value of the addend can be
21922 encoded in 8 bits. */
21923 if (addend_abs >= 0x100)
21924 as_bad_where (fixP->fx_file, fixP->fx_line,
21925 _("bad offset 0x%08lX (only 8 bits available for the magnitude)"),
495bde8e 21926 (unsigned long) addend_abs);
4962c51a
MS
21927
21928 /* Extract the instruction. */
21929 insn = md_chars_to_number (buf, INSN_SIZE);
21930
21931 /* If the addend is negative, clear bit 23 of the instruction.
21932 Otherwise set it. */
21933 if (value < 0)
21934 insn &= ~(1 << 23);
21935 else
21936 insn |= 1 << 23;
21937
21938 /* Place the first four bits of the absolute value of the addend
21939 into the first 4 bits of the instruction, and the remaining
21940 four into bits 8 .. 11. */
21941 insn &= 0xfffff0f0;
21942 insn |= (addend_abs & 0xf) | ((addend_abs & 0xf0) << 4);
5f4273c7
NC
21943
21944 /* Update the instruction. */
4962c51a
MS
21945 md_number_to_chars (buf, insn, INSN_SIZE);
21946 }
21947 break;
21948
21949 case BFD_RELOC_ARM_LDC_PC_G0:
21950 case BFD_RELOC_ARM_LDC_PC_G1:
21951 case BFD_RELOC_ARM_LDC_PC_G2:
21952 case BFD_RELOC_ARM_LDC_SB_G0:
21953 case BFD_RELOC_ARM_LDC_SB_G1:
21954 case BFD_RELOC_ARM_LDC_SB_G2:
9c2799c2 21955 gas_assert (!fixP->fx_done);
4962c51a
MS
21956 if (!seg->use_rela_p)
21957 {
21958 bfd_vma insn;
21959 bfd_vma addend_abs = abs (value);
21960
21961 /* Check that the absolute value of the addend is a multiple of
21962 four and, when divided by four, fits in 8 bits. */
21963 if (addend_abs & 0x3)
21964 as_bad_where (fixP->fx_file, fixP->fx_line,
21965 _("bad offset 0x%08lX (must be word-aligned)"),
495bde8e 21966 (unsigned long) addend_abs);
4962c51a
MS
21967
21968 if ((addend_abs >> 2) > 0xff)
21969 as_bad_where (fixP->fx_file, fixP->fx_line,
21970 _("bad offset 0x%08lX (must be an 8-bit number of words)"),
495bde8e 21971 (unsigned long) addend_abs);
4962c51a
MS
21972
21973 /* Extract the instruction. */
21974 insn = md_chars_to_number (buf, INSN_SIZE);
21975
21976 /* If the addend is negative, clear bit 23 of the instruction.
21977 Otherwise set it. */
21978 if (value < 0)
21979 insn &= ~(1 << 23);
21980 else
21981 insn |= 1 << 23;
21982
21983 /* Place the addend (divided by four) into the first eight
21984 bits of the instruction. */
21985 insn &= 0xfffffff0;
21986 insn |= addend_abs >> 2;
5f4273c7
NC
21987
21988 /* Update the instruction. */
4962c51a
MS
21989 md_number_to_chars (buf, insn, INSN_SIZE);
21990 }
21991 break;
21992
845b51d6
PB
21993 case BFD_RELOC_ARM_V4BX:
21994 /* This will need to go in the object file. */
21995 fixP->fx_done = 0;
21996 break;
21997
c19d1205
ZW
21998 case BFD_RELOC_UNUSED:
21999 default:
22000 as_bad_where (fixP->fx_file, fixP->fx_line,
22001 _("bad relocation fixup type (%d)"), fixP->fx_r_type);
22002 }
6c43fab6
RE
22003}
22004
c19d1205
ZW
22005/* Translate internal representation of relocation info to BFD target
22006 format. */
a737bd4d 22007
c19d1205 22008arelent *
00a97672 22009tc_gen_reloc (asection *section, fixS *fixp)
a737bd4d 22010{
c19d1205
ZW
22011 arelent * reloc;
22012 bfd_reloc_code_real_type code;
a737bd4d 22013
21d799b5 22014 reloc = (arelent *) xmalloc (sizeof (arelent));
a737bd4d 22015
21d799b5 22016 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
c19d1205
ZW
22017 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
22018 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
a737bd4d 22019
2fc8bdac 22020 if (fixp->fx_pcrel)
00a97672
RS
22021 {
22022 if (section->use_rela_p)
22023 fixp->fx_offset -= md_pcrel_from_section (fixp, section);
22024 else
22025 fixp->fx_offset = reloc->address;
22026 }
c19d1205 22027 reloc->addend = fixp->fx_offset;
a737bd4d 22028
c19d1205 22029 switch (fixp->fx_r_type)
a737bd4d 22030 {
c19d1205
ZW
22031 case BFD_RELOC_8:
22032 if (fixp->fx_pcrel)
22033 {
22034 code = BFD_RELOC_8_PCREL;
22035 break;
22036 }
a737bd4d 22037
c19d1205
ZW
22038 case BFD_RELOC_16:
22039 if (fixp->fx_pcrel)
22040 {
22041 code = BFD_RELOC_16_PCREL;
22042 break;
22043 }
6c43fab6 22044
c19d1205
ZW
22045 case BFD_RELOC_32:
22046 if (fixp->fx_pcrel)
22047 {
22048 code = BFD_RELOC_32_PCREL;
22049 break;
22050 }
a737bd4d 22051
b6895b4f
PB
22052 case BFD_RELOC_ARM_MOVW:
22053 if (fixp->fx_pcrel)
22054 {
22055 code = BFD_RELOC_ARM_MOVW_PCREL;
22056 break;
22057 }
22058
22059 case BFD_RELOC_ARM_MOVT:
22060 if (fixp->fx_pcrel)
22061 {
22062 code = BFD_RELOC_ARM_MOVT_PCREL;
22063 break;
22064 }
22065
22066 case BFD_RELOC_ARM_THUMB_MOVW:
22067 if (fixp->fx_pcrel)
22068 {
22069 code = BFD_RELOC_ARM_THUMB_MOVW_PCREL;
22070 break;
22071 }
22072
22073 case BFD_RELOC_ARM_THUMB_MOVT:
22074 if (fixp->fx_pcrel)
22075 {
22076 code = BFD_RELOC_ARM_THUMB_MOVT_PCREL;
22077 break;
22078 }
22079
c19d1205
ZW
22080 case BFD_RELOC_NONE:
22081 case BFD_RELOC_ARM_PCREL_BRANCH:
22082 case BFD_RELOC_ARM_PCREL_BLX:
22083 case BFD_RELOC_RVA:
22084 case BFD_RELOC_THUMB_PCREL_BRANCH7:
22085 case BFD_RELOC_THUMB_PCREL_BRANCH9:
22086 case BFD_RELOC_THUMB_PCREL_BRANCH12:
22087 case BFD_RELOC_THUMB_PCREL_BRANCH20:
22088 case BFD_RELOC_THUMB_PCREL_BRANCH23:
22089 case BFD_RELOC_THUMB_PCREL_BRANCH25:
c19d1205
ZW
22090 case BFD_RELOC_VTABLE_ENTRY:
22091 case BFD_RELOC_VTABLE_INHERIT:
f0927246
NC
22092#ifdef TE_PE
22093 case BFD_RELOC_32_SECREL:
22094#endif
c19d1205
ZW
22095 code = fixp->fx_r_type;
22096 break;
a737bd4d 22097
00adf2d4
JB
22098 case BFD_RELOC_THUMB_PCREL_BLX:
22099#ifdef OBJ_ELF
22100 if (EF_ARM_EABI_VERSION (meabi_flags) >= EF_ARM_EABI_VER4)
22101 code = BFD_RELOC_THUMB_PCREL_BRANCH23;
22102 else
22103#endif
22104 code = BFD_RELOC_THUMB_PCREL_BLX;
22105 break;
22106
c19d1205
ZW
22107 case BFD_RELOC_ARM_LITERAL:
22108 case BFD_RELOC_ARM_HWLITERAL:
22109 /* If this is called then the a literal has
22110 been referenced across a section boundary. */
22111 as_bad_where (fixp->fx_file, fixp->fx_line,
22112 _("literal referenced across section boundary"));
22113 return NULL;
a737bd4d 22114
c19d1205 22115#ifdef OBJ_ELF
0855e32b
NS
22116 case BFD_RELOC_ARM_TLS_CALL:
22117 case BFD_RELOC_ARM_THM_TLS_CALL:
22118 case BFD_RELOC_ARM_TLS_DESCSEQ:
22119 case BFD_RELOC_ARM_THM_TLS_DESCSEQ:
c19d1205
ZW
22120 case BFD_RELOC_ARM_GOT32:
22121 case BFD_RELOC_ARM_GOTOFF:
b43420e6 22122 case BFD_RELOC_ARM_GOT_PREL:
c19d1205
ZW
22123 case BFD_RELOC_ARM_PLT32:
22124 case BFD_RELOC_ARM_TARGET1:
22125 case BFD_RELOC_ARM_ROSEGREL32:
22126 case BFD_RELOC_ARM_SBREL32:
22127 case BFD_RELOC_ARM_PREL31:
22128 case BFD_RELOC_ARM_TARGET2:
22129 case BFD_RELOC_ARM_TLS_LE32:
22130 case BFD_RELOC_ARM_TLS_LDO32:
39b41c9c
PB
22131 case BFD_RELOC_ARM_PCREL_CALL:
22132 case BFD_RELOC_ARM_PCREL_JUMP:
4962c51a
MS
22133 case BFD_RELOC_ARM_ALU_PC_G0_NC:
22134 case BFD_RELOC_ARM_ALU_PC_G0:
22135 case BFD_RELOC_ARM_ALU_PC_G1_NC:
22136 case BFD_RELOC_ARM_ALU_PC_G1:
22137 case BFD_RELOC_ARM_ALU_PC_G2:
22138 case BFD_RELOC_ARM_LDR_PC_G0:
22139 case BFD_RELOC_ARM_LDR_PC_G1:
22140 case BFD_RELOC_ARM_LDR_PC_G2:
22141 case BFD_RELOC_ARM_LDRS_PC_G0:
22142 case BFD_RELOC_ARM_LDRS_PC_G1:
22143 case BFD_RELOC_ARM_LDRS_PC_G2:
22144 case BFD_RELOC_ARM_LDC_PC_G0:
22145 case BFD_RELOC_ARM_LDC_PC_G1:
22146 case BFD_RELOC_ARM_LDC_PC_G2:
22147 case BFD_RELOC_ARM_ALU_SB_G0_NC:
22148 case BFD_RELOC_ARM_ALU_SB_G0:
22149 case BFD_RELOC_ARM_ALU_SB_G1_NC:
22150 case BFD_RELOC_ARM_ALU_SB_G1:
22151 case BFD_RELOC_ARM_ALU_SB_G2:
22152 case BFD_RELOC_ARM_LDR_SB_G0:
22153 case BFD_RELOC_ARM_LDR_SB_G1:
22154 case BFD_RELOC_ARM_LDR_SB_G2:
22155 case BFD_RELOC_ARM_LDRS_SB_G0:
22156 case BFD_RELOC_ARM_LDRS_SB_G1:
22157 case BFD_RELOC_ARM_LDRS_SB_G2:
22158 case BFD_RELOC_ARM_LDC_SB_G0:
22159 case BFD_RELOC_ARM_LDC_SB_G1:
22160 case BFD_RELOC_ARM_LDC_SB_G2:
845b51d6 22161 case BFD_RELOC_ARM_V4BX:
c19d1205
ZW
22162 code = fixp->fx_r_type;
22163 break;
a737bd4d 22164
0855e32b 22165 case BFD_RELOC_ARM_TLS_GOTDESC:
c19d1205
ZW
22166 case BFD_RELOC_ARM_TLS_GD32:
22167 case BFD_RELOC_ARM_TLS_IE32:
22168 case BFD_RELOC_ARM_TLS_LDM32:
22169 /* BFD will include the symbol's address in the addend.
22170 But we don't want that, so subtract it out again here. */
22171 if (!S_IS_COMMON (fixp->fx_addsy))
22172 reloc->addend -= (*reloc->sym_ptr_ptr)->value;
22173 code = fixp->fx_r_type;
22174 break;
22175#endif
a737bd4d 22176
c19d1205
ZW
22177 case BFD_RELOC_ARM_IMMEDIATE:
22178 as_bad_where (fixp->fx_file, fixp->fx_line,
22179 _("internal relocation (type: IMMEDIATE) not fixed up"));
22180 return NULL;
a737bd4d 22181
c19d1205
ZW
22182 case BFD_RELOC_ARM_ADRL_IMMEDIATE:
22183 as_bad_where (fixp->fx_file, fixp->fx_line,
22184 _("ADRL used for a symbol not defined in the same file"));
22185 return NULL;
a737bd4d 22186
c19d1205 22187 case BFD_RELOC_ARM_OFFSET_IMM:
00a97672
RS
22188 if (section->use_rela_p)
22189 {
22190 code = fixp->fx_r_type;
22191 break;
22192 }
22193
c19d1205
ZW
22194 if (fixp->fx_addsy != NULL
22195 && !S_IS_DEFINED (fixp->fx_addsy)
22196 && S_IS_LOCAL (fixp->fx_addsy))
a737bd4d 22197 {
c19d1205
ZW
22198 as_bad_where (fixp->fx_file, fixp->fx_line,
22199 _("undefined local label `%s'"),
22200 S_GET_NAME (fixp->fx_addsy));
22201 return NULL;
a737bd4d
NC
22202 }
22203
c19d1205
ZW
22204 as_bad_where (fixp->fx_file, fixp->fx_line,
22205 _("internal_relocation (type: OFFSET_IMM) not fixed up"));
22206 return NULL;
a737bd4d 22207
c19d1205
ZW
22208 default:
22209 {
22210 char * type;
6c43fab6 22211
c19d1205
ZW
22212 switch (fixp->fx_r_type)
22213 {
22214 case BFD_RELOC_NONE: type = "NONE"; break;
22215 case BFD_RELOC_ARM_OFFSET_IMM8: type = "OFFSET_IMM8"; break;
22216 case BFD_RELOC_ARM_SHIFT_IMM: type = "SHIFT_IMM"; break;
3eb17e6b 22217 case BFD_RELOC_ARM_SMC: type = "SMC"; break;
c19d1205
ZW
22218 case BFD_RELOC_ARM_SWI: type = "SWI"; break;
22219 case BFD_RELOC_ARM_MULTI: type = "MULTI"; break;
22220 case BFD_RELOC_ARM_CP_OFF_IMM: type = "CP_OFF_IMM"; break;
db187cb9 22221 case BFD_RELOC_ARM_T32_OFFSET_IMM: type = "T32_OFFSET_IMM"; break;
8f06b2d8 22222 case BFD_RELOC_ARM_T32_CP_OFF_IMM: type = "T32_CP_OFF_IMM"; break;
c19d1205
ZW
22223 case BFD_RELOC_ARM_THUMB_ADD: type = "THUMB_ADD"; break;
22224 case BFD_RELOC_ARM_THUMB_SHIFT: type = "THUMB_SHIFT"; break;
22225 case BFD_RELOC_ARM_THUMB_IMM: type = "THUMB_IMM"; break;
22226 case BFD_RELOC_ARM_THUMB_OFFSET: type = "THUMB_OFFSET"; break;
22227 default: type = _("<unknown>"); break;
22228 }
22229 as_bad_where (fixp->fx_file, fixp->fx_line,
22230 _("cannot represent %s relocation in this object file format"),
22231 type);
22232 return NULL;
22233 }
a737bd4d 22234 }
6c43fab6 22235
c19d1205
ZW
22236#ifdef OBJ_ELF
22237 if ((code == BFD_RELOC_32_PCREL || code == BFD_RELOC_32)
22238 && GOT_symbol
22239 && fixp->fx_addsy == GOT_symbol)
22240 {
22241 code = BFD_RELOC_ARM_GOTPC;
22242 reloc->addend = fixp->fx_offset = reloc->address;
22243 }
22244#endif
6c43fab6 22245
c19d1205 22246 reloc->howto = bfd_reloc_type_lookup (stdoutput, code);
6c43fab6 22247
c19d1205
ZW
22248 if (reloc->howto == NULL)
22249 {
22250 as_bad_where (fixp->fx_file, fixp->fx_line,
22251 _("cannot represent %s relocation in this object file format"),
22252 bfd_get_reloc_code_name (code));
22253 return NULL;
22254 }
6c43fab6 22255
c19d1205
ZW
22256 /* HACK: Since arm ELF uses Rel instead of Rela, encode the
22257 vtable entry to be used in the relocation's section offset. */
22258 if (fixp->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
22259 reloc->address = fixp->fx_offset;
6c43fab6 22260
c19d1205 22261 return reloc;
6c43fab6
RE
22262}
22263
c19d1205 22264/* This fix_new is called by cons via TC_CONS_FIX_NEW. */
6c43fab6 22265
c19d1205
ZW
22266void
22267cons_fix_new_arm (fragS * frag,
22268 int where,
22269 int size,
22270 expressionS * exp)
6c43fab6 22271{
c19d1205
ZW
22272 bfd_reloc_code_real_type type;
22273 int pcrel = 0;
6c43fab6 22274
c19d1205
ZW
22275 /* Pick a reloc.
22276 FIXME: @@ Should look at CPU word size. */
22277 switch (size)
22278 {
22279 case 1:
22280 type = BFD_RELOC_8;
22281 break;
22282 case 2:
22283 type = BFD_RELOC_16;
22284 break;
22285 case 4:
22286 default:
22287 type = BFD_RELOC_32;
22288 break;
22289 case 8:
22290 type = BFD_RELOC_64;
22291 break;
22292 }
6c43fab6 22293
f0927246
NC
22294#ifdef TE_PE
22295 if (exp->X_op == O_secrel)
22296 {
22297 exp->X_op = O_symbol;
22298 type = BFD_RELOC_32_SECREL;
22299 }
22300#endif
22301
c19d1205
ZW
22302 fix_new_exp (frag, where, (int) size, exp, pcrel, type);
22303}
6c43fab6 22304
4343666d 22305#if defined (OBJ_COFF)
c19d1205
ZW
22306void
22307arm_validate_fix (fixS * fixP)
6c43fab6 22308{
c19d1205
ZW
22309 /* If the destination of the branch is a defined symbol which does not have
22310 the THUMB_FUNC attribute, then we must be calling a function which has
22311 the (interfacearm) attribute. We look for the Thumb entry point to that
22312 function and change the branch to refer to that function instead. */
22313 if (fixP->fx_r_type == BFD_RELOC_THUMB_PCREL_BRANCH23
22314 && fixP->fx_addsy != NULL
22315 && S_IS_DEFINED (fixP->fx_addsy)
22316 && ! THUMB_IS_FUNC (fixP->fx_addsy))
6c43fab6 22317 {
c19d1205 22318 fixP->fx_addsy = find_real_start (fixP->fx_addsy);
6c43fab6 22319 }
c19d1205
ZW
22320}
22321#endif
6c43fab6 22322
267bf995 22323
c19d1205
ZW
22324int
22325arm_force_relocation (struct fix * fixp)
22326{
22327#if defined (OBJ_COFF) && defined (TE_PE)
22328 if (fixp->fx_r_type == BFD_RELOC_RVA)
22329 return 1;
22330#endif
6c43fab6 22331
267bf995
RR
22332 /* In case we have a call or a branch to a function in ARM ISA mode from
22333 a thumb function or vice-versa force the relocation. These relocations
22334 are cleared off for some cores that might have blx and simple transformations
22335 are possible. */
22336
22337#ifdef OBJ_ELF
22338 switch (fixp->fx_r_type)
22339 {
22340 case BFD_RELOC_ARM_PCREL_JUMP:
22341 case BFD_RELOC_ARM_PCREL_CALL:
22342 case BFD_RELOC_THUMB_PCREL_BLX:
22343 if (THUMB_IS_FUNC (fixp->fx_addsy))
22344 return 1;
22345 break;
22346
22347 case BFD_RELOC_ARM_PCREL_BLX:
22348 case BFD_RELOC_THUMB_PCREL_BRANCH25:
22349 case BFD_RELOC_THUMB_PCREL_BRANCH20:
22350 case BFD_RELOC_THUMB_PCREL_BRANCH23:
22351 if (ARM_IS_FUNC (fixp->fx_addsy))
22352 return 1;
22353 break;
22354
22355 default:
22356 break;
22357 }
22358#endif
22359
b5884301
PB
22360 /* Resolve these relocations even if the symbol is extern or weak.
22361 Technically this is probably wrong due to symbol preemption.
22362 In practice these relocations do not have enough range to be useful
22363 at dynamic link time, and some code (e.g. in the Linux kernel)
22364 expects these references to be resolved. */
c19d1205
ZW
22365 if (fixp->fx_r_type == BFD_RELOC_ARM_IMMEDIATE
22366 || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM
b5884301 22367 || fixp->fx_r_type == BFD_RELOC_ARM_OFFSET_IMM8
0110f2b8 22368 || fixp->fx_r_type == BFD_RELOC_ARM_ADRL_IMMEDIATE
b5884301
PB
22369 || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM
22370 || fixp->fx_r_type == BFD_RELOC_ARM_CP_OFF_IMM_S2
22371 || fixp->fx_r_type == BFD_RELOC_ARM_THUMB_OFFSET
16805f35 22372 || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_IMM
0110f2b8
PB
22373 || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMMEDIATE
22374 || fixp->fx_r_type == BFD_RELOC_ARM_T32_IMM12
b5884301
PB
22375 || fixp->fx_r_type == BFD_RELOC_ARM_T32_OFFSET_IMM
22376 || fixp->fx_r_type == BFD_RELOC_ARM_T32_ADD_PC12
22377 || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM
22378 || fixp->fx_r_type == BFD_RELOC_ARM_T32_CP_OFF_IMM_S2)
c19d1205 22379 return 0;
a737bd4d 22380
4962c51a
MS
22381 /* Always leave these relocations for the linker. */
22382 if ((fixp->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
22383 && fixp->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
22384 || fixp->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
22385 return 1;
22386
f0291e4c
PB
22387 /* Always generate relocations against function symbols. */
22388 if (fixp->fx_r_type == BFD_RELOC_32
22389 && fixp->fx_addsy
22390 && (symbol_get_bfdsym (fixp->fx_addsy)->flags & BSF_FUNCTION))
22391 return 1;
22392
c19d1205 22393 return generic_force_reloc (fixp);
404ff6b5
AH
22394}
22395
0ffdc86c 22396#if defined (OBJ_ELF) || defined (OBJ_COFF)
e28387c3
PB
22397/* Relocations against function names must be left unadjusted,
22398 so that the linker can use this information to generate interworking
22399 stubs. The MIPS version of this function
c19d1205
ZW
22400 also prevents relocations that are mips-16 specific, but I do not
22401 know why it does this.
404ff6b5 22402
c19d1205
ZW
22403 FIXME:
22404 There is one other problem that ought to be addressed here, but
22405 which currently is not: Taking the address of a label (rather
22406 than a function) and then later jumping to that address. Such
22407 addresses also ought to have their bottom bit set (assuming that
22408 they reside in Thumb code), but at the moment they will not. */
404ff6b5 22409
c19d1205
ZW
22410bfd_boolean
22411arm_fix_adjustable (fixS * fixP)
404ff6b5 22412{
c19d1205
ZW
22413 if (fixP->fx_addsy == NULL)
22414 return 1;
404ff6b5 22415
e28387c3
PB
22416 /* Preserve relocations against symbols with function type. */
22417 if (symbol_get_bfdsym (fixP->fx_addsy)->flags & BSF_FUNCTION)
c921be7d 22418 return FALSE;
e28387c3 22419
c19d1205
ZW
22420 if (THUMB_IS_FUNC (fixP->fx_addsy)
22421 && fixP->fx_subsy == NULL)
c921be7d 22422 return FALSE;
a737bd4d 22423
c19d1205
ZW
22424 /* We need the symbol name for the VTABLE entries. */
22425 if ( fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
22426 || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
c921be7d 22427 return FALSE;
404ff6b5 22428
c19d1205
ZW
22429 /* Don't allow symbols to be discarded on GOT related relocs. */
22430 if (fixP->fx_r_type == BFD_RELOC_ARM_PLT32
22431 || fixP->fx_r_type == BFD_RELOC_ARM_GOT32
22432 || fixP->fx_r_type == BFD_RELOC_ARM_GOTOFF
22433 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GD32
22434 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LE32
22435 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_IE32
22436 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDM32
22437 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_LDO32
0855e32b
NS
22438 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_GOTDESC
22439 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_CALL
22440 || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_CALL
22441 || fixP->fx_r_type == BFD_RELOC_ARM_TLS_DESCSEQ
22442 || fixP->fx_r_type == BFD_RELOC_ARM_THM_TLS_DESCSEQ
c19d1205 22443 || fixP->fx_r_type == BFD_RELOC_ARM_TARGET2)
c921be7d 22444 return FALSE;
a737bd4d 22445
4962c51a
MS
22446 /* Similarly for group relocations. */
22447 if ((fixP->fx_r_type >= BFD_RELOC_ARM_ALU_PC_G0_NC
22448 && fixP->fx_r_type <= BFD_RELOC_ARM_LDC_SB_G2)
22449 || fixP->fx_r_type == BFD_RELOC_ARM_LDR_PC_G0)
c921be7d 22450 return FALSE;
4962c51a 22451
79947c54
CD
22452 /* MOVW/MOVT REL relocations have limited offsets, so keep the symbols. */
22453 if (fixP->fx_r_type == BFD_RELOC_ARM_MOVW
22454 || fixP->fx_r_type == BFD_RELOC_ARM_MOVT
22455 || fixP->fx_r_type == BFD_RELOC_ARM_MOVW_PCREL
22456 || fixP->fx_r_type == BFD_RELOC_ARM_MOVT_PCREL
22457 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW
22458 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT
22459 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVW_PCREL
22460 || fixP->fx_r_type == BFD_RELOC_ARM_THUMB_MOVT_PCREL)
c921be7d 22461 return FALSE;
79947c54 22462
c921be7d 22463 return TRUE;
a737bd4d 22464}
0ffdc86c
NC
22465#endif /* defined (OBJ_ELF) || defined (OBJ_COFF) */
22466
22467#ifdef OBJ_ELF
404ff6b5 22468
c19d1205
ZW
22469const char *
22470elf32_arm_target_format (void)
404ff6b5 22471{
c19d1205
ZW
22472#ifdef TE_SYMBIAN
22473 return (target_big_endian
22474 ? "elf32-bigarm-symbian"
22475 : "elf32-littlearm-symbian");
22476#elif defined (TE_VXWORKS)
22477 return (target_big_endian
22478 ? "elf32-bigarm-vxworks"
22479 : "elf32-littlearm-vxworks");
b38cadfb
NC
22480#elif defined (TE_NACL)
22481 return (target_big_endian
22482 ? "elf32-bigarm-nacl"
22483 : "elf32-littlearm-nacl");
c19d1205
ZW
22484#else
22485 if (target_big_endian)
22486 return "elf32-bigarm";
22487 else
22488 return "elf32-littlearm";
22489#endif
404ff6b5
AH
22490}
22491
c19d1205
ZW
22492void
22493armelf_frob_symbol (symbolS * symp,
22494 int * puntp)
404ff6b5 22495{
c19d1205
ZW
22496 elf_frob_symbol (symp, puntp);
22497}
22498#endif
404ff6b5 22499
c19d1205 22500/* MD interface: Finalization. */
a737bd4d 22501
c19d1205
ZW
22502void
22503arm_cleanup (void)
22504{
22505 literal_pool * pool;
a737bd4d 22506
e07e6e58
NC
22507 /* Ensure that all the IT blocks are properly closed. */
22508 check_it_blocks_finished ();
22509
c19d1205
ZW
22510 for (pool = list_of_pools; pool; pool = pool->next)
22511 {
5f4273c7 22512 /* Put it at the end of the relevant section. */
c19d1205
ZW
22513 subseg_set (pool->section, pool->sub_section);
22514#ifdef OBJ_ELF
22515 arm_elf_change_section ();
22516#endif
22517 s_ltorg (0);
22518 }
404ff6b5
AH
22519}
22520
cd000bff
DJ
22521#ifdef OBJ_ELF
22522/* Remove any excess mapping symbols generated for alignment frags in
22523 SEC. We may have created a mapping symbol before a zero byte
22524 alignment; remove it if there's a mapping symbol after the
22525 alignment. */
22526static void
22527check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
22528 void *dummy ATTRIBUTE_UNUSED)
22529{
22530 segment_info_type *seginfo = seg_info (sec);
22531 fragS *fragp;
22532
22533 if (seginfo == NULL || seginfo->frchainP == NULL)
22534 return;
22535
22536 for (fragp = seginfo->frchainP->frch_root;
22537 fragp != NULL;
22538 fragp = fragp->fr_next)
22539 {
22540 symbolS *sym = fragp->tc_frag_data.last_map;
22541 fragS *next = fragp->fr_next;
22542
22543 /* Variable-sized frags have been converted to fixed size by
22544 this point. But if this was variable-sized to start with,
22545 there will be a fixed-size frag after it. So don't handle
22546 next == NULL. */
22547 if (sym == NULL || next == NULL)
22548 continue;
22549
22550 if (S_GET_VALUE (sym) < next->fr_address)
22551 /* Not at the end of this frag. */
22552 continue;
22553 know (S_GET_VALUE (sym) == next->fr_address);
22554
22555 do
22556 {
22557 if (next->tc_frag_data.first_map != NULL)
22558 {
22559 /* Next frag starts with a mapping symbol. Discard this
22560 one. */
22561 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
22562 break;
22563 }
22564
22565 if (next->fr_next == NULL)
22566 {
22567 /* This mapping symbol is at the end of the section. Discard
22568 it. */
22569 know (next->fr_fix == 0 && next->fr_var == 0);
22570 symbol_remove (sym, &symbol_rootP, &symbol_lastP);
22571 break;
22572 }
22573
22574 /* As long as we have empty frags without any mapping symbols,
22575 keep looking. */
22576 /* If the next frag is non-empty and does not start with a
22577 mapping symbol, then this mapping symbol is required. */
22578 if (next->fr_address != next->fr_next->fr_address)
22579 break;
22580
22581 next = next->fr_next;
22582 }
22583 while (next != NULL);
22584 }
22585}
22586#endif
22587
c19d1205
ZW
22588/* Adjust the symbol table. This marks Thumb symbols as distinct from
22589 ARM ones. */
404ff6b5 22590
c19d1205
ZW
22591void
22592arm_adjust_symtab (void)
404ff6b5 22593{
c19d1205
ZW
22594#ifdef OBJ_COFF
22595 symbolS * sym;
404ff6b5 22596
c19d1205
ZW
22597 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
22598 {
22599 if (ARM_IS_THUMB (sym))
22600 {
22601 if (THUMB_IS_FUNC (sym))
22602 {
22603 /* Mark the symbol as a Thumb function. */
22604 if ( S_GET_STORAGE_CLASS (sym) == C_STAT
22605 || S_GET_STORAGE_CLASS (sym) == C_LABEL) /* This can happen! */
22606 S_SET_STORAGE_CLASS (sym, C_THUMBSTATFUNC);
404ff6b5 22607
c19d1205
ZW
22608 else if (S_GET_STORAGE_CLASS (sym) == C_EXT)
22609 S_SET_STORAGE_CLASS (sym, C_THUMBEXTFUNC);
22610 else
22611 as_bad (_("%s: unexpected function type: %d"),
22612 S_GET_NAME (sym), S_GET_STORAGE_CLASS (sym));
22613 }
22614 else switch (S_GET_STORAGE_CLASS (sym))
22615 {
22616 case C_EXT:
22617 S_SET_STORAGE_CLASS (sym, C_THUMBEXT);
22618 break;
22619 case C_STAT:
22620 S_SET_STORAGE_CLASS (sym, C_THUMBSTAT);
22621 break;
22622 case C_LABEL:
22623 S_SET_STORAGE_CLASS (sym, C_THUMBLABEL);
22624 break;
22625 default:
22626 /* Do nothing. */
22627 break;
22628 }
22629 }
a737bd4d 22630
c19d1205
ZW
22631 if (ARM_IS_INTERWORK (sym))
22632 coffsymbol (symbol_get_bfdsym (sym))->native->u.syment.n_flags = 0xFF;
404ff6b5 22633 }
c19d1205
ZW
22634#endif
22635#ifdef OBJ_ELF
22636 symbolS * sym;
22637 char bind;
404ff6b5 22638
c19d1205 22639 for (sym = symbol_rootP; sym != NULL; sym = symbol_next (sym))
404ff6b5 22640 {
c19d1205
ZW
22641 if (ARM_IS_THUMB (sym))
22642 {
22643 elf_symbol_type * elf_sym;
404ff6b5 22644
c19d1205
ZW
22645 elf_sym = elf_symbol (symbol_get_bfdsym (sym));
22646 bind = ELF_ST_BIND (elf_sym->internal_elf_sym.st_info);
404ff6b5 22647
b0796911
PB
22648 if (! bfd_is_arm_special_symbol_name (elf_sym->symbol.name,
22649 BFD_ARM_SPECIAL_SYM_TYPE_ANY))
c19d1205
ZW
22650 {
22651 /* If it's a .thumb_func, declare it as so,
22652 otherwise tag label as .code 16. */
22653 if (THUMB_IS_FUNC (sym))
35fc36a8
RS
22654 elf_sym->internal_elf_sym.st_target_internal
22655 = ST_BRANCH_TO_THUMB;
3ba67470 22656 else if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
c19d1205
ZW
22657 elf_sym->internal_elf_sym.st_info =
22658 ELF_ST_INFO (bind, STT_ARM_16BIT);
22659 }
22660 }
22661 }
cd000bff
DJ
22662
22663 /* Remove any overlapping mapping symbols generated by alignment frags. */
22664 bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
709001e9
MM
22665 /* Now do generic ELF adjustments. */
22666 elf_adjust_symtab ();
c19d1205 22667#endif
404ff6b5
AH
22668}
22669
c19d1205 22670/* MD interface: Initialization. */
404ff6b5 22671
a737bd4d 22672static void
c19d1205 22673set_constant_flonums (void)
a737bd4d 22674{
c19d1205 22675 int i;
404ff6b5 22676
c19d1205
ZW
22677 for (i = 0; i < NUM_FLOAT_VALS; i++)
22678 if (atof_ieee ((char *) fp_const[i], 'x', fp_values[i]) == NULL)
22679 abort ();
a737bd4d 22680}
404ff6b5 22681
3e9e4fcf
JB
22682/* Auto-select Thumb mode if it's the only available instruction set for the
22683 given architecture. */
22684
22685static void
22686autoselect_thumb_from_cpu_variant (void)
22687{
22688 if (!ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v1))
22689 opcode_select (16);
22690}
22691
c19d1205
ZW
22692void
22693md_begin (void)
a737bd4d 22694{
c19d1205
ZW
22695 unsigned mach;
22696 unsigned int i;
404ff6b5 22697
c19d1205
ZW
22698 if ( (arm_ops_hsh = hash_new ()) == NULL
22699 || (arm_cond_hsh = hash_new ()) == NULL
22700 || (arm_shift_hsh = hash_new ()) == NULL
22701 || (arm_psr_hsh = hash_new ()) == NULL
62b3e311 22702 || (arm_v7m_psr_hsh = hash_new ()) == NULL
c19d1205 22703 || (arm_reg_hsh = hash_new ()) == NULL
62b3e311
PB
22704 || (arm_reloc_hsh = hash_new ()) == NULL
22705 || (arm_barrier_opt_hsh = hash_new ()) == NULL)
c19d1205
ZW
22706 as_fatal (_("virtual memory exhausted"));
22707
22708 for (i = 0; i < sizeof (insns) / sizeof (struct asm_opcode); i++)
d3ce72d0 22709 hash_insert (arm_ops_hsh, insns[i].template_name, (void *) (insns + i));
c19d1205 22710 for (i = 0; i < sizeof (conds) / sizeof (struct asm_cond); i++)
d3ce72d0 22711 hash_insert (arm_cond_hsh, conds[i].template_name, (void *) (conds + i));
c19d1205 22712 for (i = 0; i < sizeof (shift_names) / sizeof (struct asm_shift_name); i++)
5a49b8ac 22713 hash_insert (arm_shift_hsh, shift_names[i].name, (void *) (shift_names + i));
c19d1205 22714 for (i = 0; i < sizeof (psrs) / sizeof (struct asm_psr); i++)
d3ce72d0 22715 hash_insert (arm_psr_hsh, psrs[i].template_name, (void *) (psrs + i));
62b3e311 22716 for (i = 0; i < sizeof (v7m_psrs) / sizeof (struct asm_psr); i++)
d3ce72d0
NC
22717 hash_insert (arm_v7m_psr_hsh, v7m_psrs[i].template_name,
22718 (void *) (v7m_psrs + i));
c19d1205 22719 for (i = 0; i < sizeof (reg_names) / sizeof (struct reg_entry); i++)
5a49b8ac 22720 hash_insert (arm_reg_hsh, reg_names[i].name, (void *) (reg_names + i));
62b3e311
PB
22721 for (i = 0;
22722 i < sizeof (barrier_opt_names) / sizeof (struct asm_barrier_opt);
22723 i++)
d3ce72d0 22724 hash_insert (arm_barrier_opt_hsh, barrier_opt_names[i].template_name,
5a49b8ac 22725 (void *) (barrier_opt_names + i));
c19d1205 22726#ifdef OBJ_ELF
3da1d841
NC
22727 for (i = 0; i < ARRAY_SIZE (reloc_names); i++)
22728 {
22729 struct reloc_entry * entry = reloc_names + i;
22730
22731 if (arm_is_eabi() && entry->reloc == BFD_RELOC_ARM_PLT32)
22732 /* This makes encode_branch() use the EABI versions of this relocation. */
22733 entry->reloc = BFD_RELOC_UNUSED;
22734
22735 hash_insert (arm_reloc_hsh, entry->name, (void *) entry);
22736 }
c19d1205
ZW
22737#endif
22738
22739 set_constant_flonums ();
404ff6b5 22740
c19d1205
ZW
22741 /* Set the cpu variant based on the command-line options. We prefer
22742 -mcpu= over -march= if both are set (as for GCC); and we prefer
22743 -mfpu= over any other way of setting the floating point unit.
22744 Use of legacy options with new options are faulted. */
e74cfd16 22745 if (legacy_cpu)
404ff6b5 22746 {
e74cfd16 22747 if (mcpu_cpu_opt || march_cpu_opt)
c19d1205
ZW
22748 as_bad (_("use of old and new-style options to set CPU type"));
22749
22750 mcpu_cpu_opt = legacy_cpu;
404ff6b5 22751 }
e74cfd16 22752 else if (!mcpu_cpu_opt)
c19d1205 22753 mcpu_cpu_opt = march_cpu_opt;
404ff6b5 22754
e74cfd16 22755 if (legacy_fpu)
c19d1205 22756 {
e74cfd16 22757 if (mfpu_opt)
c19d1205 22758 as_bad (_("use of old and new-style options to set FPU type"));
03b1477f
RE
22759
22760 mfpu_opt = legacy_fpu;
22761 }
e74cfd16 22762 else if (!mfpu_opt)
03b1477f 22763 {
45eb4c1b
NS
22764#if !(defined (EABI_DEFAULT) || defined (TE_LINUX) \
22765 || defined (TE_NetBSD) || defined (TE_VXWORKS))
39c2da32
RE
22766 /* Some environments specify a default FPU. If they don't, infer it
22767 from the processor. */
e74cfd16 22768 if (mcpu_fpu_opt)
03b1477f
RE
22769 mfpu_opt = mcpu_fpu_opt;
22770 else
22771 mfpu_opt = march_fpu_opt;
39c2da32 22772#else
e74cfd16 22773 mfpu_opt = &fpu_default;
39c2da32 22774#endif
03b1477f
RE
22775 }
22776
e74cfd16 22777 if (!mfpu_opt)
03b1477f 22778 {
493cb6ef 22779 if (mcpu_cpu_opt != NULL)
e74cfd16 22780 mfpu_opt = &fpu_default;
493cb6ef 22781 else if (mcpu_fpu_opt != NULL && ARM_CPU_HAS_FEATURE (*mcpu_fpu_opt, arm_ext_v5))
e74cfd16 22782 mfpu_opt = &fpu_arch_vfp_v2;
03b1477f 22783 else
e74cfd16 22784 mfpu_opt = &fpu_arch_fpa;
03b1477f
RE
22785 }
22786
ee065d83 22787#ifdef CPU_DEFAULT
e74cfd16 22788 if (!mcpu_cpu_opt)
ee065d83 22789 {
e74cfd16
PB
22790 mcpu_cpu_opt = &cpu_default;
22791 selected_cpu = cpu_default;
ee065d83 22792 }
e74cfd16
PB
22793#else
22794 if (mcpu_cpu_opt)
22795 selected_cpu = *mcpu_cpu_opt;
ee065d83 22796 else
e74cfd16 22797 mcpu_cpu_opt = &arm_arch_any;
ee065d83 22798#endif
03b1477f 22799
e74cfd16 22800 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
03b1477f 22801
3e9e4fcf
JB
22802 autoselect_thumb_from_cpu_variant ();
22803
e74cfd16 22804 arm_arch_used = thumb_arch_used = arm_arch_none;
ee065d83 22805
f17c130b 22806#if defined OBJ_COFF || defined OBJ_ELF
b99bd4ef 22807 {
7cc69913
NC
22808 unsigned int flags = 0;
22809
22810#if defined OBJ_ELF
22811 flags = meabi_flags;
d507cf36
PB
22812
22813 switch (meabi_flags)
33a392fb 22814 {
d507cf36 22815 case EF_ARM_EABI_UNKNOWN:
7cc69913 22816#endif
d507cf36
PB
22817 /* Set the flags in the private structure. */
22818 if (uses_apcs_26) flags |= F_APCS26;
22819 if (support_interwork) flags |= F_INTERWORK;
22820 if (uses_apcs_float) flags |= F_APCS_FLOAT;
c19d1205 22821 if (pic_code) flags |= F_PIC;
e74cfd16 22822 if (!ARM_CPU_HAS_FEATURE (cpu_variant, fpu_any_hard))
7cc69913
NC
22823 flags |= F_SOFT_FLOAT;
22824
d507cf36
PB
22825 switch (mfloat_abi_opt)
22826 {
22827 case ARM_FLOAT_ABI_SOFT:
22828 case ARM_FLOAT_ABI_SOFTFP:
22829 flags |= F_SOFT_FLOAT;
22830 break;
33a392fb 22831
d507cf36
PB
22832 case ARM_FLOAT_ABI_HARD:
22833 if (flags & F_SOFT_FLOAT)
22834 as_bad (_("hard-float conflicts with specified fpu"));
22835 break;
22836 }
03b1477f 22837
e74cfd16
PB
22838 /* Using pure-endian doubles (even if soft-float). */
22839 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_endian_pure))
7cc69913 22840 flags |= F_VFP_FLOAT;
f17c130b 22841
fde78edd 22842#if defined OBJ_ELF
e74cfd16 22843 if (ARM_CPU_HAS_FEATURE (cpu_variant, fpu_arch_maverick))
d507cf36 22844 flags |= EF_ARM_MAVERICK_FLOAT;
d507cf36
PB
22845 break;
22846
8cb51566 22847 case EF_ARM_EABI_VER4:
3a4a14e9 22848 case EF_ARM_EABI_VER5:
c19d1205 22849 /* No additional flags to set. */
d507cf36
PB
22850 break;
22851
22852 default:
22853 abort ();
22854 }
7cc69913 22855#endif
b99bd4ef
NC
22856 bfd_set_private_flags (stdoutput, flags);
22857
22858 /* We have run out flags in the COFF header to encode the
22859 status of ATPCS support, so instead we create a dummy,
c19d1205 22860 empty, debug section called .arm.atpcs. */
b99bd4ef
NC
22861 if (atpcs)
22862 {
22863 asection * sec;
22864
22865 sec = bfd_make_section (stdoutput, ".arm.atpcs");
22866
22867 if (sec != NULL)
22868 {
22869 bfd_set_section_flags
22870 (stdoutput, sec, SEC_READONLY | SEC_DEBUGGING /* | SEC_HAS_CONTENTS */);
22871 bfd_set_section_size (stdoutput, sec, 0);
22872 bfd_set_section_contents (stdoutput, sec, NULL, 0, 0);
22873 }
22874 }
7cc69913 22875 }
f17c130b 22876#endif
b99bd4ef
NC
22877
22878 /* Record the CPU type as well. */
2d447fca
JM
22879 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt2))
22880 mach = bfd_mach_arm_iWMMXt2;
22881 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_iwmmxt))
e16bb312 22882 mach = bfd_mach_arm_iWMMXt;
e74cfd16 22883 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_xscale))
b99bd4ef 22884 mach = bfd_mach_arm_XScale;
e74cfd16 22885 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_cext_maverick))
fde78edd 22886 mach = bfd_mach_arm_ep9312;
e74cfd16 22887 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5e))
b99bd4ef 22888 mach = bfd_mach_arm_5TE;
e74cfd16 22889 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v5))
b99bd4ef 22890 {
e74cfd16 22891 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
b99bd4ef
NC
22892 mach = bfd_mach_arm_5T;
22893 else
22894 mach = bfd_mach_arm_5;
22895 }
e74cfd16 22896 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4))
b99bd4ef 22897 {
e74cfd16 22898 if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v4t))
b99bd4ef
NC
22899 mach = bfd_mach_arm_4T;
22900 else
22901 mach = bfd_mach_arm_4;
22902 }
e74cfd16 22903 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3m))
b99bd4ef 22904 mach = bfd_mach_arm_3M;
e74cfd16
PB
22905 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v3))
22906 mach = bfd_mach_arm_3;
22907 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2s))
22908 mach = bfd_mach_arm_2a;
22909 else if (ARM_CPU_HAS_FEATURE (cpu_variant, arm_ext_v2))
22910 mach = bfd_mach_arm_2;
22911 else
22912 mach = bfd_mach_arm_unknown;
b99bd4ef
NC
22913
22914 bfd_set_arch_mach (stdoutput, TARGET_ARCH, mach);
22915}
22916
c19d1205 22917/* Command line processing. */
b99bd4ef 22918
c19d1205
ZW
22919/* md_parse_option
22920 Invocation line includes a switch not recognized by the base assembler.
22921 See if it's a processor-specific option.
b99bd4ef 22922
c19d1205
ZW
22923 This routine is somewhat complicated by the need for backwards
22924 compatibility (since older releases of gcc can't be changed).
22925 The new options try to make the interface as compatible as
22926 possible with GCC.
b99bd4ef 22927
c19d1205 22928 New options (supported) are:
b99bd4ef 22929
c19d1205
ZW
22930 -mcpu=<cpu name> Assemble for selected processor
22931 -march=<architecture name> Assemble for selected architecture
22932 -mfpu=<fpu architecture> Assemble for selected FPU.
22933 -EB/-mbig-endian Big-endian
22934 -EL/-mlittle-endian Little-endian
22935 -k Generate PIC code
22936 -mthumb Start in Thumb mode
22937 -mthumb-interwork Code supports ARM/Thumb interworking
b99bd4ef 22938
278df34e 22939 -m[no-]warn-deprecated Warn about deprecated features
267bf995 22940
c19d1205 22941 For now we will also provide support for:
b99bd4ef 22942
c19d1205
ZW
22943 -mapcs-32 32-bit Program counter
22944 -mapcs-26 26-bit Program counter
22945 -macps-float Floats passed in FP registers
22946 -mapcs-reentrant Reentrant code
22947 -matpcs
22948 (sometime these will probably be replaced with -mapcs=<list of options>
22949 and -matpcs=<list of options>)
b99bd4ef 22950
c19d1205
ZW
22951 The remaining options are only supported for back-wards compatibility.
22952 Cpu variants, the arm part is optional:
22953 -m[arm]1 Currently not supported.
22954 -m[arm]2, -m[arm]250 Arm 2 and Arm 250 processor
22955 -m[arm]3 Arm 3 processor
22956 -m[arm]6[xx], Arm 6 processors
22957 -m[arm]7[xx][t][[d]m] Arm 7 processors
22958 -m[arm]8[10] Arm 8 processors
22959 -m[arm]9[20][tdmi] Arm 9 processors
22960 -mstrongarm[110[0]] StrongARM processors
22961 -mxscale XScale processors
22962 -m[arm]v[2345[t[e]]] Arm architectures
22963 -mall All (except the ARM1)
22964 FP variants:
22965 -mfpa10, -mfpa11 FPA10 and 11 co-processor instructions
22966 -mfpe-old (No float load/store multiples)
22967 -mvfpxd VFP Single precision
22968 -mvfp All VFP
22969 -mno-fpu Disable all floating point instructions
b99bd4ef 22970
c19d1205
ZW
22971 The following CPU names are recognized:
22972 arm1, arm2, arm250, arm3, arm6, arm600, arm610, arm620,
22973 arm7, arm7m, arm7d, arm7dm, arm7di, arm7dmi, arm70, arm700,
22974 arm700i, arm710 arm710t, arm720, arm720t, arm740t, arm710c,
22975 arm7100, arm7500, arm7500fe, arm7tdmi, arm8, arm810, arm9,
22976 arm920, arm920t, arm940t, arm946, arm966, arm9tdmi, arm9e,
22977 arm10t arm10e, arm1020t, arm1020e, arm10200e,
22978 strongarm, strongarm110, strongarm1100, strongarm1110, xscale.
b99bd4ef 22979
c19d1205 22980 */
b99bd4ef 22981
c19d1205 22982const char * md_shortopts = "m:k";
b99bd4ef 22983
c19d1205
ZW
22984#ifdef ARM_BI_ENDIAN
22985#define OPTION_EB (OPTION_MD_BASE + 0)
22986#define OPTION_EL (OPTION_MD_BASE + 1)
b99bd4ef 22987#else
c19d1205
ZW
22988#if TARGET_BYTES_BIG_ENDIAN
22989#define OPTION_EB (OPTION_MD_BASE + 0)
b99bd4ef 22990#else
c19d1205
ZW
22991#define OPTION_EL (OPTION_MD_BASE + 1)
22992#endif
b99bd4ef 22993#endif
845b51d6 22994#define OPTION_FIX_V4BX (OPTION_MD_BASE + 2)
b99bd4ef 22995
c19d1205 22996struct option md_longopts[] =
b99bd4ef 22997{
c19d1205
ZW
22998#ifdef OPTION_EB
22999 {"EB", no_argument, NULL, OPTION_EB},
23000#endif
23001#ifdef OPTION_EL
23002 {"EL", no_argument, NULL, OPTION_EL},
b99bd4ef 23003#endif
845b51d6 23004 {"fix-v4bx", no_argument, NULL, OPTION_FIX_V4BX},
c19d1205
ZW
23005 {NULL, no_argument, NULL, 0}
23006};
b99bd4ef 23007
c19d1205 23008size_t md_longopts_size = sizeof (md_longopts);
b99bd4ef 23009
c19d1205 23010struct arm_option_table
b99bd4ef 23011{
c19d1205
ZW
23012 char *option; /* Option name to match. */
23013 char *help; /* Help information. */
23014 int *var; /* Variable to change. */
23015 int value; /* What to change it to. */
23016 char *deprecated; /* If non-null, print this message. */
23017};
b99bd4ef 23018
c19d1205
ZW
23019struct arm_option_table arm_opts[] =
23020{
23021 {"k", N_("generate PIC code"), &pic_code, 1, NULL},
23022 {"mthumb", N_("assemble Thumb code"), &thumb_mode, 1, NULL},
23023 {"mthumb-interwork", N_("support ARM/Thumb interworking"),
23024 &support_interwork, 1, NULL},
23025 {"mapcs-32", N_("code uses 32-bit program counter"), &uses_apcs_26, 0, NULL},
23026 {"mapcs-26", N_("code uses 26-bit program counter"), &uses_apcs_26, 1, NULL},
23027 {"mapcs-float", N_("floating point args are in fp regs"), &uses_apcs_float,
23028 1, NULL},
23029 {"mapcs-reentrant", N_("re-entrant code"), &pic_code, 1, NULL},
23030 {"matpcs", N_("code is ATPCS conformant"), &atpcs, 1, NULL},
23031 {"mbig-endian", N_("assemble for big-endian"), &target_big_endian, 1, NULL},
23032 {"mlittle-endian", N_("assemble for little-endian"), &target_big_endian, 0,
23033 NULL},
b99bd4ef 23034
c19d1205
ZW
23035 /* These are recognized by the assembler, but have no affect on code. */
23036 {"mapcs-frame", N_("use frame pointer"), NULL, 0, NULL},
23037 {"mapcs-stack-check", N_("use stack size checking"), NULL, 0, NULL},
278df34e
NS
23038
23039 {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
23040 {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
23041 &warn_on_deprecated, 0, NULL},
e74cfd16
PB
23042 {NULL, NULL, NULL, 0, NULL}
23043};
23044
23045struct arm_legacy_option_table
23046{
23047 char *option; /* Option name to match. */
23048 const arm_feature_set **var; /* Variable to change. */
23049 const arm_feature_set value; /* What to change it to. */
23050 char *deprecated; /* If non-null, print this message. */
23051};
b99bd4ef 23052
e74cfd16
PB
23053const struct arm_legacy_option_table arm_legacy_opts[] =
23054{
c19d1205
ZW
23055 /* DON'T add any new processors to this list -- we want the whole list
23056 to go away... Add them to the processors table instead. */
e74cfd16
PB
23057 {"marm1", &legacy_cpu, ARM_ARCH_V1, N_("use -mcpu=arm1")},
23058 {"m1", &legacy_cpu, ARM_ARCH_V1, N_("use -mcpu=arm1")},
23059 {"marm2", &legacy_cpu, ARM_ARCH_V2, N_("use -mcpu=arm2")},
23060 {"m2", &legacy_cpu, ARM_ARCH_V2, N_("use -mcpu=arm2")},
23061 {"marm250", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
23062 {"m250", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm250")},
23063 {"marm3", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
23064 {"m3", &legacy_cpu, ARM_ARCH_V2S, N_("use -mcpu=arm3")},
23065 {"marm6", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm6")},
23066 {"m6", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm6")},
23067 {"marm600", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm600")},
23068 {"m600", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm600")},
23069 {"marm610", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm610")},
23070 {"m610", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm610")},
23071 {"marm620", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm620")},
23072 {"m620", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm620")},
23073 {"marm7", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7")},
23074 {"m7", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7")},
23075 {"marm70", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm70")},
23076 {"m70", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm70")},
23077 {"marm700", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700")},
23078 {"m700", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700")},
23079 {"marm700i", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700i")},
23080 {"m700i", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm700i")},
23081 {"marm710", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710")},
23082 {"m710", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710")},
23083 {"marm710c", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710c")},
23084 {"m710c", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm710c")},
23085 {"marm720", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm720")},
23086 {"m720", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm720")},
23087 {"marm7d", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7d")},
23088 {"m7d", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7d")},
23089 {"marm7di", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7di")},
23090 {"m7di", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7di")},
23091 {"marm7m", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
23092 {"m7m", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7m")},
23093 {"marm7dm", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
23094 {"m7dm", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dm")},
23095 {"marm7dmi", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
23096 {"m7dmi", &legacy_cpu, ARM_ARCH_V3M, N_("use -mcpu=arm7dmi")},
23097 {"marm7100", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7100")},
23098 {"m7100", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7100")},
23099 {"marm7500", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500")},
23100 {"m7500", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500")},
23101 {"marm7500fe", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500fe")},
23102 {"m7500fe", &legacy_cpu, ARM_ARCH_V3, N_("use -mcpu=arm7500fe")},
23103 {"marm7t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23104 {"m7t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23105 {"marm7tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23106 {"m7tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm7tdmi")},
23107 {"marm710t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
23108 {"m710t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm710t")},
23109 {"marm720t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
23110 {"m720t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm720t")},
23111 {"marm740t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
23112 {"m740t", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm740t")},
23113 {"marm8", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm8")},
23114 {"m8", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm8")},
23115 {"marm810", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm810")},
23116 {"m810", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=arm810")},
23117 {"marm9", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
23118 {"m9", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9")},
23119 {"marm9tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
23120 {"m9tdmi", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm9tdmi")},
23121 {"marm920", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
23122 {"m920", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm920")},
23123 {"marm940", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
23124 {"m940", &legacy_cpu, ARM_ARCH_V4T, N_("use -mcpu=arm940")},
23125 {"mstrongarm", &legacy_cpu, ARM_ARCH_V4, N_("use -mcpu=strongarm")},
23126 {"mstrongarm110", &legacy_cpu, ARM_ARCH_V4,
c19d1205 23127 N_("use -mcpu=strongarm110")},
e74cfd16 23128 {"mstrongarm1100", &legacy_cpu, ARM_ARCH_V4,
c19d1205 23129 N_("use -mcpu=strongarm1100")},
e74cfd16 23130 {"mstrongarm1110", &legacy_cpu, ARM_ARCH_V4,
c19d1205 23131 N_("use -mcpu=strongarm1110")},
e74cfd16
PB
23132 {"mxscale", &legacy_cpu, ARM_ARCH_XSCALE, N_("use -mcpu=xscale")},
23133 {"miwmmxt", &legacy_cpu, ARM_ARCH_IWMMXT, N_("use -mcpu=iwmmxt")},
23134 {"mall", &legacy_cpu, ARM_ANY, N_("use -mcpu=all")},
7ed4c4c5 23135
c19d1205 23136 /* Architecture variants -- don't add any more to this list either. */
e74cfd16
PB
23137 {"mv2", &legacy_cpu, ARM_ARCH_V2, N_("use -march=armv2")},
23138 {"marmv2", &legacy_cpu, ARM_ARCH_V2, N_("use -march=armv2")},
23139 {"mv2a", &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
23140 {"marmv2a", &legacy_cpu, ARM_ARCH_V2S, N_("use -march=armv2a")},
23141 {"mv3", &legacy_cpu, ARM_ARCH_V3, N_("use -march=armv3")},
23142 {"marmv3", &legacy_cpu, ARM_ARCH_V3, N_("use -march=armv3")},
23143 {"mv3m", &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
23144 {"marmv3m", &legacy_cpu, ARM_ARCH_V3M, N_("use -march=armv3m")},
23145 {"mv4", &legacy_cpu, ARM_ARCH_V4, N_("use -march=armv4")},
23146 {"marmv4", &legacy_cpu, ARM_ARCH_V4, N_("use -march=armv4")},
23147 {"mv4t", &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
23148 {"marmv4t", &legacy_cpu, ARM_ARCH_V4T, N_("use -march=armv4t")},
23149 {"mv5", &legacy_cpu, ARM_ARCH_V5, N_("use -march=armv5")},
23150 {"marmv5", &legacy_cpu, ARM_ARCH_V5, N_("use -march=armv5")},
23151 {"mv5t", &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
23152 {"marmv5t", &legacy_cpu, ARM_ARCH_V5T, N_("use -march=armv5t")},
23153 {"mv5e", &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
23154 {"marmv5e", &legacy_cpu, ARM_ARCH_V5TE, N_("use -march=armv5te")},
7ed4c4c5 23155
c19d1205 23156 /* Floating point variants -- don't add any more to this list either. */
e74cfd16
PB
23157 {"mfpe-old", &legacy_fpu, FPU_ARCH_FPE, N_("use -mfpu=fpe")},
23158 {"mfpa10", &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa10")},
23159 {"mfpa11", &legacy_fpu, FPU_ARCH_FPA, N_("use -mfpu=fpa11")},
23160 {"mno-fpu", &legacy_fpu, ARM_ARCH_NONE,
c19d1205 23161 N_("use either -mfpu=softfpa or -mfpu=softvfp")},
7ed4c4c5 23162
e74cfd16 23163 {NULL, NULL, ARM_ARCH_NONE, NULL}
c19d1205 23164};
7ed4c4c5 23165
c19d1205 23166struct arm_cpu_option_table
7ed4c4c5 23167{
c19d1205 23168 char *name;
f3bad469 23169 size_t name_len;
e74cfd16 23170 const arm_feature_set value;
c19d1205
ZW
23171 /* For some CPUs we assume an FPU unless the user explicitly sets
23172 -mfpu=... */
e74cfd16 23173 const arm_feature_set default_fpu;
ee065d83
PB
23174 /* The canonical name of the CPU, or NULL to use NAME converted to upper
23175 case. */
23176 const char *canonical_name;
c19d1205 23177};
7ed4c4c5 23178
c19d1205
ZW
23179/* This list should, at a minimum, contain all the cpu names
23180 recognized by GCC. */
f3bad469 23181#define ARM_CPU_OPT(N, V, DF, CN) { N, sizeof (N) - 1, V, DF, CN }
e74cfd16 23182static const struct arm_cpu_option_table arm_cpus[] =
c19d1205 23183{
f3bad469
MGD
23184 ARM_CPU_OPT ("all", ARM_ANY, FPU_ARCH_FPA, NULL),
23185 ARM_CPU_OPT ("arm1", ARM_ARCH_V1, FPU_ARCH_FPA, NULL),
23186 ARM_CPU_OPT ("arm2", ARM_ARCH_V2, FPU_ARCH_FPA, NULL),
23187 ARM_CPU_OPT ("arm250", ARM_ARCH_V2S, FPU_ARCH_FPA, NULL),
23188 ARM_CPU_OPT ("arm3", ARM_ARCH_V2S, FPU_ARCH_FPA, NULL),
23189 ARM_CPU_OPT ("arm6", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23190 ARM_CPU_OPT ("arm60", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23191 ARM_CPU_OPT ("arm600", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23192 ARM_CPU_OPT ("arm610", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23193 ARM_CPU_OPT ("arm620", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23194 ARM_CPU_OPT ("arm7", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23195 ARM_CPU_OPT ("arm7m", ARM_ARCH_V3M, FPU_ARCH_FPA, NULL),
23196 ARM_CPU_OPT ("arm7d", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23197 ARM_CPU_OPT ("arm7dm", ARM_ARCH_V3M, FPU_ARCH_FPA, NULL),
23198 ARM_CPU_OPT ("arm7di", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23199 ARM_CPU_OPT ("arm7dmi", ARM_ARCH_V3M, FPU_ARCH_FPA, NULL),
23200 ARM_CPU_OPT ("arm70", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23201 ARM_CPU_OPT ("arm700", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23202 ARM_CPU_OPT ("arm700i", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23203 ARM_CPU_OPT ("arm710", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23204 ARM_CPU_OPT ("arm710t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23205 ARM_CPU_OPT ("arm720", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23206 ARM_CPU_OPT ("arm720t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23207 ARM_CPU_OPT ("arm740t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23208 ARM_CPU_OPT ("arm710c", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23209 ARM_CPU_OPT ("arm7100", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23210 ARM_CPU_OPT ("arm7500", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23211 ARM_CPU_OPT ("arm7500fe", ARM_ARCH_V3, FPU_ARCH_FPA, NULL),
23212 ARM_CPU_OPT ("arm7t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23213 ARM_CPU_OPT ("arm7tdmi", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23214 ARM_CPU_OPT ("arm7tdmi-s", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23215 ARM_CPU_OPT ("arm8", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23216 ARM_CPU_OPT ("arm810", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23217 ARM_CPU_OPT ("strongarm", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23218 ARM_CPU_OPT ("strongarm1", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23219 ARM_CPU_OPT ("strongarm110", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23220 ARM_CPU_OPT ("strongarm1100", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23221 ARM_CPU_OPT ("strongarm1110", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23222 ARM_CPU_OPT ("arm9", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23223 ARM_CPU_OPT ("arm920", ARM_ARCH_V4T, FPU_ARCH_FPA, "ARM920T"),
23224 ARM_CPU_OPT ("arm920t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23225 ARM_CPU_OPT ("arm922t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23226 ARM_CPU_OPT ("arm940t", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23227 ARM_CPU_OPT ("arm9tdmi", ARM_ARCH_V4T, FPU_ARCH_FPA, NULL),
23228 ARM_CPU_OPT ("fa526", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
23229 ARM_CPU_OPT ("fa626", ARM_ARCH_V4, FPU_ARCH_FPA, NULL),
c19d1205
ZW
23230 /* For V5 or later processors we default to using VFP; but the user
23231 should really set the FPU type explicitly. */
f3bad469
MGD
23232 ARM_CPU_OPT ("arm9e-r0", ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
23233 ARM_CPU_OPT ("arm9e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23234 ARM_CPU_OPT ("arm926ej", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, "ARM926EJ-S"),
23235 ARM_CPU_OPT ("arm926ejs", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, "ARM926EJ-S"),
23236 ARM_CPU_OPT ("arm926ej-s", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, NULL),
23237 ARM_CPU_OPT ("arm946e-r0", ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
23238 ARM_CPU_OPT ("arm946e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM946E-S"),
23239 ARM_CPU_OPT ("arm946e-s", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23240 ARM_CPU_OPT ("arm966e-r0", ARM_ARCH_V5TExP, FPU_ARCH_VFP_V2, NULL),
23241 ARM_CPU_OPT ("arm966e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM966E-S"),
23242 ARM_CPU_OPT ("arm966e-s", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23243 ARM_CPU_OPT ("arm968e-s", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23244 ARM_CPU_OPT ("arm10t", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL),
23245 ARM_CPU_OPT ("arm10tdmi", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL),
23246 ARM_CPU_OPT ("arm10e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23247 ARM_CPU_OPT ("arm1020", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, "ARM1020E"),
23248 ARM_CPU_OPT ("arm1020t", ARM_ARCH_V5T, FPU_ARCH_VFP_V1, NULL),
23249 ARM_CPU_OPT ("arm1020e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23250 ARM_CPU_OPT ("arm1022e", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23251 ARM_CPU_OPT ("arm1026ejs", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2,
23252 "ARM1026EJ-S"),
23253 ARM_CPU_OPT ("arm1026ej-s", ARM_ARCH_V5TEJ, FPU_ARCH_VFP_V2, NULL),
23254 ARM_CPU_OPT ("fa606te", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23255 ARM_CPU_OPT ("fa616te", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23256 ARM_CPU_OPT ("fa626te", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23257 ARM_CPU_OPT ("fmp626", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23258 ARM_CPU_OPT ("fa726te", ARM_ARCH_V5TE, FPU_ARCH_VFP_V2, NULL),
23259 ARM_CPU_OPT ("arm1136js", ARM_ARCH_V6, FPU_NONE, "ARM1136J-S"),
23260 ARM_CPU_OPT ("arm1136j-s", ARM_ARCH_V6, FPU_NONE, NULL),
23261 ARM_CPU_OPT ("arm1136jfs", ARM_ARCH_V6, FPU_ARCH_VFP_V2,
23262 "ARM1136JF-S"),
23263 ARM_CPU_OPT ("arm1136jf-s", ARM_ARCH_V6, FPU_ARCH_VFP_V2, NULL),
23264 ARM_CPU_OPT ("mpcore", ARM_ARCH_V6K, FPU_ARCH_VFP_V2, "MPCore"),
23265 ARM_CPU_OPT ("mpcorenovfp", ARM_ARCH_V6K, FPU_NONE, "MPCore"),
23266 ARM_CPU_OPT ("arm1156t2-s", ARM_ARCH_V6T2, FPU_NONE, NULL),
23267 ARM_CPU_OPT ("arm1156t2f-s", ARM_ARCH_V6T2, FPU_ARCH_VFP_V2, NULL),
23268 ARM_CPU_OPT ("arm1176jz-s", ARM_ARCH_V6ZK, FPU_NONE, NULL),
23269 ARM_CPU_OPT ("arm1176jzf-s", ARM_ARCH_V6ZK, FPU_ARCH_VFP_V2, NULL),
23270 ARM_CPU_OPT ("cortex-a5", ARM_ARCH_V7A_MP_SEC,
23271 FPU_NONE, "Cortex-A5"),
23272 ARM_CPU_OPT ("cortex-a7", ARM_ARCH_V7A_IDIV_MP_SEC_VIRT,
23273 FPU_ARCH_NEON_VFP_V4,
23274 "Cortex-A7"),
23275 ARM_CPU_OPT ("cortex-a8", ARM_ARCH_V7A_SEC,
23276 ARM_FEATURE (0, FPU_VFP_V3
5287ad62 23277 | FPU_NEON_EXT_V1),
f3bad469
MGD
23278 "Cortex-A8"),
23279 ARM_CPU_OPT ("cortex-a9", ARM_ARCH_V7A_MP_SEC,
23280 ARM_FEATURE (0, FPU_VFP_V3
15290f0a 23281 | FPU_NEON_EXT_V1),
f3bad469
MGD
23282 "Cortex-A9"),
23283 ARM_CPU_OPT ("cortex-a15", ARM_ARCH_V7A_IDIV_MP_SEC_VIRT,
23284 FPU_ARCH_NEON_VFP_V4,
23285 "Cortex-A15"),
23286 ARM_CPU_OPT ("cortex-r4", ARM_ARCH_V7R, FPU_NONE, "Cortex-R4"),
23287 ARM_CPU_OPT ("cortex-r4f", ARM_ARCH_V7R, FPU_ARCH_VFP_V3D16,
23288 "Cortex-R4F"),
23289 ARM_CPU_OPT ("cortex-r5", ARM_ARCH_V7R_IDIV,
23290 FPU_NONE, "Cortex-R5"),
23291 ARM_CPU_OPT ("cortex-m4", ARM_ARCH_V7EM, FPU_NONE, "Cortex-M4"),
23292 ARM_CPU_OPT ("cortex-m3", ARM_ARCH_V7M, FPU_NONE, "Cortex-M3"),
23293 ARM_CPU_OPT ("cortex-m1", ARM_ARCH_V6SM, FPU_NONE, "Cortex-M1"),
23294 ARM_CPU_OPT ("cortex-m0", ARM_ARCH_V6SM, FPU_NONE, "Cortex-M0"),
ce32bd10 23295 ARM_CPU_OPT ("cortex-m0plus", ARM_ARCH_V6SM, FPU_NONE, "Cortex-M0+"),
c19d1205 23296 /* ??? XSCALE is really an architecture. */
f3bad469 23297 ARM_CPU_OPT ("xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
c19d1205 23298 /* ??? iwmmxt is not a processor. */
f3bad469
MGD
23299 ARM_CPU_OPT ("iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP_V2, NULL),
23300 ARM_CPU_OPT ("iwmmxt2", ARM_ARCH_IWMMXT2,FPU_ARCH_VFP_V2, NULL),
23301 ARM_CPU_OPT ("i80200", ARM_ARCH_XSCALE, FPU_ARCH_VFP_V2, NULL),
c19d1205 23302 /* Maverick */
f3bad469
MGD
23303 ARM_CPU_OPT ("ep9312", ARM_FEATURE (ARM_AEXT_V4T, ARM_CEXT_MAVERICK),
23304 FPU_ARCH_MAVERICK,
23305 "ARM920T"),
23306 { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE, NULL }
c19d1205 23307};
f3bad469 23308#undef ARM_CPU_OPT
7ed4c4c5 23309
c19d1205 23310struct arm_arch_option_table
7ed4c4c5 23311{
c19d1205 23312 char *name;
f3bad469 23313 size_t name_len;
e74cfd16
PB
23314 const arm_feature_set value;
23315 const arm_feature_set default_fpu;
c19d1205 23316};
7ed4c4c5 23317
c19d1205
ZW
23318/* This list should, at a minimum, contain all the architecture names
23319 recognized by GCC. */
f3bad469 23320#define ARM_ARCH_OPT(N, V, DF) { N, sizeof (N) - 1, V, DF }
e74cfd16 23321static const struct arm_arch_option_table arm_archs[] =
c19d1205 23322{
f3bad469
MGD
23323 ARM_ARCH_OPT ("all", ARM_ANY, FPU_ARCH_FPA),
23324 ARM_ARCH_OPT ("armv1", ARM_ARCH_V1, FPU_ARCH_FPA),
23325 ARM_ARCH_OPT ("armv2", ARM_ARCH_V2, FPU_ARCH_FPA),
23326 ARM_ARCH_OPT ("armv2a", ARM_ARCH_V2S, FPU_ARCH_FPA),
23327 ARM_ARCH_OPT ("armv2s", ARM_ARCH_V2S, FPU_ARCH_FPA),
23328 ARM_ARCH_OPT ("armv3", ARM_ARCH_V3, FPU_ARCH_FPA),
23329 ARM_ARCH_OPT ("armv3m", ARM_ARCH_V3M, FPU_ARCH_FPA),
23330 ARM_ARCH_OPT ("armv4", ARM_ARCH_V4, FPU_ARCH_FPA),
23331 ARM_ARCH_OPT ("armv4xm", ARM_ARCH_V4xM, FPU_ARCH_FPA),
23332 ARM_ARCH_OPT ("armv4t", ARM_ARCH_V4T, FPU_ARCH_FPA),
23333 ARM_ARCH_OPT ("armv4txm", ARM_ARCH_V4TxM, FPU_ARCH_FPA),
23334 ARM_ARCH_OPT ("armv5", ARM_ARCH_V5, FPU_ARCH_VFP),
23335 ARM_ARCH_OPT ("armv5t", ARM_ARCH_V5T, FPU_ARCH_VFP),
23336 ARM_ARCH_OPT ("armv5txm", ARM_ARCH_V5TxM, FPU_ARCH_VFP),
23337 ARM_ARCH_OPT ("armv5te", ARM_ARCH_V5TE, FPU_ARCH_VFP),
23338 ARM_ARCH_OPT ("armv5texp", ARM_ARCH_V5TExP, FPU_ARCH_VFP),
23339 ARM_ARCH_OPT ("armv5tej", ARM_ARCH_V5TEJ, FPU_ARCH_VFP),
23340 ARM_ARCH_OPT ("armv6", ARM_ARCH_V6, FPU_ARCH_VFP),
23341 ARM_ARCH_OPT ("armv6j", ARM_ARCH_V6, FPU_ARCH_VFP),
23342 ARM_ARCH_OPT ("armv6k", ARM_ARCH_V6K, FPU_ARCH_VFP),
23343 ARM_ARCH_OPT ("armv6z", ARM_ARCH_V6Z, FPU_ARCH_VFP),
23344 ARM_ARCH_OPT ("armv6zk", ARM_ARCH_V6ZK, FPU_ARCH_VFP),
23345 ARM_ARCH_OPT ("armv6t2", ARM_ARCH_V6T2, FPU_ARCH_VFP),
23346 ARM_ARCH_OPT ("armv6kt2", ARM_ARCH_V6KT2, FPU_ARCH_VFP),
23347 ARM_ARCH_OPT ("armv6zt2", ARM_ARCH_V6ZT2, FPU_ARCH_VFP),
23348 ARM_ARCH_OPT ("armv6zkt2", ARM_ARCH_V6ZKT2, FPU_ARCH_VFP),
23349 ARM_ARCH_OPT ("armv6-m", ARM_ARCH_V6M, FPU_ARCH_VFP),
23350 ARM_ARCH_OPT ("armv6s-m", ARM_ARCH_V6SM, FPU_ARCH_VFP),
23351 ARM_ARCH_OPT ("armv7", ARM_ARCH_V7, FPU_ARCH_VFP),
c450d570
PB
23352 /* The official spelling of the ARMv7 profile variants is the dashed form.
23353 Accept the non-dashed form for compatibility with old toolchains. */
f3bad469
MGD
23354 ARM_ARCH_OPT ("armv7a", ARM_ARCH_V7A, FPU_ARCH_VFP),
23355 ARM_ARCH_OPT ("armv7r", ARM_ARCH_V7R, FPU_ARCH_VFP),
23356 ARM_ARCH_OPT ("armv7m", ARM_ARCH_V7M, FPU_ARCH_VFP),
23357 ARM_ARCH_OPT ("armv7-a", ARM_ARCH_V7A, FPU_ARCH_VFP),
23358 ARM_ARCH_OPT ("armv7-r", ARM_ARCH_V7R, FPU_ARCH_VFP),
23359 ARM_ARCH_OPT ("armv7-m", ARM_ARCH_V7M, FPU_ARCH_VFP),
23360 ARM_ARCH_OPT ("armv7e-m", ARM_ARCH_V7EM, FPU_ARCH_VFP),
bca38921 23361 ARM_ARCH_OPT ("armv8-a", ARM_ARCH_V8A, FPU_ARCH_VFP),
f3bad469
MGD
23362 ARM_ARCH_OPT ("xscale", ARM_ARCH_XSCALE, FPU_ARCH_VFP),
23363 ARM_ARCH_OPT ("iwmmxt", ARM_ARCH_IWMMXT, FPU_ARCH_VFP),
23364 ARM_ARCH_OPT ("iwmmxt2", ARM_ARCH_IWMMXT2,FPU_ARCH_VFP),
23365 { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
c19d1205 23366};
f3bad469 23367#undef ARM_ARCH_OPT
7ed4c4c5 23368
69133863
MGD
23369/* ISA extensions in the co-processor and main instruction set space. */
23370struct arm_option_extension_value_table
c19d1205
ZW
23371{
23372 char *name;
f3bad469 23373 size_t name_len;
e74cfd16 23374 const arm_feature_set value;
69133863 23375 const arm_feature_set allowed_archs;
c19d1205 23376};
7ed4c4c5 23377
69133863
MGD
23378/* The following table must be in alphabetical order with a NULL last entry.
23379 */
f3bad469 23380#define ARM_EXT_OPT(N, V, AA) { N, sizeof (N) - 1, V, AA }
69133863 23381static const struct arm_option_extension_value_table arm_extensions[] =
c19d1205 23382{
bca38921
MGD
23383 ARM_EXT_OPT ("crypto", FPU_ARCH_CRYPTO_NEON_VFP_ARMV8,
23384 ARM_FEATURE (ARM_EXT_V8, 0)),
23385 ARM_EXT_OPT ("fp", FPU_ARCH_VFP_ARMV8,
23386 ARM_FEATURE (ARM_EXT_V8, 0)),
f3bad469
MGD
23387 ARM_EXT_OPT ("idiv", ARM_FEATURE (ARM_EXT_ADIV | ARM_EXT_DIV, 0),
23388 ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
23389 ARM_EXT_OPT ("iwmmxt",ARM_FEATURE (0, ARM_CEXT_IWMMXT), ARM_ANY),
23390 ARM_EXT_OPT ("iwmmxt2",
23391 ARM_FEATURE (0, ARM_CEXT_IWMMXT2), ARM_ANY),
23392 ARM_EXT_OPT ("maverick",
23393 ARM_FEATURE (0, ARM_CEXT_MAVERICK), ARM_ANY),
23394 ARM_EXT_OPT ("mp", ARM_FEATURE (ARM_EXT_MP, 0),
23395 ARM_FEATURE (ARM_EXT_V7A | ARM_EXT_V7R, 0)),
bca38921
MGD
23396 ARM_EXT_OPT ("simd", FPU_ARCH_NEON_VFP_ARMV8,
23397 ARM_FEATURE (ARM_EXT_V8, 0)),
f3bad469
MGD
23398 ARM_EXT_OPT ("os", ARM_FEATURE (ARM_EXT_OS, 0),
23399 ARM_FEATURE (ARM_EXT_V6M, 0)),
23400 ARM_EXT_OPT ("sec", ARM_FEATURE (ARM_EXT_SEC, 0),
23401 ARM_FEATURE (ARM_EXT_V6K | ARM_EXT_V7A, 0)),
23402 ARM_EXT_OPT ("virt", ARM_FEATURE (ARM_EXT_VIRT | ARM_EXT_ADIV
23403 | ARM_EXT_DIV, 0),
23404 ARM_FEATURE (ARM_EXT_V7A, 0)),
23405 ARM_EXT_OPT ("xscale",ARM_FEATURE (0, ARM_CEXT_XSCALE), ARM_ANY),
23406 { NULL, 0, ARM_ARCH_NONE, ARM_ARCH_NONE }
69133863 23407};
f3bad469 23408#undef ARM_EXT_OPT
69133863
MGD
23409
23410/* ISA floating-point and Advanced SIMD extensions. */
23411struct arm_option_fpu_value_table
23412{
23413 char *name;
23414 const arm_feature_set value;
c19d1205 23415};
7ed4c4c5 23416
c19d1205
ZW
23417/* This list should, at a minimum, contain all the fpu names
23418 recognized by GCC. */
69133863 23419static const struct arm_option_fpu_value_table arm_fpus[] =
c19d1205
ZW
23420{
23421 {"softfpa", FPU_NONE},
23422 {"fpe", FPU_ARCH_FPE},
23423 {"fpe2", FPU_ARCH_FPE},
23424 {"fpe3", FPU_ARCH_FPA}, /* Third release supports LFM/SFM. */
23425 {"fpa", FPU_ARCH_FPA},
23426 {"fpa10", FPU_ARCH_FPA},
23427 {"fpa11", FPU_ARCH_FPA},
23428 {"arm7500fe", FPU_ARCH_FPA},
23429 {"softvfp", FPU_ARCH_VFP},
23430 {"softvfp+vfp", FPU_ARCH_VFP_V2},
23431 {"vfp", FPU_ARCH_VFP_V2},
23432 {"vfp9", FPU_ARCH_VFP_V2},
b1cc4aeb 23433 {"vfp3", FPU_ARCH_VFP_V3}, /* For backwards compatbility. */
c19d1205
ZW
23434 {"vfp10", FPU_ARCH_VFP_V2},
23435 {"vfp10-r0", FPU_ARCH_VFP_V1},
23436 {"vfpxd", FPU_ARCH_VFP_V1xD},
b1cc4aeb
PB
23437 {"vfpv2", FPU_ARCH_VFP_V2},
23438 {"vfpv3", FPU_ARCH_VFP_V3},
62f3b8c8 23439 {"vfpv3-fp16", FPU_ARCH_VFP_V3_FP16},
b1cc4aeb 23440 {"vfpv3-d16", FPU_ARCH_VFP_V3D16},
62f3b8c8
PB
23441 {"vfpv3-d16-fp16", FPU_ARCH_VFP_V3D16_FP16},
23442 {"vfpv3xd", FPU_ARCH_VFP_V3xD},
23443 {"vfpv3xd-fp16", FPU_ARCH_VFP_V3xD_FP16},
c19d1205
ZW
23444 {"arm1020t", FPU_ARCH_VFP_V1},
23445 {"arm1020e", FPU_ARCH_VFP_V2},
23446 {"arm1136jfs", FPU_ARCH_VFP_V2},
23447 {"arm1136jf-s", FPU_ARCH_VFP_V2},
23448 {"maverick", FPU_ARCH_MAVERICK},
5287ad62 23449 {"neon", FPU_ARCH_VFP_V3_PLUS_NEON_V1},
8e79c3df 23450 {"neon-fp16", FPU_ARCH_NEON_FP16},
62f3b8c8
PB
23451 {"vfpv4", FPU_ARCH_VFP_V4},
23452 {"vfpv4-d16", FPU_ARCH_VFP_V4D16},
ada65aa3 23453 {"fpv4-sp-d16", FPU_ARCH_VFP_V4_SP_D16},
62f3b8c8 23454 {"neon-vfpv4", FPU_ARCH_NEON_VFP_V4},
bca38921
MGD
23455 {"fp-armv8", FPU_ARCH_VFP_ARMV8},
23456 {"neon-fp-armv8", FPU_ARCH_NEON_VFP_ARMV8},
23457 {"crypto-neon-fp-armv8",
23458 FPU_ARCH_CRYPTO_NEON_VFP_ARMV8},
e74cfd16
PB
23459 {NULL, ARM_ARCH_NONE}
23460};
23461
23462struct arm_option_value_table
23463{
23464 char *name;
23465 long value;
c19d1205 23466};
7ed4c4c5 23467
e74cfd16 23468static const struct arm_option_value_table arm_float_abis[] =
c19d1205
ZW
23469{
23470 {"hard", ARM_FLOAT_ABI_HARD},
23471 {"softfp", ARM_FLOAT_ABI_SOFTFP},
23472 {"soft", ARM_FLOAT_ABI_SOFT},
e74cfd16 23473 {NULL, 0}
c19d1205 23474};
7ed4c4c5 23475
c19d1205 23476#ifdef OBJ_ELF
3a4a14e9 23477/* We only know how to output GNU and ver 4/5 (AAELF) formats. */
e74cfd16 23478static const struct arm_option_value_table arm_eabis[] =
c19d1205
ZW
23479{
23480 {"gnu", EF_ARM_EABI_UNKNOWN},
23481 {"4", EF_ARM_EABI_VER4},
3a4a14e9 23482 {"5", EF_ARM_EABI_VER5},
e74cfd16 23483 {NULL, 0}
c19d1205
ZW
23484};
23485#endif
7ed4c4c5 23486
c19d1205
ZW
23487struct arm_long_option_table
23488{
23489 char * option; /* Substring to match. */
23490 char * help; /* Help information. */
23491 int (* func) (char * subopt); /* Function to decode sub-option. */
23492 char * deprecated; /* If non-null, print this message. */
23493};
7ed4c4c5 23494
c921be7d 23495static bfd_boolean
f3bad469 23496arm_parse_extension (char *str, const arm_feature_set **opt_p)
7ed4c4c5 23497{
21d799b5
NC
23498 arm_feature_set *ext_set = (arm_feature_set *)
23499 xmalloc (sizeof (arm_feature_set));
e74cfd16 23500
69133863 23501 /* We insist on extensions being specified in alphabetical order, and with
fa94de6b
RM
23502 extensions being added before being removed. We achieve this by having
23503 the global ARM_EXTENSIONS table in alphabetical order, and using the
69133863 23504 ADDING_VALUE variable to indicate whether we are adding an extension (1)
fa94de6b 23505 or removing it (0) and only allowing it to change in the order
69133863
MGD
23506 -1 -> 1 -> 0. */
23507 const struct arm_option_extension_value_table * opt = NULL;
23508 int adding_value = -1;
23509
e74cfd16
PB
23510 /* Copy the feature set, so that we can modify it. */
23511 *ext_set = **opt_p;
23512 *opt_p = ext_set;
23513
c19d1205 23514 while (str != NULL && *str != 0)
7ed4c4c5 23515 {
f3bad469
MGD
23516 char *ext;
23517 size_t len;
7ed4c4c5 23518
c19d1205
ZW
23519 if (*str != '+')
23520 {
23521 as_bad (_("invalid architectural extension"));
c921be7d 23522 return FALSE;
c19d1205 23523 }
7ed4c4c5 23524
c19d1205
ZW
23525 str++;
23526 ext = strchr (str, '+');
7ed4c4c5 23527
c19d1205 23528 if (ext != NULL)
f3bad469 23529 len = ext - str;
c19d1205 23530 else
f3bad469 23531 len = strlen (str);
7ed4c4c5 23532
f3bad469 23533 if (len >= 2 && strncmp (str, "no", 2) == 0)
69133863
MGD
23534 {
23535 if (adding_value != 0)
23536 {
23537 adding_value = 0;
23538 opt = arm_extensions;
23539 }
23540
f3bad469 23541 len -= 2;
69133863
MGD
23542 str += 2;
23543 }
f3bad469 23544 else if (len > 0)
69133863
MGD
23545 {
23546 if (adding_value == -1)
23547 {
23548 adding_value = 1;
23549 opt = arm_extensions;
23550 }
23551 else if (adding_value != 1)
23552 {
23553 as_bad (_("must specify extensions to add before specifying "
23554 "those to remove"));
23555 return FALSE;
23556 }
23557 }
23558
f3bad469 23559 if (len == 0)
c19d1205
ZW
23560 {
23561 as_bad (_("missing architectural extension"));
c921be7d 23562 return FALSE;
c19d1205 23563 }
7ed4c4c5 23564
69133863
MGD
23565 gas_assert (adding_value != -1);
23566 gas_assert (opt != NULL);
23567
23568 /* Scan over the options table trying to find an exact match. */
23569 for (; opt->name != NULL; opt++)
f3bad469 23570 if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
c19d1205 23571 {
69133863
MGD
23572 /* Check we can apply the extension to this architecture. */
23573 if (!ARM_CPU_HAS_FEATURE (*ext_set, opt->allowed_archs))
23574 {
23575 as_bad (_("extension does not apply to the base architecture"));
23576 return FALSE;
23577 }
23578
23579 /* Add or remove the extension. */
23580 if (adding_value)
23581 ARM_MERGE_FEATURE_SETS (*ext_set, *ext_set, opt->value);
23582 else
23583 ARM_CLEAR_FEATURE (*ext_set, *ext_set, opt->value);
23584
c19d1205
ZW
23585 break;
23586 }
7ed4c4c5 23587
c19d1205
ZW
23588 if (opt->name == NULL)
23589 {
69133863
MGD
23590 /* Did we fail to find an extension because it wasn't specified in
23591 alphabetical order, or because it does not exist? */
23592
23593 for (opt = arm_extensions; opt->name != NULL; opt++)
f3bad469 23594 if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
69133863
MGD
23595 break;
23596
23597 if (opt->name == NULL)
23598 as_bad (_("unknown architectural extension `%s'"), str);
23599 else
23600 as_bad (_("architectural extensions must be specified in "
23601 "alphabetical order"));
23602
c921be7d 23603 return FALSE;
c19d1205 23604 }
69133863
MGD
23605 else
23606 {
23607 /* We should skip the extension we've just matched the next time
23608 round. */
23609 opt++;
23610 }
7ed4c4c5 23611
c19d1205
ZW
23612 str = ext;
23613 };
7ed4c4c5 23614
c921be7d 23615 return TRUE;
c19d1205 23616}
7ed4c4c5 23617
c921be7d 23618static bfd_boolean
f3bad469 23619arm_parse_cpu (char *str)
7ed4c4c5 23620{
f3bad469
MGD
23621 const struct arm_cpu_option_table *opt;
23622 char *ext = strchr (str, '+');
23623 size_t len;
7ed4c4c5 23624
c19d1205 23625 if (ext != NULL)
f3bad469 23626 len = ext - str;
7ed4c4c5 23627 else
f3bad469 23628 len = strlen (str);
7ed4c4c5 23629
f3bad469 23630 if (len == 0)
7ed4c4c5 23631 {
c19d1205 23632 as_bad (_("missing cpu name `%s'"), str);
c921be7d 23633 return FALSE;
7ed4c4c5
NC
23634 }
23635
c19d1205 23636 for (opt = arm_cpus; opt->name != NULL; opt++)
f3bad469 23637 if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
c19d1205 23638 {
e74cfd16
PB
23639 mcpu_cpu_opt = &opt->value;
23640 mcpu_fpu_opt = &opt->default_fpu;
ee065d83 23641 if (opt->canonical_name)
5f4273c7 23642 strcpy (selected_cpu_name, opt->canonical_name);
ee065d83
PB
23643 else
23644 {
f3bad469 23645 size_t i;
c921be7d 23646
f3bad469 23647 for (i = 0; i < len; i++)
ee065d83
PB
23648 selected_cpu_name[i] = TOUPPER (opt->name[i]);
23649 selected_cpu_name[i] = 0;
23650 }
7ed4c4c5 23651
c19d1205
ZW
23652 if (ext != NULL)
23653 return arm_parse_extension (ext, &mcpu_cpu_opt);
7ed4c4c5 23654
c921be7d 23655 return TRUE;
c19d1205 23656 }
7ed4c4c5 23657
c19d1205 23658 as_bad (_("unknown cpu `%s'"), str);
c921be7d 23659 return FALSE;
7ed4c4c5
NC
23660}
23661
c921be7d 23662static bfd_boolean
f3bad469 23663arm_parse_arch (char *str)
7ed4c4c5 23664{
e74cfd16 23665 const struct arm_arch_option_table *opt;
c19d1205 23666 char *ext = strchr (str, '+');
f3bad469 23667 size_t len;
7ed4c4c5 23668
c19d1205 23669 if (ext != NULL)
f3bad469 23670 len = ext - str;
7ed4c4c5 23671 else
f3bad469 23672 len = strlen (str);
7ed4c4c5 23673
f3bad469 23674 if (len == 0)
7ed4c4c5 23675 {
c19d1205 23676 as_bad (_("missing architecture name `%s'"), str);
c921be7d 23677 return FALSE;
7ed4c4c5
NC
23678 }
23679
c19d1205 23680 for (opt = arm_archs; opt->name != NULL; opt++)
f3bad469 23681 if (opt->name_len == len && strncmp (opt->name, str, len) == 0)
c19d1205 23682 {
e74cfd16
PB
23683 march_cpu_opt = &opt->value;
23684 march_fpu_opt = &opt->default_fpu;
5f4273c7 23685 strcpy (selected_cpu_name, opt->name);
7ed4c4c5 23686
c19d1205
ZW
23687 if (ext != NULL)
23688 return arm_parse_extension (ext, &march_cpu_opt);
7ed4c4c5 23689
c921be7d 23690 return TRUE;
c19d1205
ZW
23691 }
23692
23693 as_bad (_("unknown architecture `%s'\n"), str);
c921be7d 23694 return FALSE;
7ed4c4c5 23695}
eb043451 23696
c921be7d 23697static bfd_boolean
c19d1205
ZW
23698arm_parse_fpu (char * str)
23699{
69133863 23700 const struct arm_option_fpu_value_table * opt;
b99bd4ef 23701
c19d1205
ZW
23702 for (opt = arm_fpus; opt->name != NULL; opt++)
23703 if (streq (opt->name, str))
23704 {
e74cfd16 23705 mfpu_opt = &opt->value;
c921be7d 23706 return TRUE;
c19d1205 23707 }
b99bd4ef 23708
c19d1205 23709 as_bad (_("unknown floating point format `%s'\n"), str);
c921be7d 23710 return FALSE;
c19d1205
ZW
23711}
23712
c921be7d 23713static bfd_boolean
c19d1205 23714arm_parse_float_abi (char * str)
b99bd4ef 23715{
e74cfd16 23716 const struct arm_option_value_table * opt;
b99bd4ef 23717
c19d1205
ZW
23718 for (opt = arm_float_abis; opt->name != NULL; opt++)
23719 if (streq (opt->name, str))
23720 {
23721 mfloat_abi_opt = opt->value;
c921be7d 23722 return TRUE;
c19d1205 23723 }
cc8a6dd0 23724
c19d1205 23725 as_bad (_("unknown floating point abi `%s'\n"), str);
c921be7d 23726 return FALSE;
c19d1205 23727}
b99bd4ef 23728
c19d1205 23729#ifdef OBJ_ELF
c921be7d 23730static bfd_boolean
c19d1205
ZW
23731arm_parse_eabi (char * str)
23732{
e74cfd16 23733 const struct arm_option_value_table *opt;
cc8a6dd0 23734
c19d1205
ZW
23735 for (opt = arm_eabis; opt->name != NULL; opt++)
23736 if (streq (opt->name, str))
23737 {
23738 meabi_flags = opt->value;
c921be7d 23739 return TRUE;
c19d1205
ZW
23740 }
23741 as_bad (_("unknown EABI `%s'\n"), str);
c921be7d 23742 return FALSE;
c19d1205
ZW
23743}
23744#endif
cc8a6dd0 23745
c921be7d 23746static bfd_boolean
e07e6e58
NC
23747arm_parse_it_mode (char * str)
23748{
c921be7d 23749 bfd_boolean ret = TRUE;
e07e6e58
NC
23750
23751 if (streq ("arm", str))
23752 implicit_it_mode = IMPLICIT_IT_MODE_ARM;
23753 else if (streq ("thumb", str))
23754 implicit_it_mode = IMPLICIT_IT_MODE_THUMB;
23755 else if (streq ("always", str))
23756 implicit_it_mode = IMPLICIT_IT_MODE_ALWAYS;
23757 else if (streq ("never", str))
23758 implicit_it_mode = IMPLICIT_IT_MODE_NEVER;
23759 else
23760 {
23761 as_bad (_("unknown implicit IT mode `%s', should be "\
23762 "arm, thumb, always, or never."), str);
c921be7d 23763 ret = FALSE;
e07e6e58
NC
23764 }
23765
23766 return ret;
23767}
23768
c19d1205
ZW
23769struct arm_long_option_table arm_long_opts[] =
23770{
23771 {"mcpu=", N_("<cpu name>\t assemble for CPU <cpu name>"),
23772 arm_parse_cpu, NULL},
23773 {"march=", N_("<arch name>\t assemble for architecture <arch name>"),
23774 arm_parse_arch, NULL},
23775 {"mfpu=", N_("<fpu name>\t assemble for FPU architecture <fpu name>"),
23776 arm_parse_fpu, NULL},
23777 {"mfloat-abi=", N_("<abi>\t assemble for floating point ABI <abi>"),
23778 arm_parse_float_abi, NULL},
23779#ifdef OBJ_ELF
7fac0536 23780 {"meabi=", N_("<ver>\t\t assemble for eabi version <ver>"),
c19d1205
ZW
23781 arm_parse_eabi, NULL},
23782#endif
e07e6e58
NC
23783 {"mimplicit-it=", N_("<mode>\t controls implicit insertion of IT instructions"),
23784 arm_parse_it_mode, NULL},
c19d1205
ZW
23785 {NULL, NULL, 0, NULL}
23786};
cc8a6dd0 23787
c19d1205
ZW
23788int
23789md_parse_option (int c, char * arg)
23790{
23791 struct arm_option_table *opt;
e74cfd16 23792 const struct arm_legacy_option_table *fopt;
c19d1205 23793 struct arm_long_option_table *lopt;
b99bd4ef 23794
c19d1205 23795 switch (c)
b99bd4ef 23796 {
c19d1205
ZW
23797#ifdef OPTION_EB
23798 case OPTION_EB:
23799 target_big_endian = 1;
23800 break;
23801#endif
cc8a6dd0 23802
c19d1205
ZW
23803#ifdef OPTION_EL
23804 case OPTION_EL:
23805 target_big_endian = 0;
23806 break;
23807#endif
b99bd4ef 23808
845b51d6
PB
23809 case OPTION_FIX_V4BX:
23810 fix_v4bx = TRUE;
23811 break;
23812
c19d1205
ZW
23813 case 'a':
23814 /* Listing option. Just ignore these, we don't support additional
23815 ones. */
23816 return 0;
b99bd4ef 23817
c19d1205
ZW
23818 default:
23819 for (opt = arm_opts; opt->option != NULL; opt++)
23820 {
23821 if (c == opt->option[0]
23822 && ((arg == NULL && opt->option[1] == 0)
23823 || streq (arg, opt->option + 1)))
23824 {
c19d1205 23825 /* If the option is deprecated, tell the user. */
278df34e 23826 if (warn_on_deprecated && opt->deprecated != NULL)
c19d1205
ZW
23827 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
23828 arg ? arg : "", _(opt->deprecated));
b99bd4ef 23829
c19d1205
ZW
23830 if (opt->var != NULL)
23831 *opt->var = opt->value;
cc8a6dd0 23832
c19d1205
ZW
23833 return 1;
23834 }
23835 }
b99bd4ef 23836
e74cfd16
PB
23837 for (fopt = arm_legacy_opts; fopt->option != NULL; fopt++)
23838 {
23839 if (c == fopt->option[0]
23840 && ((arg == NULL && fopt->option[1] == 0)
23841 || streq (arg, fopt->option + 1)))
23842 {
e74cfd16 23843 /* If the option is deprecated, tell the user. */
278df34e 23844 if (warn_on_deprecated && fopt->deprecated != NULL)
e74cfd16
PB
23845 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c,
23846 arg ? arg : "", _(fopt->deprecated));
e74cfd16
PB
23847
23848 if (fopt->var != NULL)
23849 *fopt->var = &fopt->value;
23850
23851 return 1;
23852 }
23853 }
23854
c19d1205
ZW
23855 for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
23856 {
23857 /* These options are expected to have an argument. */
23858 if (c == lopt->option[0]
23859 && arg != NULL
23860 && strncmp (arg, lopt->option + 1,
23861 strlen (lopt->option + 1)) == 0)
23862 {
c19d1205 23863 /* If the option is deprecated, tell the user. */
278df34e 23864 if (warn_on_deprecated && lopt->deprecated != NULL)
c19d1205
ZW
23865 as_tsktsk (_("option `-%c%s' is deprecated: %s"), c, arg,
23866 _(lopt->deprecated));
b99bd4ef 23867
c19d1205
ZW
23868 /* Call the sup-option parser. */
23869 return lopt->func (arg + strlen (lopt->option) - 1);
23870 }
23871 }
a737bd4d 23872
c19d1205
ZW
23873 return 0;
23874 }
a394c00f 23875
c19d1205
ZW
23876 return 1;
23877}
a394c00f 23878
c19d1205
ZW
23879void
23880md_show_usage (FILE * fp)
a394c00f 23881{
c19d1205
ZW
23882 struct arm_option_table *opt;
23883 struct arm_long_option_table *lopt;
a394c00f 23884
c19d1205 23885 fprintf (fp, _(" ARM-specific assembler options:\n"));
a394c00f 23886
c19d1205
ZW
23887 for (opt = arm_opts; opt->option != NULL; opt++)
23888 if (opt->help != NULL)
23889 fprintf (fp, " -%-23s%s\n", opt->option, _(opt->help));
a394c00f 23890
c19d1205
ZW
23891 for (lopt = arm_long_opts; lopt->option != NULL; lopt++)
23892 if (lopt->help != NULL)
23893 fprintf (fp, " -%s%s\n", lopt->option, _(lopt->help));
a394c00f 23894
c19d1205
ZW
23895#ifdef OPTION_EB
23896 fprintf (fp, _("\
23897 -EB assemble code for a big-endian cpu\n"));
a394c00f
NC
23898#endif
23899
c19d1205
ZW
23900#ifdef OPTION_EL
23901 fprintf (fp, _("\
23902 -EL assemble code for a little-endian cpu\n"));
a737bd4d 23903#endif
845b51d6
PB
23904
23905 fprintf (fp, _("\
23906 --fix-v4bx Allow BX in ARMv4 code\n"));
c19d1205 23907}
ee065d83
PB
23908
23909
23910#ifdef OBJ_ELF
62b3e311
PB
23911typedef struct
23912{
23913 int val;
23914 arm_feature_set flags;
23915} cpu_arch_ver_table;
23916
23917/* Mapping from CPU features to EABI CPU arch values. Table must be sorted
23918 least features first. */
23919static const cpu_arch_ver_table cpu_arch_ver[] =
23920{
23921 {1, ARM_ARCH_V4},
23922 {2, ARM_ARCH_V4T},
23923 {3, ARM_ARCH_V5},
ee3c0378 23924 {3, ARM_ARCH_V5T},
62b3e311
PB
23925 {4, ARM_ARCH_V5TE},
23926 {5, ARM_ARCH_V5TEJ},
23927 {6, ARM_ARCH_V6},
7e806470 23928 {9, ARM_ARCH_V6K},
f4c65163 23929 {7, ARM_ARCH_V6Z},
91e22acd 23930 {11, ARM_ARCH_V6M},
b2a5fbdc 23931 {12, ARM_ARCH_V6SM},
7e806470 23932 {8, ARM_ARCH_V6T2},
bca38921 23933 {10, ARM_ARCH_V7A_IDIV_MP_SEC_VIRT},
62b3e311
PB
23934 {10, ARM_ARCH_V7R},
23935 {10, ARM_ARCH_V7M},
bca38921 23936 {14, ARM_ARCH_V8A},
62b3e311
PB
23937 {0, ARM_ARCH_NONE}
23938};
23939
ee3c0378
AS
23940/* Set an attribute if it has not already been set by the user. */
23941static void
23942aeabi_set_attribute_int (int tag, int value)
23943{
23944 if (tag < 1
23945 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
23946 || !attributes_set_explicitly[tag])
23947 bfd_elf_add_proc_attr_int (stdoutput, tag, value);
23948}
23949
23950static void
23951aeabi_set_attribute_string (int tag, const char *value)
23952{
23953 if (tag < 1
23954 || tag >= NUM_KNOWN_OBJ_ATTRIBUTES
23955 || !attributes_set_explicitly[tag])
23956 bfd_elf_add_proc_attr_string (stdoutput, tag, value);
23957}
23958
ee065d83
PB
23959/* Set the public EABI object attributes. */
23960static void
23961aeabi_set_public_attributes (void)
23962{
23963 int arch;
69239280 23964 char profile;
90ec0d68 23965 int virt_sec = 0;
bca38921 23966 int fp16_optional = 0;
e74cfd16 23967 arm_feature_set flags;
62b3e311
PB
23968 arm_feature_set tmp;
23969 const cpu_arch_ver_table *p;
ee065d83
PB
23970
23971 /* Choose the architecture based on the capabilities of the requested cpu
23972 (if any) and/or the instructions actually used. */
e74cfd16
PB
23973 ARM_MERGE_FEATURE_SETS (flags, arm_arch_used, thumb_arch_used);
23974 ARM_MERGE_FEATURE_SETS (flags, flags, *mfpu_opt);
23975 ARM_MERGE_FEATURE_SETS (flags, flags, selected_cpu);
ddd7f988
RE
23976
23977 if (ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any))
23978 ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v1);
23979
23980 if (ARM_CPU_HAS_FEATURE (thumb_arch_used, arm_arch_any))
23981 ARM_MERGE_FEATURE_SETS (flags, flags, arm_ext_v4t);
23982
23983 /* Allow the user to override the reported architecture. */
7a1d4c38
PB
23984 if (object_arch)
23985 {
23986 ARM_CLEAR_FEATURE (flags, flags, arm_arch_any);
23987 ARM_MERGE_FEATURE_SETS (flags, flags, *object_arch);
23988 }
23989
251665fc
MGD
23990 /* We need to make sure that the attributes do not identify us as v6S-M
23991 when the only v6S-M feature in use is the Operating System Extensions. */
23992 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_os))
23993 if (!ARM_CPU_HAS_FEATURE (flags, arm_arch_v6m_only))
23994 ARM_CLEAR_FEATURE (flags, flags, arm_ext_os);
23995
62b3e311
PB
23996 tmp = flags;
23997 arch = 0;
23998 for (p = cpu_arch_ver; p->val; p++)
23999 {
24000 if (ARM_CPU_HAS_FEATURE (tmp, p->flags))
24001 {
24002 arch = p->val;
24003 ARM_CLEAR_FEATURE (tmp, tmp, p->flags);
24004 }
24005 }
ee065d83 24006
9e3c6df6
PB
24007 /* The table lookup above finds the last architecture to contribute
24008 a new feature. Unfortunately, Tag13 is a subset of the union of
24009 v6T2 and v7-M, so it is never seen as contributing a new feature.
24010 We can not search for the last entry which is entirely used,
24011 because if no CPU is specified we build up only those flags
24012 actually used. Perhaps we should separate out the specified
24013 and implicit cases. Avoid taking this path for -march=all by
24014 checking for contradictory v7-A / v7-M features. */
24015 if (arch == 10
24016 && !ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a)
24017 && ARM_CPU_HAS_FEATURE (flags, arm_ext_v7m)
24018 && ARM_CPU_HAS_FEATURE (flags, arm_ext_v6_dsp))
24019 arch = 13;
24020
ee065d83
PB
24021 /* Tag_CPU_name. */
24022 if (selected_cpu_name[0])
24023 {
91d6fa6a 24024 char *q;
ee065d83 24025
91d6fa6a
NC
24026 q = selected_cpu_name;
24027 if (strncmp (q, "armv", 4) == 0)
ee065d83
PB
24028 {
24029 int i;
5f4273c7 24030
91d6fa6a
NC
24031 q += 4;
24032 for (i = 0; q[i]; i++)
24033 q[i] = TOUPPER (q[i]);
ee065d83 24034 }
91d6fa6a 24035 aeabi_set_attribute_string (Tag_CPU_name, q);
ee065d83 24036 }
62f3b8c8 24037
ee065d83 24038 /* Tag_CPU_arch. */
ee3c0378 24039 aeabi_set_attribute_int (Tag_CPU_arch, arch);
62f3b8c8 24040
62b3e311
PB
24041 /* Tag_CPU_arch_profile. */
24042 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7a))
69239280 24043 profile = 'A';
62b3e311 24044 else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v7r))
69239280 24045 profile = 'R';
7e806470 24046 else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_m))
69239280
MGD
24047 profile = 'M';
24048 else
24049 profile = '\0';
24050
24051 if (profile != '\0')
24052 aeabi_set_attribute_int (Tag_CPU_arch_profile, profile);
62f3b8c8 24053
ee065d83 24054 /* Tag_ARM_ISA_use. */
ee3c0378
AS
24055 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v1)
24056 || arch == 0)
24057 aeabi_set_attribute_int (Tag_ARM_ISA_use, 1);
62f3b8c8 24058
ee065d83 24059 /* Tag_THUMB_ISA_use. */
ee3c0378
AS
24060 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v4t)
24061 || arch == 0)
24062 aeabi_set_attribute_int (Tag_THUMB_ISA_use,
24063 ARM_CPU_HAS_FEATURE (flags, arm_arch_t2) ? 2 : 1);
62f3b8c8 24064
ee065d83 24065 /* Tag_VFP_arch. */
bca38921
MGD
24066 if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_armv8))
24067 aeabi_set_attribute_int (Tag_VFP_arch, 7);
24068 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_fma))
62f3b8c8
PB
24069 aeabi_set_attribute_int (Tag_VFP_arch,
24070 ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32)
24071 ? 5 : 6);
24072 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_d32))
bca38921
MGD
24073 {
24074 fp16_optional = 1;
24075 aeabi_set_attribute_int (Tag_VFP_arch, 3);
24076 }
ada65aa3 24077 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v3xd))
bca38921
MGD
24078 {
24079 aeabi_set_attribute_int (Tag_VFP_arch, 4);
24080 fp16_optional = 1;
24081 }
ee3c0378
AS
24082 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v2))
24083 aeabi_set_attribute_int (Tag_VFP_arch, 2);
24084 else if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1)
24085 || ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd))
24086 aeabi_set_attribute_int (Tag_VFP_arch, 1);
62f3b8c8 24087
4547cb56
NC
24088 /* Tag_ABI_HardFP_use. */
24089 if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1xd)
24090 && !ARM_CPU_HAS_FEATURE (flags, fpu_vfp_ext_v1))
24091 aeabi_set_attribute_int (Tag_ABI_HardFP_use, 1);
24092
ee065d83 24093 /* Tag_WMMX_arch. */
ee3c0378
AS
24094 if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt2))
24095 aeabi_set_attribute_int (Tag_WMMX_arch, 2);
24096 else if (ARM_CPU_HAS_FEATURE (flags, arm_cext_iwmmxt))
24097 aeabi_set_attribute_int (Tag_WMMX_arch, 1);
62f3b8c8 24098
ee3c0378 24099 /* Tag_Advanced_SIMD_arch (formerly Tag_NEON_arch). */
bca38921
MGD
24100 if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_armv8))
24101 aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 3);
24102 else if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_v1))
24103 {
24104 if (ARM_CPU_HAS_FEATURE (flags, fpu_neon_ext_fma))
24105 {
24106 aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 2);
24107 }
24108 else
24109 {
24110 aeabi_set_attribute_int (Tag_Advanced_SIMD_arch, 1);
24111 fp16_optional = 1;
24112 }
24113 }
fa94de6b 24114
ee3c0378 24115 /* Tag_VFP_HP_extension (formerly Tag_NEON_FP16_arch). */
bca38921 24116 if (ARM_CPU_HAS_FEATURE (flags, fpu_vfp_fp16) && fp16_optional)
ee3c0378 24117 aeabi_set_attribute_int (Tag_VFP_HP_extension, 1);
4547cb56 24118
69239280
MGD
24119 /* Tag_DIV_use.
24120
24121 We set Tag_DIV_use to two when integer divide instructions have been used
24122 in ARM state, or when Thumb integer divide instructions have been used,
24123 but we have no architecture profile set, nor have we any ARM instructions.
24124
bca38921
MGD
24125 For ARMv8 we set the tag to 0 as integer divide is implied by the base
24126 architecture.
24127
69239280 24128 For new architectures we will have to check these tests. */
bca38921
MGD
24129 gas_assert (arch <= TAG_CPU_ARCH_V8);
24130 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_v8))
24131 aeabi_set_attribute_int (Tag_DIV_use, 0);
24132 else if (ARM_CPU_HAS_FEATURE (flags, arm_ext_adiv)
24133 || (profile == '\0'
24134 && ARM_CPU_HAS_FEATURE (flags, arm_ext_div)
24135 && !ARM_CPU_HAS_FEATURE (arm_arch_used, arm_arch_any)))
eea54501 24136 aeabi_set_attribute_int (Tag_DIV_use, 2);
60e5ef9f
MGD
24137
24138 /* Tag_MP_extension_use. */
24139 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_mp))
24140 aeabi_set_attribute_int (Tag_MPextension_use, 1);
f4c65163
MGD
24141
24142 /* Tag Virtualization_use. */
24143 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_sec))
90ec0d68
MGD
24144 virt_sec |= 1;
24145 if (ARM_CPU_HAS_FEATURE (flags, arm_ext_virt))
24146 virt_sec |= 2;
24147 if (virt_sec != 0)
24148 aeabi_set_attribute_int (Tag_Virtualization_use, virt_sec);
ee065d83
PB
24149}
24150
104d59d1 24151/* Add the default contents for the .ARM.attributes section. */
ee065d83
PB
24152void
24153arm_md_end (void)
24154{
ee065d83
PB
24155 if (EF_ARM_EABI_VERSION (meabi_flags) < EF_ARM_EABI_VER4)
24156 return;
24157
24158 aeabi_set_public_attributes ();
ee065d83 24159}
8463be01 24160#endif /* OBJ_ELF */
ee065d83
PB
24161
24162
24163/* Parse a .cpu directive. */
24164
24165static void
24166s_arm_cpu (int ignored ATTRIBUTE_UNUSED)
24167{
e74cfd16 24168 const struct arm_cpu_option_table *opt;
ee065d83
PB
24169 char *name;
24170 char saved_char;
24171
24172 name = input_line_pointer;
5f4273c7 24173 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
ee065d83
PB
24174 input_line_pointer++;
24175 saved_char = *input_line_pointer;
24176 *input_line_pointer = 0;
24177
24178 /* Skip the first "all" entry. */
24179 for (opt = arm_cpus + 1; opt->name != NULL; opt++)
24180 if (streq (opt->name, name))
24181 {
e74cfd16
PB
24182 mcpu_cpu_opt = &opt->value;
24183 selected_cpu = opt->value;
ee065d83 24184 if (opt->canonical_name)
5f4273c7 24185 strcpy (selected_cpu_name, opt->canonical_name);
ee065d83
PB
24186 else
24187 {
24188 int i;
24189 for (i = 0; opt->name[i]; i++)
24190 selected_cpu_name[i] = TOUPPER (opt->name[i]);
f3bad469 24191
ee065d83
PB
24192 selected_cpu_name[i] = 0;
24193 }
e74cfd16 24194 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
ee065d83
PB
24195 *input_line_pointer = saved_char;
24196 demand_empty_rest_of_line ();
24197 return;
24198 }
24199 as_bad (_("unknown cpu `%s'"), name);
24200 *input_line_pointer = saved_char;
24201 ignore_rest_of_line ();
24202}
24203
24204
24205/* Parse a .arch directive. */
24206
24207static void
24208s_arm_arch (int ignored ATTRIBUTE_UNUSED)
24209{
e74cfd16 24210 const struct arm_arch_option_table *opt;
ee065d83
PB
24211 char saved_char;
24212 char *name;
24213
24214 name = input_line_pointer;
5f4273c7 24215 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
ee065d83
PB
24216 input_line_pointer++;
24217 saved_char = *input_line_pointer;
24218 *input_line_pointer = 0;
24219
24220 /* Skip the first "all" entry. */
24221 for (opt = arm_archs + 1; opt->name != NULL; opt++)
24222 if (streq (opt->name, name))
24223 {
e74cfd16
PB
24224 mcpu_cpu_opt = &opt->value;
24225 selected_cpu = opt->value;
5f4273c7 24226 strcpy (selected_cpu_name, opt->name);
e74cfd16 24227 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
ee065d83
PB
24228 *input_line_pointer = saved_char;
24229 demand_empty_rest_of_line ();
24230 return;
24231 }
24232
24233 as_bad (_("unknown architecture `%s'\n"), name);
24234 *input_line_pointer = saved_char;
24235 ignore_rest_of_line ();
24236}
24237
24238
7a1d4c38
PB
24239/* Parse a .object_arch directive. */
24240
24241static void
24242s_arm_object_arch (int ignored ATTRIBUTE_UNUSED)
24243{
24244 const struct arm_arch_option_table *opt;
24245 char saved_char;
24246 char *name;
24247
24248 name = input_line_pointer;
5f4273c7 24249 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
7a1d4c38
PB
24250 input_line_pointer++;
24251 saved_char = *input_line_pointer;
24252 *input_line_pointer = 0;
24253
24254 /* Skip the first "all" entry. */
24255 for (opt = arm_archs + 1; opt->name != NULL; opt++)
24256 if (streq (opt->name, name))
24257 {
24258 object_arch = &opt->value;
24259 *input_line_pointer = saved_char;
24260 demand_empty_rest_of_line ();
24261 return;
24262 }
24263
24264 as_bad (_("unknown architecture `%s'\n"), name);
24265 *input_line_pointer = saved_char;
24266 ignore_rest_of_line ();
24267}
24268
69133863
MGD
24269/* Parse a .arch_extension directive. */
24270
24271static void
24272s_arm_arch_extension (int ignored ATTRIBUTE_UNUSED)
24273{
24274 const struct arm_option_extension_value_table *opt;
24275 char saved_char;
24276 char *name;
24277 int adding_value = 1;
24278
24279 name = input_line_pointer;
24280 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
24281 input_line_pointer++;
24282 saved_char = *input_line_pointer;
24283 *input_line_pointer = 0;
24284
24285 if (strlen (name) >= 2
24286 && strncmp (name, "no", 2) == 0)
24287 {
24288 adding_value = 0;
24289 name += 2;
24290 }
24291
24292 for (opt = arm_extensions; opt->name != NULL; opt++)
24293 if (streq (opt->name, name))
24294 {
24295 if (!ARM_CPU_HAS_FEATURE (*mcpu_cpu_opt, opt->allowed_archs))
24296 {
24297 as_bad (_("architectural extension `%s' is not allowed for the "
24298 "current base architecture"), name);
24299 break;
24300 }
24301
24302 if (adding_value)
24303 ARM_MERGE_FEATURE_SETS (selected_cpu, selected_cpu, opt->value);
24304 else
24305 ARM_CLEAR_FEATURE (selected_cpu, selected_cpu, opt->value);
24306
24307 mcpu_cpu_opt = &selected_cpu;
24308 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
24309 *input_line_pointer = saved_char;
24310 demand_empty_rest_of_line ();
24311 return;
24312 }
24313
24314 if (opt->name == NULL)
24315 as_bad (_("unknown architecture `%s'\n"), name);
24316
24317 *input_line_pointer = saved_char;
24318 ignore_rest_of_line ();
24319}
24320
ee065d83
PB
24321/* Parse a .fpu directive. */
24322
24323static void
24324s_arm_fpu (int ignored ATTRIBUTE_UNUSED)
24325{
69133863 24326 const struct arm_option_fpu_value_table *opt;
ee065d83
PB
24327 char saved_char;
24328 char *name;
24329
24330 name = input_line_pointer;
5f4273c7 24331 while (*input_line_pointer && !ISSPACE (*input_line_pointer))
ee065d83
PB
24332 input_line_pointer++;
24333 saved_char = *input_line_pointer;
24334 *input_line_pointer = 0;
5f4273c7 24335
ee065d83
PB
24336 for (opt = arm_fpus; opt->name != NULL; opt++)
24337 if (streq (opt->name, name))
24338 {
e74cfd16
PB
24339 mfpu_opt = &opt->value;
24340 ARM_MERGE_FEATURE_SETS (cpu_variant, *mcpu_cpu_opt, *mfpu_opt);
ee065d83
PB
24341 *input_line_pointer = saved_char;
24342 demand_empty_rest_of_line ();
24343 return;
24344 }
24345
24346 as_bad (_("unknown floating point format `%s'\n"), name);
24347 *input_line_pointer = saved_char;
24348 ignore_rest_of_line ();
24349}
ee065d83 24350
794ba86a 24351/* Copy symbol information. */
f31fef98 24352
794ba86a
DJ
24353void
24354arm_copy_symbol_attributes (symbolS *dest, symbolS *src)
24355{
24356 ARM_GET_FLAG (dest) = ARM_GET_FLAG (src);
24357}
e04befd0 24358
f31fef98 24359#ifdef OBJ_ELF
e04befd0
AS
24360/* Given a symbolic attribute NAME, return the proper integer value.
24361 Returns -1 if the attribute is not known. */
f31fef98 24362
e04befd0
AS
24363int
24364arm_convert_symbolic_attribute (const char *name)
24365{
f31fef98
NC
24366 static const struct
24367 {
24368 const char * name;
24369 const int tag;
24370 }
24371 attribute_table[] =
24372 {
24373 /* When you modify this table you should
24374 also modify the list in doc/c-arm.texi. */
e04befd0 24375#define T(tag) {#tag, tag}
f31fef98
NC
24376 T (Tag_CPU_raw_name),
24377 T (Tag_CPU_name),
24378 T (Tag_CPU_arch),
24379 T (Tag_CPU_arch_profile),
24380 T (Tag_ARM_ISA_use),
24381 T (Tag_THUMB_ISA_use),
75375b3e 24382 T (Tag_FP_arch),
f31fef98
NC
24383 T (Tag_VFP_arch),
24384 T (Tag_WMMX_arch),
24385 T (Tag_Advanced_SIMD_arch),
24386 T (Tag_PCS_config),
24387 T (Tag_ABI_PCS_R9_use),
24388 T (Tag_ABI_PCS_RW_data),
24389 T (Tag_ABI_PCS_RO_data),
24390 T (Tag_ABI_PCS_GOT_use),
24391 T (Tag_ABI_PCS_wchar_t),
24392 T (Tag_ABI_FP_rounding),
24393 T (Tag_ABI_FP_denormal),
24394 T (Tag_ABI_FP_exceptions),
24395 T (Tag_ABI_FP_user_exceptions),
24396 T (Tag_ABI_FP_number_model),
75375b3e 24397 T (Tag_ABI_align_needed),
f31fef98 24398 T (Tag_ABI_align8_needed),
75375b3e 24399 T (Tag_ABI_align_preserved),
f31fef98
NC
24400 T (Tag_ABI_align8_preserved),
24401 T (Tag_ABI_enum_size),
24402 T (Tag_ABI_HardFP_use),
24403 T (Tag_ABI_VFP_args),
24404 T (Tag_ABI_WMMX_args),
24405 T (Tag_ABI_optimization_goals),
24406 T (Tag_ABI_FP_optimization_goals),
24407 T (Tag_compatibility),
24408 T (Tag_CPU_unaligned_access),
75375b3e 24409 T (Tag_FP_HP_extension),
f31fef98
NC
24410 T (Tag_VFP_HP_extension),
24411 T (Tag_ABI_FP_16bit_format),
cd21e546
MGD
24412 T (Tag_MPextension_use),
24413 T (Tag_DIV_use),
f31fef98
NC
24414 T (Tag_nodefaults),
24415 T (Tag_also_compatible_with),
24416 T (Tag_conformance),
24417 T (Tag_T2EE_use),
24418 T (Tag_Virtualization_use),
cd21e546 24419 /* We deliberately do not include Tag_MPextension_use_legacy. */
e04befd0 24420#undef T
f31fef98 24421 };
e04befd0
AS
24422 unsigned int i;
24423
24424 if (name == NULL)
24425 return -1;
24426
f31fef98 24427 for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
c921be7d 24428 if (streq (name, attribute_table[i].name))
e04befd0
AS
24429 return attribute_table[i].tag;
24430
24431 return -1;
24432}
267bf995
RR
24433
24434
24435/* Apply sym value for relocations only in the case that
24436 they are for local symbols and you have the respective
24437 architectural feature for blx and simple switches. */
24438int
24439arm_apply_sym_value (struct fix * fixP)
24440{
24441 if (fixP->fx_addsy
24442 && ARM_CPU_HAS_FEATURE (selected_cpu, arm_ext_v5t)
34e77a92 24443 && !S_FORCE_RELOC (fixP->fx_addsy, TRUE))
267bf995
RR
24444 {
24445 switch (fixP->fx_r_type)
24446 {
24447 case BFD_RELOC_ARM_PCREL_BLX:
24448 case BFD_RELOC_THUMB_PCREL_BRANCH23:
24449 if (ARM_IS_FUNC (fixP->fx_addsy))
24450 return 1;
24451 break;
24452
24453 case BFD_RELOC_ARM_PCREL_CALL:
24454 case BFD_RELOC_THUMB_PCREL_BLX:
24455 if (THUMB_IS_FUNC (fixP->fx_addsy))
24456 return 1;
24457 break;
24458
24459 default:
24460 break;
24461 }
24462
24463 }
24464 return 0;
24465}
f31fef98 24466#endif /* OBJ_ELF */